diff --git a/helpers/README.md b/helpers/README.md index d34dbe3..457e7dd 100644 --- a/helpers/README.md +++ b/helpers/README.md @@ -24,19 +24,9 @@ windows: download instructions https://www.ffmpeg.org/download.html ``` -```bash +````bash usage: yt [-h] [--duration] [--transcript] [url] -vm (video meta) extracts metadata about a video, such as the transcript and the video's duration. By Daniel Miessler. - -positional arguments: - url YouTube video URL - -options: - -h, --help show this help message and exit - --duration Output only the duration - --transcript Output only the transcript -``` ```bash ts -h @@ -49,4 +39,4 @@ positional arguments: options: -h, --help show this help message and exit -``` +```` diff --git a/helpers/yt.py b/helpers/yt.py index a473d96..4c84ee4 100644 --- a/helpers/yt.py +++ b/helpers/yt.py @@ -11,17 +11,17 @@ import argparse def get_video_id(url): # Extract video ID from URL - pattern = r'(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})' + pattern = r"(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})" match = re.search(pattern, url) return match.group(1) if match else None def main_function(url, options): # Load environment variables from .env file - load_dotenv(os.path.expanduser('~/.config/fabric/.env')) + load_dotenv(os.path.expanduser("~/.config/fabric/.env")) # Get YouTube API key from environment variable - api_key = os.getenv('YOUTUBE_API_KEY') + api_key = os.getenv("YOUTUBE_API_KEY") if not api_key: print("Error: YOUTUBE_API_KEY not found in ~/.config/fabric/.env") return @@ -34,25 +34,23 @@ def main_function(url, options): try: # Initialize the YouTube API client - youtube = build('youtube', 'v3', developerKey=api_key) + youtube = build("youtube", "v3", developerKey=api_key) # Get video details - video_response = youtube.videos().list( - id=video_id, - part='contentDetails' - ).execute() + video_response = ( + youtube.videos().list(id=video_id, part="contentDetails").execute() + ) # Extract video duration and convert to minutes - duration_iso = video_response['items'][0]['contentDetails']['duration'] + duration_iso = video_response["items"][0]["contentDetails"]["duration"] duration_seconds = isodate.parse_duration(duration_iso).total_seconds() duration_minutes = round(duration_seconds / 60) # Get video transcript try: transcript_list = YouTubeTranscriptApi.get_transcript(video_id) - transcript_text = ' '.join([item['text'] - for item in transcript_list]) - transcript_text = transcript_text.replace('\n', ' ') + transcript_text = " ".join([item["text"] for item in transcript_list]) + transcript_text = transcript_text.replace("\n", " ") except Exception as e: transcript_text = "Transcript not available." @@ -63,24 +61,26 @@ def main_function(url, options): print(transcript_text) else: # Create JSON object - output = { - "transcript": transcript_text, - "duration": duration_minutes - } + output = {"transcript": transcript_text, "duration": duration_minutes} # Print JSON object print(json.dumps(output)) except HttpError as e: - print("Error: Failed to access YouTube API. Please check your YOUTUBE_API_KEY and ensure it is valid.") + print( + "Error: Failed to access YouTube API. Please check your YOUTUBE_API_KEY and ensure it is valid." + ) def main(): parser = argparse.ArgumentParser( - description='vm (video meta) extracts metadata about a video, such as the transcript and the video\'s duration. By Daniel Miessler.') - parser.add_argument('url', nargs='?', help='YouTube video URL') - parser.add_argument('--duration', action='store_true', - help='Output only the duration') - parser.add_argument('--transcript', action='store_true', - help='Output only the transcript') + description="vm (video meta) extracts metadata about a video, such as the transcript and the video's duration. By Daniel Miessler." + ) + parser.add_argument("url", nargs="?", help="YouTube video URL") + parser.add_argument( + "--duration", action="store_true", help="Output only the duration" + ) + parser.add_argument( + "--transcript", action="store_true", help="Output only the transcript" + ) args = parser.parse_args() if args.url: