mkm3u: New hack for `episodes' which are carved out of chapter breaks.
authorMark Wooding <mdw@distorted.org.uk>
Thu, 17 Mar 2022 19:54:59 +0000 (19:54 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Thu, 17 Mar 2022 19:54:59 +0000 (19:54 +0000)
The `Danger Mouse' discs do this.  Grr.

mkm3u

diff --git a/mkm3u b/mkm3u
index 7583937..9b308aa 100755 (executable)
--- a/mkm3u
+++ b/mkm3u
@@ -284,12 +284,13 @@ class Chapter (object):
     me.url = episode.source.url(episode.tno, i, i + 1)
 
 class Episode (object):
-  def __init__(me, season, i, neps, title, src, tno = None, startch = None):
+  def __init__(me, season, i, neps, title, src, tno = None,
+               startch = None, endch = 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, startch, None)
+    me.url = src.url(tno, startch, endch)
   def add_chapter(me, title, j):
     ch = Chapter(me, title, j)
     me.chapters.append(ch)
@@ -303,8 +304,8 @@ class BaseSeason (object):
     me.episodes = []
     me.implicitp = implicitp
     me.ep_i, episodes = 1, []
-  def add_episode(me, j, neps, title, src, tno, startch):
-    ep = Episode(me, j, neps, title, src, tno, startch)
+  def add_episode(me, j, neps, title, src, tno, startch, endch):
+    ep = Episode(me, j, neps, title, src, tno, startch, endch)
     me.episodes.append(ep)
     src.nuses += neps; me.ep_i += neps
     return ep
@@ -335,10 +336,10 @@ class MovieSeason (BaseSeason):
     super().__init__(series, *args, **kw)
     me.title = title
     me.i = None
-  def add_episode(me, j, neps, title, src, tno, startch):
+  def add_episode(me, j, neps, title, src, tno, startch, endch):
     if me.title is None and title is None:
       raise ExpectedError("movie or movie season must have a title")
-    return super().add_episode(j, neps, title, src, tno, startch)
+    return super().add_episode(j, neps, title, src, tno, startch, endch)
   def _eplabel(me, i, neps, title):
     if me.title is None:
       label = title
@@ -541,7 +542,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; ch = None
+    ti = None; sname = None; neps = 1; epi = None; loch = hich = None
     for k, v in me._keyvals(opts):
       if k is None:
         if v.isdigit(): ti = int(v)
@@ -550,7 +551,10 @@ 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)
+      elif k == "ch":
+        try: sep = v.index("-")
+        except ValueError: loch, hich = getint(v), None
+        else: loch, hich = getint(v[:sep]), getint(v[sep + 1:]) + 1
       else: raise ExpectedError("unknown episode option `%s'" % k)
     check(ti is not None, "missing title number")
     series = me._get_series(sname)
@@ -572,7 +576,7 @@ class EpisodeListParser (object):
       try: src = me._isos[series.name]
       except KeyError: src = me._auto_epsrc(series)
 
-    episode = season.add_episode(epi, neps, title, src, ti, ch)
+    episode = season.add_episode(epi, neps, title, src, ti, loch, hich)
     me._pl.add_episode(episode)
     me._cur_episode = episode