From 673b9d49ecd8a3878eb732ba29fe88258c9325fe Mon Sep 17 00:00:00 2001 From: Rafael Moraes <50295204+glomatico@users.noreply.github.com> Date: Mon, 9 Mar 2026 09:18:24 -0300 Subject: [PATCH] Add optional DB to register downloaded media --- votify/cli/cli.py | 30 ++++++++++++++++++++++++++++-- votify/cli/cli_config.py | 14 ++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/votify/cli/cli.py b/votify/cli/cli.py index bcbe46e..271f106 100644 --- a/votify/cli/cli.py +++ b/votify/cli/cli.py @@ -12,20 +12,25 @@ from ..api.api import SpotifyApi from ..downloader.audio import SpotifyAudioDownloader from ..downloader.base import SpotifyBaseDownloader from ..downloader.downloader import SpotifyDownloader -from ..downloader.exceptions import VotifyDownloaderException +from ..downloader.exceptions import VotifyDownloaderException, VotifyMediaFileExists from ..downloader.video import SpotifyVideoDownloader from ..interface.audio import SpotifyAudioInterface from ..interface.base import SpotifyBaseInterface from ..interface.enums import AutoMediaOption from ..interface.episode import SpotifyEpisodeInterface from ..interface.episode_video import SpotifyEpisodeVideoInterface -from ..interface.exceptions import VotifyMediaException, VotifyUrlParseException +from ..interface.exceptions import ( + VotifyMediaException, + VotifyMediaFlatFilterException, + VotifyUrlParseException, +) from ..interface.interface import SpotifyInterface from ..interface.music_video import SpotifyMusicVideoInterface from ..interface.song import SpotifySongInterface from ..interface.video import SpotifyVideoInterface from .cli_config import CliConfig from .config_file import ConfigFile +from .database import Database from .utils import CustomLoggerFormatter, prompt_path logger = logging.getLogger(__name__) @@ -79,6 +84,13 @@ async def main(config: CliConfig): if not config.no_drm: wvd_path = prompt_path(config.wvd_path) + if config.database_path: + database = Database(config.database_path) + flat_filter = database.flat_filter + else: + database = None + flat_filter = None + api = await SpotifyApi.create_from_netscape_cookies(cookies_path) base_interface = SpotifyBaseInterface( @@ -108,6 +120,7 @@ async def main(config: CliConfig): music_video=music_video_interface, episode_video=episode_video_interface, prefer_video=config.prefer_video, + flat_filter=flat_filter, ) base_downloader = SpotifyBaseDownloader( @@ -193,6 +206,10 @@ async def main(config: CliConfig): media_title = "Unknown Title" if e.media_metadata and e.media_metadata.get("name"): media_title = e.media_metadata["name"] + + if isinstance(e, VotifyMediaFlatFilterException): + e = VotifyMediaFileExists(media_path=e.result) + logger.warning( download_queue_progress + f' Skipping "{media_title}": {str(e)}' ) @@ -226,6 +243,15 @@ async def main(config: CliConfig): ) finally: download_index += 1 + if ( + database + and item + and item.media + and item.media.media_metadata + and item.staged_path + ): + media_id = item.media.media_metadata["uri"].split(":")[-1] + database.add(media_id, item.final_path) await asyncio.sleep(config.wait_interval) logger.info(f"Finished with {error_count} error(s)") diff --git a/votify/cli/cli_config.py b/votify/cli/cli_config.py index 69d6700..ec849f9 100644 --- a/votify/cli/cli_config.py +++ b/votify/cli/cli_config.py @@ -110,6 +110,20 @@ class CliConfig: is_flag=True, ), ] + database_path: Annotated[ + str, + option( + "--database-path", + help="Path to the SQLite database file for registering downloaded media", + default=None, + type=click.Path( + file_okay=True, + dir_okay=False, + writable=True, + resolve_path=True, + ), + ), + ] # API specific options cookies_path: Annotated[ str,