diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 28b2b1a..660f37f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -28,6 +28,9 @@ jobs: with: python-version: ${{ matrix.python }} cache: "poetry" + - name: 🏗 Set up FFmpeg + id: setup-ffmpeg + uses: FedericoCarboni/setup-ffmpeg@v3 - name: 🏗 Install workflow dependencies run: | poetry config virtualenvs.create true diff --git a/podme_api/auth/client.py b/podme_api/auth/client.py index cbd9f96..85470b0 100644 --- a/podme_api/auth/client.py +++ b/podme_api/auth/client.py @@ -322,7 +322,7 @@ def get_credentials(self) -> dict | None: """Get the current credentials as a dictionary, or None if not set.""" if self._credentials is not None: return self._credentials.to_dict() - return None + return None # pragma: no cover def set_credentials(self, credentials: SchibstedCredentials | dict | str): """Set the credentials. diff --git a/podme_api/client.py b/podme_api/client.py index afafcd8..d50fef3 100644 --- a/podme_api/client.py +++ b/podme_api/client.py @@ -315,8 +315,8 @@ async def _get_pages( return data + @staticmethod async def transcode_file( - self, input_file: PathLike | str, output_file: PathLike | str | None = None, transcode_options: dict[str, str] | None = None, @@ -340,29 +340,47 @@ async def transcode_file( if not input_file.is_file(): raise PodMeApiError("File not found") - if output_file is None: + if output_file is None: # pragma: no cover output_file = input_file.with_stem(f"{input_file.stem}_out") transcode_options = transcode_options or {} - ffmpeg = ( - FFmpeg() - .option("y") - .input(input_file.as_posix()) - .output( - output_file.as_posix(), - { - "c": "copy", - "map": "0", - "brand": "isomiso2mp41", - **transcode_options, - }, - ) - ) try: + ffprobe = FFmpeg(executable="ffprobe").input( + input_file, + print_format="json", + show_streams=None, + ) + media = json.loads(await ffprobe.execute()) + + codec_name = media["streams"][0]["codec_name"] + codec_tag_string = media["streams"][0]["codec_tag_string"] + if codec_name == "aac" and codec_tag_string[:3] == "mp4": + output_file = output_file.with_suffix(".mp4") + transcode_options.update( + { + "codec": "copy", + "map": "0", + "brand": "isomiso2mp41", + } + ) + + elif codec_name == "mp3": + return input_file + + _LOGGER.info("Transcoding file: %s to %s", input_file, output_file) + ffmpeg = ( + FFmpeg() + .option("y") + .input(input_file) + .output( + output_file, + transcode_options, + ) + ) await ffmpeg.execute() except FileNotFoundError as err: - _LOGGER.warning("Error occurred while transcoding file: %s", err) + _LOGGER.warning("Please install ffmpeg to enable transcoding: %s", err) return input_file except FFmpegError as err: _LOGGER.warning("Error occurred while transcoding file: %s", err) diff --git a/tests/fixtures/stream_m3u8.json b/tests/fixtures/stream_m3u8.json index e628e1e..9748ba1 100644 --- a/tests/fixtures/stream_m3u8.json +++ b/tests/fixtures/stream_m3u8.json @@ -1 +1 @@ -{"master.m3u8": "#EXTM3U\n#EXT-X-VERSION:7\n#EXT-X-STREAM-INF:BANDWIDTH=140800,CODECS=\"mp4a.40.2\"\naudio_128_pkg.m3u8\n\n\n", "audio_128_pkg.m3u8": "#EXTM3U\n#EXT-X-VERSION:7\n#EXT-X-TARGETDURATION:2\n#EXT-X-MEDIA-SEQUENCE:0\n#EXT-X-PLAYLIST-TYPE:VOD\n#EXT-X-MAP:URI=\"audio_128_pkg.mp4\",BYTERANGE=\"802@0\"\n#EXTINF:2.005333,\n#EXT-X-BYTERANGE:33091@802\naudio_128_pkg.mp4\n#EXTINF:1.701750,\n#EXT-X-BYTERANGE:28106@42394167\naudio_128_pkg.mp4\n#EXT-X-ENDLIST\n", "audio_128_pkg.mp4": "AAAAHGZ0eXBpc29tAAACAGlzb21pc28ybXA0MQAAAAhmcmVlAABApG1kYXQhEUUAFFABRv/xClpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl3lwhS0tLS0tLS0tLS0tLS0tLS0\ntLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vCERRQAUUAFG//EKWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaXeXCFLS0tLS0tLS0tLS0tLS0tLS0\ntLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8IRFFABRQAUb/8QpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpd5eIUtLS0tLS0tLS0tLS0tLS0tLS0\ntLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8IRoOTv78P/udpQwEQIUF\noNgNaKSveJ4yUET0mHITeNkOs9EI4zgJPyF5FJ964wSzgiGY3RImEIarZkMEgm2JnYxCJGIVpJB6\naJNI31DQHeR7PywDTpCxiBHM52tBCgJoy5pvKABrRCkDzxlCLvvKyCGCwxMvBSeGxRPVcpJ8y6WT\n6LyAhtKhNdMhwbTkMbgSGg1JDY64nIcTKLlemEq27IoorYAWHwA+VvkAfPSb5cQpaWlpaWlpaWlp\naWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlp\naWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlp\naWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaXghGhRdvozGRJEDyffOGrCi\nikqpKBQEUIDnE4EcjDqElPtQJBLJGIRMfasfBQuznzpvmF8LVaF6w/LRKTEf+N8eS21zS1av6S5S\n9oWtE/wCBFyonmPut93noD55vH0duoIPBwVjdWboq8OICjqdj7/uNjq66hmS0p9Fg83WWqXTQoUL\nYJ3CJPBwb7768rxW66hswiEMKujeNUqhE5u5uiB88sLT/j6Nq88DSyEqMH6tj3cjgNOfX9X0ifo0\nA4xuVgsYjsIYUo7Yxs+c/pENXwlQ5Bi60BaOBqShSZ/AwqoX4KYqqlaT+BV6rgphgo7D7x3kBEW2\nkMOAsJBsJBEYHXwVPZUSqq9oKIoCgp2mei4Wd3kNnw2zJlRQskEWQycAO+Zg87IRCQjcPeM+F71p\nGld45eeZ0M/u/7atvpH6lh0E31b/skQuxiUcyMsrTX/89zlOo8Z9mSbpmO5fU8b0q45Avg/GHdPc\ngsXUrCEDZ2TqgLfc+R9gyygY8cB7iYMw7FeDgziIySgyqJF0jk3eWMvcBtPB9JFhIKH8s0te67o9\n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\nAAAdZGF0YQAAAAEAAAAATGF2ZjYwLjE2LjEwMA==\n"} +{"master.m3u8": "#EXTM3U\n#EXT-X-VERSION:7\n#EXT-X-STREAM-INF:BANDWIDTH=140800,CODECS=\"mp4a.40.2\"\naudio_128_pkg.m3u8\n\n\n", "audio_128_pkg.m3u8": "#EXTM3U\n#EXT-X-VERSION:7\n#EXT-X-TARGETDURATION:2\n#EXT-X-MEDIA-SEQUENCE:0\n#EXT-X-PLAYLIST-TYPE:VOD\n#EXT-X-MAP:URI=\"audio_128_pkg.mp4\",BYTERANGE=\"802@0\"\n#EXTINF:2.005333,\n#EXT-X-BYTERANGE:33091@802\naudio_128_pkg.mp4\n#EXTINF:1.701750,\n#EXT-X-BYTERANGE:28106@42394167\naudio_128_pkg.mp4\n#EXT-X-ENDLIST\n", "audio_128_pkg.mp4": "AAAAHGZ0eXBpc29tAAACAGlzb21pc28ybXA0MQAAAAhmcmVlAAA/+W1kYXQhEUUAFFABRv/xClpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpa\nWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl3lwhS0tLS0tLS0tLS0tLS0tLS0\ntLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vCEqE5WoTgYSA1C8qwdj\nENaKSg/55Cl3jresQzBDHu5+N/1/3/i/C1abOyMuY04fLNH9P6QZ4hnwgCoAZ3IBsQPiFNaKSg/5\n5SVzxXZTtZmq7/QQpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl\npaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl\npaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl\npaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl\npaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaXgIUzTPbRKxQgb4Y0mJm/J\nN9UnIoNTPel3cRvnwH4Bn/idfHM69lqQpR1SgodmkesvZVlXLNJ3ju76lUc7cova7yR8jYhH08eL\n7/uVX+Ly4bzkxR0vT/OeahONcsj5lNOd0/fYFlI6klnklI4RD6M6fnMt4seigy4Mwr8P/ANDVu/j\nEnQHJ6Qe7B8foDSyrqFBKctpCAF7l1EqHEUXpxf+HICQ4AG3w2z1PJP5wYYRKMAs33Wqurg1UA4b\n+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"} diff --git a/tests/test_client.py b/tests/test_client.py index f32c63c..6867af5 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -459,6 +459,7 @@ async def test_get_podcast_info(aresponses: ResponsesMockServer, podme_client, p f"{PODME_API_PATH}/podcast/slug/{podcast_slug}", "GET", json_response(data=fixture), + repeat=2, ) async with podme_client() as client: @@ -466,6 +467,11 @@ async def test_get_podcast_info(aresponses: ResponsesMockServer, podme_client, p result = await client.get_podcast_info(podcast_slug) assert isinstance(result, PodMePodcast) + results = await client.get_podcasts_info([podcast_slug]) + assert isinstance(results, list) + assert len(results) == 1 + assert all(isinstance(r, PodMePodcast) for r in results) + @pytest.mark.parametrize( "episode_id", @@ -605,6 +611,29 @@ async def test_get_home_screen(aresponses: ResponsesMockServer, podme_client): async def test_download_episode_files(aresponses: ResponsesMockServer, podme_client): + episodes_fixture = load_fixture_json("episode_currentlyplaying") + setup_stream_mocks(aresponses, episodes_fixture) + download_urls = [ + (e["id"], URL(e["streamUrl"]).with_name("audio_128_pkg.mp4")) + for e in episodes_fixture + if "m3u8" in e["streamUrl"] + ] + + async with podme_client() as client: + client: PodMeClient + with tempfile.TemporaryDirectory() as d: + dir_path = Path(d) + + def get_file_ending(url: URL) -> str: + return url.name.rsplit(".").pop() + + download_infos = [ + (url, dir_path / f"{episode_id}.{get_file_ending(url)}") for episode_id, url in download_urls + ] + await client.download_files(download_infos) + + +async def test_download_episode_files_with_callbacks(aresponses: ResponsesMockServer, podme_client): episodes_fixture = load_fixture_json("episode_currentlyplaying") setup_stream_mocks(aresponses, episodes_fixture) async with podme_client() as client: @@ -712,6 +741,29 @@ def get_file_ending(url: URL) -> str: await client.download_files(download_infos, on_progress, on_finished) +async def test_transcode_file_error(podme_client): + non_existing_file = Path("non_existing_file.mp3") + + async with podme_client() as client: + client: PodMeClient + with pytest.raises(PodMeApiError): + await client.transcode_file(non_existing_file) + + with tempfile.NamedTemporaryFile(suffix=".mp3") as f: + invalid_file = Path(f.name) + await client.transcode_file(invalid_file) + + +async def test_transcode_no_ffmpeg(monkeypatch, podme_client): + monkeypatch.setenv("PATH", "") + async with podme_client() as client: + client: PodMeClient + with tempfile.NamedTemporaryFile(suffix=".mp3") as f: + input_path = Path(f.name) + saved_path = await client.transcode_file(input_path) + assert saved_path == input_path + + async def test_no_content(aresponses: ResponsesMockServer, podme_client): """Test HTTP 201 response handling.""" aresponses.add(