diff --git a/spotdl/handle.py b/spotdl/handle.py index c6ebc7e..f76f46c 100644 --- a/spotdl/handle.py +++ b/spotdl/handle.py @@ -292,9 +292,6 @@ def get_arguments(raw_args=None, to_group=True, to_merge=True): if parsed.avconv and parsed.trim_silence: parser.error("--trim-silence can only be used with FFmpeg") - if parsed.no_metadata and parsed.no_fallback_metadata: - parser.error('--no-metadata and --no-fallback-metadata cannot be used together') - parsed.log_level = log_leveller(parsed.log_level) return parsed diff --git a/spotdl/patcher.py b/spotdl/patcher.py index fc7efca..1b1b744 100644 --- a/spotdl/patcher.py +++ b/spotdl/patcher.py @@ -8,7 +8,7 @@ def _getbestthumb(self): if url: return url - part_url = "http://i.ytimg.com/vi/%s/" % self.videoid + part_url = "https://i.ytimg.com/vi/%s/" % self.videoid # Thumbnail resolution sorted in descending order thumbs = ("maxresdefault.jpg", "sddefault.jpg", diff --git a/test/test_patcher.py b/test/test_patcher.py new file mode 100644 index 0000000..baddd0e --- /dev/null +++ b/test/test_patcher.py @@ -0,0 +1,35 @@ +from spotdl import patcher +import pafy + +import pytest + +patcher.patch_pafy() + +class TestPafyContentAvailable: + pass + + +class TestMethodAssignment: + def test_pafy_getbestthumb(self): + pafy.backend_shared.BasePafy.getbestthumb == patcher._getbestthumb + + +class TestMethodCalls: + @pytest.fixture(scope="module") + def content_fixture(self): + content = pafy.new("http://youtube.com/watch?v=3nQNiWdeH2Q") + return content + + def test_pafy_getbestthumb(self, content_fixture): + thumbnail = patcher._getbestthumb(content_fixture) + assert thumbnail == "https://i.ytimg.com/vi/3nQNiWdeH2Q/maxresdefault.jpg" + + def test_pafy_getbestthumb_without_ytdl(self, content_fixture): + content_fixture._ydl_info["thumbnails"][0]["url"] = None + thumbnail = patcher._getbestthumb(content_fixture) + assert thumbnail == "https://i.ytimg.com/vi/3nQNiWdeH2Q/maxresdefault.jpg" + + + def test_pafy_content_available(self): + TestPafyContentAvailable._content_available = patcher._content_available + assert TestPafyContentAvailable()._content_available("https://youtube.com/") diff --git a/test/test_youtube_tools.py b/test/test_youtube_tools.py index eb5393c..4ddd258 100644 --- a/test/test_youtube_tools.py +++ b/test/test_youtube_tools.py @@ -99,6 +99,56 @@ def content_fixture(metadata_fixture): return content +# True = Metadata must be fetched from Spotify +# False = Metadata must be fetched from YouTube +# None = Metadata must be `None` + +MATCH_METADATA_NO_FALLBACK_TEST_TABLE = [ + ("https://open.spotify.com/track/5nWduGwBGBn1PSqYTJUDbS", True), + ("http://youtube.com/watch?v=3nQNiWdeH2Q", None), + ("Linux Talk | Working with Drives and Filesystems", None) +] + +MATCH_METADATA_FALLBACK_TEST_TABLE = [ + ("https://open.spotify.com/track/5nWduGwBGBn1PSqYTJUDbS", True), + ("http://youtube.com/watch?v=3nQNiWdeH2Q", False), + ("Linux Talk | Working with Drives and Filesystems", False) +] + +MATCH_METADATA_NO_METADATA_TEST_TABLE = [ + ("https://open.spotify.com/track/5nWduGwBGBn1PSqYTJUDbS", None), + ("http://youtube.com/watch?v=3nQNiWdeH2Q", None), + ("Linux Talk | Working with Drives and Filesystems", None) +] + + +class TestMetadataOrigin: + def match_metadata(self, track, metadata_type): + _, metadata = youtube_tools.match_video_and_metadata(track) + if metadata_type is None: + assert metadata == metadata_type + else: + assert metadata["spotify_metadata"] == metadata_type + + @pytest.mark.parametrize("track, metadata_type", MATCH_METADATA_NO_FALLBACK_TEST_TABLE) + def test_match_metadata_with_no_fallback(self, track, metadata_type, monkeypatch, content_fixture): + monkeypatch.setattr(youtube_tools, "go_pafy", lambda track, meta_tags: content_fixture) + const.args.no_fallback_metadata = True + self.match_metadata(track, metadata_type) + + @pytest.mark.parametrize("track, metadata_type", MATCH_METADATA_FALLBACK_TEST_TABLE) + def test_match_metadata_with_fallback(self, track, metadata_type, monkeypatch, content_fixture): + monkeypatch.setattr(youtube_tools, "go_pafy", lambda track, meta_tags: content_fixture) + const.args.no_fallback_metadata = False + self.match_metadata(track, metadata_type) + + @pytest.mark.parametrize("track, metadata_type", MATCH_METADATA_NO_METADATA_TEST_TABLE) + def test_match_metadata_with_no_metadata(self, track, metadata_type, monkeypatch, content_fixture): + monkeypatch.setattr(youtube_tools, "go_pafy", lambda track, meta_tags: content_fixture) + const.args.no_metadata = True + self.match_metadata(track, metadata_type) + + @pytest.fixture(scope="module") def title_fixture(content_fixture): title = youtube_tools.get_youtube_title(content_fixture)