X-Git-Url: https://git.distorted.org.uk/~mdw/epls/blobdiff_plain/b092d5117493f7633167748a0af8c168b8011583..065a5db681eac97dd6812197ca11cb67d0914752:/mkm3u diff --git a/mkm3u b/mkm3u index 42f8413..bcc3536 100755 --- a/mkm3u +++ b/mkm3u @@ -138,8 +138,7 @@ def some_group(m, *gg): class VideoDir (object): - _R_ISO_PRE = RX.compile(r""" - ^ + _R_ISO_PRE = RX.compile(r""" ^ (?: S (?P \d+) (?: \. \ (?P .*)—)? (?: D (?P \d+))? | (?P \d+)) \. \ # @@ -147,59 +146,70 @@ class VideoDir (object): \. iso $ """, RX.X) - _R_ISO_EP = RX.compile(r""" - ^ E (?P \d+) (?: – (?P \d+))? $ + _R_ISO_EP = RX.compile(r""" ^ + (?: S (?P \d+) \ )? + E (?P \d+) (?: – (?P \d+))? $ """, RX.X) def __init__(me, dir): me.dir = dir fns = OS.listdir(OS.path.join(ROOT, dir)) fns.sort() - season, last_j = None, 0 + season = None seasons = {} for fn in fns: path = OS.path.join(dir, fn) if not fn.endswith(".iso"): continue m = me._R_ISO_PRE.match(fn) - if not m: continue + if not m: + #print(";; `%s' ignored" % path, file = SYS.stderr) + continue - i = filter(m.group("si"), int, 1) + i = filter(m.group("si"), int) stitle = m.group("st") - if season is None or i != season.i: - check(season is None or i == season.i + 1, - "season %d /= %d" % (i, season is None and -1 or season.i + 1)) - check(i not in seasons, "season %d already seen" % i) - seasons[i] = season = VideoSeason(i, stitle) - last_j = 0 - else: - check(stitle == season.title, - "season title `%s' /= `%s'" % (stitle, season.title)) - j = filter(some_group(m, "sdi", "di"), int) - if j is not None: - check(j == last_j + 1, - "season %d disc %d /= %d" % (season.i, j, last_j + 1)) + check(i is not None or stitle is None, + "explicit season title without number in `%s'" % fn) + if i is not None: + if season is None or i != season.i: + check(season is None or i == season.i + 1, + "season %d /= %d" % + (i, season is None and -1 or season.i + 1)) + check(i not in seasons, "season %d already seen" % i) + seasons[i] = season = VideoSeason(i, stitle) + else: + check(stitle == season.title, + "season title `%s' /= `%s'" % (stitle, season.title)) disc = VideoDisc(path) + ts = season any, bad = False, False for eprange in m.group("eps").split(", "): mm = me._R_ISO_EP.match(eprange) if mm is None: bad = True; continue + if not any: + #print(";; `%s'" % path, file = SYS.stderr) + any = True + i = filter(mm.group("si"), int) + if i is not None: + try: ts = seasons[i] + except KeyError: ts = seasons[i] = VideoSeason(i, None) + if ts is None: + ts = season = seasons[1] = VideoSeason(1, None) start = filter(mm.group("ei"), int) end = filter(mm.group("ej"), int, start) for k in range(start, end + 1): - season.set_episode_disc(k, disc) - any = True - if bad and any: - raise ExpectedError("bad ep list in `%s'", fn) - last_j = j + ts.set_episode_disc(k, disc) + #print(";;\tepisode %d.%d" % (ts.i, k), file = SYS.stderr) + if not any: pass #print(";; `%s' ignored" % path, file = SYS.stderr) + elif bad: raise ExpectedError("bad ep list in `%s'", fn) me.seasons = seasons class AudioDisc (Source): - #PREFIX = "file://" + PREFIX = "file://" TITLEP = CHAPTERP = False class AudioEpisode (Source): - #PREFIX = "file://" + PREFIX = "file://" TITLEP = CHAPTERP = False def __init__(me, fn, i, *args, **kw): super().__init__(fn, *args, **kw) @@ -207,8 +217,7 @@ class AudioEpisode (Source): class AudioDir (object): - _R_FLAC = RX.compile(r""" - ^ + _R_FLAC = RX.compile(r""" ^ E (\d+) (?: \. \ (.*))? \. flac $ @@ -422,14 +431,27 @@ def parse_list(fn): if i is None: check(ads, "no title, but no audio directory") check(season.implicitp, "audio source, but explicit season") - src = ads.episodes[ep_i] + try: src = ads.episodes[ep_i] + except KeyError: + raise ExpectedError("episode %d not found in audio dir `%s'" % + ep_i, ads.dir) elif iso: src = iso else: check(vdname in vds, "title, but no iso or video directory") - src = vds[vdname].seasons[season.i].episodes[ep_i] + try: vdir = vds[vdname] + except KeyError: + raise ExpectedError("video dir label `%s' not set" % vdname) + try: s = vdir.seasons[season.i] + except KeyError: + raise ExpectedError("season %d not found in video dir `%s'" % + (season.i, vdir.dir)) + try: src = s.episodes[ep_i] + except KeyError: + raise ExpectedError("episode %d.%d not found in video dir `%s'" % + (season.i, ep_i, vdir.dir)) episode = season.add_episode(fake_epi, neps, title, src, i) chapter = None