raise ExpectedError("bad ep list in `%s'", fn)
me.seasons = seasons
+class SingleFileDir (object):
+
+ _CHECK_COMPLETE = True
+
+ def __init__(me, dir):
+ me.dir = dir
+ fns = OS.listdir(OS.path.join(ROOT, dir))
+ fns.sort()
+ episodes = {}
+ last_i = 0
+ rx = RX.compile(r"""
+ E (\d+)
+ (?: \. \ (.*))?
+ %s $
+ """ % RX.escape(me._EXT), RX.X)
+
+ for fn in fns:
+ path = OS.path.join(dir, fn)
+ if not fn.endswith(me._EXT): continue
+ m = rx.match(fn)
+ if not m: continue
+ i = filter(m.group(1), int)
+ etitle = m.group(2)
+ if me._CHECK_COMPLETE:
+ check(i == last_i + 1, "episode %d /= %d" % (i, last_i + 1))
+ episodes[i] = me._mkepisode(path, i)
+ last_i = i
+ me.episodes = episodes
+
class AudioFile (Source):
PREFIX = "file://"
TITLEP = CHAPTERP = False
super().__init__(fn, *args, **kw)
me.i = i
-class AudioDir (object):
+class AudioDir (SingleFileDir):
+ _EXT = ".flac"
- _R_FLAC = RX.compile(r""" ^
- E (\d+)
- (?: \. \ (.*))?
- \. flac $
- """, RX.X)
+ def _mkepisode(me, path, i):
+ return AudioEpisode(path, i)
- def __init__(me, dir):
- me.dir = dir
- fns = OS.listdir(OS.path.join(ROOT, dir))
- fns.sort()
- episodes = {}
- last_i = 0
- for fn in fns:
- path = OS.path.join(dir, fn)
- if not fn.endswith(".flac"): continue
- m = me._R_FLAC.match(fn)
- if not m: continue
- i = filter(m.group(1), int)
- etitle = m.group(2)
- check(i == last_i + 1, "episode %d /= %d" % (i, last_i + 1))
- episodes[i] = AudioEpisode(path, i)
- last_i = i
- me.episodes = episodes
+class VideoFile (Source):
+ PREFIX = "file://"
+ TITLEP = CHAPTERP = False
+
+ def _duration(me, title, start_chapter, end_chaptwr):
+ out = program_output(["mediainfo", "--output=General;%Duration%",
+ OS.path.join(ROOT, me.fn)])
+ return int(out)//1000
+
+class VideoEpisode (VideoFile):
+ def __init__(me, fn, i, *args, **kw):
+ super().__init__(fn, *args, **kw)
+ me.i = i
+
+class VideoDir (SingleFileDir):
+ _EXT = ".mp4"
+ _CHECK_COMPLETE = False
+
+ def _mkepisode(me, path, i):
+ return VideoEpisode(path, i)
class Chapter (object):
def __init__(me, episode, title, i):
me.nseries = 0
me.single_series_p = False
me.series_title = None
+ me.series_sep = ""
def add_episode(me, episode):
me.episodes.append(episode)
label = ep.label()
if me.nseries > 1 and ep.series_title_p and \
ep.season.series.title is not None:
- if ep.season.i is None: sep = ": "
- else: sep = " "
- label = ep.season.series.title + sep + label
+ if ep.season.i is None: sep = ":"
+ else: sep = me.series_sep
+ label = ep.season.series.title + sep + " " + label
if not ep.chapters:
f.write("#EXTINF:%d,,%s\n%s\n" % (ep.duration, label, ep.url))
else:
title = ep.season.series.full_title
if me.single_series_p:
stag = "-"
- if title is not None: label = title + " " + label
+ if title is not None: label = title + me.series_sep + " " + label
else:
if title is None: title = me.series_title
stag = ep.season.series.name
if dir == "-": forget(me._vdirs, series.name)
else: me._vdirs[series.name] = DVDDir(dir)
+ elif cmd == "vdir":
+ series = me._opts_series(cmd, opts)
+ dir = ww.rest(); check(dir is not None, "missing directory")
+ if not series.wantedp: return
+ if dir == "-": forget(me._sfdirs, series.name)
+ else: me._sfdirs[series.name] = VideoDir(dir)
+
elif cmd == "adir":
series = me._opts_series(cmd, opts)
dir = ww.rest(); check(dir is not None, "missing directory")
src = me._auto_epsrc(series)
src.nuses += n
+ elif cmd == "sep":
+ sep = ww.rest(); check(sep is not None, "missing separator")
+ me._pl.series_sep = sep
+
else:
raise ExpectedError("unknown command `%s'" % cmd)