86 lines
2.1 KiB
Python
Executable File
86 lines
2.1 KiB
Python
Executable File
#! /usr/bin/env python3
|
|
|
|
"""
|
|
# Install issues?
|
|
https://stackoverflow.com/a/27481870
|
|
|
|
https://stackoverflow.com/a/66024755
|
|
sudo apt purge youtube-dl
|
|
sudo pip3 install youtube-dl
|
|
|
|
https://stackoverflow.com/a/75504772
|
|
python3 -m pip install --force-reinstall https://github.com/yt-dlp/yt-dlp/archive/master.tar.gz
|
|
"""
|
|
|
|
#import youtube_dl
|
|
import yt_dlp as youtube_dl
|
|
from streamer import Streamer, is_alive
|
|
import subprocess
|
|
import time
|
|
import sys
|
|
|
|
|
|
class Tuuube(Streamer):
|
|
PORT = 8554
|
|
|
|
def __init__(self, id):
|
|
self.id = id
|
|
|
|
super().__init__()
|
|
|
|
def _stream_path(self):
|
|
return f":{Tuuube.PORT}/tuuube/{self.id}"
|
|
|
|
def _stream_thread(self):
|
|
ydl_opts = {
|
|
'format': 'bestaudio/best',
|
|
'outtmpl': f'/tmp/{self.id}.%(ext)s',
|
|
'postprocessors': [{
|
|
'key': 'FFmpegExtractAudio',
|
|
'preferredcodec': 'mp3',
|
|
'preferredquality': '192',
|
|
}],
|
|
}
|
|
|
|
try:
|
|
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
|
|
ydl.download([f'https://www.youtube.com/watch?v={self.id}'])
|
|
except Exception as e:
|
|
print(f'File sourcing failed, aborting stream. {e}', file=sys.stderr)
|
|
self.run = False
|
|
return
|
|
|
|
self.playback = subprocess.Popen(
|
|
[
|
|
'/usr/bin/ffmpeg', '-re', '-stream_loop', '-1', '-i',
|
|
f"/tmp/{self.id}.mp3", '-c', 'copy',
|
|
'-f', 'rtsp', f"rtsp://localhost{self._stream_path()}"
|
|
],
|
|
stdin=subprocess.PIPE,
|
|
stdout=subprocess.DEVNULL,
|
|
stderr=subprocess.DEVNULL
|
|
)
|
|
|
|
while self.run:
|
|
if not is_alive(self.playback):
|
|
print('Playback failed, aborting stream.', file=sys.stderr)
|
|
break
|
|
time.sleep(0.1)
|
|
|
|
self.run = False
|
|
|
|
self.playback.kill()
|
|
self.playback.wait()
|
|
self.playback = None
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
#tube = Tuuube('dQw4w9WgXcQ')
|
|
tube = Tuuube('BaW_jenozKc')
|
|
|
|
tube.start_stream()
|
|
|
|
while True:
|
|
print(tube.is_streaming())
|
|
time.sleep(1) |