scrobbler/sync.py
2024-07-07 09:19:48 +03:30

84 lines
2.9 KiB
Python

#!/usr/local/hirad-venv/bin/python
import time
import argparse
import httpcore
import httpx
from libs.networks import Network
from libs.database import Sync
from libs.track import get_track_details, get_duration_mbid
def get_last_lonestar_track():
last_track = lonestar_network.get_tracks(1, None, None)[0]
artist, title, _, date, timestamp = get_track_details(last_track)
print(f"Last LoneStar track: {date} - {artist} - {title} - {timestamp}")
return timestamp
def get_lastfm_tracks(first_ts, last_ts):
tracks_list = lastfm_network.get_tracks(None, first_ts, last_ts)
print(f"There is {len(tracks_list)} tracks from LastFM to be synced to LoneStar.")
for i, track in enumerate(tracks_list):
artist, title, album, date, timestamp = get_track_details(track)
duration, mbid = get_duration_mbid(track)
print(f'{i + 1}. {artist} - {title} - {date} - {timestamp}')
database.write_into(date, artist, title, album, duration, timestamp, mbid)
print("Finished adding tracks to the database")
def sync_scrobbles():
tracks_list = database.select_all()
for i, track in enumerate(tracks_list):
date, artist, title, album, duration, timestamp, mbid = track
print(f"Syncing {i + 1}. {artist} - {title} - {timestamp}")
try:
lonestar_network.scrobble(
artist=artist,
title=title,
album=album,
duration=duration,
timestamp=timestamp,
mbid=mbid
)
drop_track = database.drop_track(title, timestamp)
if drop_track:
print("Track synced and dropped from db")
except Exception as e:
print("An error occurred while syncing", e)
def arguments():
parser = argparse.ArgumentParser(description="Sync scrobbles between LastFM and LoneStar")
parser.add_argument('-q', action='store_true', help="Quiet run. Not asking for timestamps")
args = parser.parse_args()
if args.q:
first_ts = get_last_lonestar_track()
last_ts = int(time.time())
else:
first_ts = input("Enter first track timestamp: ")
if len(first_ts) != 10:
first_ts = get_last_lonestar_track()
last_ts = input("Enter last track timestamp: ")
if len(last_ts) != 10:
last_ts = int(time.time())
return first_ts, last_ts
if __name__ == '__main__':
database = Sync()
lastfm_network = Network(Network.get_network("LastFM"))
lonestar_network = Network(Network.get_network("LoneStar"))
first_timestamp, last_timestamp = arguments()
try:
get_lastfm_tracks(first_timestamp, last_timestamp)
except (httpx.ReadTimeout, httpcore.ReadTimeout) as err:
print("Network read timeout {}. Retrying...".format(err))
time.sleep(2)
get_lastfm_tracks(first_timestamp, last_timestamp)
sync_scrobbles()