chiark
/
gitweb
/
~mdw
/
epls
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
fb7a89e
)
mkm3u: Introduce hacks to inhibit DVD menu handling.
author
Mark Wooding
<mdw@distorted.org.uk>
Mon, 3 Jun 2024 21:34:50 +0000
(22:34 +0100)
committer
Mark Wooding
<mdw@distorted.org.uk>
Mon, 3 Jun 2024 21:34:50 +0000
(22:34 +0100)
mkm3u
patch
|
blob
|
blame
|
history
diff --git
a/mkm3u
b/mkm3u
index ea60ddc5ee7d46d9213383cc954f707275a79ea7..6fc83e4560404689aeb05628032d5fefae77cc92 100755
(executable)
--- a/
mkm3u
+++ b/
mkm3u
@@
-136,12
+136,17
@@
class Source (object):
PREFIX = ""
TITLEP = CHAPTERP = False
PREFIX = ""
TITLEP = CHAPTERP = False
- def __init__(me, fn):
+ def __init__(me, fn
, prefix = None
):
me.fn = fn
me.neps = None
me.used_titles = set()
me.used_chapters = set()
me.nuses = 0
me.fn = fn
me.neps = None
me.used_titles = set()
me.used_chapters = set()
me.nuses = 0
+ me._pfx = prefix
+
+ def _prefix(me):
+ if me._pfx is not None: return me._pfx
+ else: return me.PREFIX
def _duration(me, title, start_chapter, end_chapter):
return -1
def _duration(me, title, start_chapter, end_chapter):
return -1
@@
-224,14
+229,16
@@
class Source (object):
else:
for ch in range(start_chapter, end_chapter):
me.used_chapters.add((title, ch))
else:
for ch in range(start_chapter, end_chapter):
me.used_chapters.add((title, ch))
- return me.
PREFIX
+ ROOT + urlencode(me.fn) + suffix, duration
+ return me.
_prefix()
+ ROOT + urlencode(me.fn) + suffix, duration
class DVDFile (Source):
PREFIX = "dvd://"
TITLEP = CHAPTERP = True
class DVDFile (Source):
PREFIX = "dvd://"
TITLEP = CHAPTERP = True
- def __init__(me, fn, *args, **kw):
- super().__init__(fn, *args, **kw)
+ def __init__(me, fn, menuhack = False, *args, **kw):
+ pfx = None
+ if menuhack: pfx = "dvdsimple://"
+ super().__init__(fn, prefix = pfx, *args, **kw)
me.neps = 0
def _duration(me, title, start_chapter, end_chapter):
me.neps = 0
def _duration(me, title, start_chapter, end_chapter):
@@
-278,21
+285,21
@@
class DVDDir (object):
list(map(lambda pat:
RX.compile("^" + pat + r"\.iso$", RX.X),
pats)),
list(map(lambda pat:
RX.compile("^" + pat + r"\.iso$", RX.X),
pats)),
- [[r""" S (?P<si> \d+) \. \ (?P<stitle> .*) — (?: D
\d+
\. \ )?
+ [[r""" S (?P<si> \d+) \. \ (?P<stitle> .*) — (?: D
(?P<di> \d+)
\. \ )?
(?P<epex> .*) """,
(?P<epex> .*) """,
- r""" S (?P<si> \d+) (?: D
\d+
)? \. \ (?P<epex> .*) """,
+ r""" S (?P<si> \d+) (?: D
(?P<di> \d+)
)? \. \ (?P<epex> .*) """,
r""" S (?P<si> \d+) \. \ (?P<epex> E \d+ .*) """,
r""" S (?P<si> \d+) \. \ (?P<epex> E \d+ .*) """,
- r""" S (?P<si> \d+)
(?P<epex> E
\d+) \. \ .* """],
+ r""" S (?P<si> \d+)
E (?P<ei>
\d+) \. \ .* """],
[r""" (?P<si> \d+) [A-Z]? \. \ (?P<stitle> .*) — (?P<epex> .*) """],
[r""" (?P<si> \d+) [A-Z]? \. \ (?P<stitle> .*) — (?P<epex> .*) """],
- [r"""
\d+
\. \ (?P<epex> [ES] \d+ .*) """],
- [r""" (?P<e
pnum
> \d+ ) \. \ .* """]]))
+ [r"""
(?P<di> \d+)
\. \ (?P<epex> [ES] \d+ .*) """],
+ [r""" (?P<e
i
> \d+ ) \. \ .* """]]))
_R_ISO_EP = RX.compile(r""" ^
(?: S (?P<si> \d+) \ )?
E (?P<ei> \d+) (?: – (?P<ej> \d+))? $
""", RX.X)
_R_ISO_EP = RX.compile(r""" ^
(?: S (?P<si> \d+) \ )?
E (?P<ei> \d+) (?: – (?P<ej> \d+))? $
""", RX.X)
- def __init__(me, dir):
+ def __init__(me, dir
, hacks
):
me.dir = dir
fns = OS.listdir(OS.path.join(ROOT, dir))
fns.sort()
me.dir = dir
fns = OS.listdir(OS.path.join(ROOT, dir))
fns.sort()
@@
-330,12
+337,23
@@
class DVDDir (object):
check(stitle == season.title,
"season title `%s' /= `%s'" % (stitle, season.title))
check(stitle == season.title,
"season title `%s' /= `%s'" % (stitle, season.title))
- disc = DVDFile(path)
ts = season
any, bad = False, False
ts = season
any, bad = False, False
- e
pnum = match_group(m, "epnum
")
- if e
pnum is not None: eplist = ["E" + epnum
]
+ e
i = match_group(m, "ei
")
+ if e
i is not None: eplist = ["E" + ei
]
else: eplist = match_group(m, "epex", mustp = True).split(", ")
else: eplist = match_group(m, "epex", mustp = True).split(", ")
+
+ di = filter(match_group(m, "di"), int)
+ discid = ""
+ if si is not None: discid += "S%02d" % si
+ if di is not None: discid += "D%02d" % di
+ elif ei is not None: discid += "E%02d" % int(ei)
+ menuhack = False
+ for h in hacks.get(discid, []):
+ if h == "menu": menuhack = True
+ else: raise ExpectedError("unknown hack `%s'" % h)
+ disc = DVDFile(path, menuhack)
+
for eprange in eplist:
mm = me._R_ISO_EP.match(eprange)
if mm is None:
for eprange in eplist:
mm = me._R_ISO_EP.match(eprange)
if mm is None:
@@
-650,6
+668,7
@@
class EpisodeListParser (object):
me._series_wanted = series_wanted
me._chaptersp = chapters_wanted_p
me._explen, me._expvar = None, DEFAULT_EXPVAR
me._series_wanted = series_wanted
me._chaptersp = chapters_wanted_p
me._explen, me._expvar = None, DEFAULT_EXPVAR
+ me._hacks = {}
if series_wanted is None: me._mode = MODE_UNSET
else: me._mode = MODE_MULTI
if series_wanted is None: me._mode = MODE_UNSET
else: me._mode = MODE_MULTI
@@
-745,8
+764,7
@@
class EpisodeListParser (object):
elif cmd == "season":
series = me._opts_series(cmd, opts)
elif cmd == "season":
series = me._opts_series(cmd, opts)
- w = ww.nextword();
- check(w is not None, "missing season number")
+ w = ww.nextword(); check(w is not None, "missing season number")
if w == "-":
if not series.wantedp: return
series.add_movies(ww.rest())
if w == "-":
if not series.wantedp: return
series.add_movies(ww.rest())
@@
-781,22
+799,34
@@
class EpisodeListParser (object):
if not series.wantedp: return
series.ensure_season().ep_i = epi
if not series.wantedp: return
series.ensure_season().ep_i = epi
- elif cmd == "dvd":
+ elif cmd == "hacks":
+ series = me._opts_series(cmd, opts)
+ discid = ww.nextword(); check(discid is not None, "missing disc id")
+ hh = me._hacks.setdefault(series.name, {}).setdefault(discid, [])
+ while True:
+ h = ww.nextword()
+ if h is None: break
+ hh.append(h)
+
+ elif cmd == "dvd" or cmd == "dvdsimple":
series = me._opts_series(cmd, opts)
fn = ww.rest(); check(fn is not None, "missing filename")
series = me._opts_series(cmd, opts)
fn = ww.rest(); check(fn is not None, "missing filename")
+ menuhack = cmd == "dvdsimple"
if not series.wantedp: return
if fn == "-": forget(me._isos, series.name)
else:
check(OS.path.exists(OS.path.join(ROOT, fn)),
"dvd iso file `%s' not found" % fn)
if not series.wantedp: return
if fn == "-": forget(me._isos, series.name)
else:
check(OS.path.exists(OS.path.join(ROOT, fn)),
"dvd iso file `%s' not found" % fn)
- me._isos[series.name] = DVDFile(fn)
+ me._isos[series.name] = DVDFile(fn
, menuhack
)
elif cmd == "dvddir":
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._vdirs, series.name)
elif cmd == "dvddir":
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._vdirs, series.name)
- else: me._vdirs[series.name] = DVDDir(dir)
+ else:
+ me._vdirs[series.name] = \
+ DVDDir(dir, me._hacks.get(series.name, {}))
elif cmd == "vdir":
series = me._opts_series(cmd, opts)
elif cmd == "vdir":
series = me._opts_series(cmd, opts)