aeon-flux.epls: Add playlist for new series.
[epls] / mkm3u
diff --git a/mkm3u b/mkm3u
index 29b2e54..b1d9fd2 100755 (executable)
--- a/mkm3u
+++ b/mkm3u
@@ -360,6 +360,35 @@ class DVDDir (object):
         raise ExpectedError("bad ep list in `%s'", fn)
     me.seasons = seasons
 
+class SingleFileDir (object):
+
+  _CHECK_COMPLETE = True
+
+  def __init__(me, dir):
+    me.dir = dir
+    fns = OS.listdir(OS.path.join(ROOT, dir))
+    fns.sort()
+    episodes = {}
+    last_i = 0
+    rx = RX.compile(r"""
+          E (\d+)
+          (?: \. \ (.*))?
+          %s $
+    """ % RX.escape(me._EXT), RX.X)
+
+    for fn in fns:
+      path = OS.path.join(dir, fn)
+      if not fn.endswith(me._EXT): continue
+      m = rx.match(fn)
+      if not m: continue
+      i = filter(m.group(1), int)
+      etitle = m.group(2)
+      if me._CHECK_COMPLETE:
+        check(i == last_i + 1, "episode %d /= %d" % (i, last_i + 1))
+      episodes[i] = me._mkepisode(path, i)
+      last_i = i
+    me.episodes = episodes
+
 class AudioFile (Source):
   PREFIX = "file://"
   TITLEP = CHAPTERP = False
@@ -376,31 +405,32 @@ class AudioEpisode (AudioFile):
     super().__init__(fn, *args, **kw)
     me.i = i
 
-class AudioDir (object):
+class AudioDir (SingleFileDir):
+  _EXT = ".flac"
 
-  _R_FLAC = RX.compile(r""" ^
-          E (\d+)
-          (?: \. \ (.*))?
-          \. flac $
-  """, RX.X)
+  def _mkepisode(me, path, i):
+    return AudioEpisode(path, i)
 
-  def __init__(me, dir):
-    me.dir = dir
-    fns = OS.listdir(OS.path.join(ROOT, dir))
-    fns.sort()
-    episodes = {}
-    last_i = 0
-    for fn in fns:
-      path = OS.path.join(dir, fn)
-      if not fn.endswith(".flac"): continue
-      m = me._R_FLAC.match(fn)
-      if not m: continue
-      i = filter(m.group(1), int)
-      etitle = m.group(2)
-      check(i == last_i + 1, "episode %d /= %d" % (i, last_i + 1))
-      episodes[i] = AudioEpisode(path, i)
-      last_i = i
-    me.episodes = episodes
+class VideoFile (Source):
+  PREFIX = "file://"
+  TITLEP = CHAPTERP = False
+
+  def _duration(me, title, start_chapter, end_chaptwr):
+    out = program_output(["mediainfo", "--output=General;%Duration%",
+                          OS.path.join(ROOT, me.fn)])
+    return int(out)//1000
+
+class VideoEpisode (VideoFile):
+  def __init__(me, fn, i, *args, **kw):
+    super().__init__(fn, *args, **kw)
+    me.i = i
+
+class VideoDir (SingleFileDir):
+  _EXT = ".mp4"
+  _CHECK_COMPLETE = False
+
+  def _mkepisode(me, path, i):
+    return VideoEpisode(path, i)
 
 class Chapter (object):
   def __init__(me, episode, title, i):
@@ -750,7 +780,7 @@ class EpisodeListParser (object):
       if not series.wantedp: return
       series.ensure_season().ep_i = epi
 
-    elif cmd == "iso":
+    elif cmd == "dvd":
       series = me._opts_series(cmd, opts)
       fn = ww.rest(); check(fn is not None, "missing filename")
       if not series.wantedp: return
@@ -760,13 +790,20 @@ class EpisodeListParser (object):
               "dvd iso file `%s' not found" % fn)
         me._isos[series.name] = DVDFile(fn)
 
-    elif cmd == "vdir":
+    elif cmd == "dvddir":
       series = me._opts_series(cmd, opts)
       dir = ww.rest(); check(dir is not None, "missing directory")
       if not series.wantedp: return
       if dir == "-": forget(me._vdirs, series.name)
       else: me._vdirs[series.name] = DVDDir(dir)
 
+    elif cmd == "vdir":
+      series = me._opts_series(cmd, opts)
+      dir = ww.rest(); check(dir is not None, "missing directory")
+      if not series.wantedp: return
+      if dir == "-": forget(me._sfdirs, series.name)
+      else: me._sfdirs[series.name] = VideoDir(dir)
+
     elif cmd == "adir":
       series = me._opts_series(cmd, opts)
       dir = ww.rest(); check(dir is not None, "missing directory")