69 lines
2 KiB
Python
69 lines
2 KiB
Python
"""
|
|
scrobbler
|
|
https://gist.github.com/mvrpl/53f1e377315e6db26c47
|
|
"""
|
|
|
|
import applescript # py-applescript
|
|
import time
|
|
import pylast
|
|
from dotenv import dotenv_values
|
|
|
|
config = dotenv_values(".env")
|
|
|
|
lfm = pylast.LastFMNetwork(
|
|
api_key=config["LFM_KEY"],
|
|
api_secret=config["LFM_SECRET"],
|
|
username=config["USERNAME"],
|
|
password_hash=pylast.md5(config["PASSWORD"]),
|
|
)
|
|
|
|
tell_iTunes = applescript.AppleScript('''
|
|
on is_running(appName)
|
|
tell application "System Events" to (name of processes) contains appName
|
|
end is_running
|
|
|
|
on Playing()
|
|
set iTunesRunning to is_running("Music")
|
|
if iTunesRunning then
|
|
tell application "Music"
|
|
set songId to the database ID of the current track
|
|
set songState to the player state
|
|
set songTitle to the name of the current track
|
|
set songArtist to the artist of the current track
|
|
set songAlbum to the album of the current track
|
|
set songAlbumArtist to the album artist of the current track
|
|
set songDuration to the duration of the current track
|
|
set result to songId & songState & songArtist & songTitle & songAlbum & songDuration & songAlbumArtist
|
|
return result
|
|
end tell
|
|
end if
|
|
end Playing
|
|
''')
|
|
old_id = tracked_id = -1
|
|
runtime = 0
|
|
while True:
|
|
time.sleep(1)
|
|
try:
|
|
out = tell_iTunes.call("Playing")
|
|
except Exception as e:
|
|
print(e)
|
|
continue
|
|
id, state, artist, song, album, duration, album_artist = out
|
|
print(f"{runtime}/{round(duration)}", end="\r")
|
|
if old_id != id:
|
|
print("new song", old_id, id, song)
|
|
runtime = 0
|
|
old_id = id
|
|
if tracked_id == id:
|
|
continue
|
|
if state.code != b"kPSP":
|
|
continue
|
|
if duration < 30:
|
|
print("not tracking", duration)
|
|
old_id = tracked_id = id
|
|
continue
|
|
runtime += 1
|
|
if (runtime >= duration/2 or runtime > 4*60) and tracked_id != id:
|
|
print("scrobbling")
|
|
tracked_id = id
|
|
lfm.scrobble(artist, song, int(time.time() - runtime), album, album_artist, duration)
|