+ def youtube_apivideo_filter(s)
+ # This filter can be used either
+ e = s[:rexml] || REXML::Document.new(s[:text]).elements["entry"]
+ # TODO precomputing mg doesn't work on my REXML, despite what the doc
+ # says?
+ # mg = e.elements["media:group"]
+ # :title => mg["media:title"].text
+ # fails because "media:title" is not an Integer. Bah
+ vid = {
+ :formats => [],
+ :author => (e.elements["author/name"].text rescue nil),
+ :title => (e.elements["media:group/media:title"].text rescue nil),
+ :desc => (e.elements["media:group/media:description"].text rescue nil),
+ :cat => (e.elements["media:group/media:category"].text rescue nil),
+ :seconds => (e.elements["media:group/yt:duration/@seconds"].value.to_i rescue nil),
+ :url => (e.elements["media:group/media:player/@url"].value rescue nil),
+ :rating => (("%s/%s" % [e.elements["gd:rating/@average"].value, e.elements["gd:rating/@max"].value]) rescue nil),
+ :views => (e.elements["yt:statistics/@viewCount"].value rescue nil),
+ :faves => (e.elements["yt:statistics/@favoriteCount"].value rescue nil)
+ }
+ if vid[:desc]
+ vid[:desc].gsub!(/\s+/m, " ")
+ end
+ if secs = vid[:seconds]
+ vid[:duration] = Utils.secs_to_short(secs)
+ else
+ vid[:duration] = _("unknown duration")
+ end
+ e.elements.each("media:group/media:content") { |c|
+ if url = (c.elements["@url"].value rescue nil)
+ type = c.elements["@type"].value rescue nil
+ medium = c.elements["@medium"].value rescue nil
+ expression = c.elements["@expression"].value rescue nil
+ seconds = c.elements["@duration"].value.to_i rescue nil
+ fmt = case num_fmt = (c.elements["@yt:format"].value rescue nil)
+ when "1"
+ "h263+amr"
+ when "5"
+ "swf"
+ when "6"
+ "mp4+aac"
+ when nil
+ nil
+ else
+ num_fmt
+ end
+ vid[:formats] << {
+ :url => url, :type => type,
+ :medium => medium, :expression => expression,
+ :seconds => seconds,
+ :numeric_format => num_fmt,
+ :format => fmt
+ }.delete_if { |k, v| v.nil? }
+ if seconds
+ vid[:formats].last[:duration] = Utils.secs_to_short(seconds)
+ else
+ vid[:formats].last[:duration] = _("unknown duration")
+ end
+ end
+ }
+ debug vid
+ return vid
+ end
+