feat: initial implementation of navidrome-music-sync with Yandex, Spotify, Apple, YouTube support and Web UI

This commit is contained in:
Antigravity committed 2026-10-12 11:17:18 +03:00
1 parent 44c67ab49d
commit 5b6c2c72f7
23 files changed
+1445 -2

No files matched your search

+51
View File
@@ -0,0 +1,51 @@
import sys, os, time
from yandex_music import Client
from yandex_music.exceptions import NetworkError
c = Client()
code = c.request_device_code()
print("="*50, flush=True)
print(f"URL: {code.verification_url}", flush=True)
print(f"CODE: {code.user_code}", flush=True)
print("="*50, flush=True)
with open("/tmp/ya_device_status.txt", "w") as f:
f.write(f"URL: {code.verification_url}\nCODE: {code.user_code}\n")
deadline = time.monotonic() + code.expires_in
interval = max(code.interval or 5, 6)
while time.monotonic() < deadline:
try:
token_obj = c.poll_device_token(code.device_code)
if token_obj is not None:
token = token_obj.access_token
print(f"SUCCESS_TOKEN: {token}", flush=True)
with open("/tmp/ya_token.txt", "w") as f:
f.write(token)
# Read and update credentials.txt
cred_path = "/home/ai-projects/memory/credentials.txt"
if os.path.exists(cred_path):
with open(cred_path, "r") as cf:
content = cf.read()
if "yandex_music_token:" not in content:
content += f"\n# Yandex Music Token\nyandex_music_token: {token}\n"
with open(cred_path, "w") as cf:
cf.write(content)
print("CREDENTIALS_UPDATED", flush=True)
sys.exit(0)
except NetworkError as e:
if "429" in str(e):
print("Got 429 rate limit, sleeping 10s...", flush=True)
time.sleep(10)
continue
print(f"Network error: {e}", flush=True)
except Exception as e:
print(f"Error polling: {e}", flush=True)
time.sleep(interval)
print("TIMED_OUT", flush=True)
sys.exit(1)