-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathplay_artist_track.py
134 lines (121 loc) · 4.58 KB
/
play_artist_track.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import argparse
import configparser
from os import path
import signal
import sys
from roonapi import RoonApi
def signal_handler(sig, frame):
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
config = configparser.ConfigParser()
config.read('/usr/local/Roon/etc/roon_api.ini')
# Set to IP address of your Roon Core
server = config['DEFAULT']['RoonCoreIP']
# Set to Port of your Roon Core
port = config['DEFAULT']['RoonCorePort']
# Name of the file that holds a Roon API token
tokenfile = config['DEFAULT']['TokenFileName']
parser = argparse.ArgumentParser()
parser.add_argument("-t", "--track", help="track search term")
parser.add_argument("-a", "--artist", help="artist search term")
parser.add_argument("-X", "--extrack", help="track exclude search term")
parser.add_argument("-x", "--exartist", help="artist exclude search term")
parser.add_argument("-z", "--zone", help="zone selection")
args = parser.parse_args()
if args.track:
tracksearch = args.track
else:
tracksearch = "__all__"
if args.artist:
artistsearch = args.artist
else:
artistsearch = config['DEFAULT']['DefaultArtist']
if args.extrack:
extracksearch = args.extrack
else:
extracksearch = None
if args.exartist:
exartistsearch = args.exartist
else:
exartistsearch = None
if args.zone:
target_zone = args.zone
else:
target_zone = config['DEFAULT']['DefaultZone']
version = config['DEFAULT']['RoonCommandLineVersion']
release = config['DEFAULT']['RoonCommandLineRelease']
fullver = version + "-" + release
appinfo = {
"extension_id": "roon_command_line",
"display_name": "Python library for Roon",
"display_version": fullver,
"publisher": "RoonCommandLine",
"email": "roon@ronrecord.com",
"website": "https://github.com/doctorfree/RoonCommandLine",
}
# Can be None if you don't yet have a token
if path.exists(tokenfile):
token = open(tokenfile).read()
else:
token = "None"
roonapi = RoonApi(appinfo, token, server, port)
# save the token for next time
with open(tokenfile, "w") as f:
f.write(str(roonapi.token))
# get target zone output_id
outputs = roonapi.outputs
output_id = None
for (k, v) in outputs.items():
if target_zone in v["display_name"]:
output_id = k
if output_id is None:
err = "No zone found matching " + target_zone
sys.exit(err)
else:
# List matching artists
artists = roonapi.list_media(output_id,
["Library",
"Artists",
artistsearch])
if artists:
track = None
for artist in artists:
if exartistsearch is not None:
if exartistsearch in artist:
continue
# Search through this artist's albums for specified track
albums = roonapi.list_media(output_id,
["Library",
"Artists",
artist, "__all__"])
if albums:
for album in albums:
# List matching tracks
tracks = roonapi.list_media(output_id,
["Library",
"Artists",
artist, album,
tracksearch])
if extracksearch is not None and tracks:
tracks = [
chk for chk in tracks if extracksearch not in chk]
if tracks:
track = tracks[0]
print("Playing track title", track,
"on album", album, "by artist", artist)
roonapi.play_media(output_id,
["Library", "Artists",
artist, album, track], None, False)
if len(tracks) > 1:
print("\nTrack titles by", artist,
"artist matching", tracksearch, ":\n")
print(*tracks, sep="\n")
print("\nTo play another track by this artist by title either specify")
print("the full title or enough of a substring to provide a single match\n")
break
if track is not None:
break
if track is None:
print("No tracks found matching", tracksearch)
else:
print("No artists found matching ", artistsearch)