#!/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()