sdrplay-fm-radio/tuuube.py

89 lines
2.2 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
self.playback = None
super().__init__()
def is_playing(self):
return is_alive(self.playback)
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 self.is_playing():
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)