X-Git-Url: https://git.distorted.org.uk/~mdw/epls/blobdiff_plain/1766dcfb5f4bd45bb5e5cfbe88e024070a7a6b17..017188769528344839a7699c4528ad7cd26e443e:/mkm3u?ds=sidebyside diff --git a/mkm3u b/mkm3u index 596c223..9c50c3e 100755 --- a/mkm3u +++ b/mkm3u @@ -81,7 +81,7 @@ URL_SAFE_P = 256*[False] for ch in \ b"ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ b"abcdefghijklmnopqrstuvwxyz" \ - b"0123456789" b"!$%-.,/": + b"0123456789" b"!$%_-.,/": URL_SAFE_P[ch] = True def urlencode(s): return "".join((URL_SAFE_P[ch] and chr(ch) or "%%%02x" % ch @@ -545,33 +545,28 @@ class Playlist (object): (ch.duration, label, ch.title, ch.url)) def dump(me, f): + if opts.list_name is not None: f.write("LIST %s\n" % opts.list_name) if me.series_title is not None and \ me.nseries > 1 and not me.single_series_p: raise ExpectedError("can't force series name for multi-series list") - six, series = 0, {} - prefix = None + series = set() if me.single_series_p: - series["-"] = "S0" - f.write("SERIES S0 %s\n" % quote(me.series_title)) + f.write("SERIES - %s\n" % quote(me.series_title)) for season in me.seasons: for ep in season: + label = ep.label() + title = ep.season.series.full_title if me.single_series_p: - prefix = ep.season.series.full_title - stag = "S0" + stag = "-" + if title is not None: label = title + " " + label else: - skey = ep.season.series - try: - stag = series[skey] - except KeyError: - stag = "S%d" % six - series[skey] = stag - six += 1 - title = ep.season.series.full_title - if title is None: title = me.series_title + if title is None: title = me.series_title + stag = ep.season.series.name + if stag is None: stag = "-" + if stag not in series: f.write("SERIES %s %s\n" % (stag, quote(title))) - label = ep.label() - if prefix is not None: label = prefix + " " + label - f.write("ENTRY %s %s %s %d %d %d %d\n" % + series.add(stag) + f.write("ENTRY %s %s %s %d %d %d %g\n" % (stag, quote(label), quote(ep.source.fn), ep.tno, ep.start_chapter, ep.end_chapter, ep.duration)) @@ -889,12 +884,15 @@ class EpisodeListParser (object): return me._pl op = OP.OptionParser \ - (usage = "%prog [-Dc] [-M DEPS] [-d CACHE] [-o OUT] [-s SERIES] EPLS\n" + (usage = "%prog [-Dc] [-L NAME] [-M DEPS] [-d CACHE] [-o OUT] [-s SERIES] EPLS\n" "%prog -i -d CACHE", description = "Generate M3U playlists from an episode list.") op.add_option("-D", "--dump", dest = "dump", action = "store_true", default = False, help = "Dump playlist in machine-readable form") +op.add_option("-L", "--list-name", metavar = "NAME", + dest = "list_name", type = "str", default = None, + help = "Set the playlist name") op.add_option("-M", "--make-deps", metavar = "DEPS", dest = "deps", type = "str", default = None, help = "Write a `make' fragment for dependencies") @@ -947,6 +945,9 @@ try: ep.parse_file(argv[0]) pl = ep.done() + if opts.list_name is None: + opts.list_name, _ = OS.path.splitext(OS.path.basename(argv[0])) + if opts.dump: outfn = pl.dump else: outfn = pl.write if opts.output is None or opts.output == "-":