mkm3u, flying-circus-restored.epls: Start at chapter 2.
[epls] / mkm3u
diff --git a/mkm3u b/mkm3u
index 046373f..2e2f5cd 100755 (executable)
--- a/mkm3u
+++ b/mkm3u
@@ -94,31 +94,41 @@ class Source (object):
     me.used_titles = dict()
     me.used_chapters = set()
     me.nuses = 0
-  def url(me, title = None, chapter = None):
+  def url(me, title = None, start_chapter = None, end_chapter = None):
     if title == "-":
       if me.TITLEP: raise ExpectedError("missing title number")
-      if chapter is not None:
+      if start_chapter is not None or end_chapter is not None:
         raise ExpectedError("can't specify chapter without title")
       suffix = ""
     elif not me.TITLEP:
       raise ExpectedError("can't specify title with `%s'" % me.fn)
-    elif chapter is None:
+    elif start_chapter is None:
+      if end_chapter is not None:
+        raise ExpectedError("can't specify end chapter without start chapter")
       suffix = "#%d" % title
     elif not me.CHAPTERP:
       raise ExpectedError("can't specify chapter with `%s'" % me.fn)
+    elif end_chapter is None:
+      suffix = "#%d:%d" % (title, start_chapter)
     else:
-      suffix = "#%d:%d-%d:%d" % (title, chapter, title, chapter)
-    if chapter is not None: key, set = (title, chapter), me.used_chapters
-    else: key, set = title, me.used_titles
-    if key in set:
-      if title == "-":
-        raise ExpectedError("`%s' already used" % me.fn)
-      elif chapter is None:
-        raise ExpectedError("`%s' title %d already used" % (me.fn, title))
-      else:
-        raise ExpectedError("`%s' title %d chapter %d already used" %
-                              (me.fn, title, chapter))
-    if chapter is not None: me.used_chapters.add((title, chapter))
+      suffix = "#%d:%d-%d:%d" % (title, start_chapter, title, end_chapter - 1)
+    if end_chapter is not None:
+      keys = [(title, ch) for ch in range(start_chapter, end_chapter)]
+      set = me.used_chapters
+    else:
+      keys, set = [title], me.used_titles
+    for k in keys:
+      if k in set:
+        if title == "-":
+          raise ExpectedError("`%s' already used" % me.fn)
+        elif end_chapter is None:
+          raise ExpectedError("`%s' title %d already used" % (me.fn, title))
+        else:
+          raise ExpectedError("`%s' title %d chapter %d already used" %
+                              (me.fn, title, k[1]))
+    if end_chapter is not None:
+      for ch in range(start_chapter, end_chapter):
+        me.used_chapters.add((title, ch))
     return me.PREFIX + ROOT + urlencode(me.fn) + suffix
 
 class VideoDisc (Source):
@@ -262,15 +272,15 @@ class AudioDir (object):
 class Chapter (object):
   def __init__(me, episode, title, i):
     me.title, me.i = title, i
-    me.url = episode.source.url(episode.tno, i)
+    me.url = episode.source.url(episode.tno, i, i + 1)
 
 class Episode (object):
-  def __init__(me, season, i, neps, title, src, tno = None):
+  def __init__(me, season, i, neps, title, src, tno = None, startch = None):
     me.season = season
     me.i, me.neps, me.title = i, neps, title
     me.chapters = []
     me.source, me.tno = src, tno
-    me.url = src.url(tno)
+    me.url = src.url(tno, startch, None)
   def add_chapter(me, title, j):
     ch = Chapter(me, title, j)
     me.chapters.append(ch)
@@ -284,8 +294,8 @@ class BaseSeason (object):
     me.episodes = []
     me.implicitp = implicitp
     me.ep_i, episodes = 1, []
-  def add_episode(me, j, neps, title, src, tno):
-    ep = Episode(me, j, neps, title, src, tno)
+  def add_episode(me, j, neps, title, src, tno, startch):
+    ep = Episode(me, j, neps, title, src, tno, startch)
     me.episodes.append(ep)
     src.nuses += neps; me.ep_i += neps
     return ep
@@ -310,9 +320,9 @@ class Season (BaseSeason):
     return label
 
 class MovieSeason (BaseSeason):
-  def add_episode(me, j, neps, title, src, tno):
+  def add_episode(me, j, neps, title, src, tno, startch):
     if title is None: raise ExpectedError("movie must have a title")
-    return super().add_episode(j, neps, title, src, tno)
+    return super().add_episode(j, neps, title, src, tno, startch)
   def _eplabel(me, i, epn, title):
     return title
 
@@ -492,7 +502,7 @@ class EpisodeListParser (object):
   def _process_episode(me, ww):
 
     opts = ww.nextword(); check(opts is not None, "missing title/options")
-    ti = None; sname = None; neps = 1; epi = None
+    ti = None; sname = None; neps = 1; epi = None; ch = None
     for k, v in me._keyvals(opts):
       if k is None:
         if v.isdigit(): ti = int(v)
@@ -501,6 +511,7 @@ class EpisodeListParser (object):
       elif k == "s": sname = v
       elif k == "n": neps = getint(v)
       elif k == "ep": epi = getint(v)
+      elif k == "ch": ch = getint(v)
       else: raise ExpectedError("unknown episode option `%s'" % k)
     check(ti is not None, "missing title number")
     series = me._get_series(sname)
@@ -530,7 +541,7 @@ class EpisodeListParser (object):
                      "episode %d.%d not found in video dir `%s'" %
                        (season.i, season.ep_i, dir.dir))
 
-    episode = season.add_episode(epi, neps, title, src, ti)
+    episode = season.add_episode(epi, neps, title, src, ti, ch)
     me._pl.add_episode(episode)
     me._cur_episode = episode