#!/usr/bin/env python3 """Generate HTML index file from playlist HTMLs and MP3 filenames""" import sys import glob import string import re from datetime import date, timedelta from html.parser import HTMLParser import pystache CHARSET = "ISO8859-1" # Windows-1252 for older playlists def getcorrdate(mp3file): """Get corresponding date for MP3 file. If hour = 0, use previous day""" ymd = PREFIXES.sub("", mp3file)[0:10] if ymd[8:10] == "00": ymd = (date(int(ymd[0:4]), int(ymd[4:6]), int(ymd[6:8])) - timedelta(days=1)).strftime("%Y%m%d") return ymd[0:8] def processmp3list(mp3files): """Create a dictionary of MP3 files keyed by 8-digit date""" mp3dict = {} for mp3file in mp3files: ymd = getcorrdate(mp3file) if ymd in mp3dict: mp3dict[ymd].append(mp3file) else: mp3dict[ymd] = [mp3file] return mp3dict def findattr(attrs, name): """Return value of attribute with name or None""" for attr in attrs: if attr[0] == name: return attr[1] return None class MyHTMLParser(HTMLParser): #pylint: disable=W0223 """Parser that will process a playlist HTML file""" def handle_starttag(self, tag, attrs): if tag != "meta": return name = findattr(attrs, "name") if not name: return name = name.lower() content = findattr(attrs, "content") if WANTED.match(name) and content: INFO[name] = content if name.find("date") >= 0 else bytes( content, "raw-unicode-escape").decode(CHARSET, "replace").encode(CHARSET) def parseplaylist(hfile): """Parse one playlist file""" parser = MyHTMLParser() try: file = open(hfile, encoding=CHARSET) except OSError: print(f"Cannot open {hfile}") return parser.feed(file.read()) file.close() def getbestdate(hfile, info): """Use the best metadata for date""" if DATEPREF.match(hfile): best = DATEPREF.sub("", hfile)[0:8] elif "date" in INFO: best = info["date"] if not best or not DIGITS.match(best): # use the other date best = info["abc-datereversed"] return best def getbesttitle(info): """Use the best metadata for title""" if "dc.title" in info: return info["dc.title"] elif "title" in info: return info["title"] return "No title" def isodate(ymd): """Return ISO formatted date from 8-digit date""" return ymd[0:4] + "-" + ymd[4:6] + "-" + ymd[6:8] def makedictentry(ymd, hfile, ttl, descr): """Make a (unique) entry for playlist dictionary""" if isinstance(PLDICT[ymd], list): PLDICT[ymd] = {"htmfile": hfile, "mp3files": PLDICT[ymd], "ISODate": isodate(ymd), "title": ttl, "description": descr} else: # append some fields replace = None for letter in list(string.ascii_lowercase): if not ymd + letter in PLDICT: replace = letter break if not replace: return ymdl = ymd + replace PLDICT[ymdl] = {"htmfile": hfile, "mp3files": PLDICT[ymd]['mp3files'], "ISODate": isodate(ymd), "title": ttl, "description": descr} def render(proglist): """Render the list as a web page""" renderer = pystache.Renderer() print("""
Playlist | Audio | Description |
---|---|---|
{{{title}}} | {{#mp3files}}{{#.}}MP3 {{/.}}{{/mp3files}} | {{ISODate}} {{{description}}} |