84 lines
2.9 KiB
Python
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()
|