diff --git a/youtube_transcript_api/_cli.py b/youtube_transcript_api/_cli.py index 3f28766..6dbef37 100644 --- a/youtube_transcript_api/_cli.py +++ b/youtube_transcript_api/_cli.py @@ -1,4 +1,5 @@ import argparse +from importlib.metadata import PackageNotFoundError, version from typing import List from .proxies import GenericProxyConfig, WebshareProxyConfig @@ -91,6 +92,12 @@ def _fetch_transcript( return transcript.fetch() + def _get_version(self): + try: + return version("youtube-transcript-api") + except PackageNotFoundError: + return "unknown" + def _parse_args(self): parser = argparse.ArgumentParser( description=( @@ -99,6 +106,11 @@ def _parse_args(self): "other selenium based solutions do!" ) ) + parser.add_argument( + "--version", + action="version", + version=f"%(prog)s, version {self._get_version()}", + ) parser.add_argument( "--list-transcripts", action="store_const", diff --git a/youtube_transcript_api/test/test_cli.py b/youtube_transcript_api/test/test_cli.py index 3edccf9..78c23c3 100644 --- a/youtube_transcript_api/test/test_cli.py +++ b/youtube_transcript_api/test/test_cli.py @@ -1,8 +1,10 @@ import pytest +from importlib.metadata import PackageNotFoundError, version from unittest import TestCase -from unittest.mock import MagicMock +from unittest.mock import MagicMock, patch import json +import subprocess from youtube_transcript_api import ( YouTubeTranscriptApi, @@ -340,3 +342,29 @@ def test_run__cookies(self): proxy_config=None, cookie_path="blahblah.txt", ) + + def test_version_matches_metadata(self): + """ + `youtube_transcript_api --version` should return the same version as in the package metadata. + """ + expected_version_msg = ( + f"youtube_transcript_api, version {version('youtube-transcript-api')}" + ) + + cli_version_msg = subprocess.run( + ["youtube_transcript_api", "--version"], + capture_output=True, + text=True, + check=True, + ).stdout.strip() + + assert ( + cli_version_msg == expected_version_msg + ), f"Expected version '{expected_version_msg}', but got '{cli_version_msg}'" + + def test_get_version_package_not_found(self): + with patch( + "youtube_transcript_api._cli.version", side_effect=PackageNotFoundError + ): + cli = YouTubeTranscriptCli([]) + assert cli._get_version() == "unknown"