mkm3u: Picky checking of automatically selected discs.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 14 Mar 2022 14:29:25 +0000 (14:29 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 14 Mar 2022 14:30:45 +0000 (14:30 +0000)
Each should be used the right number of times.

mkm3u

diff --git a/mkm3u b/mkm3u
index 9be73ce..42f8413 100755 (executable)
--- a/mkm3u
+++ b/mkm3u
@@ -81,6 +81,10 @@ class Source (object):
   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 url(me, title = None, chapter = None):
     if title is None:
       if me.TITLEP: raise ExpectedError("missing title number")
@@ -95,12 +99,27 @@ class Source (object):
       raise ExpectedError("can't specify chapter with `%s'" % me.fn)
     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 is None:
+        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))
     return me.PREFIX + ROOT + urlencode(me.fn) + suffix
 
 class VideoDisc (Source):
   PREFIX = "dvd://"
   TITLEP = CHAPTERP = True
 
+  def __init__(me, fn, *args, **kw):
+    super().__init__(fn, *args, **kw)
+    me.neps = 0
+
 class VideoSeason (object):
   def __init__(me, i, title):
     me.i = i
@@ -109,7 +128,7 @@ class VideoSeason (object):
   def set_episode_disc(me, i, disc):
     if i in me.episodes:
       raise ExpectedError("season %d episode %d already taken" % (me.i, i))
-    me.episodes[i] = disc
+    me.episodes[i] = disc; disc.neps += 1
 
 def some_group(m, *gg):
   for g in gg:
@@ -133,6 +152,7 @@ class VideoDir (object):
   """, RX.X)
 
   def __init__(me, dir):
+    me.dir = dir
     fns = OS.listdir(OS.path.join(ROOT, dir))
     fns.sort()
     season, last_j = None, 0
@@ -195,6 +215,7 @@ class AudioDir (object):
   """, RX.X)
 
   def __init__(me, dir):
+    me.dir = dir
     fns = OS.listdir(OS.path.join(ROOT, dir))
     fns.sort()
     episodes = {}
@@ -412,7 +433,7 @@ def parse_list(fn):
 
             episode = season.add_episode(fake_epi, neps, title, src, i)
             chapter = None
-            ep_i += neps
+            ep_i += neps; src.nuses += neps
 
           else:
             ww = Words(line)
@@ -424,6 +445,16 @@ def parse_list(fn):
             else: j += 1
             chapter = episode.add_chapter(title, j)
 
+  discs = set()
+  for vdir in vds.values():
+    for s in vdir.seasons.values():
+      for d in s.episodes.values():
+        discs.add(d)
+  for d in sorted(discs, key = lambda d: d.fn):
+    if d.neps != d.nuses:
+      raise ExpectedError("disc `%s' has %d episodes, used %d times" %
+                          (d.fn, d.neps, d.nuses))
+
   return playlist
 
 ROOT = "/mnt/dvd/archive/"