[WIP] updated the output of VideoCollection to include playlists

This commit is contained in:
Kieran Eglin 2024-02-02 11:06:01 -08:00
parent bdef6c75bb
commit bb2ca0fb30
No known key found for this signature in database
GPG key ID: 193984967FCF432D
4 changed files with 52 additions and 14 deletions

View file

@ -12,3 +12,39 @@ alias Pinchflat.Profiles
alias Pinchflat.MediaSource
alias Pinchflat.MediaClient.{SourceDetails, VideoDownloader}
defmodule IexHelpers do
def playlist_url do
"https://www.youtube.com/playlist?list=PLmqC3wPkeL8kSlTCcSMDD63gmSi7evcXS"
end
def channel_url do
"https://www.youtube.com/c/TheUselessTrials"
end
def video_url do
"https://www.youtube.com/watch?v=bR52O78ZIUw"
end
def details(type) do
source =
case type do
:playlist -> playlist_url()
:channel -> channel_url()
end
SourceDetails.get_source_details(source)
end
def ids(type) do
source =
case type do
:playlist -> playlist_url()
:channel -> channel_url()
end
SourceDetails.get_video_ids(source)
end
end
import IexHelpers

View file

@ -4,8 +4,6 @@ defmodule Pinchflat.MediaClient.Backends.YtDlp.VideoCollection do
videos (aka: a source [ie: channels, playlists]).
"""
alias Pinchflat.MediaClient.SourceDetails
@doc """
Returns a list of strings representing the video ids in the collection.
@ -28,19 +26,30 @@ defmodule Pinchflat.MediaClient.Backends.YtDlp.VideoCollection do
instead we're fetching just the first video (using playlist_end: 1)
and parsing the source ID and name from _its_ metadata
Returns {:ok, %SourceDetails{}} | {:error, any, ...}.
Returns {:ok, map()} | {:error, any, ...}.
"""
def get_source_details(source_url) do
opts = [:skip_download, playlist_end: 1]
opts = [:simulate, :skip_download, playlist_end: 1]
output_template = "%(.{channel,channel_id,playlist_id,playlist_title})j"
with {:ok, output} <- backend_runner().run(source_url, opts, "%(.{channel,channel_id})j"),
with {:ok, output} <- backend_runner().run(source_url, opts, output_template),
{:ok, parsed_json} <- Phoenix.json_library().decode(output) do
{:ok, SourceDetails.new(parsed_json["channel_id"], parsed_json["channel"])}
{:ok, format_source_details(parsed_json)}
else
err -> err
end
end
# TODO: test
defp format_source_details(response) do
%{
channel_id: response["channel_id"],
channel_name: response["channel"],
playlist_id: response["playlist_id"],
playlist_name: response["playlist_title"]
}
end
defp backend_runner do
Application.get_env(:pinchflat, :yt_dlp_runner)
end

View file

@ -5,16 +5,9 @@ defmodule Pinchflat.MediaClient.SourceDetails do
Technically hardcodes the yt-dlp backend for now, but should leave
it open-ish for future expansion (just in case).
"""
@enforce_keys [:id, :name]
defstruct [:id, :name]
alias Pinchflat.MediaClient.Backends.YtDlp.VideoCollection, as: YtDlpSource
@doc false
def new(id, name) do
%__MODULE__{id: id, name: name}
end
@doc """
Gets a source's ID and name from its URL, using the given backend.

View file

@ -115,7 +115,7 @@ defmodule Pinchflat.MediaSource do
%Ecto.Changeset{changes: changes} = changeset
case SourceDetails.get_source_details(changes.original_url) do
{:ok, %SourceDetails{} = source_details} ->
{:ok, source_details} ->
change_source(
source,
Map.merge(changes, %{