-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
play_composer_album.py
120 lines (107 loc) · 3.91 KB
/
play_composer_album.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
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("-a", "--album", help="album search term")
parser.add_argument("-c", "--composer", help="composer search term")
parser.add_argument("-X", "--exalbum", help="album exclude search term")
parser.add_argument("-x", "--excomposer", help="composer exclude search term")
parser.add_argument("-z", "--zone", help="zone selection")
args = parser.parse_args()
if args.album:
albumsearch = args.album
else:
albumsearch = config['DEFAULT']['DefaultAlbum']
if args.composer:
composersearch = args.composer
else:
composersearch = config['DEFAULT']['DefaultComposer']
if args.exalbum:
exalbumsearch = args.exalbum
else:
exalbumsearch = None
if args.excomposer:
excomposersearch = args.excomposer
else:
excomposersearch = 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 composers
composers = roonapi.list_media(output_id,
["Library",
"Composers", composersearch])
if composers:
album = None
for composer in composers:
if excomposersearch is not None:
if excomposersearch in composer:
continue
# List matching albums
albums = roonapi.list_media(output_id,
["Library",
"Composers", composer, albumsearch])
if exalbumsearch is not None and albums:
albums = [chk for chk in albums if exalbumsearch not in chk]
if albums:
album = albums[0]
print("Playing album title", album, "by composer", composer)
roonapi.play_media(output_id,
["Library",
"Composers", composer, album], None, False)
if len(albums) > 1:
print("\nAlbum titles by", composer,
"composer matching", albumsearch, ":\n")
print(*albums, sep="\n")
print("\nTo play another album by this composer by title either specify")
print("the full title or enough of a substring to provide a single match\n")
break
if album is None:
print("No albums found matching", albumsearch)
else:
print("No composers found matching", composersearch)