* Started adding youtube API for fast indexing * Hooked youtube API into fast indexing * Added youtube_api_key to settings * Added youtube api key to settings UI * Added tests * Refactored the youtube api module * More refactor * Changed editing mode name from basic to standard * [WIP] started on copy changes * Updated copy
64 lines
1.8 KiB
Elixir
64 lines
1.8 KiB
Elixir
defmodule Pinchflat.FastIndexing.YoutubeRss do
|
|
@moduledoc """
|
|
Methods for interacting with YouTube RSS feeds for fast indexing
|
|
"""
|
|
|
|
require Logger
|
|
|
|
alias Pinchflat.Sources.Source
|
|
alias Pinchflat.FastIndexing.YoutubeBehaviour
|
|
|
|
@behaviour YoutubeBehaviour
|
|
|
|
@doc """
|
|
Determines if the YouTube RSS feed is enabled for fast indexing. Used to satisfy
|
|
the `YoutubeBehaviour` behaviour.
|
|
|
|
Returns true
|
|
"""
|
|
@impl YoutubeBehaviour
|
|
def enabled?(), do: true
|
|
|
|
@doc """
|
|
Fetches the recent media IDs from a YouTube RSS feed for a given source.
|
|
|
|
Returns {:ok, [binary()]} | {:error, binary()}
|
|
"""
|
|
@impl YoutubeBehaviour
|
|
def get_recent_media_ids(%Source{} = source) do
|
|
Logger.debug("Fetching recent media IDs from YouTube RSS feed for source: #{source.collection_id}")
|
|
|
|
case http_client().get(rss_url_for_source(source)) do
|
|
{:ok, response} ->
|
|
response = to_string(response)
|
|
media_id_regex = ~r/<yt:videoId>(.*?)<\/yt:videoId>/
|
|
|
|
# Don't get on me about using regex to search XML.
|
|
# The content is known, well-formed, and simple.
|
|
media_ids =
|
|
media_id_regex
|
|
|> Regex.scan(response)
|
|
|> Enum.map(fn [_, id] -> String.trim(id) end)
|
|
|> Enum.filter(&(String.length(&1) > 0))
|
|
|> Enum.uniq()
|
|
|
|
Logger.debug("Media ids fetched from RSS: #{inspect(media_ids)}")
|
|
|
|
{:ok, media_ids}
|
|
|
|
{:error, _reason} ->
|
|
{:error, "Failed to fetch RSS feed"}
|
|
end
|
|
end
|
|
|
|
defp rss_url_for_source(source) do
|
|
case source.collection_type do
|
|
:channel -> "https://www.youtube.com/feeds/videos.xml?channel_id=#{source.collection_id}"
|
|
:playlist -> "https://www.youtube.com/feeds/videos.xml?playlist_id=#{source.collection_id}"
|
|
end
|
|
end
|
|
|
|
defp http_client do
|
|
Application.get_env(:pinchflat, :http_client, Pinchflat.HTTP.HTTPClient)
|
|
end
|
|
end
|