K00B404's picture
Update thaTube.py
04f9404 verified
raw
history blame
3.95 kB
import random
import tempfile
import streamlit as st
from pytube import Playlist, YouTube
from pydub import AudioSegment
import os
class thaTube:
def __init__(self, playlist_url='https://www.youtube.com/playlist?list=PLUwVJKJgdARRdQ3Y3NFB9HMTjXTa5INcz'):
self.playlist_url = playlist_url
self.current_audio_file = None
self.video_url = None
self.is_playing = False
# Set up the Streamlit UI
self.create_ui()
def select_random_video(self):
"""Select a random video from the playlist."""
playlist = Playlist(self.playlist_url)
videos = list(playlist.video_urls)
self.video_url = random.choice(videos)
return self.video_url
def extract_audio(self):
"""Extract audio from the selected video and save it as an MP3 file."""
if not self.video_url:
st.error("No video selected. Please select a video first.")
return None
try:
video = YouTube(self.video_url)
audio_stream = video.streams.filter(only_audio=True).first()
if not audio_stream:
st.error("No audio stream available for this video.")
return None
# Create a temporary MP3 file
with tempfile.NamedTemporaryFile(delete=False, suffix='.mp4') as temp_audio_file:
audio_stream.download(output_path=temp_audio_file.name)
temp_audio_file.close()
audio = AudioSegment.from_file(temp_audio_file.name)
with tempfile.NamedTemporaryFile(delete=False, suffix='.mp3') as mp3_file:
audio.export(mp3_file.name, format="mp3")
self.current_audio_file = mp3_file.name
return self.current_audio_file
except HTTPError as e:
st.error(f"HTTP error occurred: {e}")
return None
except Exception as e:
st.error(f"An error occurred while extracting audio: {e}")
return None
def play_audio(self):
"""Play the extracted audio using Streamlit's audio player."""
if not self.current_audio_file:
raise ValueError("No audio file to play. Please extract audio first.")
# Streamlit's audio player does not require pygame, so we use it directly
audio_bytes = open(self.current_audio_file, 'rb').read()
st.audio(audio_bytes, format='audio/mpeg', start_time=0)
self.is_playing = True
def stop_audio(self):
"""Stop the currently playing audio."""
if self.is_playing:
# In Streamlit, stopping the audio is effectively done by re-rendering the UI without calling st.audio()
st.write("Audio stopped.")
self.is_playing = False
def set_volume(self, volume):
"""Set the volume for playback (volume is a float between 0.0 and 1.0)."""
if self.current_audio_file:
# Adjust volume with pydub before playback
audio = AudioSegment.from_file(self.current_audio_file)
louder_audio = audio + (volume * 20 - 10) # Pydub uses dB
louder_audio.export(self.current_audio_file, format="mp3")
def next_video(self):
"""Select a new random video and start playing its audio."""
self.stop_audio()
if self.select_random_video():
if self.extract_audio():
self.play_audio()
def create_ui(self):
"""Create a Streamlit interface for controlling playback."""
st.title('YouTube Audio Player')
if st.button('Play Random Video'):
self.next_video()
if st.button('Stop Audio'):
self.stop_audio()
volume = st.slider('Volume', 0.0, 1.0, 0.5)
self.set_volume(volume)
st.write(f"Volume set to {volume}")
if st.button('Next Video'):
self.next_video()