X-Git-Url: https://git.distorted.org.uk/~mdw/epls/blobdiff_plain/6a388c2dee94cb50e94bad16b446a6593c901a11..fd3b422fb6c809f7f08463d95538477380ddaeb9:/mkm3u?ds=sidebyside diff --git a/mkm3u b/mkm3u index 046373f..2e2f5cd 100755 --- a/mkm3u +++ b/mkm3u @@ -94,31 +94,41 @@ class Source (object): me.used_titles = dict() me.used_chapters = set() me.nuses = 0 - def url(me, title = None, chapter = None): + def url(me, title = None, start_chapter = None, end_chapter = None): if title == "-": if me.TITLEP: raise ExpectedError("missing title number") - if chapter is not None: + if start_chapter is not None or end_chapter is not None: raise ExpectedError("can't specify chapter without title") suffix = "" elif not me.TITLEP: raise ExpectedError("can't specify title with `%s'" % me.fn) - elif chapter is None: + elif start_chapter is None: + if end_chapter is not None: + raise ExpectedError("can't specify end chapter without start chapter") suffix = "#%d" % title elif not me.CHAPTERP: raise ExpectedError("can't specify chapter with `%s'" % me.fn) + elif end_chapter is None: + suffix = "#%d:%d" % (title, start_chapter) 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 == "-": - 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)) + suffix = "#%d:%d-%d:%d" % (title, start_chapter, title, end_chapter - 1) + if end_chapter is not None: + keys = [(title, ch) for ch in range(start_chapter, end_chapter)] + set = me.used_chapters + else: + keys, set = [title], me.used_titles + for k in keys: + if k in set: + if title == "-": + raise ExpectedError("`%s' already used" % me.fn) + elif end_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, k[1])) + if end_chapter is not None: + for ch in range(start_chapter, end_chapter): + me.used_chapters.add((title, ch)) return me.PREFIX + ROOT + urlencode(me.fn) + suffix class VideoDisc (Source): @@ -262,15 +272,15 @@ class AudioDir (object): class Chapter (object): def __init__(me, episode, title, i): me.title, me.i = title, i - me.url = episode.source.url(episode.tno, i) + me.url = episode.source.url(episode.tno, i, i + 1) class Episode (object): - def __init__(me, season, i, neps, title, src, tno = None): + def __init__(me, season, i, neps, title, src, tno = None, startch = 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) + me.url = src.url(tno, startch, None) def add_chapter(me, title, j): ch = Chapter(me, title, j) me.chapters.append(ch) @@ -284,8 +294,8 @@ class BaseSeason (object): me.episodes = [] me.implicitp = implicitp me.ep_i, episodes = 1, [] - def add_episode(me, j, neps, title, src, tno): - ep = Episode(me, j, neps, title, src, tno) + def add_episode(me, j, neps, title, src, tno, startch): + ep = Episode(me, j, neps, title, src, tno, startch) me.episodes.append(ep) src.nuses += neps; me.ep_i += neps return ep @@ -310,9 +320,9 @@ class Season (BaseSeason): return label class MovieSeason (BaseSeason): - def add_episode(me, j, neps, title, src, tno): + def add_episode(me, j, neps, title, src, tno, startch): if title is None: raise ExpectedError("movie must have a title") - return super().add_episode(j, neps, title, src, tno) + return super().add_episode(j, neps, title, src, tno, startch) def _eplabel(me, i, epn, title): return title @@ -492,7 +502,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 + ti = None; sname = None; neps = 1; epi = None; ch = None for k, v in me._keyvals(opts): if k is None: if v.isdigit(): ti = int(v) @@ -501,6 +511,7 @@ 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) else: raise ExpectedError("unknown episode option `%s'" % k) check(ti is not None, "missing title number") series = me._get_series(sname) @@ -530,7 +541,7 @@ class EpisodeListParser (object): "episode %d.%d not found in video dir `%s'" % (season.i, season.ep_i, dir.dir)) - episode = season.add_episode(epi, neps, title, src, ti) + episode = season.add_episode(epi, neps, title, src, ti, ch) me._pl.add_episode(episode) me._cur_episode = episode