Skip to content

Commit 5bb8bc1

Browse files
authored
Merge pull request #152 from phw/subsonic-playlist-id
Allow specifying subsonic playlist ID to overwrite
2 parents 48ef15d + 0eb0cb6 commit 5bb8bc1

File tree

3 files changed

+26
-12
lines changed

3 files changed

+26
-12
lines changed

troi/cli.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -183,12 +183,13 @@ def info_cmd(patch):
183183
@click.option("-d", "--db_file", help="Database file for the local collection", required=False, is_flag=False)
184184
@click.option('-t', '--threshold', default=.80, help="Minimum match percentage for metadata matches. Must be 0.0 - 1.0")
185185
@click.option('-u', '--upload-to-subsonic', required=False, is_flag=True, help="upload playlist via subsonic API")
186+
@click.option('-i', '--subsonic-id', required=False, help="overwrite existing subsonic playlist with the given ID")
186187
@click.option('-m', '--save-to-m3u', required=False, help="save to specified m3u playlist")
187188
@click.option('-j', '--save-to-jspf', required=False, help="save to specified JSPF playlist")
188189
@click.option('-y', '--dont-ask', required=False, is_flag=True, help="save playlist without asking user")
189190
@click.option('-q', '--quiet', 'quiet', help="Do no print out anything", required=False, is_flag=True)
190191
@click.argument('jspf_playlist')
191-
def resolve(db_file, threshold, upload_to_subsonic, save_to_m3u, save_to_jspf, dont_ask, quiet, jspf_playlist):
192+
def resolve(db_file, threshold, upload_to_subsonic, subsonic_id, save_to_m3u, save_to_jspf, dont_ask, quiet, jspf_playlist):
192193
""" Resolve a global JSPF playlist with MusicBrainz MBIDs to files in the local collection"""
193194
set_log_level(quiet)
194195
db_file = db_file_check(db_file)
@@ -197,20 +198,21 @@ def resolve(db_file, threshold, upload_to_subsonic, save_to_m3u, save_to_jspf, d
197198
lbrl = ListenBrainzRadioLocal(quiet)
198199
playlist = read_jspf_playlist(jspf_playlist)
199200
lbrl.resolve_playlist(threshold, playlist)
200-
output_playlist(db, playlist, upload_to_subsonic, save_to_m3u, save_to_jspf, dont_ask)
201+
output_playlist(db, playlist, upload_to_subsonic, save_to_m3u, save_to_jspf, dont_ask, subsonic_id)
201202

202203

203204
@cli.command(name="lb-radio", context_settings=dict(ignore_unknown_options=True, ))
204205
@click.option("-d", "--db_file", help="Database file for the local collection", required=False, is_flag=False)
205206
@click.option('-t', '--threshold', default=.80, help="Minimum match percentage for metadata matches. Must be 0.0 - 1.0")
206207
@click.option('-u', '--upload-to-subsonic', required=False, is_flag=True, help="upload playlist via subsonic API")
208+
@click.option('-i', '--subsonic-id', required=False, help="overwrite existing subsonic playlist with the given ID")
207209
@click.option('-m', '--save-to-m3u', required=False, help="save to specified m3u playlist")
208210
@click.option('-j', '--save-to-jspf', required=False, help="save to specified JSPF playlist")
209211
@click.option('-y', '--dont-ask', required=False, is_flag=True, help="save playlist without asking user")
210212
@click.option('-q', '--quiet', 'quiet', help="Do no print out anything", required=False, is_flag=True)
211213
@click.argument('mode')
212214
@click.argument('prompt')
213-
def lb_radio(db_file, threshold, upload_to_subsonic, save_to_m3u, save_to_jspf, dont_ask, quiet, mode, prompt):
215+
def lb_radio(db_file, threshold, upload_to_subsonic, subsonic_id, save_to_m3u, save_to_jspf, dont_ask, quiet, mode, prompt):
214216
"""Use LB Radio to create a playlist from a prompt, using a local music collection"""
215217
set_log_level(quiet)
216218
db_file = db_file_check(db_file)
@@ -224,19 +226,20 @@ def lb_radio(db_file, threshold, upload_to_subsonic, save_to_m3u, save_to_jspf,
224226
db.metadata_sanity_check(include_subsonic=upload_to_subsonic)
225227
return
226228

227-
output_playlist(db, playlist, upload_to_subsonic, save_to_m3u, save_to_jspf, dont_ask)
229+
output_playlist(db, playlist, upload_to_subsonic, save_to_m3u, save_to_jspf, dont_ask, subsonic_id)
228230

229231

230232
@cli.command("weekly-jams", context_settings=dict(ignore_unknown_options=True, ))
231233
@click.option("-d", "--db_file", help="Database file for the local collection", required=False, is_flag=False)
232234
@click.option('-t', '--threshold', default=.80, help="Minimum match percentage for metadata matches. Must be 0.0 - 1.0")
233235
@click.option('-u', '--upload-to-subsonic', required=False, is_flag=True, help="upload playlist via subsonic API")
236+
@click.option('-i', '--subsonic-id', required=False, help="overwrite existing subsonic playlist with the given ID")
234237
@click.option('-m', '--save-to-m3u', required=False, help="save to specified m3u playlist")
235238
@click.option('-j', '--save-to-jspf', required=False, help="save to specified JSPF playlist")
236239
@click.option('-y', '--dont-ask', required=False, is_flag=True, help="save playlist without asking user")
237240
@click.option('-q', '--quiet', 'quiet', help="Do no print out anything", required=False, is_flag=True)
238241
@click.argument('user_name')
239-
def periodic_jams(db_file, threshold, upload_to_subsonic, save_to_m3u, save_to_jspf, dont_ask, quiet, user_name):
242+
def periodic_jams(db_file, threshold, upload_to_subsonic, subsonic_id, save_to_m3u, save_to_jspf, dont_ask, quiet, user_name):
240243
"Generate a weekly jams playlist for your local collection"
241244
set_log_level(quiet)
242245
db_file = db_file_check(db_file)
@@ -251,7 +254,7 @@ def periodic_jams(db_file, threshold, upload_to_subsonic, save_to_m3u, save_to_j
251254
db.metadata_sanity_check(include_subsonic=upload_to_subsonic)
252255
return
253256

254-
output_playlist(db, playlist, upload_to_subsonic, save_to_m3u, save_to_jspf, dont_ask)
257+
output_playlist(db, playlist, upload_to_subsonic, save_to_m3u, save_to_jspf, dont_ask, subsonic_id)
255258

256259

257260
@cli.command(context_settings=dict(ignore_unknown_options=True, ))

troi/content_resolver/cli.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
DEFAULT_CHUNKSIZE = 100
2727

2828

29-
def output_playlist(db, playlist, upload_to_subsonic, save_to_m3u, save_to_jspf, dont_ask):
29+
def output_playlist(db, playlist, upload_to_subsonic, save_to_m3u, save_to_jspf, dont_ask, subsonic_id=None):
3030
try:
3131
recording = playlist.playlists[0].recordings[0]
3232
except (KeyError, IndexError):
@@ -43,7 +43,7 @@ def output_playlist(db, playlist, upload_to_subsonic, save_to_m3u, save_to_jspf,
4343

4444
if dont_ask or ask_yes_no_question("Upload via subsonic? (Y/n)"):
4545
logger.info("uploading playlist")
46-
db.upload_playlist(playlist)
46+
db.upload_playlist(playlist, subsonic_id)
4747
return
4848

4949
if save_to_m3u or save_to_jspf:

troi/content_resolver/subsonic.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import datetime
22
import logging
33

4+
from libsonic.errors import DataNotFoundError
45
import peewee
56
from tqdm import tqdm
67

@@ -235,9 +236,7 @@ def update_recordings(self, recordings):
235236
# , subsonic_id = excluded.subsonic_id
236237
# , last_updated = excluded.last_updated""", recordings)
237238

238-
239-
240-
def upload_playlist(self, playlist):
239+
def upload_playlist(self, playlist, playlist_id=None):
241240
"""
242241
Given a Troi playlist, upload the playlist to the subsonic API.
243242
"""
@@ -253,4 +252,16 @@ def upload_playlist(self, playlist):
253252
except KeyError:
254253
continue
255254

256-
conn.createPlaylist(name=playlist.playlists[0].name, songIds=song_ids)
255+
if playlist_id:
256+
try:
257+
remote_playlist = conn.getPlaylist(pid=playlist_id)
258+
conn.updatePlaylist(
259+
lid=playlist_id,
260+
name=playlist.playlists[0].name,
261+
songIdsToAdd=song_ids,
262+
songIndexesToRemove=list(range(0, len(remote_playlist["playlist"]) - 1)),
263+
)
264+
except DataNotFoundError:
265+
conn.createPlaylist(name=playlist.playlists[0].name, songIds=song_ids)
266+
else:
267+
conn.createPlaylist(name=playlist.playlists[0].name, songIds=song_ids)

0 commit comments

Comments
 (0)