Skip to content

Instantly share code, notes, and snippets.

@hiredman
Created September 22, 2013 21:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hiredman/6664075 to your computer and use it in GitHub Desktop.
Save hiredman/6664075 to your computer and use it in GitHub Desktop.
strangeloop 2013 youtube playlist maker
#!/usr/bin/java -jar /Users/hiredman/src/clojure/target/clojure-1.6.0-master-SNAPSHOT.jar
(let [pom-uber-jar
(str "http://thelibraryofcongress.s3.amazonaws.com/"
"pomegranate-0.0.13-SNAPSHOT-jar-with-dependencies.jar")
cl (java.net.URLClassLoader. (into-array [(java.net.URL. pom-uber-jar)]))
cx (.getContextClassLoader (Thread/currentThread))]
(push-thread-bindings {clojure.lang.Compiler/LOADER cl})
(.setContextClassLoader (Thread/currentThread) cl)
(try
(require '[cemerick.pomegranate :as pom])
(finally
(.setContextClassLoader (Thread/currentThread) cx)
(pop-thread-bindings))))
(pom/add-dependencies :coordinates '[[com.google.gdata/core "1.47.1"]
[clj-http "0.7.7"]
[enlive "1.1.4"]
[robert/bruce "0.7.1"]]
:repositories (merge cemerick.pomegranate.aether/maven-central
{"clojars" "http://clojars.org/repo"}))
(require '[clj-http.client :as http]
'[net.cgrand.enlive-html :as html]
'[robert.bruce :refer [try-try-again]])
(assert (not (empty? (System/getenv "DEVKEY"))))
(assert (not (empty? (System/getenv "USER"))))
(assert (not (empty? (System/getenv "PASS"))))
(def ys (com.google.gdata.client.youtube.YouTubeService.
"strangeloop playlist maker"
(System/getenv "DEVKEY")))
(.setUserCredentials ys
(System/getenv "USER")
(System/getenv "PASS"))
(def vf com.google.gdata.data.youtube.VideoFeed)
(def ve com.google.gdata.data.youtube.VideoEntry)
(defn query [string]
(let [q (doto (com.google.gdata.client.youtube.YouTubeQuery.
(java.net.URL. "http://gdata.youtube.com/feeds/api/videos"))
(.setFullTextQuery string))
feed (.query ys q vf)]
(some-> feed
(.getEntries)
(first)
(.getSelfLink)
(.getHref))))
(defn query-strings []
(distinct
(->> (html/select
(html/html-resource
(:body
(http/get "https://github.com/strangeloop/StrangeLoop2013/wiki/Playlist"
{:as :stream})))
[:tr :td])
(partition-all 3)
(map (comp
(partial apply str)
(partial interpose \space)
(juxt (comp first :content second)
(comp first :content first)))))))
(import 'com.google.gdata.data.PlainTextConstruct)
(def feed-url "http://gdata.youtube.com/feeds/api/users/default/playlists")
(def new-strange-loop-pl (com.google.gdata.data.youtube.PlaylistLinkEntry.))
(.setTitle new-strange-loop-pl (PlainTextConstruct. "strangeloop 2013"))
(.setSummary new-strange-loop-pl (PlainTextConstruct. "music played in the main theater, strangeloop 2013"))
(def created-strange-loop-pl (.insert ys (java.net.URL. feed-url) new-strange-loop-pl))
(doseq [qs (query-strings)
:let [video-url (query qs)]
:when video-url]
(try-try-again {}
#(let [video-entry (.getEntry ys (java.net.URL. video-url) ve)
playlist-entry (com.google.gdata.data.youtube.PlaylistEntry. video-entry)]
(.insert ys (java.net.URL. (.getFeedUrl created-strange-loop-pl))
playlist-entry))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment