File size: 3,954 Bytes
879d534
 
954de96
879d534
 
1d3299f
879d534
e34c612
70b864f
a9663e6
954de96
879d534
1d3299f
a9663e6
1d3299f
a9663e6
879d534
 
1d3299f
a9663e6
879d534
 
 
 
 
1d3299f
879d534
04f9404
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
879d534
04f9404
 
 
 
 
 
 
879d534
1d3299f
954de96
 
1d3299f
 
 
 
954de96
 
 
1d3299f
954de96
1d3299f
 
954de96
 
 
1d3299f
 
 
 
 
 
954de96
 
1d3299f
954de96
1d3299f
 
 
954de96
a9663e6
1d3299f
954de96
 
 
1d3299f
954de96
 
 
 
 
 
 
 
 
1d3299f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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()