12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- import wave
- def maxwait(songs, context, conf):
- wait = int(conf.get("EF_MAXWAIT_SEC", 0))
- if wait == 0:
- return True
- if "time" not in context["status"]:
- return True, "no song playing?"
- curpos, duration = map(int, context["status"]["time"].split(":"))
- remaining = duration - curpos
- if remaining > wait:
- return False, "remaining %d max allowed %d" % (remaining, wait)
- return True
- def get_duration(path):
- """get track duration in seconds"""
- if path.lower().endswith(".wav"):
- with wave.open(path, "r") as f:
- frames = f.getnframes()
- rate = f.getframerate()
- duration = frames / rate
- return int(duration)
- try:
- import mutagen
- except ModuleNotFoundError:
- raise ImportError("mutagen not installed")
- audio = mutagen.File(path)
- if audio is None:
- return None
- return int(audio.info.length)
- def percentwait(songs, context, conf, getdur=get_duration):
- """
- Similar to maxwait, but the maximum waiting time is proportional to the
- duration of the audio we're going to add.
- This filter observe the EF_MAXWAIT_PERC variable.
- The variable must be an integer representing the percentual.
- If the variable is 0 or unset, the filter will not run.
- For example, if the currently playing track still has 1 minute to go and we
- are adding a jingle of 40seconds, then if EF_MAXWAIT_PERC==200 the audio
- will be added (40s*200% = 1m20s) while if EF_MAXWAIT_PERC==100 it will be
- filtered out.
- """
- percentwait = int(conf.get("EF_MAXWAIT_PERC", 0))
- if percentwait == 0:
- return True
- if "time" not in context["status"]:
- return True, "no song playing?"
- curpos, duration = map(int, context["status"]["time"].split(":"))
- remaining = duration - curpos
- eventduration = 0
- for uri in songs["uris"]:
- if not uri.startswith("file://"):
- return True, "%s is not a file" % uri
- path = uri[len("file://") :] # strips file://
- songduration = getdur(path)
- if songduration is None:
- continue
- eventduration += songduration
- wait = eventduration * (percentwait / 100.0)
- if remaining > wait:
- return False, "remaining %d max allowed %d" % (remaining, wait)
- return True
|