From 58e8d92bc3cbcc0e84f64d8037aa09b87d9d9f9b Mon Sep 17 00:00:00 2001 From: sudacode Date: Thu, 13 Mar 2025 11:20:16 -0700 Subject: [PATCH] update --- src/jimaku_dl/cli.py | 16 ---------------- src/jimaku_dl/downloader.py | 7 +++---- tests/test_downloader.py | 33 ++++++++++----------------------- tests/test_parse_filename.py | 33 --------------------------------- 4 files changed, 13 insertions(+), 76 deletions(-) diff --git a/src/jimaku_dl/cli.py b/src/jimaku_dl/cli.py index d68f0e6..a352ca1 100644 --- a/src/jimaku_dl/cli.py +++ b/src/jimaku_dl/cli.py @@ -36,22 +36,6 @@ def parse_args(args: Optional[Sequence[str]] = None) -> argparse.Namespace: parser.add_argument( "-v", "--version", action="version", version=f"jimaku-dl {__version__}" ) - parser = ArgumentParser(description="Download anime subtitles from Jimaku") - parser.add_argument("media_path", help="Path to the media file or directory") - parser.add_argument( - "-d", - "--dest", - help=( - "Directory to save downloaded subtitles " - "(default: same directory as video/input directory)" - ), - ) - parser.add_argument( - "-p", - "--play", - action="store_true", - help="Launch MPV with the subtitle(s) loaded", - ) # Global options parser.add_argument( diff --git a/src/jimaku_dl/downloader.py b/src/jimaku_dl/downloader.py index 97c9b55..2a402cc 100644 --- a/src/jimaku_dl/downloader.py +++ b/src/jimaku_dl/downloader.py @@ -8,7 +8,7 @@ from functools import lru_cache from importlib.util import find_spec from logging import Logger, basicConfig, getLogger from os import environ -from os.path import abspath, basename, dirname, exists, isdir, join, normpath +from os.path import abspath, basename, dirname, exists, isdir, join, normpath, splitext from re import IGNORECASE from re import compile as re_compile from re import search, sub @@ -63,7 +63,7 @@ class JimakuDownloader: self.api_token = api_token or environ.get("JIMAKU_API_TOKEN", "") if not self.api_token: self.logger.warning( - "No API token provided. " "Will need to be set before downloading." + "No API token provided. Will need to be set before downloading." ) def _setup_logging(self, log_level: str) -> Logger: @@ -1519,8 +1519,7 @@ class JimakuDownloader: elif play and is_directory: print("Cannot play media with MPV when input is a directory. Skipping.") self.logger.warning( - "Cannot play media with MPV when input is a directory. " - "Skipping playback." + "Cannot play media with MPV when input is a directory. Skipping." ) self.logger.info("Subtitle download process completed successfully") diff --git a/tests/test_downloader.py b/tests/test_downloader.py index 854cfa1..64975c6 100644 --- a/tests/test_downloader.py +++ b/tests/test_downloader.py @@ -96,16 +96,9 @@ class TestJimakuDownloader: # Make sure the response object has a working raise_for_status method mock_requests["response"].raise_for_status = MagicMock() - # Test with special characters in the title - result = downloader.query_anilist( - "KonoSuba – God’s blessing on this wonderful world!! (2016)", season=3 - ) - assert result == 123456 # Patch requests.post directly to use our mock - with patch( - "jimaku_dl.downloader.requests_post", return_value=mock_requests["response"] - ): + with patch("jimaku_dl.downloader.requests_post", return_value=mock_requests["response"]): # Test the function with title and season result = downloader.query_anilist("Test Anime", season=1) assert result == 123456 @@ -159,9 +152,7 @@ class TestJimakuDownloader: mock_requests["response"].raise_for_status = MagicMock() # Patch requests.post directly to use our mock - with patch( - "jimaku_dl.downloader.requests_post", return_value=mock_requests["response"] - ): + with patch("jimaku_dl.downloader.requests_post", return_value=mock_requests["response"]): # Test the function with title and season - should work even without API token result = downloader.query_anilist("Test Anime", season=1) assert result == 123456 @@ -324,18 +315,16 @@ class TestJimakuDownloader: mock_requests["response"].json.side_effect = None mock_requests["response"].json.return_value = mock_jimaku_entries_response mock_requests["get"].return_value = mock_requests["response"] - + # Make sure the response object has a working raise_for_status method mock_requests["response"].raise_for_status = MagicMock() # Patch the requests.get function directly to use our mock - with patch( - "jimaku_dl.downloader.requests_get", return_value=mock_requests["response"] - ): + with patch("jimaku_dl.downloader.requests_get", return_value=mock_requests["response"]): # Call the function and check the result result = downloader.query_jimaku_entries(123456) assert result == mock_jimaku_entries_response - + # We won't assert on mock_requests["get"] here since it's not reliable # due to the patching approach @@ -346,24 +335,22 @@ class TestJimakuDownloader: # Set the mock response mock_requests["response"].json.side_effect = None mock_requests["response"].json.return_value = mock_jimaku_files_response - + # Create a direct mock for requests_get to verify it's called correctly mock_get = MagicMock(return_value=mock_requests["response"]) - + # Patch the requests_get function directly with patch("jimaku_dl.downloader.requests_get", mock_get): # Call the function and check the result result = downloader.get_entry_files(1) assert result == mock_jimaku_files_response - + # Verify proper headers were set in the API call mock_get.assert_called_once() url = mock_get.call_args[0][0] assert "entries/1/files" in url - headers = mock_get.call_args[1].get("headers", {}) - assert ( - headers.get("Authorization") == "test_token" - ) # Changed from 'Bearer test_token' + headers = mock_get.call_args[1].get('headers', {}) + assert headers.get('Authorization') == 'test_token' # Changed from 'Bearer test_token' def test_get_entry_files_no_token(self, monkeypatch): """Test getting entry files without API token.""" diff --git a/tests/test_parse_filename.py b/tests/test_parse_filename.py index 0c4aa56..56df7cc 100644 --- a/tests/test_parse_filename.py +++ b/tests/test_parse_filename.py @@ -110,36 +110,6 @@ class TestParseFilename: # Simple number in season directory file_path = os.path.join("path", "to", "My Anime", "Season 2", "5.mkv") title, season, episode = downloader.parse_filename(file_path) - # Mock _prompt_for_title_info to avoid reading from stdin for the entire test function - with patch.object(self.downloader, "_prompt_for_title_info") as mock_prompt: - # Configure mock to return appropriate values for different test cases - mock_prompt.side_effect = [ - ("Show Name", 1, 2), # First call return value - ("Show Name", 3, 4), # Second call return value - ("My Anime", 2, 5), # Third call return value - ("Long Anime Title With Spaces", 1, 3), # Fourth call return value - ] - - # Standard Season-## format - title, season, episode = self.downloader.parse_filename( - "/path/to/Show Name/Season-1/Show Name - 02 [1080p].mkv" - ) - assert title == "Show Name" - assert season == 1 - assert episode == 2 - - # Season ## format - title, season, episode = self.downloader.parse_filename( - "/path/to/Show Name/Season 03/Episode 4.mkv" - ) - assert title == "Show Name" - assert season == 3 - assert episode == 4 - - # Simple number in season directory - title, season, episode = self.downloader.parse_filename( - "/path/to/My Anime/Season 2/5.mkv" - ) assert title == "My Anime" assert season == 2 assert episode == 5 @@ -154,9 +124,6 @@ class TestParseFilename: "Long Anime Title With Spaces - 03.mkv", ) title, season, episode = downloader.parse_filename(file_path) - title, season, episode = self.downloader.parse_filename( - "/media/user/Anime/Long Anime Title With Spaces/Season-1/Long Anime Title With Spaces - 03.mkv" - ) assert title == "Long Anime Title With Spaces" assert season == 1 assert episode == 3