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