mkm3u: Add some spaces to improve the layout.
[epls] / mkm3u
diff --git a/mkm3u b/mkm3u
index 9053c5f..7df1891 100755 (executable)
--- a/mkm3u
+++ b/mkm3u
@@ -128,14 +128,17 @@ def setup_db(fn):
   """)
 
 class Source (object):
+
   PREFIX = ""
   TITLEP = CHAPTERP = False
+
   def __init__(me, fn):
     me.fn = fn
     me.neps = None
     me.used_titles = dict()
     me.used_chapters = set()
     me.nuses = 0
+
   def _duration(me, title, start_chapter, end_chapter):
     return -1
   def url_and_duration(me, title = None,
@@ -501,17 +504,21 @@ class Series (object):
     me.cur_season = None
 
 class Playlist (object):
+
   def __init__(me):
     me.seasons = []
     me.episodes = []
     me.epname, me.epnames = "Episode", "Episodes"
     me.nseries = 0
+
   def add_episode(me, episode):
     me.episodes.append(episode)
+
   def done_season(me):
     if me.episodes:
       me.seasons.append(me.episodes)
       me.episodes = []
+
   def write(me, f):
     f.write("#EXTM3U\n")
     for season in me.seasons:
@@ -530,6 +537,19 @@ class Playlist (object):
             f.write("#EXTINF:%d,,%s: %s\n%s\n" %
                     (ch.duration, label, ch.title, ch.url))
 
+  def write_deps(me, f, out):
+    deps = set()
+    for season in me.seasons:
+      for ep in season: deps.add(ep.source.fn)
+    f.write("### -*-makefile-*-\n")
+    f.write("%s: $(call check-deps, %s," % (out, out))
+    for dep in sorted(deps):
+      f.write(" \\\n\t'%s'" %
+                OS.path.join(ROOT, dep)
+                  .replace(",", "$(comma)")
+                  .replace("'", "'\\''"))
+    f.write(")\n")
+
 DEFAULT_EXPVAR = 0.05
 R_DURMULT = RX.compile(r""" ^
         (\d+ (?: \. \d+)?) x
@@ -744,7 +764,8 @@ class EpisodeListParser (object):
     if epi is None: epi = season.ep_i
 
     if ti == "-":
-      check(season.implicitp, "audio source, but explicit season")
+      check(season.implicitp or season.i is None,
+            "audio source, but explicit non-movie season")
       dir = lookup(me._audirs, series.name,
                    "no title, and no audio directory")
       src = lookup(dir.episodes, season.ep_i,
@@ -809,28 +830,41 @@ class EpisodeListParser (object):
     return me._pl
 
 op = OP.OptionParser \
-  (usage = "%prog [-c] [-d CACHE] [-s SERIES] EPLS\n"
+  (usage = "%prog [-c] [-M DEPS] [-d CACHE] [-o OUT] [-s SERIES] EPLS\n"
            "%prog -i -d CACHE",
    description = "Generate M3U playlists from an episode list.")
+op.add_option("-M", "--make-deps", metavar = "DEPS",
+              dest = "deps", type = "str", default = None,
+              help = "Write a `make' fragment for dependencies")
 op.add_option("-c", "--chapters",
               dest = "chaptersp", action = "store_true", default = False,
               help = "Output individual chapter names")
 op.add_option("-i", "--init-db",
               dest = "initdbp", action = "store_true", default = False,
               help = "Initialize the database")
-op.add_option("-d", "--database",
+op.add_option("-d", "--database", metavar = "CACHE",
               dest = "database", type = "str", default = None,
               help = "Set filename for cache database")
-op.add_option("-s", "--series",
+op.add_option("-o", "--output", metavar = "OUT",
+              dest = "output", type = "str", default = None,
+              help = "Write output playlist to OUT")
+op.add_option("-O", "--fake-output", metavar = "OUT",
+              dest = "fakeout", type = "str", default = None,
+              help = "Pretend output goes to OUT for purposes of `-M'")
+op.add_option("-s", "--series", metavar = "SERIES",
               dest = "series", type = "str", default = None,
               help = "Output only the listed SERIES (comma-separated)")
 try:
   opts, argv = op.parse_args()
+
   if opts.initdbp:
     if opts.chaptersp or opts.series is not None or \
+       opts.output is not None or opts.deps is not None or \
+       opts.fakeout is not None or \
        opts.database is None or len(argv):
       op.print_usage(file = SYS.stderr); SYS.exit(2)
     setup_db(opts.database)
+
   else:
     if len(argv) != 1: op.print_usage(file = SYS.stderr); SYS.exit(2)
     if opts.database is not None: init_db(opts.database)
@@ -839,10 +873,29 @@ try:
     else:
       series_wanted = set()
       for name in opts.series.split(","): series_wanted.add(name)
+    if opts.deps is not None:
+      if (opts.output is None or opts.output == "-") and opts.fakeout is None:
+        raise ExpectedError("can't write dep fragment without output file")
+      if opts.fakeout is None: opts.fakeout = opts.output
+    else:
+      if opts.fakeout is not None:
+        raise ExpectedError("fake output set but no dep fragment")
+
     ep = EpisodeListParser(series_wanted, opts.chaptersp)
     ep.parse_file(argv[0])
     pl = ep.done()
-    pl.write(SYS.stdout)
+
+    if opts.output is None or opts.output == "-":
+      pl.write(SYS.stdout)
+    else:
+      with open(opts.output, "w") as f: pl.write(f)
+
+    if opts.deps:
+      if opts.deps == "-":
+        pl.write_deps(SYS.stdout, opts.fakeout)
+      else:
+        with open(opts.deps, "w") as f: pl.write_deps(f, opts.fakeout)
+
 except (ExpectedError, IOError, OSError) as e:
   LOC.report(e)
   SYS.exit(2)