Add basic youtube upload support
authorClinton Ebadi <clinton@unknownlamer.org>
Sat, 23 Nov 2019 01:52:56 +0000 (20:52 -0500)
committerClinton Ebadi <clinton@unknownlamer.org>
Sat, 23 Nov 2019 01:52:56 +0000 (20:52 -0500)
Rather than using the Kodi youtube extension, this downloads the video
and extracts the audio has vorbis in order to apply
replaygain. Otherwise videos can be jarringly louder than music that's
properly replaygained.

This also has the benefit of working on the upstream Kodi and not just
my patched version that allows queuing videos when in party mode
without quitting party mode instantly.

No error checking whatsoever, and no attempt is made to display good
metadata in the queue yet.

party-upload/normals.cgi
party-upload/partyparty.py
party-upload/youtube.html [new file with mode: 0644]

index 40de5b8..d05378b 100755 (executable)
@@ -42,7 +42,7 @@ sys.stdout.flush ()
 print ("<!DOCTYPE html>\n<html><head><title>partyparty beb</title></head><body>")
 print (partyparty.css ())
 
-print '<p style="font-size: 5rem"><a href="upload.html">Upload A Song</a> | <a href="normals.cgi">home</a> | <a href="normals.cgi?browseartists=1">browse</a></p>'
+print '<p style="font-size: 5rem"><a href="upload.html">Upload A Song</a> | <a href="youtube.html">Add From YouTube</a> | <a href="normals.cgi">home</a> | <a href="normals.cgi?browseartists=1">browse</a></p>'
 
 
 
index e3d222d..21886c0 100644 (file)
@@ -25,6 +25,7 @@ import subprocess
 from xbmcjson import XBMC
 import urllib
 from yattag import Doc
+import youtube_dl
 
 xbmc = None
 
@@ -209,6 +210,33 @@ class Upload:
         self.attempt_rpgain ()
         return self.filename
 
+class Youtube:
+    upload_dir = '/srv/archive/incoming/youtube-moosic'
+    ydl_opts = {
+        'format': 'bestaudio/best',
+        'outtmpl': upload_dir + '/%(id)s.%(ext)s',
+        'quiet': True,
+        'postprocessors': [
+            {
+                'key': 'FFmpegMetadata',
+            },
+            {
+                'key': 'FFmpegExtractAudio',
+                'preferredcodec': 'vorbis',
+            }],
+
+    }
+
+    def __init__ (self, form, field):
+        self.ydl = youtube_dl.YoutubeDL(self.ydl_opts)
+        self.url = form.getvalue (field)
+
+    def save (self):
+        info = self.ydl.extract_info (self.url, download=True)
+        filename = '{}/{}.ogg'.format (self.upload_dir, info['display_id'])
+        subprocess.call (["/usr/bin/vorbisgain", "-q", filename])
+        return filename
+
 
 def css ():
     doc, tag, text = Doc ().tagtext ()
@@ -335,6 +363,10 @@ class PartyManager:
             upload = Upload (form, 'song')
             filename = upload.save ()
             self.randomqueue ({"file": filename}, 1 if 'asap' not in form else 3)
+        elif 'youtubego' in form:
+            youtube = Youtube (form, 'youtubeurl')
+            filename = youtube.save ()
+            self.randomqueue ({"file": filename}, 1 if 'asap' not in form else 3)
         elif 'partyon' in form:
             if 'error' in xbmc.Player.SetPartymode (partymode=True, playerid=0):
                 xbmc.Player.Open (item={"partymode": "music"})
diff --git a/party-upload/youtube.html b/party-upload/youtube.html
new file mode 100644 (file)
index 0000000..c915c60
--- /dev/null
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      body { font-family: sans-serif; }
+      input[type=url] { height: 2em; width:
+      100%; font-size: 200%; }
+      button { font-size: 400%; background-color: slategray; border: 0px
+      solid black; border-radius: 10px; width: 95%; display: block;
+      margin: 2rem auto; }
+
+      label[for=asap] { font-size: 350%; }
+      input[type=checkbox] { transform: scale(2.5); margin-right: 2em; }
+    </style>
+  </head>
+  <body>
+    <form action="normals.cgi" method="post" enctype="multipart/form-data">
+      <p>
+       <label for="youtubeurl">YouTube URL</label>
+       <input name="youtubeurl" type="text" required="required" />
+       <!-- <input type="submit" value="Party On!" /> -->
+       <button name="youtubego" type="submit">Party On!</button>
+       <input type="checkbox" value="faster" name="asap"  />
+       <label for="asap">nnooowww</label>
+      </p>
+    </form>
+  </body>
+</html>