82 lines
2.7 KiB
Python
82 lines
2.7 KiB
Python
#!/usr/bin/env python3
|
|
import sys, os, json, urllib.request, urllib.parse
|
|
|
|
LRCLIB = "https://lrclib.net/api/search"
|
|
|
|
|
|
def norm(s):
|
|
return "".join(ch for ch in (s or "") if ch.isalnum() or "\u4e00" <= ch <= "\u9fff").lower()
|
|
|
|
|
|
def http_get(url):
|
|
req = urllib.request.Request(url, headers={
|
|
"User-Agent": "lyrics-plugin/1.0",
|
|
"Accept": "application/json",
|
|
})
|
|
with urllib.request.urlopen(req, timeout=15) as r:
|
|
return r.read().decode("utf-8", "ignore")
|
|
|
|
|
|
def main():
|
|
raw = sys.argv[1] if len(sys.argv) > 1 else ""
|
|
title, artist, album = "test", "", ""
|
|
if raw and os.path.isfile(raw):
|
|
try:
|
|
with open(raw, encoding="utf-8") as f:
|
|
lines = [l.strip() for l in f.read().splitlines()]
|
|
title = lines[0] if lines else "test"
|
|
artist = lines[1] if len(lines) > 1 else ""
|
|
album = lines[2] if len(lines) > 2 else ""
|
|
except Exception as e:
|
|
out = {"type": "none", "lines": [], "lrc": "", "diag": [f"query_file_read_err={e!r}"]}
|
|
print(json.dumps(out, ensure_ascii=False))
|
|
return
|
|
else:
|
|
title = raw or "test"
|
|
|
|
out = {"type": "none", "lines": [], "lrc": "", "diag": []}
|
|
try:
|
|
q = urllib.parse.urlencode({"track_name": title, "artist_name": artist or title})
|
|
s = json.loads(http_get(LRCLIB + "?" + q))
|
|
if not s:
|
|
out["diag"].append("lrclib: no results")
|
|
print(json.dumps(out, ensure_ascii=False))
|
|
return
|
|
|
|
nart = norm(artist)
|
|
nalb = norm(album)
|
|
ntitle = norm(title)
|
|
best = None
|
|
for c in s:
|
|
cn = norm(c.get("trackName", ""))
|
|
ca = norm(c.get("artistName", ""))
|
|
if ntitle and cn != ntitle and ntitle not in cn and cn not in ntitle:
|
|
continue
|
|
if nart and ca and (nart in ca or ca in nart):
|
|
best = c
|
|
break
|
|
if nalb and norm(c.get("albumName", "")) == nalb:
|
|
best = c
|
|
break
|
|
if best is None:
|
|
best = c
|
|
if best is None:
|
|
best = s[0]
|
|
|
|
lrc = best.get("syncedLyrics") or best.get("plainLyrics") or ""
|
|
if not lrc:
|
|
out["diag"].append("lrclib: empty lyrics")
|
|
print(json.dumps(out, ensure_ascii=False))
|
|
return
|
|
out["lrc"] = lrc
|
|
out["type"] = "lrc"
|
|
out["diag"].append(f"lrclib: {best.get('trackName')} / {best.get('artistName')} synced={bool(best.get('syncedLyrics'))}")
|
|
print(json.dumps(out, ensure_ascii=False))
|
|
except Exception as e:
|
|
out["diag"].append(f"lrclib ERR: {e!r}")
|
|
print(json.dumps(out, ensure_ascii=False))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|