""", RX.X)
_R_ISO_EP = RX.compile(r""" ^
+ (?: S (?P<si> \d+) \ )?
E (?P<ei> \d+) (?: – (?P<ej> \d+))? $
""", RX.X)
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)