lib/podcast_index/podcast.rb in podcast_index-0.1.0 vs lib/podcast_index/podcast.rb in podcast_index-0.2.0
- old
+ new
@@ -1,52 +1,122 @@
require "ostruct"
require "delegate"
+# rubocop:disable Metrics/ParameterLists, Lint/UnusedMethodArgument
module PodcastIndex
class Podcast < SimpleDelegator
class << self
+ FIND_ONE_ATTRIBUTES = %i[feed_url guid itunes_id].freeze
+ FIND_MANY_ATTRIBUTES = %i[tag medium term title trending dead recent new newly_found].freeze
+
def find(id)
response = Api::Podcasts.by_feed_id(id: id)
from_response(response)
end
- def find_by_feed_url(url)
- response = Api::Podcasts.by_feed_url(url: url)
+ def find_by(attributes)
+ match = (attributes.keys & FIND_ONE_ATTRIBUTES)
+ raise ArgumentError, "Must supply one of the attributes: #{FIND_ONE_ATTRIBUTES}" unless match.present?
+ raise ArgumentError, "Must supply only one of the attributes: #{FIND_ONE_ATTRIBUTES}" if match.length > 1
+
+ send("find_by_#{match.first}", attributes[match.first])
+ end
+
+ def where(attributes)
+ return find_all_music_by_term(**attributes) if attributes[:medium] == "music" && attributes[:term].present?
+
+ match = (attributes.keys & FIND_MANY_ATTRIBUTES)
+ raise ArgumentError, "Must supply one of the attributes: #{FIND_MANY_ATTRIBUTES}" unless match.present?
+ raise ArgumentError, "Must supply only one of the attributes: #{FIND_MANY_ATTRIBUTES}" if match.length > 1
+
+ send("find_all_by_#{match.first}", **attributes)
+ end
+
+ private
+
+ def find_by_feed_url(feed_url)
+ response = Api::Podcasts.by_feed_url(url: feed_url)
from_response(response)
end
def find_by_guid(guid)
response = Api::Podcasts.by_guid(guid: guid)
from_response(response)
end
- def find_by_itunes_id(id)
- response = Api::Podcasts.by_itunes_id(id: id)
+ def find_by_itunes_id(itunes_id)
+ response = Api::Podcasts.by_itunes_id(id: itunes_id)
from_response(response)
end
- def find_by_term(term, val: nil, aponly: nil, clean: nil, fulltext: nil)
+ def find_all_by_tag(tag:)
+ response = Api::Podcasts.by_tag(tag: tag)
+ from_response_collection(response)
+ end
+
+ def find_all_music_by_term(medium:, term:, val: nil, aponly: nil, clean: nil, fulltext: nil)
+ response = Api::Search.music_by_term(term: term, val: val, aponly: aponly, clean: clean, fulltext: fulltext)
+ from_response_collection(response)
+ end
+
+ def find_all_by_medium(medium:)
+ response = Api::Podcasts.by_medium(medium: medium)
+ from_response_collection(response)
+ end
+
+ def find_all_by_trending(trending:, max: nil, since: nil, lang: nil, categories: [], exclude_categories: [])
+ response = Api::Podcasts.trending(max: max, since: since, lang: lang, cat: categories.join(","),
+ notcat: exclude_categories.join(","))
+ from_response_collection(response)
+ end
+
+ def find_all_by_dead(*)
+ response = Api::Podcasts.dead
+ from_response_collection(response)
+ end
+
+ def find_all_by_term(term:, val: nil, aponly: nil, clean: nil, fulltext: nil)
response = Api::Search.by_term(term: term, val: val, aponly: aponly, clean: clean, fulltext: fulltext)
from_response_collection(response)
end
- def find_by_title(title, val: nil, clean: nil, fulltext: nil)
+ def find_all_by_title(title:, val: nil, clean: nil, fulltext: nil)
response = Api::Search.by_title(title: title, val: val, clean: clean, fulltext: fulltext)
from_response_collection(response)
end
- private
+ def find_all_by_recent(recent:, max: nil, since: nil, lang: nil, categories: [], exclude_categories: [])
+ response = Api::Recent.feeds(max: max, since: since, lang: lang, cat: categories.join(","),
+ notcat: exclude_categories.join(","))
+ from_response_collection(response)
+ end
+ def find_all_by_new(new:, max: nil, since: nil, feedid: nil, desc: nil)
+ response = Api::Recent.new_feeds(max: max, since: since, feedid: feedid, desc: desc)
+ from_response_collection(response)
+ end
+
+ def find_all_by_newly_found(newly_found:, max: nil, since: nil)
+ response = Api::Recent.data(max: max, since: since)
+ # This one has a bit of an oddball response. It's nested in a "data" attribute and all the keys
+ # for each feed are prefixed with "feed" (see example fixture)
+ response["data"]["feeds"].map do |item|
+ feed = item.transform_keys { |key| key.delete_prefix("feed").underscore }
+ new(JSON.parse(feed.to_json, object_class: OpenStruct)) # rubocop:disable Style/OpenStructUse
+ end
+ end
+
def from_response(response)
feed = response["feed"].transform_keys(&:underscore)
new(JSON.parse(feed.to_json, object_class: OpenStruct)) # rubocop:disable Style/OpenStructUse
end
def from_response_collection(response)
response["feeds"].map do |item|
- episode = item.transform_keys(&:underscore)
- new(JSON.parse(episode.to_json, object_class: OpenStruct)) # rubocop:disable Style/OpenStructUse
+ feed = item.transform_keys(&:underscore)
+ new(JSON.parse(feed.to_json, object_class: OpenStruct)) # rubocop:disable Style/OpenStructUse
end
end
end
end
end
+# rubocop:enable Metrics/ParameterLists, Lint/UnusedMethodArgument