From 4d9e6162fc9af015fc921c361158cd4ae3eaddcb Mon Sep 17 00:00:00 2001 From: Kamil Date: Wed, 11 Dec 2024 20:33:13 +0000 Subject: [PATCH] feat: add quality_score field to Track model and update related functionality Fixes #51 --- app/models.py | 3 ++ app/tasks.py | 18 ++++++++--- config.py | 1 + ...2777a1885a6b_add_quality_score_to_track.py | 32 +++++++++++++++++++ 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 migrations/versions/2777a1885a6b_add_quality_score_to_track.py diff --git a/app/models.py b/app/models.py index 6400f4d..ca8a89e 100644 --- a/app/models.py +++ b/app/models.py @@ -58,9 +58,12 @@ class Track(db.Model): jellyfin_id = db.Column(db.String(120), nullable=True) # Add Jellyfin track ID field download_status = db.Column(db.String(2048), nullable=True) provider_id = db.Column(db.String(20)) + # Many-to-Many relationship with Playlists playlists = db.relationship('Playlist', secondary=playlist_tracks, back_populates='tracks') + lidarr_processed = db.Column(db.Boolean(), default=False) + quality_score = db.Column(db.Float(), default=0) def __repr__(self): return f'' diff --git a/app/tasks.py b/app/tasks.py index f0a7208..eeea749 100644 --- a/app/tasks.py +++ b/app/tasks.py @@ -418,11 +418,18 @@ def update_jellyfin_id_for_downloaded_tracks(self): app.logger.info("Starting Jellyfin ID update for tracks...") with app.app_context(): - downloaded_tracks = Track.query.filter_by(downloaded=True, jellyfin_id=None).all() + downloaded_tracks = Track.query.filter( + Track.downloaded == True, + Track.jellyfin_id == None, + (Track.quality_score < app.config['QUALITY_SCORE_THRESHOLD']) | (Track.quality_score == None) + ).all() if task_manager.acquire_lock(full_update_key, expiration=60*60*24): app.logger.info(f"performing full update on jellyfin track ids. (Update tracks and playlists if better quality will be found)") - downloaded_tracks = Track.query.all() + app.logger.info(f"\tQUALITY_SCORE_THRESHOLD = {app.config['QUALITY_SCORE_THRESHOLD']}") + downloaded_tracks = Track.query.filter( + (Track.quality_score < app.config['QUALITY_SCORE_THRESHOLD']) | (Track.quality_score == None) + ).all() else: app.logger.debug(f"doing update on tracks with downloaded = True and jellyfin_id = None") total_tracks = len(downloaded_tracks) @@ -436,6 +443,7 @@ def update_jellyfin_id_for_downloaded_tracks(self): for track in downloaded_tracks: try: best_match = find_best_match_from_jellyfin(track) + if best_match: track.downloaded = True if track.jellyfin_id != best_match['Id']: @@ -445,7 +453,7 @@ def update_jellyfin_id_for_downloaded_tracks(self): track.filesystem_path = best_match['Path'] app.logger.info(f"Updated filesystem_path for track: {track.name} ({track.provider_track_id})") - + track.quality_score = best_match['quality_score'] db.session.commit() else: @@ -611,7 +619,9 @@ def find_best_match_from_jellyfin(track: Track): if quality_score > best_quality_score: best_match = result best_quality_score = quality_score - + # attach the quality_score to the best_match + if best_match: + best_match['quality_score'] = best_quality_score return best_match except Exception as e: app.logger.error(f"Error searching Jellyfin for track {track.name}: {str(e)}") diff --git a/config.py b/config.py index 500c55d..8dc1b97 100644 --- a/config.py +++ b/config.py @@ -34,6 +34,7 @@ class Config: CHECK_FOR_UPDATES = os.getenv('CHECK_FOR_UPDATES','true').lower() == 'true' SPOTDL_PROXY = os.getenv('SPOTDL_PROXY',None) SPOTDL_OUTPUT_FORMAT = os.getenv('SPOTDL_OUTPUT_FORMAT','__jellyplist/{artist}-{title}.mp3') + QUALITY_SCORE_THRESHOLD = float(os.getenv('QUALITY_SCORE_THRESHOLD',1000.0)) # SpotDL specific configuration SPOTDL_CONFIG = { 'cookie_file': '/jellyplist/cookies.txt', diff --git a/migrations/versions/2777a1885a6b_add_quality_score_to_track.py b/migrations/versions/2777a1885a6b_add_quality_score_to_track.py new file mode 100644 index 0000000..2aa6654 --- /dev/null +++ b/migrations/versions/2777a1885a6b_add_quality_score_to_track.py @@ -0,0 +1,32 @@ +"""Add quality score to Track + +Revision ID: 2777a1885a6b +Revises: 46a65ecc9904 +Create Date: 2024-12-11 20:02:00.303765 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '2777a1885a6b' +down_revision = '46a65ecc9904' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('track', schema=None) as batch_op: + batch_op.add_column(sa.Column('quality_score', sa.Float(), nullable=True)) + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('track', schema=None) as batch_op: + batch_op.drop_column('quality_score') + + # ### end Alembic commands ###