lib/youtube_g/parser.rb in msp-youtube-g-0.4.6 vs lib/youtube_g/parser.rb in msp-youtube-g-0.4.7

- old
+ new

@@ -1,21 +1,59 @@ require 'cgi' require 'open-uri' require 'rexml/document' class YouTubeG - module Parser - class FeedParser - def initialize(url) - @url = url + module Parser + class FeedParserError < Exception; end + + class FeedParser + attr_reader :url_based + alias :url_based? :url_based + + def initialize(arg) + @url_based = assert_valid_url(arg) + @content = arg end + def parse + if @url_based + parse_content open(@content).read + else + parse_content @content + end + end + + private + def assert_valid_url (url) + URI::parse(url) + return true + rescue + return false + end + end + + class UploadErrorParser + def initialize(xml) + raise YouTubeG::Parser::FeedParserError.new("You must pass some xml") if xml == '' + @doc = REXML::Document.new(xml) + end + def parse - parse_content open(@url).read - end + upload_errors = [] + + @doc.elements.each("//error") do |error| + location = error.elements["location"].text #[/media:group\/media:(.*)\/text\(\)/,1] + code = error.elements["code"].text + domain = error.elements["domain"].text + upload_errors << YouTubeG::Model::UploadError.new(:location => location, :code => code, :domain => domain) + end + + return upload_errors + end end - + class VideoFeedParser < FeedParser def parse_content(content) doc = REXML::Document.new(content) entry = doc.elements["entry"] @@ -25,11 +63,19 @@ protected def parse_entry(entry) video_id = entry.elements["id"].text published_at = Time.parse(entry.elements["published"].text) - updated_at = Time.parse(entry.elements["updated"].text) + updated_at = Time.parse(entry.elements["updated"].text) + + app_control_element = entry.elements["app:control"] + app_contrlol = nil + if app_control_element + app_control = YouTubeG::Model::Video::AppControl.new( + :draft => app_control_element.elements["app:draft"].text, + :state => app_control_element.elements["yt:state"].attributes["name"]) + end # parse the category and keyword lists categories = [] keywords = [] entry.elements.each("category") do |category| @@ -59,18 +105,18 @@ :uri => author_element.elements["uri"].text) end media_group = entry.elements["media:group"] description = media_group.elements["media:description"].text - duration = media_group.elements["yt:duration"].attributes["seconds"].to_i + duration = media_group.elements["yt:duration"].attributes["seconds"].to_i if media_group.elements["yt:duration"] media_content = [] media_group.elements.each("media:content") do |mce| media_content << parse_media_content(mce) end - player_url = media_group.elements["media:player"].attributes["url"] + player_url = media_group.elements["media:player"].attributes["url"] if media_group.elements["media:player"] # parse thumbnails thumbnails = [] media_group.elements.each("media:thumbnail") do |thumb_element| # TODO: convert time HH:MM:ss string to seconds? @@ -97,11 +143,12 @@ racy = entry.elements["yt:racy"] ? true : false YouTubeG::Model::Video.new( :video_id => video_id, :published_at => published_at, - :updated_at => updated_at, + :updated_at => updated_at, + :app_control => app_control, :categories => categories, :keywords => keywords, :title => title, :html_content => html_content, :author => author, @@ -129,11 +176,11 @@ :format => format, :duration => duration, :mime_type => mime_type, :default => default) end - end + end class VideosFeedParser < VideoFeedParser private def parse_content(content) @@ -158,8 +205,8 @@ :offset => offset, :max_result_count => max_result_count, :videos => videos) end end - + end end \ No newline at end of file