Trivial upload scripts for parties
authorClinton Ebadi <clinton@unknownlamer.org>
Mon, 27 Apr 2015 05:30:52 +0000 (01:30 -0400)
committerClinton Ebadi <clinton@unknownlamer.org>
Mon, 27 Apr 2015 05:31:57 +0000 (01:31 -0400)
If you have friends and they don't agree with your music choices all
the time (or, hey, who doesn't like listening to their favorite
music?), this script allows anyone to upload music from their phone to
the active kodi playlist.

Attempts to be minimally fair through randomness. Ugly, but
more-or-less functional.

party-upload/README [new file with mode: 0644]
party-upload/upload.cgi [new file with mode: 0755]
party-upload/upload.html [new file with mode: 0644]

diff --git a/party-upload/README b/party-upload/README
new file mode 100644 (file)
index 0000000..5ad758c
--- /dev/null
@@ -0,0 +1,10 @@
+Trivial Party Mode Upload Script
+
+Requires python-xbmc <https://github.com/jcsaaddupuy/python-xbmc>.
+
+Throw upload.cgi and upload.html into a directory together, generate a
+QR code URL for friends to scan, and now anyone can upload music from
+their phones to your party playlist. No configuration file, modify
+upload.cgi directly if your user/pass differ from the default.
+
+Patches to add a config file or anything really are welcome.
\ No newline at end of file
diff --git a/party-upload/upload.cgi b/party-upload/upload.cgi
new file mode 100755 (executable)
index 0000000..8ac3918
--- /dev/null
@@ -0,0 +1,89 @@
+#!/usr/bin/python
+
+# Simple PartyMode Upload Script
+# Copyright (c) 2015 Clinton Ebadi <clinton@unknownlamer.org>
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# todo:
+# fix weird characters (see erica's song)
+# track uploads (overcomplicated version)
+# - phone ip is hopefully good enough
+# - track # of uses of asap/Next Please
+# - track files we have queued (need at least next-please so we can queue those in order)
+# track uploads (easy version)
+# - dump timestamps into file (/tmp = cleared at reboot, no need to clear it manually probably)
+# - sum up # of songs uploading in last N minutes
+# - throttle asap position based on the number of songs being uploaded
+# - e.g. no one in last PERIOD = go next, fuckton of people = asap just ain't working
+
+
+# integrate better with native queue (if it existed...)
+
+# upload.html
+# - show playlist length, # of next/asap available, likely queue position
+# - show upcoming songs (5? just next-please?)
+# - - just use SSI + python virtual includes, seriously
+
+import cgi, cgitb
+import os, sys
+import daemon
+import subprocess
+import random
+from xbmcjson import XBMC
+
+cgitb.enable()
+
+print "content-type: text/html\n\n"
+
+music_dir = "/srv/archive/incoming/stolen-moosic"
+form = cgi.FieldStorage ()
+
+# Evil: just run replaygain/mp3gain/metaflac on the file and hope one
+# works instead of dealing with MIME. For now.
+def attempt_rpgain (file_name): 
+   subprocess.call (["/usr/bin/vorbisgain", "-q", file_name])
+   subprocess.call (["/usr/bin/mp3gain", "-q", "-s", "i", file_name])
+   subprocess.call (["/usr/bin/aacgain", "-q", "-s", "i", file_name])
+   subprocess.call (["/usr/bin/metaflac", "--add-replay-gain", file_name])
+
+def save_uploaded_file (form_field, upload_dir):
+    if form_field not in form:
+        print "<p>No file provided.</p>"
+        sys.exit ()
+    fileitem = form[form_field]
+    fout = file (os.path.join(upload_dir, fileitem.filename), 'wb')
+    fout.write (fileitem.value)
+    fout.close()
+    return fileitem.filename
+
+song_name = save_uploaded_file ("song", music_dir)
+
+print '<p><a href="upload.html">Upload another song</a></p>'
+sys.stdout.flush ()
+
+#with daemon.DaemonContext ():
+attempt_rpgain ("{0}/{1}".format (music_dir, song_name))
+
+xbmc = XBMC ("http://localhost:8080/jsonrpc")
+
+# todo: use REMOTE_ADDR to limit how many asap requests a person can
+# make in a time period
+totalitems = xbmc.Playlist.GetItems (playlistid=0)['result']['limits']['total']
+playpos = random.randint (1, totalitems / (1 if 'asap' not in form else 3))
+
+print xbmc.Playlist.Insert (playlistid=0, item={"file": "{0}/{1}".format (music_dir, song_name)}, position=playpos)
+
+print '<p style="font-size: x-large">Your song is number {0} in the queue ({1} songs in playlist).</p>'.format (playpos, totalitems+1)
+
+
diff --git a/party-upload/upload.html b/party-upload/upload.html
new file mode 100644 (file)
index 0000000..787a17e
--- /dev/null
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      body { font-family: sans-serif; }
+      input[type=file], input[type=submit] { height: 20em; width:
+      100%; font-size: 200%; background-color: steelblue;}
+      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%; }
+    </style>
+  </head>
+  <body>
+    <form action="upload.cgi" method="post" enctype="multipart/form-data">
+      <p>
+       <input name="song" type="file" accept="audio/*" required="required" />
+       <!-- <input type="submit" value="Party On!" /> -->
+       <button name="go" type="submit">Party On!</button>
+       <input type="checkbox" value="faster" name="asap"  />
+       <label for="asap">nnooowww</label>
+      </p>
+    </form>
+  </body>
+</html>