feat: add refresh playlist functionality
This commit is contained in:
@@ -170,6 +170,37 @@ def delete_playlist(playlist_id):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
flash(f'Failed to remove item: {str(e)}')
|
flash(f'Failed to remove item: {str(e)}')
|
||||||
|
|
||||||
|
@app.route('/refresh_playlist/<playlist_id>', methods=['GET'])
|
||||||
|
@functions.jellyfin_admin_required
|
||||||
|
def refresh_playlist(playlist_id):
|
||||||
|
# get the playlist from the database using the playlist_id
|
||||||
|
playlist = Playlist.query.filter_by(jellyfin_id=playlist_id).first()
|
||||||
|
# if the playlist has a jellyfin_id, then fetch the playlist from Jellyfin
|
||||||
|
if playlist.jellyfin_id:
|
||||||
|
try:
|
||||||
|
app.logger.debug(f"removing all tracks from playlist {playlist.jellyfin_id}")
|
||||||
|
jellyfin_playlist = jellyfin.get_music_playlist(session_token=functions._get_api_token(), playlist_id=playlist.jellyfin_id)
|
||||||
|
jellyfin.remove_songs_from_playlist(session_token=functions._get_token_from_sessioncookie(), playlist_id=playlist.jellyfin_id, song_ids=[track for track in jellyfin_playlist['ItemIds']])
|
||||||
|
ordered_tracks = db.session.execute(
|
||||||
|
db.select(Track, playlist_tracks.c.track_order)
|
||||||
|
.join(playlist_tracks, playlist_tracks.c.track_id == Track.id)
|
||||||
|
.where(playlist_tracks.c.playlist_id == playlist.id)
|
||||||
|
.order_by(playlist_tracks.c.track_order)
|
||||||
|
).all()
|
||||||
|
|
||||||
|
tracks = [track.jellyfin_id for track, idx in ordered_tracks if track.jellyfin_id is not None]
|
||||||
|
#jellyfin.remove_songs_from_playlist(session_token=jellyfin_admin_token, playlist_id=playlist.jellyfin_id, song_ids=tracks)
|
||||||
|
jellyfin.add_songs_to_playlist(session_token=functions._get_api_token(), user_id=functions._get_admin_id(), playlist_id=playlist.jellyfin_id, song_ids=tracks)
|
||||||
|
# if the playlist is found, then update the playlist metadata
|
||||||
|
provider_playlist = MusicProviderRegistry.get_provider(playlist.provider_id).get_playlist(playlist.provider_playlist_id)
|
||||||
|
functions.update_playlist_metadata(playlist, provider_playlist)
|
||||||
|
flash('Playlist refreshed')
|
||||||
|
return jsonify({'success': True})
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
flash(f'Failed to refresh playlist: {str(e)}')
|
||||||
|
return jsonify({'success': False})
|
||||||
|
|
||||||
|
|
||||||
@app.route('/wipe_playlist/<playlist_id>', methods=['DELETE'])
|
@app.route('/wipe_playlist/<playlist_id>', methods=['DELETE'])
|
||||||
@functions.jellyfin_admin_required
|
@functions.jellyfin_admin_required
|
||||||
|
|||||||
@@ -119,6 +119,23 @@ class JellyfinClient:
|
|||||||
else:
|
else:
|
||||||
raise Exception(f"Failed to update playlist: {response.content}")
|
raise Exception(f"Failed to update playlist: {response.content}")
|
||||||
|
|
||||||
|
def get_music_playlist(self, session_token : str, playlist_id: str):
|
||||||
|
"""
|
||||||
|
Get a music playlist by its ID.
|
||||||
|
:param playlist_id: The ID of the playlist to fetch.
|
||||||
|
:return: The playlist object
|
||||||
|
"""
|
||||||
|
url = f'{self.base_url}/Playlists/{playlist_id}'
|
||||||
|
self.logger.debug(f"Url={url}")
|
||||||
|
|
||||||
|
response = requests.get(url, headers=self._get_headers(session_token=session_token), timeout = self.timeout)
|
||||||
|
self.logger.debug(f"Response = {response.status_code}")
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return response.json()
|
||||||
|
else:
|
||||||
|
raise Exception(f"Failed to get playlist: {response.content}")
|
||||||
|
|
||||||
def get_playlist_metadata(self, session_token: str, user_id: str,playlist_id: str) -> PlaylistMetadata:
|
def get_playlist_metadata(self, session_token: str, user_id: str,playlist_id: str) -> PlaylistMetadata:
|
||||||
url = f'{self.base_url}/Items/{playlist_id}'
|
url = f'{self.base_url}/Items/{playlist_id}'
|
||||||
params = {
|
params = {
|
||||||
|
|||||||
@@ -9,6 +9,29 @@
|
|||||||
<p>{{ item.track_count }} songs, {{ total_duration }}</p>
|
<p>{{ item.track_count }} songs, {{ total_duration }}</p>
|
||||||
<p>Last Updated: {{ item.last_updated}} | Last Change: {{ item.last_changed}}</p>
|
<p>Last Updated: {{ item.last_updated}} | Last Change: {{ item.last_changed}}</p>
|
||||||
{% include 'partials/_add_remove_button.html' %}
|
{% include 'partials/_add_remove_button.html' %}
|
||||||
|
{% if session['is_admin'] and item.jellyfin_id %}
|
||||||
|
<p>
|
||||||
|
<button id="refresh-playlist-btn" class="btn btn-primary mt-2">Refresh Playlist in Jellyfin</button>
|
||||||
|
<script>
|
||||||
|
document.getElementById('refresh-playlist-btn').addEventListener('click', function() {
|
||||||
|
fetch(`/refresh_playlist/{{item.jellyfin_id}}`)
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
if (data.success) {
|
||||||
|
alert('Playlist refreshed successfully');
|
||||||
|
} else {
|
||||||
|
alert('Failed to refresh playlist');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Error:', error);
|
||||||
|
alert('An error occurred while refreshing the playlist');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
Reference in New Issue
Block a user