From a5e7c48f70250a45ac71d384a0936de92c807a6d Mon Sep 17 00:00:00 2001 From: Kieran Date: Tue, 30 Jan 2024 20:15:59 -0800 Subject: [PATCH] Download video(s) (first iteration) (#5) * Updated package.json (and made an excuse to make a branch) * Video filepath parser (#6) * Restructured files; Added parser placeholder * More restructuring * Added basic parser for hydrating template strings * Improved docs * More docs * Initial implementation of media profiles (#7) * [WIP] Added basic video download method * [WIP] Very-WIP first steps at parsing options and downloading * Made my options safe by default and removed special safe versions * Ran html generator for mediaprofile model - leaving as-is for now * Addressed a bunch of TODO comments * Add "channel" type Media Source (#8) * [WIP] Working on fetching channel metadata in yt-dlp backend * Finished first draft of methods to do with querying channels * Renamed CommandRunnerMock to have a more descriptive name * Ran the phx generator for the channel model * Renamed Downloader namespace to MediaClient * [WIP] saving before attempting LiveView * LiveView did not work out but here's a working controller how about * Index a channel (#9) * Ran a MediaItem generator; Reformatted to my liking * [WIP] added basic index function * setup oban * Added basic Oban job for indexing * Added in workers for indexing; hooked them into record creation flow * Added a task model with a phx generator * Tied together tasks with jobs and channels * Download indexed videos (#10) * Clarified documentation * more comments * [WIP] hooked up basic video downloading; starting work on metadata * Added metadata model and parsing Adding the metadata model made me realize that, in many cases, yt-dlp returns undesired input in stdout, breaking parsing. In order to get the metadata model working, I had to change the way in which the app interacts with yt-dlp. Now, output is written as a file to disk which is immediately re-read and returned. * Added tests for video download worker * Hooked up video downloading to the channel indexing pipeline * Adds tasks for media items * Updated video metadata parser to extract the title * Ran linting --- .gitignore | 1 + Dockerfile | 2 + assets/yarn.lock | 4 + config/config.exs | 12 +- config/dev.exs | 4 + config/test.exs | 6 +- ideas.md | 3 + lib/pinchflat/application.ex | 1 + .../backend_command_runner.ex | 7 - .../yt_dlp/command_runner.ex | 58 - .../yt_dlp/video_collection.ex | 21 - lib/pinchflat/media.ex | 75 + lib/pinchflat/media/media_item.ex | 38 + lib/pinchflat/media/media_metadata.ex | 28 + .../backends/backend_command_runner.ex | 7 + .../media_client/backends/yt_dlp/channel.ex | 32 + .../backends/yt_dlp/command_runner.ex | 90 + .../backends/yt_dlp/metadata_parser.ex | 27 + .../media_client/backends/yt_dlp/video.ex | 26 + .../backends/yt_dlp/video_collection.ex | 28 + lib/pinchflat/media_client/channel_details.ex | 41 + .../media_client/video_downloader.ex | 70 + lib/pinchflat/media_source.ex | 163 + lib/pinchflat/media_source/channel.ex | 37 + lib/pinchflat/profiles.ex | 56 + lib/pinchflat/profiles/media_profile.ex | 27 + .../profiles/options/yt_dlp/option_builder.ex | 39 + .../options/yt_dlp/output_path_builder.ex | 64 + lib/pinchflat/rendered_string/base.ex | 52 + lib/pinchflat/rendered_string/parser.ex | 35 + lib/pinchflat/repo.ex | 14 + lib/pinchflat/tasks.ex | 148 + lib/pinchflat/tasks/channel_tasks.ex | 33 + lib/pinchflat/tasks/task.ex | 26 + lib/{ => pinchflat}/utils/string_utils.ex | 13 + .../workers/media_indexing_worker.ex | 80 + .../workers/video_download_worker.ex | 26 + .../media_profile_controller.ex | 62 + .../media_profiles/media_profile_html.ex | 13 + .../media_profile_html/edit.html.heex | 8 + .../media_profile_html/index.html.heex | 30 + .../media_profile_form.html.heex | 10 + .../media_profile_html/new.html.heex | 8 + .../media_profile_html/show.html.heex | 16 + .../media_sources/channel_controller.ex | 75 + .../controllers/media_sources/channel_html.ex | 27 + .../channel_html/channel_form.html.heex | 25 + .../media_sources/channel_html/edit.html.heex | 12 + .../channel_html/index.html.heex | 28 + .../media_sources/channel_html/new.html.heex | 12 + .../media_sources/channel_html/show.html.heex | 17 + lib/pinchflat_web/router.ex | 6 + mix.exs | 5 +- mix.lock | 3 + package.json | 2 +- .../20240122030944_create_media_profiles.exs | 14 + .../20240123174417_create_channels.exs | 17 + .../20240125025325_create_media_items.exs | 17 + .../20240125043813_add_oban_jobs_table.exs | 13 + ...165519_add_index_frequency_to_channels.exs | 9 + .../20240125212753_create_tasks.exs | 16 + .../20240129015810_create_media_metadata.exs | 15 + ...20240130161316_add_media_item_to_tasks.exs | 12 + .../yt_dlp/video_collection_test.exs | 44 - .../backends/yt_dlp/channel_test.exs | 45 + .../backends}/yt_dlp/command_runner_test.exs | 31 +- .../backends/yt_dlp/metadata_parser_test.exs | 45 + .../yt_dlp/output_path_builder_test.exs | 25 + .../backends/yt_dlp/video_collection_test.exs | 49 + .../backends/yt_dlp/video_test.exs | 56 + .../media_client/channel_details_test.exs | 60 + .../media_client/video_downloader_test.exs | 61 + test/pinchflat/media_source_test.exs | 313 + test/pinchflat/media_test.exs | 126 + .../options/yt_dlp/option_builder_test.exs | 18 + test/pinchflat/profiles_test.exs | 78 + .../pinchflat/rendered_string/parser_test.exs | 40 + test/pinchflat/repo_test.exs | 26 + test/pinchflat/tasks/channel_tasks_test.exs | 45 + test/pinchflat/tasks_test.exs | 211 + test/pinchflat/utils/string_utils_test.exs | 17 +- .../workers/media_indexing_worker_test.exs | 110 + .../workers/video_download_worker_test.exs | 59 + .../controllers/channel_controller_test.exs | 119 + .../media_profile_controller_test.exs | 90 + test/support/conn_case.ex | 1 + test/support/data_case.ex | 3 + test/support/files/media_metadata.json | 5772 +++++++++++++++++ test/support/fixtures/job_fixtures.ex | 19 + test/support/fixtures/media_fixtures.ex | 45 + .../support/fixtures/media_source_fixtures.ex | 30 + test/support/fixtures/profiles_fixtures.ex | 21 + test/support/fixtures/tasks_fixtures.ex | 24 + test/support/scripts/yt-dlp-mocks/repeater.sh | 19 +- test/support/testing_helper_methods.ex | 43 + test/test_helper.exs | 5 +- 96 files changed, 9358 insertions(+), 158 deletions(-) create mode 100644 assets/yarn.lock create mode 100644 ideas.md delete mode 100644 lib/pinchflat/downloader_backends/backend_command_runner.ex delete mode 100644 lib/pinchflat/downloader_backends/yt_dlp/command_runner.ex delete mode 100644 lib/pinchflat/downloader_backends/yt_dlp/video_collection.ex create mode 100644 lib/pinchflat/media.ex create mode 100644 lib/pinchflat/media/media_item.ex create mode 100644 lib/pinchflat/media/media_metadata.ex create mode 100644 lib/pinchflat/media_client/backends/backend_command_runner.ex create mode 100644 lib/pinchflat/media_client/backends/yt_dlp/channel.ex create mode 100644 lib/pinchflat/media_client/backends/yt_dlp/command_runner.ex create mode 100644 lib/pinchflat/media_client/backends/yt_dlp/metadata_parser.ex create mode 100644 lib/pinchflat/media_client/backends/yt_dlp/video.ex create mode 100644 lib/pinchflat/media_client/backends/yt_dlp/video_collection.ex create mode 100644 lib/pinchflat/media_client/channel_details.ex create mode 100644 lib/pinchflat/media_client/video_downloader.ex create mode 100644 lib/pinchflat/media_source.ex create mode 100644 lib/pinchflat/media_source/channel.ex create mode 100644 lib/pinchflat/profiles.ex create mode 100644 lib/pinchflat/profiles/media_profile.ex create mode 100644 lib/pinchflat/profiles/options/yt_dlp/option_builder.ex create mode 100644 lib/pinchflat/profiles/options/yt_dlp/output_path_builder.ex create mode 100644 lib/pinchflat/rendered_string/base.ex create mode 100644 lib/pinchflat/rendered_string/parser.ex create mode 100644 lib/pinchflat/tasks.ex create mode 100644 lib/pinchflat/tasks/channel_tasks.ex create mode 100644 lib/pinchflat/tasks/task.ex rename lib/{ => pinchflat}/utils/string_utils.ex (52%) create mode 100644 lib/pinchflat/workers/media_indexing_worker.ex create mode 100644 lib/pinchflat/workers/video_download_worker.ex create mode 100644 lib/pinchflat_web/controllers/media_profiles/media_profile_controller.ex create mode 100644 lib/pinchflat_web/controllers/media_profiles/media_profile_html.ex create mode 100644 lib/pinchflat_web/controllers/media_profiles/media_profile_html/edit.html.heex create mode 100644 lib/pinchflat_web/controllers/media_profiles/media_profile_html/index.html.heex create mode 100644 lib/pinchflat_web/controllers/media_profiles/media_profile_html/media_profile_form.html.heex create mode 100644 lib/pinchflat_web/controllers/media_profiles/media_profile_html/new.html.heex create mode 100644 lib/pinchflat_web/controllers/media_profiles/media_profile_html/show.html.heex create mode 100644 lib/pinchflat_web/controllers/media_sources/channel_controller.ex create mode 100644 lib/pinchflat_web/controllers/media_sources/channel_html.ex create mode 100644 lib/pinchflat_web/controllers/media_sources/channel_html/channel_form.html.heex create mode 100644 lib/pinchflat_web/controllers/media_sources/channel_html/edit.html.heex create mode 100644 lib/pinchflat_web/controllers/media_sources/channel_html/index.html.heex create mode 100644 lib/pinchflat_web/controllers/media_sources/channel_html/new.html.heex create mode 100644 lib/pinchflat_web/controllers/media_sources/channel_html/show.html.heex create mode 100644 priv/repo/migrations/20240122030944_create_media_profiles.exs create mode 100644 priv/repo/migrations/20240123174417_create_channels.exs create mode 100644 priv/repo/migrations/20240125025325_create_media_items.exs create mode 100644 priv/repo/migrations/20240125043813_add_oban_jobs_table.exs create mode 100644 priv/repo/migrations/20240125165519_add_index_frequency_to_channels.exs create mode 100644 priv/repo/migrations/20240125212753_create_tasks.exs create mode 100644 priv/repo/migrations/20240129015810_create_media_metadata.exs create mode 100644 priv/repo/migrations/20240130161316_add_media_item_to_tasks.exs delete mode 100644 test/pinchflat/downloader_backends/yt_dlp/video_collection_test.exs create mode 100644 test/pinchflat/media_client/backends/yt_dlp/channel_test.exs rename test/pinchflat/{downloader_backends => media_client/backends}/yt_dlp/command_runner_test.exs (62%) create mode 100644 test/pinchflat/media_client/backends/yt_dlp/metadata_parser_test.exs create mode 100644 test/pinchflat/media_client/backends/yt_dlp/output_path_builder_test.exs create mode 100644 test/pinchflat/media_client/backends/yt_dlp/video_collection_test.exs create mode 100644 test/pinchflat/media_client/backends/yt_dlp/video_test.exs create mode 100644 test/pinchflat/media_client/channel_details_test.exs create mode 100644 test/pinchflat/media_client/video_downloader_test.exs create mode 100644 test/pinchflat/media_source_test.exs create mode 100644 test/pinchflat/media_test.exs create mode 100644 test/pinchflat/profiles/options/yt_dlp/option_builder_test.exs create mode 100644 test/pinchflat/profiles_test.exs create mode 100644 test/pinchflat/rendered_string/parser_test.exs create mode 100644 test/pinchflat/repo_test.exs create mode 100644 test/pinchflat/tasks/channel_tasks_test.exs create mode 100644 test/pinchflat/tasks_test.exs create mode 100644 test/pinchflat/workers/media_indexing_worker_test.exs create mode 100644 test/pinchflat/workers/video_download_worker_test.exs create mode 100644 test/pinchflat_web/controllers/channel_controller_test.exs create mode 100644 test/pinchflat_web/controllers/media_profile_controller_test.exs create mode 100644 test/support/files/media_metadata.json create mode 100644 test/support/fixtures/job_fixtures.ex create mode 100644 test/support/fixtures/media_fixtures.ex create mode 100644 test/support/fixtures/media_source_fixtures.ex create mode 100644 test/support/fixtures/profiles_fixtures.ex create mode 100644 test/support/fixtures/tasks_fixtures.ex create mode 100644 test/support/testing_helper_methods.ex diff --git a/.gitignore b/.gitignore index 81199f42..4ef91f6c 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,4 @@ npm-debug.log /.elixir_ls .env +.DS_Store diff --git a/Dockerfile b/Dockerfile index 9c93dc8b..e987099e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,5 +29,7 @@ RUN chmod +x ./docker-run.sh # Install Elixir deps RUN mix deps.get +# Gives us iex shell history +ENV ERL_AFLAGS="-kernel shell_history enabled" EXPOSE 4008 diff --git a/assets/yarn.lock b/assets/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/assets/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/config/config.exs b/config/config.exs index f920c3cf..91b39206 100644 --- a/config/config.exs +++ b/config/config.exs @@ -12,7 +12,10 @@ config :pinchflat, generators: [timestamp_type: :utc_datetime], # Specifying backend data here makes mocking and local testing SUPER easy yt_dlp_executable: System.find_executable("yt-dlp"), - yt_dlp_runner: Pinchflat.DownloaderBackends.YtDlp.CommandRunner + yt_dlp_runner: Pinchflat.MediaClient.Backends.YtDlp.CommandRunner, + # TODO: figure this out + media_directory: :not_implemented, + metadata_directory: Path.join([System.tmp_dir!(), "pinchflat", "metadata"]) # Configures the endpoint config :pinchflat, PinchflatWeb.Endpoint, @@ -25,6 +28,13 @@ config :pinchflat, PinchflatWeb.Endpoint, pubsub_server: Pinchflat.PubSub, live_view: [signing_salt: "/t5878kO"] +config :pinchflat, Oban, + repo: Pinchflat.Repo, + # Keep old jobs for 30 days for display in the UI + plugins: [{Oban.Plugins.Pruner, max_age: 30 * 24 * 60 * 60}], + # TODO: consider making this an env var or something? + queues: [default: 10, media_indexing: 2, media_fetching: 2] + # Configures the mailer # # By default it uses the "Local" adapter which stores the emails diff --git a/config/dev.exs b/config/dev.exs index a3bc3e44..ccf1d708 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -1,5 +1,9 @@ import Config +config :pinchflat, + media_directory: Path.join([File.cwd!(), "tmp", "videos"]), + metadata_directory: Path.join([File.cwd!(), "tmp", "metadata"]) + # Configure your database config :pinchflat, Pinchflat.Repo, username: System.get_env("POSTGRES_USER"), diff --git a/config/test.exs b/config/test.exs index 20d03ff2..b2d86149 100644 --- a/config/test.exs +++ b/config/test.exs @@ -2,7 +2,11 @@ import Config config :pinchflat, # Specifying backend data here makes mocking and local testing SUPER easy - yt_dlp_executable: Path.join([File.cwd!(), "/test/support/scripts/yt-dlp-mocks/repeater.sh"]) + yt_dlp_executable: Path.join([File.cwd!(), "/test/support/scripts/yt-dlp-mocks/repeater.sh"]), + media_directory: Path.join([System.tmp_dir!(), "videos"]), + metadata_directory: Path.join([System.tmp_dir!(), "metadata"]) + +config :pinchflat, Oban, testing: :manual # Configure your database # diff --git a/ideas.md b/ideas.md new file mode 100644 index 00000000..2cb74e33 --- /dev/null +++ b/ideas.md @@ -0,0 +1,3 @@ +- Write media datbase ID as metadata/to file/whatever so it gives us an option to retroactively match media to the DB down the line. Useful if someone moves the media without informing the UI + - Use a UUID for the media database ID (or at least alongside it) +- Look into this and its recommended plugins https://hexdocs.pm/ex_check/readme.html diff --git a/lib/pinchflat/application.ex b/lib/pinchflat/application.ex index 774cc5d9..6842111a 100644 --- a/lib/pinchflat/application.ex +++ b/lib/pinchflat/application.ex @@ -10,6 +10,7 @@ defmodule Pinchflat.Application do children = [ PinchflatWeb.Telemetry, Pinchflat.Repo, + {Oban, Application.fetch_env!(:pinchflat, Oban)}, {DNSCluster, query: Application.get_env(:pinchflat, :dns_cluster_query) || :ignore}, {Phoenix.PubSub, name: Pinchflat.PubSub}, # Start the Finch HTTP client for sending emails diff --git a/lib/pinchflat/downloader_backends/backend_command_runner.ex b/lib/pinchflat/downloader_backends/backend_command_runner.ex deleted file mode 100644 index 6e1bcb7a..00000000 --- a/lib/pinchflat/downloader_backends/backend_command_runner.ex +++ /dev/null @@ -1,7 +0,0 @@ -defmodule Pinchflat.DownloaderBackends.BackendCommandRunner do - @moduledoc """ - A behaviour for running CLI commands against a downloader backend - """ - - @callback run(binary(), keyword()) :: {:ok, binary()} | {:error, binary(), integer()} -end diff --git a/lib/pinchflat/downloader_backends/yt_dlp/command_runner.ex b/lib/pinchflat/downloader_backends/yt_dlp/command_runner.ex deleted file mode 100644 index 014ae0ec..00000000 --- a/lib/pinchflat/downloader_backends/yt_dlp/command_runner.ex +++ /dev/null @@ -1,58 +0,0 @@ -defmodule Pinchflat.DownloaderBackends.YtDlp.CommandRunner do - @moduledoc """ - Runs yt-dlp commands using the `System.cmd/3` function - """ - - alias Pinchflat.Utils.StringUtils - alias Pinchflat.DownloaderBackends.BackendCommandRunner - - @behaviour BackendCommandRunner - - @doc """ - Runs a yt-dlp command and returns the string output - """ - @impl BackendCommandRunner - def run(url, command_opts) do - command = backend_executable() - formatted_command_opts = parse_options(command_opts) ++ [url] - - case System.cmd(command, formatted_command_opts, stderr_to_stdout: true) do - {output, 0} -> {:ok, output} - {output, status} -> {:error, output, status} - end - end - - # We want to satisfy the following behaviours: - # - # 1. If the key is an atom, convert it to a string and convert it to kebab case (for convenience) - # 2. If the key is a string, assume we want it as-is and don't convert it - # 3. If the key is accompanied by a value, append the value to the list - # 4. If the key is not accompanied by a value, assume it's a flag and PREpend it to the list - defp parse_options(command_opts) do - Enum.reduce(command_opts, [], &parse_option/2) - end - - defp parse_option({k, v}, acc) when is_atom(k) do - stringified_key = StringUtils.to_kebab_case(Atom.to_string(k)) - - parse_option({"--#{stringified_key}", v}, acc) - end - - defp parse_option({k, v}, acc) when is_binary(k) do - acc ++ [k, to_string(v)] - end - - defp parse_option(arg, acc) when is_atom(arg) do - stringified_arg = StringUtils.to_kebab_case(Atom.to_string(arg)) - - parse_option("--#{stringified_arg}", acc) - end - - defp parse_option(arg, acc) when is_binary(arg) do - [arg | acc] - end - - defp backend_executable do - Application.get_env(:pinchflat, :yt_dlp_executable) - end -end diff --git a/lib/pinchflat/downloader_backends/yt_dlp/video_collection.ex b/lib/pinchflat/downloader_backends/yt_dlp/video_collection.ex deleted file mode 100644 index 324895ba..00000000 --- a/lib/pinchflat/downloader_backends/yt_dlp/video_collection.ex +++ /dev/null @@ -1,21 +0,0 @@ -defmodule Pinchflat.DownloaderBackends.YtDlp.VideoCollection do - @moduledoc """ - Contains utilities for working with collections of videos (ie: channels, playlists) - """ - - @doc """ - Returns a list of strings representing the video ids in the collection - """ - def get_video_ids(url, command_opts \\ []) do - opts = command_opts ++ [:simulate, :skip_download, :get_id] - - case backend_runner().run(url, opts) do - {:ok, output} -> {:ok, String.split(output, "\n", trim: true)} - res -> res - end - end - - defp backend_runner do - Application.get_env(:pinchflat, :yt_dlp_runner) - end -end diff --git a/lib/pinchflat/media.ex b/lib/pinchflat/media.ex new file mode 100644 index 00000000..0ec21d14 --- /dev/null +++ b/lib/pinchflat/media.ex @@ -0,0 +1,75 @@ +defmodule Pinchflat.Media do + @moduledoc """ + The Media context. + """ + + import Ecto.Query, warn: false + + alias Pinchflat.Repo + alias Pinchflat.Tasks + alias Pinchflat.Media.MediaItem + alias Pinchflat.MediaSource.Channel + + @doc """ + Returns the list of media_items. Returns [%MediaItem{}, ...]. + """ + def list_media_items do + Repo.all(MediaItem) + end + + @doc """ + Returns a list of pending media_items for a given channel, where + pending means the `video_filepath` is `nil`. + + Returns [%MediaItem{}, ...]. + """ + def list_pending_media_items_for(%Channel{} = channel) do + from( + m in MediaItem, + where: m.channel_id == ^channel.id and is_nil(m.video_filepath) + ) + |> Repo.all() + end + + @doc """ + Gets a single media_item. + + Returns %MediaItem{}. Raises `Ecto.NoResultsError` if the Media item does not exist. + """ + def get_media_item!(id), do: Repo.get!(MediaItem, id) + + @doc """ + Creates a media_item. Returns {:ok, %MediaItem{}} | {:error, %Ecto.Changeset{}}. + """ + def create_media_item(attrs) do + %MediaItem{} + |> MediaItem.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a media_item. Returns {:ok, %MediaItem{}} | {:error, %Ecto.Changeset{}}. + """ + def update_media_item(%MediaItem{} = media_item, attrs) do + media_item + |> MediaItem.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a media_item and its associated tasks. + + Returns {:ok, %MediaItem{}} | {:error, %Ecto.Changeset{}}. + """ + def delete_media_item(%MediaItem{} = media_item) do + Tasks.delete_tasks_for(media_item) + Repo.delete(media_item) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking media_item changes. + """ + def change_media_item(%MediaItem{} = media_item, attrs \\ %{}) do + MediaItem.changeset(media_item, attrs) + end +end diff --git a/lib/pinchflat/media/media_item.ex b/lib/pinchflat/media/media_item.ex new file mode 100644 index 00000000..a15427a2 --- /dev/null +++ b/lib/pinchflat/media/media_item.ex @@ -0,0 +1,38 @@ +defmodule Pinchflat.Media.MediaItem do + @moduledoc """ + The MediaItem schema. + """ + + use Ecto.Schema + import Ecto.Changeset + + alias Pinchflat.Tasks.Task + alias Pinchflat.MediaSource.Channel + alias Pinchflat.Media.MediaMetadata + + @required_fields ~w(media_id channel_id)a + @allowed_fields ~w(title media_id video_filepath channel_id)a + + schema "media_items" do + field :title, :string + field :media_id, :string + field :video_filepath, :string + + belongs_to :channel, Channel + + has_one :metadata, MediaMetadata, on_replace: :update + + has_many :tasks, Task + + timestamps(type: :utc_datetime) + end + + @doc false + def changeset(media_item, attrs) do + media_item + |> cast(attrs, @allowed_fields) + |> cast_assoc(:metadata, with: &MediaMetadata.changeset/2, required: false) + |> validate_required(@required_fields) + |> unique_constraint([:media_id, :channel_id]) + end +end diff --git a/lib/pinchflat/media/media_metadata.ex b/lib/pinchflat/media/media_metadata.ex new file mode 100644 index 00000000..e41db271 --- /dev/null +++ b/lib/pinchflat/media/media_metadata.ex @@ -0,0 +1,28 @@ +defmodule Pinchflat.Media.MediaMetadata do + @moduledoc """ + The MediaMetadata schema. + + Look. Don't @ me about Metadata vs. Metadatum. I'm very sensitive. + """ + + use Ecto.Schema + import Ecto.Changeset + + alias Pinchflat.Media.MediaItem + + schema "media_metadata" do + field :client_response, :map + + belongs_to :media_item, MediaItem + + timestamps(type: :utc_datetime) + end + + @doc false + def changeset(media_metadata, attrs) do + media_metadata + |> cast(attrs, [:client_response]) + |> validate_required([:client_response]) + |> unique_constraint([:media_item_id]) + end +end diff --git a/lib/pinchflat/media_client/backends/backend_command_runner.ex b/lib/pinchflat/media_client/backends/backend_command_runner.ex new file mode 100644 index 00000000..272286f8 --- /dev/null +++ b/lib/pinchflat/media_client/backends/backend_command_runner.ex @@ -0,0 +1,7 @@ +defmodule Pinchflat.MediaClient.Backends.BackendCommandRunner do + @moduledoc """ + A behaviour for running CLI commands against a downloader backend + """ + + @callback run(binary(), keyword(), binary()) :: {:ok, binary()} | {:error, binary(), integer()} +end diff --git a/lib/pinchflat/media_client/backends/yt_dlp/channel.ex b/lib/pinchflat/media_client/backends/yt_dlp/channel.ex new file mode 100644 index 00000000..d97f88d2 --- /dev/null +++ b/lib/pinchflat/media_client/backends/yt_dlp/channel.ex @@ -0,0 +1,32 @@ +defmodule Pinchflat.MediaClient.Backends.YtDlp.Channel do + @moduledoc """ + Contains utilities for working with a channel's videos + """ + + use Pinchflat.MediaClient.Backends.YtDlp.VideoCollection + alias Pinchflat.MediaClient.ChannelDetails + + @doc """ + Gets a channel's ID and name from its URL. + + yt-dlp does not _really_ have channel-specific functions, so + instead we're fetching just the first video (using playlist_end: 1) + and parsing the channel ID and name from _its_ metadata + + Returns {:ok, %ChannelDetails{}} | {:error, any, ...}. + """ + def get_channel_details(channel_url) do + opts = [playlist_end: 1] + + with {:ok, output} <- backend_runner().run(channel_url, opts, "%(.{channel,channel_id})j"), + {:ok, parsed_json} <- Phoenix.json_library().decode(output) do + {:ok, ChannelDetails.new(parsed_json["channel_id"], parsed_json["channel"])} + else + err -> err + end + end + + defp backend_runner do + Application.get_env(:pinchflat, :yt_dlp_runner) + end +end diff --git a/lib/pinchflat/media_client/backends/yt_dlp/command_runner.ex b/lib/pinchflat/media_client/backends/yt_dlp/command_runner.ex new file mode 100644 index 00000000..e88e238e --- /dev/null +++ b/lib/pinchflat/media_client/backends/yt_dlp/command_runner.ex @@ -0,0 +1,90 @@ +defmodule Pinchflat.MediaClient.Backends.YtDlp.CommandRunner do + @moduledoc """ + Runs yt-dlp commands using the `System.cmd/3` function + """ + + require Logger + + alias Pinchflat.Utils.StringUtils + alias Pinchflat.MediaClient.Backends.BackendCommandRunner + + @behaviour BackendCommandRunner + + @doc """ + Runs a yt-dlp command and returns the string output. Saves the output to + a file and then returns its contents because yt-dlp will return warnings + to stdout even if the command is successful, but these will break JSON parsing. + + Returns {:ok, binary()} | {:error, output, status}. + + IDEA: Indexing takes a long time, but the output is actually streamed to stdout. + Maybe we could listen to that stream instead so we can index videos as they're discovered. + See: https://stackoverflow.com/a/49061086/5665799 + """ + @impl BackendCommandRunner + def run(url, command_opts, output_template) do + command = backend_executable() + # These must stay in exactly this order, hence why I'm giving it its own variable. + # Also, can't use RAM file since yt-dlp needs a concrete filepath. + json_output_path = generate_json_output_path() + print_to_file_opts = [{:print_to_file, output_template}, json_output_path] + formatted_command_opts = [url] ++ parse_options(command_opts ++ print_to_file_opts) + + Logger.debug("[yt-dlp] called with: #{Enum.join(formatted_command_opts, " ")}") + + case System.cmd(command, formatted_command_opts, stderr_to_stdout: true) do + {_, 0} -> + # IDEA: consider deleting the file after reading it + # (even on error? especially on error?) + File.read(json_output_path) + + {output, status} -> + {:error, output, status} + end + end + + defp generate_json_output_path do + metadata_directory = Application.get_env(:pinchflat, :metadata_directory) + filepath = Path.join([metadata_directory, "#{StringUtils.random_string(64)}.json"]) + + # Ensure the file can be created and written to BEFORE we run the `yt-dlp` command + :ok = File.mkdir_p!(Path.dirname(filepath)) + :ok = File.write(filepath, "") + + filepath + end + + # We want to satisfy the following behaviours: + # + # 1. If the key is an atom, convert it to a string and convert it to kebab case (for convenience) + # 2. If the key is a string, assume we want it as-is and don't convert it + # 3. If the key is accompanied by a value, append the value to the list + # 4. If the key is not accompanied by a value, assume it's a flag and PREpend it to the list + defp parse_options(command_opts) do + Enum.reduce(command_opts, [], &parse_option/2) + end + + defp parse_option({k, v}, acc) when is_atom(k) do + stringified_key = StringUtils.to_kebab_case(Atom.to_string(k)) + + parse_option({"--#{stringified_key}", v}, acc) + end + + defp parse_option({k, v}, acc) when is_binary(k) do + acc ++ [k, to_string(v)] + end + + defp parse_option(arg, acc) when is_atom(arg) do + stringified_arg = StringUtils.to_kebab_case(Atom.to_string(arg)) + + parse_option("--#{stringified_arg}", acc) + end + + defp parse_option(arg, acc) when is_binary(arg) do + acc ++ [arg] + end + + defp backend_executable do + Application.get_env(:pinchflat, :yt_dlp_executable) + end +end diff --git a/lib/pinchflat/media_client/backends/yt_dlp/metadata_parser.ex b/lib/pinchflat/media_client/backends/yt_dlp/metadata_parser.ex new file mode 100644 index 00000000..be7f8abf --- /dev/null +++ b/lib/pinchflat/media_client/backends/yt_dlp/metadata_parser.ex @@ -0,0 +1,27 @@ +defmodule Pinchflat.MediaClient.Backends.YtDlp.MetadataParser do + @moduledoc """ + yt-dlp offers a LOT of metadata in its JSON response, some of which + needs to be extracted and included in various models. + + For now, also squirrel all of it away in the `media_metadata` table. + I might revisit this or pare it down later, but I'd rather need it + and not have it, ya know? + """ + + @doc """ + Parses the given JSON response from yt-dlp and returns a map of + the needful media_item attributes, along with anything needed for + its associations. + + Returns map() + """ + def parse_for_media_item(metadata) do + %{ + title: metadata["title"], + video_filepath: metadata["filepath"], + metadata: %{ + client_response: metadata + } + } + end +end diff --git a/lib/pinchflat/media_client/backends/yt_dlp/video.ex b/lib/pinchflat/media_client/backends/yt_dlp/video.ex new file mode 100644 index 00000000..fac8564c --- /dev/null +++ b/lib/pinchflat/media_client/backends/yt_dlp/video.ex @@ -0,0 +1,26 @@ +defmodule Pinchflat.MediaClient.Backends.YtDlp.Video do + @moduledoc """ + Contains utilities for working with singular videos + """ + + @doc """ + Downloads a single video (and possibly its metadata) directly to its + final destination. Returns the parsed JSON output from yt-dlp. + + Returns {:ok, map()} | {:error, any, ...}. + """ + def download(url, command_opts \\ []) do + opts = [:no_simulate] ++ command_opts + + with {:ok, output} <- backend_runner().run(url, opts, "after_move:%()j"), + {:ok, parsed_json} <- Phoenix.json_library().decode(output) do + {:ok, parsed_json} + else + err -> err + end + end + + defp backend_runner do + Application.get_env(:pinchflat, :yt_dlp_runner) + end +end diff --git a/lib/pinchflat/media_client/backends/yt_dlp/video_collection.ex b/lib/pinchflat/media_client/backends/yt_dlp/video_collection.ex new file mode 100644 index 00000000..d89c0643 --- /dev/null +++ b/lib/pinchflat/media_client/backends/yt_dlp/video_collection.ex @@ -0,0 +1,28 @@ +defmodule Pinchflat.MediaClient.Backends.YtDlp.VideoCollection do + @moduledoc """ + Contains utilities for working with collections of videos (ie: channels, playlists). + + Meant to be included in other modules but can be used on its own. Channels and playlists + will have many of their own methods, but also share a lot of methods. This module is for + those shared methods. + """ + + defmacro __using__(_) do + quote do + @doc """ + Returns a list of strings representing the video ids in the collection. + + Returns {:ok, [binary()]} | {:error, any, ...}. + """ + def get_video_ids(url, command_opts \\ []) do + runner = Application.get_env(:pinchflat, :yt_dlp_runner) + opts = command_opts ++ [:simulate, :skip_download] + + case runner.run(url, opts, "%(id)s") do + {:ok, output} -> {:ok, String.split(output, "\n", trim: true)} + res -> res + end + end + end + end +end diff --git a/lib/pinchflat/media_client/channel_details.ex b/lib/pinchflat/media_client/channel_details.ex new file mode 100644 index 00000000..021238b9 --- /dev/null +++ b/lib/pinchflat/media_client/channel_details.ex @@ -0,0 +1,41 @@ +defmodule Pinchflat.MediaClient.ChannelDetails do + @moduledoc """ + This is the integration layer for actually working with channels. + + 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.Channel, as: YtDlpChannel + + @doc false + def new(id, name) do + %__MODULE__{id: id, name: name} + end + + @doc """ + Gets a channel's ID and name from its URL, using the given backend. + + Returns {:ok, map()} | {:error, any, ...}. + """ + def get_channel_details(channel_url, backend \\ :yt_dlp) do + channel_module(backend).get_channel_details(channel_url) + end + + @doc """ + Returns a list of video IDs for the given channel URL, using the given backend. + + Returns {:ok, list(binary())} | {:error, any, ...}. + """ + def get_video_ids(channel_url, backend \\ :yt_dlp) do + channel_module(backend).get_video_ids(channel_url) + end + + defp channel_module(backend) do + case backend do + :yt_dlp -> YtDlpChannel + end + end +end diff --git a/lib/pinchflat/media_client/video_downloader.ex b/lib/pinchflat/media_client/video_downloader.ex new file mode 100644 index 00000000..a993f59f --- /dev/null +++ b/lib/pinchflat/media_client/video_downloader.ex @@ -0,0 +1,70 @@ +defmodule Pinchflat.MediaClient.VideoDownloader do + @moduledoc """ + This is the integration layer for actually downloading videos. + It takes into account the media profile's settings in order + to download the video with the desired options. + + Technically hardcodes the yt-dlp backend for now, but should leave + it open-ish for future expansion (just in case). + """ + + alias Pinchflat.Repo + alias Pinchflat.Media + alias Pinchflat.Media.MediaItem + alias Pinchflat.Profiles.MediaProfile + + alias Pinchflat.MediaClient.Backends.YtDlp.Video, as: YtDlpVideo + alias Pinchflat.Profiles.Options.YtDlp.OptionBuilder, as: YtDlpOptionBuilder + alias Pinchflat.MediaClient.Backends.YtDlp.MetadataParser, as: YtDlpMetadataParser + + @doc """ + Downloads a video for a media item, updating the media item based on the metadata + returned by the backend. Also saves the entire metadata response to the associated + media_metadata record. + + Returns {:ok, %MediaItem{}} | {:error, any, ...any} + """ + def download_for_media_item(%MediaItem{} = media_item, backend \\ :yt_dlp) do + item_with_preloads = Repo.preload(media_item, [:metadata, channel: :media_profile]) + media_profile = item_with_preloads.channel.media_profile + + case download_for_media_profile(media_item.media_id, media_profile, backend) do + {:ok, parsed_json} -> + parser = metadata_parser(backend) + parsed_attrs = parser.parse_for_media_item(parsed_json) + + # Don't forgor to use preloaded associations or updates to + # associations won't work! + Media.update_media_item(item_with_preloads, parsed_attrs) + + err -> + err + end + end + + defp download_for_media_profile(url, %MediaProfile{} = media_profile, backend) do + option_builder = option_builder(backend) + video_backend = video_backend(backend) + {:ok, options} = option_builder.build(media_profile) + + video_backend.download(url, options) + end + + defp option_builder(backend) do + case backend do + :yt_dlp -> YtDlpOptionBuilder + end + end + + defp video_backend(backend) do + case backend do + :yt_dlp -> YtDlpVideo + end + end + + defp metadata_parser(backend) do + case backend do + :yt_dlp -> YtDlpMetadataParser + end + end +end diff --git a/lib/pinchflat/media_source.ex b/lib/pinchflat/media_source.ex new file mode 100644 index 00000000..8f8b6f73 --- /dev/null +++ b/lib/pinchflat/media_source.ex @@ -0,0 +1,163 @@ +defmodule Pinchflat.MediaSource do + @moduledoc """ + The MediaSource context. + """ + + import Ecto.Query, warn: false + alias Pinchflat.Repo + + alias Pinchflat.Tasks + alias Pinchflat.Media + alias Pinchflat.Tasks.ChannelTasks + alias Pinchflat.MediaSource.Channel + alias Pinchflat.MediaClient.ChannelDetails + + @doc """ + Returns the list of channels. Returns [%Channel{}, ...] + """ + def list_channels do + Repo.all(Channel) + end + + @doc """ + Gets a single channel. + + Returns %Channel{}. Raises `Ecto.NoResultsError` if the Channel does not exist. + """ + def get_channel!(id), do: Repo.get!(Channel, id) + + @doc """ + Creates a channel. May attempt to pull additional channel details from the + original_url (if provided). Will attempt to start indexing the channel's + media if successfully inserted. + + Returns {:ok, %Channel{}} | {:error, %Ecto.Changeset{}} + """ + def create_channel(attrs) do + %Channel{} + |> change_channel_from_url(attrs) + |> commit_and_start_indexing() + end + + @doc """ + Given a media source, creates (indexes) the media by creating media_items for each + media ID in the source. + + Returns [%MediaItem{}, ...] | [%Ecto.Changeset{}, ...] + """ + def index_media_items(%Channel{} = channel) do + {:ok, media_ids} = ChannelDetails.get_video_ids(channel.original_url) + + media_ids + |> Enum.map(fn media_id -> + attrs = %{channel_id: channel.id, media_id: media_id} + + case Media.create_media_item(attrs) do + {:ok, media_item} -> media_item + {:error, changeset} -> changeset + end + end) + end + + @doc """ + Updates a channel. May attempt to pull additional channel details from the + original_url (if changed). May attempt to start indexing the channel's + media if the indexing frequency has been changed. + + Existing indexing tasks will be cancelled if the indexing frequency has been + changed (logic in `ChannelTasks.kickoff_indexing_task`) + + Returns {:ok, %Channel{}} | {:error, %Ecto.Changeset{}} + """ + def update_channel(%Channel{} = channel, attrs) do + channel + |> change_channel_from_url(attrs) + |> commit_and_start_indexing() + end + + @doc """ + Deletes a channel and it's associated tasks (of any state). + + Returns {:ok, %Channel{}} | {:error, %Ecto.Changeset{}} + """ + def delete_channel(%Channel{} = channel) do + Tasks.delete_tasks_for(channel) + Repo.delete(channel) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking channel changes. + """ + def change_channel(%Channel{} = channel, attrs \\ %{}) do + Channel.changeset(channel, attrs) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking channel changes and additionally + fetches channel details from the original_url (if provided). If the channel + details cannot be fetched, an error is added to the changeset. + + Note that this fetches channel details as long as the `original_url` is present. + This means that it'll go for it even if a changeset is otherwise invalid. This + is pretty easy to change, but for MVP I'm not concerned. + """ + def change_channel_from_url(%Channel{} = channel, attrs) do + case change_channel(channel, attrs) do + %Ecto.Changeset{changes: %{original_url: _}} = changeset -> + add_channel_details_to_changeset(channel, changeset) + + changeset -> + changeset + end + end + + defp add_channel_details_to_changeset(channel, changeset) do + %Ecto.Changeset{changes: changes} = changeset + + case ChannelDetails.get_channel_details(changes.original_url) do + {:ok, %ChannelDetails{} = channel_details} -> + change_channel( + channel, + Map.merge(changes, %{ + name: channel_details.name, + channel_id: channel_details.id + }) + ) + + {:error, runner_error, _status_code} -> + Ecto.Changeset.add_error( + changeset, + :original_url, + "could not fetch channel details from URL", + error: runner_error + ) + end + end + + defp commit_and_start_indexing(changeset) do + case Repo.insert_or_update(changeset) do + {:ok, %Channel{} = channel} -> + maybe_run_indexing_task(changeset, channel) + + {:ok, channel} + + err -> + err + end + end + + defp maybe_run_indexing_task(changeset, channel) do + case changeset.data do + # If the changeset is new (not persisted), attempt indexing no matter what + %{__meta__: %{state: :built}} -> + ChannelTasks.kickoff_indexing_task(channel) + + # If the record has been persisted, only attempt indexing if the + # indexing frequency has been changed + %{__meta__: %{state: :loaded}} -> + if Map.has_key?(changeset.changes, :index_frequency_minutes) do + ChannelTasks.kickoff_indexing_task(channel) + end + end + end +end diff --git a/lib/pinchflat/media_source/channel.ex b/lib/pinchflat/media_source/channel.ex new file mode 100644 index 00000000..e70030cf --- /dev/null +++ b/lib/pinchflat/media_source/channel.ex @@ -0,0 +1,37 @@ +defmodule Pinchflat.MediaSource.Channel do + @moduledoc """ + The Channel schema. + """ + + use Ecto.Schema + import Ecto.Changeset + + alias Pinchflat.Media.MediaItem + alias Pinchflat.Profiles.MediaProfile + + @allowed_fields ~w(name channel_id index_frequency_minutes original_url media_profile_id)a + @required_fields @allowed_fields -- ~w(index_frequency_minutes)a + + schema "channels" do + field :name, :string + field :channel_id, :string + field :index_frequency_minutes, :integer + # This should only be used for user reference going forward + # as the channel_id should be used for all API calls + field :original_url, :string + + belongs_to :media_profile, MediaProfile + + has_many :media_items, MediaItem + + timestamps(type: :utc_datetime) + end + + @doc false + def changeset(channel, attrs) do + channel + |> cast(attrs, @allowed_fields) + |> validate_required(@required_fields) + |> unique_constraint([:channel_id, :media_profile_id]) + end +end diff --git a/lib/pinchflat/profiles.ex b/lib/pinchflat/profiles.ex new file mode 100644 index 00000000..01d78b44 --- /dev/null +++ b/lib/pinchflat/profiles.ex @@ -0,0 +1,56 @@ +defmodule Pinchflat.Profiles do + @moduledoc """ + The Profiles context. + """ + + import Ecto.Query, warn: false + alias Pinchflat.Repo + + alias Pinchflat.Profiles.MediaProfile + + @doc """ + Returns the list of media_profiles. Returns [%MediaProfile{}, ...] + """ + def list_media_profiles do + Repo.all(MediaProfile) + end + + @doc """ + Gets a single media_profile. + + Returns %MediaProfile{}. Raises `Ecto.NoResultsError` if the Media profile does not exist. + """ + def get_media_profile!(id), do: Repo.get!(MediaProfile, id) + + @doc """ + Creates a media_profile. Returns {:ok, %MediaProfile{}} | {:error, %Ecto.Changeset{}} + """ + def create_media_profile(attrs) do + %MediaProfile{} + |> MediaProfile.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a media_profile. Returns {:ok, %MediaProfile{}} | {:error, %Ecto.Changeset{}} + """ + def update_media_profile(%MediaProfile{} = media_profile, attrs) do + media_profile + |> MediaProfile.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a media_profile. Returns {:ok, %MediaProfile{}} | {:error, %Ecto.Changeset{}} + """ + def delete_media_profile(%MediaProfile{} = media_profile) do + Repo.delete(media_profile) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking media_profile changes. + """ + def change_media_profile(%MediaProfile{} = media_profile, attrs \\ %{}) do + MediaProfile.changeset(media_profile, attrs) + end +end diff --git a/lib/pinchflat/profiles/media_profile.ex b/lib/pinchflat/profiles/media_profile.ex new file mode 100644 index 00000000..34b3fdf1 --- /dev/null +++ b/lib/pinchflat/profiles/media_profile.ex @@ -0,0 +1,27 @@ +defmodule Pinchflat.Profiles.MediaProfile do + @moduledoc """ + A media profile is a set of settings that can be applied to many media sources + """ + + use Ecto.Schema + import Ecto.Changeset + + alias Pinchflat.MediaSource.Channel + + schema "media_profiles" do + field :name, :string + field :output_path_template, :string + + has_many :channels, Channel + + timestamps(type: :utc_datetime) + end + + @doc false + def changeset(media_profile, attrs) do + media_profile + |> cast(attrs, [:name, :output_path_template]) + |> validate_required([:name, :output_path_template]) + |> unique_constraint(:name) + end +end diff --git a/lib/pinchflat/profiles/options/yt_dlp/option_builder.ex b/lib/pinchflat/profiles/options/yt_dlp/option_builder.ex new file mode 100644 index 00000000..ce99e1ff --- /dev/null +++ b/lib/pinchflat/profiles/options/yt_dlp/option_builder.ex @@ -0,0 +1,39 @@ +defmodule Pinchflat.Profiles.Options.YtDlp.OptionBuilder do + @moduledoc """ + Builds the options for yt-dlp based on the given media profile. + + IDEA: consider making this a behaviour so I can add other backends later + """ + + alias Pinchflat.Profiles.MediaProfile + alias Pinchflat.Profiles.Options.YtDlp.OutputPathBuilder + + @doc """ + Builds the options for yt-dlp based on the given media profile. + + IDEA: consider adding the ability to pass in a second argument to override + these options + """ + def build(%MediaProfile{} = media_profile) do + {:ok, output_path} = OutputPathBuilder.build(media_profile.output_path_template) + + # NOTE: I'll be hardcoding most things for now (esp. options to help me test) - + # add more configuration later as I build out the models. Walk before you can run! + + # NOTE: Looks like you can put different media types in different directories. + # see: https://github.com/yt-dlp/yt-dlp#output-template + {:ok, + [ + :embed_metadata, + :embed_thumbnail, + :embed_subs, + :no_progress, + sub_langs: "en.*", + output: Path.join(base_directory(), output_path) + ]} + end + + defp base_directory do + Application.get_env(:pinchflat, :media_directory) + end +end diff --git a/lib/pinchflat/profiles/options/yt_dlp/output_path_builder.ex b/lib/pinchflat/profiles/options/yt_dlp/output_path_builder.ex new file mode 100644 index 00000000..b058784e --- /dev/null +++ b/lib/pinchflat/profiles/options/yt_dlp/output_path_builder.ex @@ -0,0 +1,64 @@ +defmodule Pinchflat.Profiles.Options.YtDlp.OutputPathBuilder do + @moduledoc """ + Builds yt-dlp-friendly output paths for downloaded media + + IDEA: consider making this a behaviour so I can add other backends later + """ + + alias Pinchflat.RenderedString.Parser, as: TemplateParser + + @doc """ + Builds the actual final filepath from a given template. + + Translates liquid-style templates into yt-dlp-style templates, + leaving yt-dlp syntax intact. + """ + def build(template_string) do + TemplateParser.parse(template_string, full_yt_dlp_options_map()) + end + + defp full_yt_dlp_options_map do + Map.merge( + standard_yt_dlp_option_map(), + custom_yt_dlp_option_map() + ) + end + + defp standard_yt_dlp_option_map do + %{ + # Uppercase "S" means "safe" - ie: filepath-safe + "id" => "%(id)S", + "ext" => "%(ext)S", + "title" => "%(title)S", + "fulltitle" => "%(fulltitle)S", + "uploader" => "%(uploader)S", + "creator" => "%(creator)S", + "upload_date" => "%(upload_date)S", + "release_date" => "%(release_date)S", + "duration" => "%(duration)S", + # For videos classified as an episode of a series: + "series" => "%(series)S", + "season" => "%(season)S", + "season_number" => "%(season_number)S", + "episode" => "%(episode)S", + "episode_number" => "%(episode_number)S", + "episode_id" => "%(episode_id)S", + # For videos classified as music: + "track" => "%(track)S", + "track_number" => "%(track_number)S", + "artist" => "%(artist)S", + "album" => "%(album)S", + "album_type" => "%(album_type)S", + "genre" => "%(genre)S" + } + end + + defp custom_yt_dlp_option_map do + %{ + # Individual parts of the upload date + "upload_year" => "%(upload_date>%Y)S", + "upload_month" => "%(upload_date>%m)S", + "upload_day" => "%(upload_date>%d)S" + } + end +end diff --git a/lib/pinchflat/rendered_string/base.ex b/lib/pinchflat/rendered_string/base.ex new file mode 100644 index 00000000..549a6767 --- /dev/null +++ b/lib/pinchflat/rendered_string/base.ex @@ -0,0 +1,52 @@ +defmodule Pinchflat.RenderedString.Base do + @moduledoc """ + A base module for parsing rendered strings, designed as a macro to be used + in other modules. See https://elixirforum.com/t/help-to-parse-a-template-with-nimbleparsec/47980 + + NOTE: if the needs here get any more complicated, look into using a Liquid + template parser. No need to reinvent the wheel any more than I already have. + + NOTE: this is effectively tested by the `Pinchflat.RenderedString.Parser`'s tests + """ + + defmacro __using__(_opts) do + quote location: :keep do + import NimbleParsec + + opening_tag = string("{{") + closing_tag = string("}}") + optional_whitespaces = ascii_string(~c[ \t\n\r], min: 0) + + # Capture everything up to the opening object + text = + lookahead_not(opening_tag) + # ... as long as it's a character + |> utf8_char([]) + # ... and there's at least one character + |> times(min: 1) + # ... and then convert it to a string + |> reduce({List, :to_string, []}) + # ... finally bag it and tag it + |> unwrap_and_tag(:text) + + identifier = + utf8_string([?a..?z, ?A..?Z, ?_, ?0..?9], min: 1) + |> reduce({Enum, :join, []}) + |> unwrap_and_tag(:identifier) + + defparsecp(:expression, identifier) + + # when spotting interpolation, ignore the opening tag and any whitespace + interpolation = + ignore(concat(opening_tag, optional_whitespaces)) + # ... then parse the expression (identifier) + |> parsec(:expression) + # ... then ignore any whitespace and the closing tags after the expression + |> ignore(concat(optional_whitespaces, closing_tag)) + # ... once again we bag it and tag it + |> unwrap_and_tag(:interpolation) + + defparsec(:do_parse, choice([interpolation, text]) |> repeat() |> eos()) + end + end +end diff --git a/lib/pinchflat/rendered_string/parser.ex b/lib/pinchflat/rendered_string/parser.ex new file mode 100644 index 00000000..ab167fa5 --- /dev/null +++ b/lib/pinchflat/rendered_string/parser.ex @@ -0,0 +1,35 @@ +defmodule Pinchflat.RenderedString.Parser do + @moduledoc """ + Parses liquid-ish-style strings into a rendered string + + Used for turning filepath templates into real filepaths + """ + + use Pinchflat.RenderedString.Base + + @doc """ + Parses a string into a rendered string, using the provided variables. + + Variable identifiers are surrounded by {{ and }}. The variable keys MUST be strings. + If an identifier is not found in the provided variables, it will be removed from the string. + """ + def parse(string, variables) do + # `do_parse` comes from `RenderedString.Base` + case do_parse(string) do + {:ok, parsed, _, _, _, _} -> + {:ok, build_string(parsed, variables)} + + {:error, message, _, _, _, _} -> + {:error, message} + end + end + + defp build_string(parsed, variables) do + Enum.reduce(parsed, "", fn element, acc -> + case element do + {:text, text} -> acc <> text + {:interpolation, {:identifier, identifier}} -> acc <> to_string(variables[identifier]) + end + end) + end +end diff --git a/lib/pinchflat/repo.ex b/lib/pinchflat/repo.ex index 05ad6a6b..9751f758 100644 --- a/lib/pinchflat/repo.ex +++ b/lib/pinchflat/repo.ex @@ -2,4 +2,18 @@ defmodule Pinchflat.Repo do use Ecto.Repo, otp_app: :pinchflat, adapter: Ecto.Adapters.Postgres + + @doc """ + It's not immediately obvious if an Oban job qualifies as unique, so this method + attempts creating a job and checks for the `conflict?` field in the returned job. + + Returns {:ok, %Oban.Job{}} | {:duplicate, %Oban.Job{}} | {:error, any()}. + """ + def insert_unique_job(job_struct) do + case Oban.insert(job_struct) do + {:ok, %Oban.Job{conflict?: false} = job} -> {:ok, job} + {:ok, %Oban.Job{conflict?: true} = job} -> {:duplicate, job} + err -> err + end + end end diff --git a/lib/pinchflat/tasks.ex b/lib/pinchflat/tasks.ex new file mode 100644 index 00000000..052b1374 --- /dev/null +++ b/lib/pinchflat/tasks.ex @@ -0,0 +1,148 @@ +defmodule Pinchflat.Tasks do + @moduledoc """ + The Tasks context. + """ + + import Ecto.Query, warn: false + alias Pinchflat.Repo + + alias Pinchflat.Tasks.Task + alias Pinchflat.Media.MediaItem + alias Pinchflat.MediaSource.Channel + + @doc """ + Returns the list of tasks. Returns [%Task{}, ...] + """ + def list_tasks do + Repo.all(Task) + end + + @doc """ + Returns the list of tasks for a given record type and ID. Optionally allows you to specify + which job states to include. + + Returns [%Task{}, ...] + """ + def list_tasks_for(attached_record_type, attached_record_id, job_states \\ Oban.Job.states()) do + stringified_states = Enum.map(job_states, &to_string/1) + + Repo.all( + from t in Task, + join: j in assoc(t, :job), + where: field(t, ^attached_record_type) == ^attached_record_id, + where: j.state in ^stringified_states + ) + end + + @doc """ + Returns the list of pending tasks for a given record type and ID. + + Returns [%Task{}, ...] + """ + def list_pending_tasks_for(attached_record_type, attached_record_id) do + list_tasks_for( + attached_record_type, + attached_record_id, + [:available, :scheduled, :retryable] + ) + end + + @doc """ + Gets a single task. + + Returns %Task{}. Raises `Ecto.NoResultsError` if the Task does not exist. + """ + def get_task!(id), do: Repo.get!(Task, id) + + @doc """ + Creates a task. + + Accepts map() | %Oban.Job{}, %Channel{} | %Oban.Job{}, %MediaItem{}. + Returns {:ok, %Task{}} | {:error, %Ecto.Changeset{}}. + """ + def create_task(attrs) do + %Task{} + |> Task.changeset(attrs) + |> Repo.insert() + end + + # This function's signature is designed to help simplify + # usage of `create_job_with_task/2` + def create_task(%Oban.Job{} = job, attached_record) do + attached_record_attr = + case attached_record do + %Channel{} = channel -> %{channel_id: channel.id} + %MediaItem{} = media_item -> %{media_item_id: media_item.id} + end + + %Task{} + |> Task.changeset(Map.merge(%{job_id: job.id}, attached_record_attr)) + |> Repo.insert() + end + + @doc """ + Creates a job from given attrs, creating a task with an attached record + if successful. Returns an error if the job already exists. + + Returns {:ok, %Task{}} | {:error, :duplicate_job} | {:error, %Ecto.Changeset{}}. + """ + def create_job_with_task(job_attrs, task_attached_record) do + case Repo.insert_unique_job(job_attrs) do + {:ok, job} -> create_task(job, task_attached_record) + {:duplicate, _} -> {:error, :duplicate_job} + err -> err + end + end + + @doc """ + Deletes a task. Also cancels any attached job. + + Returns {:ok, %Task{}} | {:error, %Ecto.Changeset{}}. + """ + def delete_task(%Task{} = task) do + :ok = Oban.cancel_job(task.job_id) + + Repo.delete(task) + end + + @doc """ + Deletes all tasks attached to a given record, cancelling any attached jobs. + + Returns :ok + """ + def delete_tasks_for(attached_record) do + tasks = + case attached_record do + %Channel{} = channel -> list_tasks_for(:channel_id, channel.id) + %MediaItem{} = media_item -> list_tasks_for(:media_item_id, media_item.id) + end + + Enum.each(tasks, fn task -> + delete_task(task) + end) + end + + @doc """ + Deletes all _pending_ tasks attached to a given record, cancelling any attached jobs. + + Returns :ok + """ + def delete_pending_tasks_for(attached_record) do + tasks = + case attached_record do + %Channel{} = channel -> list_pending_tasks_for(:channel_id, channel.id) + %MediaItem{} = media_item -> list_pending_tasks_for(:media_item_id, media_item.id) + end + + Enum.each(tasks, fn task -> + delete_task(task) + end) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking task changes. + """ + def change_task(%Task{} = task, attrs \\ %{}) do + Task.changeset(task, attrs) + end +end diff --git a/lib/pinchflat/tasks/channel_tasks.ex b/lib/pinchflat/tasks/channel_tasks.ex new file mode 100644 index 00000000..a2b1cd26 --- /dev/null +++ b/lib/pinchflat/tasks/channel_tasks.ex @@ -0,0 +1,33 @@ +defmodule Pinchflat.Tasks.ChannelTasks do + @moduledoc """ + This module contains methods for managing tasks (workers) related to channels. + """ + + alias Pinchflat.Tasks + alias Pinchflat.MediaSource.Channel + alias Pinchflat.Workers.MediaIndexingWorker + + @doc """ + Starts tasks for indexing a channel's media. + + Returns {:ok, :should_not_index} | {:ok, %Task{}}. + """ + def kickoff_indexing_task(%Channel{} = channel) do + Tasks.delete_pending_tasks_for(channel) + + if channel.index_frequency_minutes <= 0 do + {:ok, :should_not_index} + else + channel + |> Map.take([:id]) + # Schedule this one immediately, but future ones will be on an interval + |> MediaIndexingWorker.new() + |> Tasks.create_job_with_task(channel) + |> case do + # This should never return {:error, :duplicate_job} since we just deleted + # any pending tasks. I'm being assertive about it so it's obvious if I'm wrong + {:ok, task} -> {:ok, task} + end + end + end +end diff --git a/lib/pinchflat/tasks/task.ex b/lib/pinchflat/tasks/task.ex new file mode 100644 index 00000000..9d53b600 --- /dev/null +++ b/lib/pinchflat/tasks/task.ex @@ -0,0 +1,26 @@ +defmodule Pinchflat.Tasks.Task do + @moduledoc """ + The Task schema. + """ + + use Ecto.Schema + import Ecto.Changeset + + alias Pinchflat.Media.MediaItem + alias Pinchflat.MediaSource.Channel + + schema "tasks" do + belongs_to :job, Oban.Job + belongs_to :channel, Channel + belongs_to :media_item, MediaItem + + timestamps(type: :utc_datetime) + end + + @doc false + def changeset(task, attrs) do + task + |> cast(attrs, [:job_id, :channel_id, :media_item_id]) + |> validate_required([:job_id]) + end +end diff --git a/lib/utils/string_utils.ex b/lib/pinchflat/utils/string_utils.ex similarity index 52% rename from lib/utils/string_utils.ex rename to lib/pinchflat/utils/string_utils.ex index f52bcfb6..e0f01e89 100644 --- a/lib/utils/string_utils.ex +++ b/lib/pinchflat/utils/string_utils.ex @@ -5,10 +5,23 @@ defmodule Pinchflat.Utils.StringUtils do @doc """ Converts a string to kebab-case (ie: `hello world` -> `hello-world`) + + Returns binary() """ def to_kebab_case(string) do string |> String.replace(~r/[\s_]/, "-") |> String.downcase() end + + @doc """ + Returns a random string of the given length. Base 16 encoded, lower case. + + Returns binary() + """ + def random_string(length \\ 32) do + :crypto.strong_rand_bytes(length) + |> Base.encode16(case: :lower) + |> String.slice(0..(length - 1)) + end end diff --git a/lib/pinchflat/workers/media_indexing_worker.ex b/lib/pinchflat/workers/media_indexing_worker.ex new file mode 100644 index 00000000..4869b0d2 --- /dev/null +++ b/lib/pinchflat/workers/media_indexing_worker.ex @@ -0,0 +1,80 @@ +defmodule Pinchflat.Workers.MediaIndexingWorker do + @moduledoc false + + use Oban.Worker, + queue: :media_indexing, + unique: [period: :infinity, states: [:available, :scheduled, :retryable]], + tags: ["media_source", "media_indexing"] + + alias __MODULE__ + alias Pinchflat.Media + alias Pinchflat.Tasks + alias Pinchflat.MediaSource + alias Pinchflat.Workers.VideoDownloadWorker + + @impl Oban.Worker + @doc """ + The ID is that of a channel _record_, not a YouTube channel ID. Indexes + the provided channel, kicks off downloads for each new MediaItem, and + reschedules the job to run again in the future (as determined by the + channel's `index_frequency_minutes` field). + + README: Re-scheduling here works a little different than you may expect. + The reschedule time is relative to the time the job has actually _completed_. + This has some benefits but also side effects to be aware of: + + - Benefit: No chance for jobs to overlap if a job takes longer than the + scheduled interval. Less likely to hit API rate limits. + - Side effect: Intervals are "soft" and _always_ walk forward. This may cause + user confusion since a 30-minute job scheduled for every hour will + actually run every 1 hour and 30 minutes. The tradeoff of not inundating + the API with requests and also not overlapping jobs is worth it, IMO. + + NOTE: Since indexing can take a LONG time, I should check what happens if an + application restart occurs while a job is running. Will the job be lost? + + IDEA: Should I use paging and do indexing in chunks? Is that even faster? + + Returns :ok | {:ok, %Task{}} + """ + def perform(%Oban.Job{args: %{"id" => channel_id}}) do + channel = MediaSource.get_channel!(channel_id) + + if channel.index_frequency_minutes <= 0 do + :ok + else + index_media_and_reschedule(channel) + end + end + + defp index_media_and_reschedule(channel) do + MediaSource.index_media_items(channel) + enqueue_video_downloads(channel) + + channel + |> Map.take([:id]) + |> MediaIndexingWorker.new(schedule_in: channel.index_frequency_minutes * 60) + |> Tasks.create_job_with_task(channel) + |> case do + {:ok, task} -> {:ok, task} + {:error, :duplicate_job} -> {:ok, :job_exists} + end + end + + # NOTE: this starts a download for each media item that is pending, + # not just the ones that were indexed in this job run. This should ensure + # that any stragglers are caught if, for some reason, they weren't enqueued + # or somehow got de-queued. + # + # I'm not sure of a case where this would happen, but it's cheap insurance. + defp enqueue_video_downloads(channel) do + channel + |> Media.list_pending_media_items_for() + |> Enum.each(fn media_item -> + media_item + |> Map.take([:id]) + |> VideoDownloadWorker.new() + |> Tasks.create_job_with_task(media_item) + end) + end +end diff --git a/lib/pinchflat/workers/video_download_worker.ex b/lib/pinchflat/workers/video_download_worker.ex new file mode 100644 index 00000000..f0047c1b --- /dev/null +++ b/lib/pinchflat/workers/video_download_worker.ex @@ -0,0 +1,26 @@ +defmodule Pinchflat.Workers.VideoDownloadWorker do + @moduledoc false + + use Oban.Worker, + queue: :media_fetching, + unique: [period: :infinity, states: [:available, :scheduled, :retryable, :executing]], + tags: ["media_item", "media_fetching"] + + alias Pinchflat.Media + alias Pinchflat.MediaClient.VideoDownloader + + @impl Oban.Worker + @doc """ + For a given media item, download the video and save the metadata. + + Returns {:ok, %MediaItem{}} | {:error, any, ...any} + """ + def perform(%Oban.Job{args: %{"id" => media_item_id}}) do + media_item = Media.get_media_item!(media_item_id) + + case VideoDownloader.download_for_media_item(media_item) do + {:ok, _} -> {:ok, media_item} + err -> err + end + end +end diff --git a/lib/pinchflat_web/controllers/media_profiles/media_profile_controller.ex b/lib/pinchflat_web/controllers/media_profiles/media_profile_controller.ex new file mode 100644 index 00000000..895b2199 --- /dev/null +++ b/lib/pinchflat_web/controllers/media_profiles/media_profile_controller.ex @@ -0,0 +1,62 @@ +defmodule PinchflatWeb.MediaProfiles.MediaProfileController do + use PinchflatWeb, :controller + + alias Pinchflat.Profiles + alias Pinchflat.Profiles.MediaProfile + + def index(conn, _params) do + media_profiles = Profiles.list_media_profiles() + render(conn, :index, media_profiles: media_profiles) + end + + def new(conn, _params) do + changeset = Profiles.change_media_profile(%MediaProfile{}) + render(conn, :new, changeset: changeset) + end + + def create(conn, %{"media_profile" => media_profile_params}) do + case Profiles.create_media_profile(media_profile_params) do + {:ok, media_profile} -> + conn + |> put_flash(:info, "Media profile created successfully.") + |> redirect(to: ~p"/media_profiles/#{media_profile}") + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, :new, changeset: changeset) + end + end + + def show(conn, %{"id" => id}) do + media_profile = Profiles.get_media_profile!(id) + render(conn, :show, media_profile: media_profile) + end + + def edit(conn, %{"id" => id}) do + media_profile = Profiles.get_media_profile!(id) + changeset = Profiles.change_media_profile(media_profile) + render(conn, :edit, media_profile: media_profile, changeset: changeset) + end + + def update(conn, %{"id" => id, "media_profile" => media_profile_params}) do + media_profile = Profiles.get_media_profile!(id) + + case Profiles.update_media_profile(media_profile, media_profile_params) do + {:ok, media_profile} -> + conn + |> put_flash(:info, "Media profile updated successfully.") + |> redirect(to: ~p"/media_profiles/#{media_profile}") + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, :edit, media_profile: media_profile, changeset: changeset) + end + end + + def delete(conn, %{"id" => id}) do + media_profile = Profiles.get_media_profile!(id) + {:ok, _media_profile} = Profiles.delete_media_profile(media_profile) + + conn + |> put_flash(:info, "Media profile deleted successfully.") + |> redirect(to: ~p"/media_profiles") + end +end diff --git a/lib/pinchflat_web/controllers/media_profiles/media_profile_html.ex b/lib/pinchflat_web/controllers/media_profiles/media_profile_html.ex new file mode 100644 index 00000000..edb33ee7 --- /dev/null +++ b/lib/pinchflat_web/controllers/media_profiles/media_profile_html.ex @@ -0,0 +1,13 @@ +defmodule PinchflatWeb.MediaProfiles.MediaProfileHTML do + use PinchflatWeb, :html + + embed_templates "media_profile_html/*" + + @doc """ + Renders a media_profile form. + """ + attr :changeset, Ecto.Changeset, required: true + attr :action, :string, required: true + + def media_profile_form(assigns) +end diff --git a/lib/pinchflat_web/controllers/media_profiles/media_profile_html/edit.html.heex b/lib/pinchflat_web/controllers/media_profiles/media_profile_html/edit.html.heex new file mode 100644 index 00000000..ca35b198 --- /dev/null +++ b/lib/pinchflat_web/controllers/media_profiles/media_profile_html/edit.html.heex @@ -0,0 +1,8 @@ +<.header> + Edit Media profile <%= @media_profile.id %> + <:subtitle>Use this form to manage media_profile records in your database. + + +<.media_profile_form changeset={@changeset} action={~p"/media_profiles/#{@media_profile}"} /> + +<.back navigate={~p"/media_profiles"}>Back to media_profiles diff --git a/lib/pinchflat_web/controllers/media_profiles/media_profile_html/index.html.heex b/lib/pinchflat_web/controllers/media_profiles/media_profile_html/index.html.heex new file mode 100644 index 00000000..eec319c3 --- /dev/null +++ b/lib/pinchflat_web/controllers/media_profiles/media_profile_html/index.html.heex @@ -0,0 +1,30 @@ +<.header> + Listing Media profiles + <:actions> + <.link href={~p"/media_profiles/new"}> + <.button>New Media profile + + + + +<.table + id="media_profiles" + rows={@media_profiles} + row_click={&JS.navigate(~p"/media_profiles/#{&1}")} +> + <:col :let={media_profile} label="Name"><%= media_profile.name %> + <:col :let={media_profile} label="Output path template"> + <%= media_profile.output_path_template %> + + <:action :let={media_profile}> +
+ <.link navigate={~p"/media_profiles/#{media_profile}"}>Show +
+ <.link navigate={~p"/media_profiles/#{media_profile}/edit"}>Edit + + <:action :let={media_profile}> + <.link href={~p"/media_profiles/#{media_profile}"} method="delete" data-confirm="Are you sure?"> + Delete + + + diff --git a/lib/pinchflat_web/controllers/media_profiles/media_profile_html/media_profile_form.html.heex b/lib/pinchflat_web/controllers/media_profiles/media_profile_html/media_profile_form.html.heex new file mode 100644 index 00000000..2a3ab664 --- /dev/null +++ b/lib/pinchflat_web/controllers/media_profiles/media_profile_html/media_profile_form.html.heex @@ -0,0 +1,10 @@ +<.simple_form :let={f} for={@changeset} action={@action}> + <.error :if={@changeset.action}> + Oops, something went wrong! Please check the errors below. + + <.input field={f[:name]} type="text" label="Name" /> + <.input field={f[:output_path_template]} type="text" label="Output path template" /> + <:actions> + <.button>Save Media profile + + diff --git a/lib/pinchflat_web/controllers/media_profiles/media_profile_html/new.html.heex b/lib/pinchflat_web/controllers/media_profiles/media_profile_html/new.html.heex new file mode 100644 index 00000000..0887e17e --- /dev/null +++ b/lib/pinchflat_web/controllers/media_profiles/media_profile_html/new.html.heex @@ -0,0 +1,8 @@ +<.header> + New Media profile + <:subtitle>Use this form to manage media_profile records in your database. + + +<.media_profile_form changeset={@changeset} action={~p"/media_profiles"} /> + +<.back navigate={~p"/media_profiles"}>Back to media_profiles diff --git a/lib/pinchflat_web/controllers/media_profiles/media_profile_html/show.html.heex b/lib/pinchflat_web/controllers/media_profiles/media_profile_html/show.html.heex new file mode 100644 index 00000000..80ea07fa --- /dev/null +++ b/lib/pinchflat_web/controllers/media_profiles/media_profile_html/show.html.heex @@ -0,0 +1,16 @@ +<.header> + Media profile <%= @media_profile.id %> + <:subtitle>This is a media_profile record from your database. + <:actions> + <.link href={~p"/media_profiles/#{@media_profile}/edit"}> + <.button>Edit media_profile + + + + +<.list> + <:item title="Name"><%= @media_profile.name %> + <:item title="Output path template"><%= @media_profile.output_path_template %> + + +<.back navigate={~p"/media_profiles"}>Back to media_profiles diff --git a/lib/pinchflat_web/controllers/media_sources/channel_controller.ex b/lib/pinchflat_web/controllers/media_sources/channel_controller.ex new file mode 100644 index 00000000..08de4f4c --- /dev/null +++ b/lib/pinchflat_web/controllers/media_sources/channel_controller.ex @@ -0,0 +1,75 @@ +defmodule PinchflatWeb.MediaSources.ChannelController do + use PinchflatWeb, :controller + + alias Pinchflat.Profiles + alias Pinchflat.MediaSource + alias Pinchflat.MediaSource.Channel + + def index(conn, _params) do + channels = MediaSource.list_channels() + + render(conn, :index, channels: channels) + end + + def new(conn, _params) do + changeset = MediaSource.change_channel(%Channel{}) + + render(conn, :new, changeset: changeset, media_profiles: media_profiles()) + end + + def create(conn, %{"channel" => channel_params}) do + case MediaSource.create_channel(channel_params) do + {:ok, channel} -> + conn + |> put_flash(:info, "Channel created successfully.") + |> redirect(to: ~p"/media_sources/channels/#{channel}") + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, :new, changeset: changeset, media_profiles: media_profiles()) + end + end + + def show(conn, %{"id" => id}) do + channel = MediaSource.get_channel!(id) + + render(conn, :show, channel: channel) + end + + def edit(conn, %{"id" => id}) do + channel = MediaSource.get_channel!(id) + changeset = MediaSource.change_channel(channel) + + render(conn, :edit, channel: channel, changeset: changeset, media_profiles: media_profiles()) + end + + def update(conn, %{"id" => id, "channel" => channel_params}) do + channel = MediaSource.get_channel!(id) + + case MediaSource.update_channel(channel, channel_params) do + {:ok, channel} -> + conn + |> put_flash(:info, "Channel updated successfully.") + |> redirect(to: ~p"/media_sources/channels/#{channel}") + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, :edit, + channel: channel, + changeset: changeset, + media_profiles: media_profiles() + ) + end + end + + def delete(conn, %{"id" => id}) do + channel = MediaSource.get_channel!(id) + {:ok, _channel} = MediaSource.delete_channel(channel) + + conn + |> put_flash(:info, "Channel deleted successfully.") + |> redirect(to: ~p"/media_sources/channels") + end + + defp media_profiles do + Profiles.list_media_profiles() + end +end diff --git a/lib/pinchflat_web/controllers/media_sources/channel_html.ex b/lib/pinchflat_web/controllers/media_sources/channel_html.ex new file mode 100644 index 00000000..0feb1912 --- /dev/null +++ b/lib/pinchflat_web/controllers/media_sources/channel_html.ex @@ -0,0 +1,27 @@ +defmodule PinchflatWeb.MediaSources.ChannelHTML do + use PinchflatWeb, :html + + embed_templates "channel_html/*" + + @doc """ + Renders a channel form. + """ + attr :changeset, Ecto.Changeset, required: true + attr :action, :string, required: true + attr :media_profiles, :list, required: true + + def channel_form(assigns) + + def friendly_index_frequencies do + [ + {"Never", -1}, + {"1 Hour", 60}, + {"3 Hours", 3 * 60}, + {"6 Hours", 6 * 60}, + {"12 Hours", 12 * 60}, + {"Daily (recommended)", 24 * 60}, + {"Weekly", 7 * 24 * 60}, + {"Monthly", 30 * 24 * 60} + ] + end +end diff --git a/lib/pinchflat_web/controllers/media_sources/channel_html/channel_form.html.heex b/lib/pinchflat_web/controllers/media_sources/channel_html/channel_form.html.heex new file mode 100644 index 00000000..b8b4d4ed --- /dev/null +++ b/lib/pinchflat_web/controllers/media_sources/channel_html/channel_form.html.heex @@ -0,0 +1,25 @@ +<.simple_form :let={f} for={@changeset} action={@action}> + <.error :if={@changeset.action}> + Oops, something went wrong! Please check the errors below. + + + <.input + field={f[:media_profile_id]} + options={Enum.map(@media_profiles, &{&1.name, &1.id})} + type="select" + label="Media Profile" + /> + + <.input field={f[:original_url]} type="text" label="Channel URL" /> + + <.input + field={f[:index_frequency_minutes]} + options={friendly_index_frequencies()} + type="select" + label="Index Frequency" + /> + + <:actions> + <.button>Save Channel + + diff --git a/lib/pinchflat_web/controllers/media_sources/channel_html/edit.html.heex b/lib/pinchflat_web/controllers/media_sources/channel_html/edit.html.heex new file mode 100644 index 00000000..c65d8108 --- /dev/null +++ b/lib/pinchflat_web/controllers/media_sources/channel_html/edit.html.heex @@ -0,0 +1,12 @@ +<.header> + Edit Channel <%= @channel.id %> + <:subtitle>Use this form to manage channel records in your database. + + +<.channel_form + changeset={@changeset} + media_profiles={@media_profiles} + action={~p"/media_sources/channels/#{@channel}"} +/> + +<.back navigate={~p"/media_sources/channels"}>Back to channels diff --git a/lib/pinchflat_web/controllers/media_sources/channel_html/index.html.heex b/lib/pinchflat_web/controllers/media_sources/channel_html/index.html.heex new file mode 100644 index 00000000..b78a61b7 --- /dev/null +++ b/lib/pinchflat_web/controllers/media_sources/channel_html/index.html.heex @@ -0,0 +1,28 @@ +<.header> + Listing Channels + <:actions> + <.link href={~p"/media_sources/channels/new"}> + <.button>New Channel + + + + +<.table id="channels" rows={@channels} row_click={&JS.navigate(~p"/media_sources/channels/#{&1}")}> + <:col :let={channel} label="Name"><%= channel.name %> + <:col :let={channel} label="Channel"><%= channel.channel_id %> + <:action :let={channel}> +
+ <.link navigate={~p"/media_sources/channels/#{channel}"}>Show +
+ <.link navigate={~p"/media_sources/channels/#{channel}/edit"}>Edit + + <:action :let={channel}> + <.link + href={~p"/media_sources/channels/#{channel}"} + method="delete" + data-confirm="Are you sure?" + > + Delete + + + diff --git a/lib/pinchflat_web/controllers/media_sources/channel_html/new.html.heex b/lib/pinchflat_web/controllers/media_sources/channel_html/new.html.heex new file mode 100644 index 00000000..b09a477b --- /dev/null +++ b/lib/pinchflat_web/controllers/media_sources/channel_html/new.html.heex @@ -0,0 +1,12 @@ +<.header> + New Channel + <:subtitle>Use this form to manage channel records in your database. + + +<.channel_form + changeset={@changeset} + media_profiles={@media_profiles} + action={~p"/media_sources/channels"} +/> + +<.back navigate={~p"/media_sources/channels"}>Back to channels diff --git a/lib/pinchflat_web/controllers/media_sources/channel_html/show.html.heex b/lib/pinchflat_web/controllers/media_sources/channel_html/show.html.heex new file mode 100644 index 00000000..0f59e3b6 --- /dev/null +++ b/lib/pinchflat_web/controllers/media_sources/channel_html/show.html.heex @@ -0,0 +1,17 @@ +<.header> + Channel <%= @channel.id %> + <:subtitle>This is a channel record from your database. + <:actions> + <.link href={~p"/media_sources/channels/#{@channel}/edit"}> + <.button>Edit channel + + + + +<.list> + <:item title="Channel Name"><%= @channel.name %> + <:item title="Channel ID"><%= @channel.channel_id %> + <:item title="Original URL"><%= @channel.original_url %> + + +<.back navigate={~p"/media_sources/channels"}>Back to channels diff --git a/lib/pinchflat_web/router.ex b/lib/pinchflat_web/router.ex index 186fcb3b..e0775ea3 100644 --- a/lib/pinchflat_web/router.ex +++ b/lib/pinchflat_web/router.ex @@ -18,6 +18,12 @@ defmodule PinchflatWeb.Router do pipe_through :browser get "/", PageController, :home + + resources "/media_profiles", MediaProfiles.MediaProfileController + + scope "/media_sources", MediaSources do + resources "/channels", ChannelController + end end # Other scopes may use custom stacks. diff --git a/mix.exs b/mix.exs index 83b991b6..d89ada40 100644 --- a/mix.exs +++ b/mix.exs @@ -51,8 +51,11 @@ defmodule Pinchflat.MixProject do {:jason, "~> 1.2"}, {:dns_cluster, "~> 0.1.1"}, {:plug_cowboy, "~> 2.5"}, + {:oban, "~> 2.16"}, + {:nimble_parsec, "~> 1.4"}, {:mox, "~> 1.0", only: :test}, - {:credo, "~> 1.7", only: [:dev, :test], runtime: false} + {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, + {:faker, "~> 0.17", only: :test} ] end diff --git a/mix.lock b/mix.lock index 9a2d029c..157a94f8 100644 --- a/mix.lock +++ b/mix.lock @@ -12,6 +12,7 @@ "ecto_sql": {:hex, :ecto_sql, "3.11.1", "e9abf28ae27ef3916b43545f9578b4750956ccea444853606472089e7d169470", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ce14063ab3514424276e7e360108ad6c2308f6d88164a076aac8a387e1fea634"}, "esbuild": {:hex, :esbuild, "0.8.1", "0cbf919f0eccb136d2eeef0df49c4acf55336de864e63594adcea3814f3edf41", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "25fc876a67c13cb0a776e7b5d7974851556baeda2085296c14ab48555ea7560f"}, "expo": {:hex, :expo, "0.5.1", "249e826a897cac48f591deba863b26c16682b43711dd15ee86b92f25eafd96d9", [:mix], [], "hexpm", "68a4233b0658a3d12ee00d27d37d856b1ba48607e7ce20fd376958d0ba6ce92b"}, + "faker": {:hex, :faker, "0.17.0", "671019d0652f63aefd8723b72167ecdb284baf7d47ad3a82a15e9b8a6df5d1fa", [:mix], [], "hexpm", "a7d4ad84a93fd25c5f5303510753789fc2433ff241bf3b4144d3f6f291658a6a"}, "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, "finch": {:hex, :finch, "0.17.0", "17d06e1d44d891d20dbd437335eebe844e2426a0cd7e3a3e220b461127c73f70", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8d014a661bb6a437263d4b5abf0bcbd3cf0deb26b1e8596f2a271d22e48934c7"}, "floki": {:hex, :floki, "0.35.2", "87f8c75ed8654b9635b311774308b2760b47e9a579dabf2e4d5f1e1d42c39e0b", [:mix], [], "hexpm", "6b05289a8e9eac475f644f09c2e4ba7e19201fd002b89c28c1293e7bd16773d9"}, @@ -22,7 +23,9 @@ "mint": {:hex, :mint, "1.5.2", "4805e059f96028948870d23d7783613b7e6b0e2fb4e98d720383852a760067fd", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "d77d9e9ce4eb35941907f1d3df38d8f750c357865353e21d335bdcdf6d892a02"}, "mox": {:hex, :mox, "1.1.0", "0f5e399649ce9ab7602f72e718305c0f9cdc351190f72844599545e4996af73c", [:mix], [], "hexpm", "d44474c50be02d5b72131070281a5d3895c0e7a95c780e90bc0cfe712f633a13"}, "nimble_options": {:hex, :nimble_options, "1.1.0", "3b31a57ede9cb1502071fade751ab0c7b8dbe75a9a4c2b5bbb0943a690b63172", [:mix], [], "hexpm", "8bbbb3941af3ca9acc7835f5655ea062111c9c27bcac53e004460dfd19008a99"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, "nimble_pool": {:hex, :nimble_pool, "1.0.0", "5eb82705d138f4dd4423f69ceb19ac667b3b492ae570c9f5c900bb3d2f50a847", [:mix], [], "hexpm", "80be3b882d2d351882256087078e1b1952a28bf98d0a287be87e4a24a710b67a"}, + "oban": {:hex, :oban, "2.17.3", "ddfd5710aadcd550d2e174c8d73ce5f1865601418cf54a91775f20443fb832b7", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "452eada8bfe0d0fefd0740ab5fa8cf3ef6c375df0b4a3c3805d179022a04738a"}, "phoenix": {:hex, :phoenix, "1.7.10", "02189140a61b2ce85bb633a9b6fd02dff705a5f1596869547aeb2b2b95edd729", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "cf784932e010fd736d656d7fead6a584a4498efefe5b8227e9f383bf15bb79d0"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.3", "86e9878f833829c3f66da03d75254c155d91d72a201eb56ae83482328dc7ca93", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "d36c401206f3011fefd63d04e8ef626ec8791975d9d107f9a0817d426f61ac07"}, "phoenix_html": {:hex, :phoenix_html, "3.3.3", "380b8fb45912b5638d2f1d925a3771b4516b9a78587249cabe394e0a5d579dc9", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "923ebe6fec6e2e3b3e569dfbdc6560de932cd54b000ada0208b5f45024bdd76c"}, diff --git a/package.json b/package.json index 6f12368d..aa413867 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "description": "Prettier is used for linting of all files so this package has to live in the root of the project. Use the other package.json files for dependencies.", + "description": "Prettier is used for linting of all files so this package has to live in the root of the project. Use the other package.json files for dependencies. Also, look into making this global or something to remove the need for this file.", "devDependencies": { "prettier": "3.2.4" } diff --git a/priv/repo/migrations/20240122030944_create_media_profiles.exs b/priv/repo/migrations/20240122030944_create_media_profiles.exs new file mode 100644 index 00000000..5997a442 --- /dev/null +++ b/priv/repo/migrations/20240122030944_create_media_profiles.exs @@ -0,0 +1,14 @@ +defmodule Pinchflat.Repo.Migrations.CreateMediaProfiles do + use Ecto.Migration + + def change do + create table(:media_profiles) do + add :name, :string, null: false + add :output_path_template, :string, null: false + + timestamps(type: :utc_datetime) + end + + create unique_index(:media_profiles, [:name]) + end +end diff --git a/priv/repo/migrations/20240123174417_create_channels.exs b/priv/repo/migrations/20240123174417_create_channels.exs new file mode 100644 index 00000000..4430c3dd --- /dev/null +++ b/priv/repo/migrations/20240123174417_create_channels.exs @@ -0,0 +1,17 @@ +defmodule Pinchflat.Repo.Migrations.CreateChannels do + use Ecto.Migration + + def change do + create table(:channels) do + add :name, :string, null: false + add :channel_id, :string, null: false + add :original_url, :string, null: false + add :media_profile_id, references(:media_profiles, on_delete: :restrict), null: false + + timestamps(type: :utc_datetime) + end + + create index(:channels, [:media_profile_id]) + create unique_index(:channels, [:channel_id, :media_profile_id]) + end +end diff --git a/priv/repo/migrations/20240125025325_create_media_items.exs b/priv/repo/migrations/20240125025325_create_media_items.exs new file mode 100644 index 00000000..cfaa25fa --- /dev/null +++ b/priv/repo/migrations/20240125025325_create_media_items.exs @@ -0,0 +1,17 @@ +defmodule Pinchflat.Repo.Migrations.CreateMediaItems do + use Ecto.Migration + + def change do + create table(:media_items) do + add :media_id, :string, null: false + add :title, :string + add :video_filepath, :string + add :channel_id, references(:channels, on_delete: :restrict), null: false + + timestamps(type: :utc_datetime) + end + + create index(:media_items, [:channel_id]) + create unique_index(:media_items, [:media_id, :channel_id]) + end +end diff --git a/priv/repo/migrations/20240125043813_add_oban_jobs_table.exs b/priv/repo/migrations/20240125043813_add_oban_jobs_table.exs new file mode 100644 index 00000000..8044fc03 --- /dev/null +++ b/priv/repo/migrations/20240125043813_add_oban_jobs_table.exs @@ -0,0 +1,13 @@ +defmodule Pinchflat.Repo.Migrations.AddObanJobsTable do + use Ecto.Migration + + def up do + Oban.Migration.up(version: 11) + end + + # We specify `version: 1` in `down`, ensuring that we'll roll all the way back down if + # necessary, regardless of which version we've migrated `up` to. + def down do + Oban.Migration.down(version: 1) + end +end diff --git a/priv/repo/migrations/20240125165519_add_index_frequency_to_channels.exs b/priv/repo/migrations/20240125165519_add_index_frequency_to_channels.exs new file mode 100644 index 00000000..c03b25b2 --- /dev/null +++ b/priv/repo/migrations/20240125165519_add_index_frequency_to_channels.exs @@ -0,0 +1,9 @@ +defmodule Pinchflat.Repo.Migrations.AddIndexFrequencyToChannels do + use Ecto.Migration + + def change do + alter table(:channels) do + add :index_frequency_minutes, :integer, default: 60 * 24, null: false + end + end +end diff --git a/priv/repo/migrations/20240125212753_create_tasks.exs b/priv/repo/migrations/20240125212753_create_tasks.exs new file mode 100644 index 00000000..7a7b5e34 --- /dev/null +++ b/priv/repo/migrations/20240125212753_create_tasks.exs @@ -0,0 +1,16 @@ +defmodule Pinchflat.Repo.Migrations.CreateTasks do + use Ecto.Migration + + def change do + create table(:tasks) do + add :job_id, references(:oban_jobs, on_delete: :delete_all), null: false + # `restrict` because we need to be sure to delete pending tasks when a channel is deleted + add :channel_id, references(:channels, on_delete: :restrict), null: true + + timestamps(type: :utc_datetime) + end + + create index(:tasks, [:job_id]) + create index(:tasks, [:channel_id]) + end +end diff --git a/priv/repo/migrations/20240129015810_create_media_metadata.exs b/priv/repo/migrations/20240129015810_create_media_metadata.exs new file mode 100644 index 00000000..bd7e49f7 --- /dev/null +++ b/priv/repo/migrations/20240129015810_create_media_metadata.exs @@ -0,0 +1,15 @@ +defmodule Pinchflat.Repo.Migrations.CreateMediaMetadata do + use Ecto.Migration + + def change do + create table(:media_metadata) do + add :client_response, :jsonb, null: false + add :media_item_id, references(:media_items, on_delete: :delete_all), null: false + + timestamps(type: :utc_datetime) + end + + create unique_index(:media_metadata, [:media_item_id]) + create index(:media_metadata, [:client_response], using: :gin) + end +end diff --git a/priv/repo/migrations/20240130161316_add_media_item_to_tasks.exs b/priv/repo/migrations/20240130161316_add_media_item_to_tasks.exs new file mode 100644 index 00000000..bd8a9c9d --- /dev/null +++ b/priv/repo/migrations/20240130161316_add_media_item_to_tasks.exs @@ -0,0 +1,12 @@ +defmodule Pinchflat.Repo.Migrations.AddMediaItemToTasks do + use Ecto.Migration + + def change do + alter table(:tasks) do + # `restrict` because we need to be sure to delete pending tasks when a channel is deleted + add :media_item_id, references(:media_items, on_delete: :restrict), null: true + end + + create index(:tasks, [:media_item_id]) + end +end diff --git a/test/pinchflat/downloader_backends/yt_dlp/video_collection_test.exs b/test/pinchflat/downloader_backends/yt_dlp/video_collection_test.exs deleted file mode 100644 index 08296fc0..00000000 --- a/test/pinchflat/downloader_backends/yt_dlp/video_collection_test.exs +++ /dev/null @@ -1,44 +0,0 @@ -defmodule Pinchflat.DownloaderBackends.YtDlp.VideoCollectionTest do - use ExUnit.Case, async: true - import Mox - - alias Pinchflat.DownloaderBackends.YtDlp.VideoCollection, as: VideoCollection - - @channel_url "https://www.youtube.com/@TheUselessTrials" - - setup :verify_on_exit! - - describe "get_video_ids/2" do - test "returns a list of video ids with no blank elements" do - expect(CommandRunnerMock, :run, fn _url, _opts -> {:ok, "id1\nid2\n\nid3\n"} end) - - assert {:ok, ["id1", "id2", "id3"]} = VideoCollection.get_video_ids(@channel_url) - end - - test "it passes the expected default args" do - expect(CommandRunnerMock, :run, fn _url, opts -> - assert opts == [:simulate, :skip_download, :get_id] - - {:ok, ""} - end) - - assert {:ok, _} = VideoCollection.get_video_ids(@channel_url) - end - - test "it passes the expected custom args" do - expect(CommandRunnerMock, :run, fn _url, opts -> - assert opts == [:custom_arg, :simulate, :skip_download, :get_id] - - {:ok, ""} - end) - - assert {:ok, _} = VideoCollection.get_video_ids(@channel_url, [:custom_arg]) - end - - test "returns the error straight through when the command fails" do - expect(CommandRunnerMock, :run, fn _url, _opts -> {:error, "Big issue", 1} end) - - assert {:error, "Big issue", 1} = VideoCollection.get_video_ids(@channel_url) - end - end -end diff --git a/test/pinchflat/media_client/backends/yt_dlp/channel_test.exs b/test/pinchflat/media_client/backends/yt_dlp/channel_test.exs new file mode 100644 index 00000000..3f9d52f5 --- /dev/null +++ b/test/pinchflat/media_client/backends/yt_dlp/channel_test.exs @@ -0,0 +1,45 @@ +defmodule Pinchflat.MediaClient.Backends.YtDlp.ChannelTest do + use ExUnit.Case, async: true + import Mox + + alias Pinchflat.MediaClient.ChannelDetails + alias Pinchflat.MediaClient.Backends.YtDlp.Channel + + @channel_url "https://www.youtube.com/c/TheUselessTrials" + + setup :verify_on_exit! + + describe "get_channel_details/1" do + test "it returns a %ChannelDetails{} with data on success" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + {:ok, "{\"channel\": \"TheUselessTrials\", \"channel_id\": \"UCQH2\"}"} + end) + + assert {:ok, res} = Channel.get_channel_details(@channel_url) + assert %ChannelDetails{id: "UCQH2", name: "TheUselessTrials"} = res + end + + test "it passes the expected args to the backend runner" do + expect(YtDlpRunnerMock, :run, fn @channel_url, opts, ot -> + assert opts == [playlist_end: 1] + assert ot == "%(.{channel,channel_id})j" + + {:ok, "{}"} + end) + + assert {:ok, _} = Channel.get_channel_details(@channel_url) + end + + test "it returns an error if the runner returns an error" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:error, "Big issue", 1} end) + + assert {:error, "Big issue", 1} = Channel.get_channel_details(@channel_url) + end + + test "it returns an error if the output is not JSON" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:ok, "Not JSON"} end) + + assert {:error, %Jason.DecodeError{}} = Channel.get_channel_details(@channel_url) + end + end +end diff --git a/test/pinchflat/downloader_backends/yt_dlp/command_runner_test.exs b/test/pinchflat/media_client/backends/yt_dlp/command_runner_test.exs similarity index 62% rename from test/pinchflat/downloader_backends/yt_dlp/command_runner_test.exs rename to test/pinchflat/media_client/backends/yt_dlp/command_runner_test.exs index 02e18c2e..d63bfccf 100644 --- a/test/pinchflat/downloader_backends/yt_dlp/command_runner_test.exs +++ b/test/pinchflat/media_client/backends/yt_dlp/command_runner_test.exs @@ -1,10 +1,10 @@ -defmodule Pinchflat.DownloaderBackends.YtDlp.CommandRunnerTest do +defmodule Pinchflat.MediaClient.Backends.YtDlp.CommandRunnerTest do use ExUnit.Case, async: true - alias Pinchflat.DownloaderBackends.YtDlp.CommandRunner, as: Runner + alias Pinchflat.MediaClient.Backends.YtDlp.CommandRunner, as: Runner @original_executable Application.compile_env(:pinchflat, :yt_dlp_executable) - @video_url "https://www.youtube.com/watch?v=9bZkp7q19f0" + @video_url "https://www.youtube.com/watch?v=-LHXuyzpex0" setup do on_exit(&reset_executable/0) @@ -12,50 +12,49 @@ defmodule Pinchflat.DownloaderBackends.YtDlp.CommandRunnerTest do describe "run/2" do test "it returns the output and status when the command succeeds" do - assert {:ok, _output} = Runner.run(@video_url, []) + assert {:ok, _output} = Runner.run(@video_url, [], "") end test "it converts symbol k-v arg keys to kebab case" do - assert {:ok, output} = Runner.run(@video_url, buffer_size: 1024) + assert {:ok, output} = Runner.run(@video_url, [buffer_size: 1024], "") assert String.contains?(output, "--buffer-size 1024") end test "it keeps string k-v arg keys untouched" do - assert {:ok, output} = Runner.run(@video_url, [{"--under_score", 1024}]) + assert {:ok, output} = Runner.run(@video_url, [{"--under_score", 1024}], "") assert String.contains?(output, "--under_score 1024") end test "it converts symbol arg keys to kebab case" do - assert {:ok, output} = Runner.run(@video_url, [:ignore_errors]) + assert {:ok, output} = Runner.run(@video_url, [:ignore_errors], "") assert String.contains?(output, "--ignore-errors") end test "it keeps string arg keys untouched" do - assert {:ok, output} = Runner.run(@video_url, ["-v"]) + assert {:ok, output} = Runner.run(@video_url, ["-v"], "") assert String.contains?(output, "-v") refute String.contains?(output, "--v") end - test "it places arg keys (flags) at the beginning of the command" do - assert {:ok, output} = - Runner.run(@video_url, [{"--under_score", 1024}, :ignore_errors]) + test "it includes the video url as the first argument" do + assert {:ok, output} = Runner.run(@video_url, [:ignore_errors], "") - assert String.contains?(output, "--ignore-errors --under_score 1024") + assert String.contains?(output, "#{@video_url} --ignore-errors") end - test "it includes the video url as the last argument" do - assert {:ok, output} = Runner.run(@video_url, [:ignore_errors]) + test "it automatically includes the --print-to-file flag" do + assert {:ok, output} = Runner.run(@video_url, [], "%(id)s") - assert String.contains?(output, "--ignore-errors #{@video_url}\n") + assert String.contains?(output, "--print-to-file %(id)s /tmp/") end test "it returns the output and status when the command fails" do wrap_executable("/bin/false", fn -> - assert {:error, "", 1} = Runner.run(@video_url, []) + assert {:error, "", 1} = Runner.run(@video_url, [], "") end) end end diff --git a/test/pinchflat/media_client/backends/yt_dlp/metadata_parser_test.exs b/test/pinchflat/media_client/backends/yt_dlp/metadata_parser_test.exs new file mode 100644 index 00000000..7bbcb186 --- /dev/null +++ b/test/pinchflat/media_client/backends/yt_dlp/metadata_parser_test.exs @@ -0,0 +1,45 @@ +defmodule Pinchflat.MediaClient.Backends.YtDlp.MediaParserTest do + use ExUnit.Case, async: true + + alias Pinchflat.MediaClient.Backends.YtDlp.MetadataParser, as: Parser + + setup do + json_filepath = + Path.join([ + File.cwd!(), + "test", + "support", + "files", + "media_metadata.json" + ]) + + {:ok, file_body} = File.read(json_filepath) + {:ok, parsed_json} = Phoenix.json_library().decode(file_body) + + {:ok, + %{ + metadata: parsed_json + }} + end + + describe "parse_for_media_item/1" do + test "it extracts the video filepath", %{metadata: metadata} do + result = Parser.parse_for_media_item(metadata) + + assert String.contains?(result.video_filepath, "bwRHIkYqYJo") + assert String.ends_with?(result.video_filepath, ".mkv") + end + + test "it extracts the title", %{metadata: metadata} do + result = Parser.parse_for_media_item(metadata) + + assert result.title == "Trying to Wheelie Without the Rear Brake" + end + + test "it returns the metadata as a map", %{metadata: metadata} do + result = Parser.parse_for_media_item(metadata) + + assert result.metadata.client_response == metadata + end + end +end diff --git a/test/pinchflat/media_client/backends/yt_dlp/output_path_builder_test.exs b/test/pinchflat/media_client/backends/yt_dlp/output_path_builder_test.exs new file mode 100644 index 00000000..4c67a445 --- /dev/null +++ b/test/pinchflat/media_client/backends/yt_dlp/output_path_builder_test.exs @@ -0,0 +1,25 @@ +defmodule Pinchflat.MediaClient.Backends.YtDlp.OutputPathBuilderTest do + use ExUnit.Case, async: true + + alias Pinchflat.Profiles.Options.YtDlp.OutputPathBuilder + + describe "build/1" do + test "it expands 'standard' curly brace variables in the template" do + assert {:ok, res} = OutputPathBuilder.build("/videos/{{ title }}.{{ ext }}") + + assert res == "/videos/%(title)S.%(ext)S" + end + + test "it expands 'custom' curly brace variables in the template" do + assert {:ok, res} = OutputPathBuilder.build("/videos/{{ upload_year }}.{{ ext }}") + + assert res == "/videos/%(upload_date>%Y)S.%(ext)S" + end + + test "it leaves yt-dlp variables alone" do + assert {:ok, res} = OutputPathBuilder.build("/videos/%(title)s.%(ext)s") + + assert res == "/videos/%(title)s.%(ext)s" + end + end +end diff --git a/test/pinchflat/media_client/backends/yt_dlp/video_collection_test.exs b/test/pinchflat/media_client/backends/yt_dlp/video_collection_test.exs new file mode 100644 index 00000000..3acae204 --- /dev/null +++ b/test/pinchflat/media_client/backends/yt_dlp/video_collection_test.exs @@ -0,0 +1,49 @@ +defmodule Pinchflat.MediaClient.Backends.YtDlp.VideoCollectionTest do + use ExUnit.Case, async: true + import Mox + + alias Pinchflat.MediaClient.Backends.YtDlp.VideoCollection + + @channel_url "https://www.youtube.com/@TheUselessTrials" + + defmodule VideoCollectionUser do + use VideoCollection + end + + setup :verify_on_exit! + + describe "get_video_ids/2" do + test "returns a list of video ids with no blank elements" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:ok, "id1\nid2\n\nid3\n"} end) + + assert {:ok, ["id1", "id2", "id3"]} = VideoCollectionUser.get_video_ids(@channel_url) + end + + test "it passes the expected default args" do + expect(YtDlpRunnerMock, :run, fn _url, opts, ot -> + assert opts == [:simulate, :skip_download] + assert ot == "%(id)s" + + {:ok, ""} + end) + + assert {:ok, _} = VideoCollectionUser.get_video_ids(@channel_url) + end + + test "it passes the expected custom args" do + expect(YtDlpRunnerMock, :run, fn _url, opts, _ot -> + assert opts == [:custom_arg, :simulate, :skip_download] + + {:ok, ""} + end) + + assert {:ok, _} = VideoCollectionUser.get_video_ids(@channel_url, [:custom_arg]) + end + + test "returns the error straight through when the command fails" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:error, "Big issue", 1} end) + + assert {:error, "Big issue", 1} = VideoCollectionUser.get_video_ids(@channel_url) + end + end +end diff --git a/test/pinchflat/media_client/backends/yt_dlp/video_test.exs b/test/pinchflat/media_client/backends/yt_dlp/video_test.exs new file mode 100644 index 00000000..841fdb00 --- /dev/null +++ b/test/pinchflat/media_client/backends/yt_dlp/video_test.exs @@ -0,0 +1,56 @@ +defmodule Pinchflat.MediaClient.Backends.YtDlp.VideoTest do + use Pinchflat.DataCase + import Mox + + alias Pinchflat.MediaClient.Backends.YtDlp.Video + + @video_url "https://www.youtube.com/watch?v=TiZPUDkDYbk" + + setup :verify_on_exit! + + # expect(YtDlpRunnerMock, :run, fn _url, [_, _, json_output_path | _] -> + # copy_metadata(json_output_path) + + # {:ok, ""} + # end) + + describe "download/2" do + test "it calls the backend runner with the expected arguments" do + expect(YtDlpRunnerMock, :run, fn @video_url, opts, ot -> + assert [:no_simulate] = opts + assert "after_move:%()j" = ot + + {:ok, render_metadata(:media_metadata)} + end) + + assert {:ok, _} = Video.download(@video_url) + end + + test "it passes along additional options" do + expect(YtDlpRunnerMock, :run, fn _url, opts, _ot -> + assert [:no_simulate, :custom_arg] = opts + + {:ok, "{}"} + end) + + assert {:ok, _} = Video.download(@video_url, [:custom_arg]) + end + + test "it parses and returns the generated file as JSON" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + {:ok, render_metadata(:media_metadata)} + end) + + assert {:ok, %{"title" => "Trying to Wheelie Without the Rear Brake"}} = + Video.download(@video_url) + end + + test "it returns errors" do + expect(YtDlpRunnerMock, :run, fn _url, _opt, _ot -> + {:error, "something"} + end) + + assert {:error, "something"} = Video.download(@video_url) + end + end +end diff --git a/test/pinchflat/media_client/channel_details_test.exs b/test/pinchflat/media_client/channel_details_test.exs new file mode 100644 index 00000000..920fc029 --- /dev/null +++ b/test/pinchflat/media_client/channel_details_test.exs @@ -0,0 +1,60 @@ +defmodule Pinchflat.MediaClient.ChannelDetailsTest do + use ExUnit.Case, async: true + import Mox + + alias Pinchflat.MediaClient.ChannelDetails + + @channel_url "https://www.youtube.com/c/TheUselessTrials" + + setup :verify_on_exit! + + describe "new/2" do + test "it returns a struct with the given values" do + assert %ChannelDetails{id: "UCQH2", name: "TheUselessTrials"} = + ChannelDetails.new("UCQH2", "TheUselessTrials") + end + end + + describe "get_channel_details/2" do + test "it passes the expected arguments to the backend" do + expect(YtDlpRunnerMock, :run, fn @channel_url, opts, ot -> + assert opts == [playlist_end: 1] + assert ot == "%(.{channel,channel_id})j" + + {:ok, "{\"channel\": \"TheUselessTrials\", \"channel_id\": \"UCQH2\"}"} + end) + + assert {:ok, _} = ChannelDetails.get_channel_details(@channel_url) + end + + test "it returns a struct composed of the returned data" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + {:ok, "{\"channel\": \"TheUselessTrials\", \"channel_id\": \"UCQH2\"}"} + end) + + assert {:ok, res} = ChannelDetails.get_channel_details(@channel_url) + assert %ChannelDetails{id: "UCQH2", name: "TheUselessTrials"} = res + end + end + + describe "get_video_ids/2" do + test "it passes the expected arguments to the backend" do + expect(YtDlpRunnerMock, :run, fn @channel_url, opts, ot -> + assert opts == [:simulate, :skip_download] + assert ot == "%(id)s" + + {:ok, ""} + end) + + assert {:ok, _} = ChannelDetails.get_video_ids(@channel_url) + end + + test "it returns a list of strings" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + {:ok, "video1\nvideo2\nvideo3"} + end) + + assert {:ok, ["video1", "video2", "video3"]} = ChannelDetails.get_video_ids(@channel_url) + end + end +end diff --git a/test/pinchflat/media_client/video_downloader_test.exs b/test/pinchflat/media_client/video_downloader_test.exs new file mode 100644 index 00000000..77b2c44d --- /dev/null +++ b/test/pinchflat/media_client/video_downloader_test.exs @@ -0,0 +1,61 @@ +defmodule Pinchflat.MediaClient.VideoDownloaderTest do + use Pinchflat.DataCase + import Mox + import Pinchflat.MediaFixtures + + alias Pinchflat.MediaClient.VideoDownloader + + setup :verify_on_exit! + + setup do + media_item = + Repo.preload( + media_item_fixture(%{title: nil, video_filepath: nil}), + [:metadata, channel: :media_profile] + ) + + {:ok, %{media_item: media_item}} + end + + describe "download_for_media_item/3" do + test "it calls the backend runner", %{media_item: media_item} do + expect(YtDlpRunnerMock, :run, fn _url, _opts, ot -> + assert ot == "after_move:%()j" + + {:ok, render_metadata(:media_metadata)} + end) + + assert {:ok, _} = VideoDownloader.download_for_media_item(media_item) + end + + test "it writes attributes to the media item", %{media_item: media_item} do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + {:ok, render_metadata(:media_metadata)} + end) + + assert %{video_filepath: nil, title: nil} = media_item + assert {:ok, updated_media_item} = VideoDownloader.download_for_media_item(media_item) + assert updated_media_item.video_filepath + assert updated_media_item.title + end + + test "it saves the metadata to the database", %{media_item: media_item} do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + {:ok, render_metadata(:media_metadata)} + end) + + assert is_nil(media_item.metadata) + assert {:ok, updated_media_item} = VideoDownloader.download_for_media_item(media_item) + assert updated_media_item.metadata + assert is_map(updated_media_item.metadata.client_response) + end + + test "errors are passed through", %{media_item: media_item} do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + {:error, :some_error} + end) + + assert {:error, :some_error} = VideoDownloader.download_for_media_item(media_item) + end + end +end diff --git a/test/pinchflat/media_source_test.exs b/test/pinchflat/media_source_test.exs new file mode 100644 index 00000000..f46cfb32 --- /dev/null +++ b/test/pinchflat/media_source_test.exs @@ -0,0 +1,313 @@ +defmodule Pinchflat.MediaSourceTest do + use Pinchflat.DataCase + import Mox + import Pinchflat.TasksFixtures + import Pinchflat.ProfilesFixtures + import Pinchflat.MediaSourceFixtures + + alias Pinchflat.MediaSource + alias Pinchflat.Media.MediaItem + alias Pinchflat.MediaSource.Channel + alias Pinchflat.Workers.MediaIndexingWorker + + @invalid_channel_attrs %{name: nil, channel_id: nil} + + setup :verify_on_exit! + + describe "list_channels/0" do + test "it returns all channels" do + channel = channel_fixture() + assert MediaSource.list_channels() == [channel] + end + end + + describe "get_channel!/1" do + test "it returns the channel with given id" do + channel = channel_fixture() + assert MediaSource.get_channel!(channel.id) == channel + end + end + + describe "create_channel/1" do + test "creates a channel and adds name + ID from runner response" do + expect(YtDlpRunnerMock, :run, &runner_function_mock/3) + + valid_attrs = %{ + media_profile_id: media_profile_fixture().id, + original_url: "https://www.youtube.com/channel/abc123" + } + + assert {:ok, %Channel{} = channel} = MediaSource.create_channel(valid_attrs) + assert channel.name == "some name" + assert String.starts_with?(channel.channel_id, "some_channel_id_") + end + + test "creation with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = MediaSource.create_channel(@invalid_channel_attrs) + end + + test "creation enforces uniqueness of channel_id scoped to the media_profile" do + expect(YtDlpRunnerMock, :run, 2, fn _url, _opts, _ot -> + {:ok, + Phoenix.json_library().encode!(%{ + channel: "some name", + channel_id: "some_channel_id_12345678" + })} + end) + + valid_once_attrs = %{ + media_profile_id: media_profile_fixture().id, + original_url: "https://www.youtube.com/channel/abc123" + } + + assert {:ok, %Channel{}} = MediaSource.create_channel(valid_once_attrs) + assert {:error, %Ecto.Changeset{}} = MediaSource.create_channel(valid_once_attrs) + end + + test "creation lets you duplicate channel_ids as long as the media profile is different" do + expect(YtDlpRunnerMock, :run, 2, fn _url, _opts, _ot -> + {:ok, + Phoenix.json_library().encode!(%{ + channel: "some name", + channel_id: "some_channel_id_12345678" + })} + end) + + valid_attrs = %{ + name: "some name", + original_url: "https://www.youtube.com/channel/abc123" + } + + channel_1_attrs = Map.merge(valid_attrs, %{media_profile_id: media_profile_fixture().id}) + channel_2_attrs = Map.merge(valid_attrs, %{media_profile_id: media_profile_fixture().id}) + + assert {:ok, %Channel{}} = MediaSource.create_channel(channel_1_attrs) + assert {:ok, %Channel{}} = MediaSource.create_channel(channel_2_attrs) + end + + test "creation will schedule the indexing task" do + expect(YtDlpRunnerMock, :run, &runner_function_mock/3) + + valid_attrs = %{ + media_profile_id: media_profile_fixture().id, + original_url: "https://www.youtube.com/channel/abc123" + } + + assert {:ok, %Channel{} = channel} = MediaSource.create_channel(valid_attrs) + + assert_enqueued(worker: MediaIndexingWorker, args: %{"id" => channel.id}) + end + end + + describe "index_media_items/1" do + setup do + stub(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:ok, "video1\nvideo2\nvideo3"} end) + + {:ok, [channel: channel_fixture()]} + end + + test "it creates a media_item record for each media ID returned", %{channel: channel} do + assert media_items = MediaSource.index_media_items(channel) + + assert Enum.count(media_items) == 3 + assert ["video1", "video2", "video3"] == Enum.map(media_items, & &1.media_id) + assert Enum.all?(media_items, fn %MediaItem{} -> true end) + end + + test "it attaches all media_items to the given channel", %{channel: channel} do + channel_id = channel.id + assert media_items = MediaSource.index_media_items(channel) + + assert Enum.count(media_items) == 3 + assert Enum.all?(media_items, fn %MediaItem{channel_id: ^channel_id} -> true end) + end + + test "it won't duplicate media_items based on media_id and channel", %{channel: channel} do + _first_run = MediaSource.index_media_items(channel) + _duplicate_run = MediaSource.index_media_items(channel) + + media_items = Repo.preload(channel, :media_items).media_items + assert Enum.count(media_items) == 3 + end + + test "it can duplicate media_ids for different channels", %{channel: channel} do + other_channel = channel_fixture() + + media_items = MediaSource.index_media_items(channel) + media_items_other_channel = MediaSource.index_media_items(other_channel) + + assert Enum.count(media_items) == 3 + assert Enum.count(media_items_other_channel) == 3 + + assert Enum.map(media_items, & &1.media_id) == + Enum.map(media_items_other_channel, & &1.media_id) + end + + test "it returns a list of media_items or changesets", %{channel: channel} do + first_run = MediaSource.index_media_items(channel) + duplicate_run = MediaSource.index_media_items(channel) + + assert Enum.all?(first_run, fn %MediaItem{} -> true end) + assert Enum.all?(duplicate_run, fn %Ecto.Changeset{} -> true end) + end + end + + describe "update_channel/2" do + test "updates with valid data updates the channel" do + channel = channel_fixture() + update_attrs = %{name: "some updated name"} + + assert {:ok, %Channel{} = channel} = MediaSource.update_channel(channel, update_attrs) + assert channel.name == "some updated name" + end + + test "updating the original_url will re-fetch the channel details" do + expect(YtDlpRunnerMock, :run, &runner_function_mock/3) + + channel = channel_fixture() + update_attrs = %{original_url: "https://www.youtube.com/channel/abc123"} + + assert {:ok, %Channel{} = channel} = MediaSource.update_channel(channel, update_attrs) + assert channel.name == "some name" + assert String.starts_with?(channel.channel_id, "some_channel_id_") + end + + test "not updating the original_url will not re-fetch the channel details" do + expect(YtDlpRunnerMock, :run, 0, &runner_function_mock/3) + + channel = channel_fixture() + update_attrs = %{name: "some updated name"} + + assert {:ok, %Channel{}} = MediaSource.update_channel(channel, update_attrs) + end + + test "updating the index frequency will re-schedule the indexing task" do + channel = channel_fixture() + update_attrs = %{index_frequency_minutes: 123} + + assert {:ok, %Channel{} = channel} = MediaSource.update_channel(channel, update_attrs) + assert channel.index_frequency_minutes == 123 + assert_enqueued(worker: MediaIndexingWorker, args: %{"id" => channel.id}) + end + + test "not updating the index frequency will not re-schedule the indexing task" do + channel = channel_fixture() + update_attrs = %{name: "some updated name"} + + assert {:ok, %Channel{}} = MediaSource.update_channel(channel, update_attrs) + refute_enqueued(worker: MediaIndexingWorker, args: %{"id" => channel.id}) + end + + test "updates with invalid data returns error changeset" do + channel = channel_fixture() + + assert {:error, %Ecto.Changeset{}} = + MediaSource.update_channel(channel, @invalid_channel_attrs) + + assert channel == MediaSource.get_channel!(channel.id) + end + end + + describe "delete_channel/1" do + test "it deletes the channel" do + channel = channel_fixture() + assert {:ok, %Channel{}} = MediaSource.delete_channel(channel) + assert_raise Ecto.NoResultsError, fn -> MediaSource.get_channel!(channel.id) end + end + + test "it returns a channel changeset" do + channel = channel_fixture() + assert %Ecto.Changeset{} = MediaSource.change_channel(channel) + end + + test "deletion also deletes all associated tasks" do + channel = channel_fixture() + task = task_fixture(channel_id: channel.id) + + assert {:ok, %Channel{}} = MediaSource.delete_channel(channel) + assert_raise Ecto.NoResultsError, fn -> Repo.reload!(task) end + end + end + + describe "change_channel/2" do + test "it returns a changeset" do + channel = channel_fixture() + + assert %Ecto.Changeset{} = MediaSource.change_channel(channel) + end + end + + describe "change_channel_from_url/2" do + test "it returns a changeset" do + stub(YtDlpRunnerMock, :run, &runner_function_mock/3) + channel = channel_fixture() + + assert %Ecto.Changeset{} = MediaSource.change_channel_from_url(channel, %{}) + end + + test "it does not fetch channel details if the original_url isn't in the changeset" do + expect(YtDlpRunnerMock, :run, 0, &runner_function_mock/3) + + changeset = MediaSource.change_channel_from_url(%Channel{}, %{name: "some updated name"}) + + assert %Ecto.Changeset{} = changeset + end + + test "it fetches channel details if the original_url is in the changeset" do + expect(YtDlpRunnerMock, :run, &runner_function_mock/3) + + changeset = + MediaSource.change_channel_from_url(%Channel{}, %{ + original_url: "https://www.youtube.com/channel/abc123" + }) + + assert %Ecto.Changeset{} = changeset + end + + test "it adds channel details to the changeset, keeping the orignal details" do + expect(YtDlpRunnerMock, :run, &runner_function_mock/3) + + media_profile = media_profile_fixture() + media_profile_id = media_profile.id + + changeset = + MediaSource.change_channel_from_url(%Channel{}, %{ + original_url: "https://www.youtube.com/channel/abc123", + media_profile_id: media_profile.id + }) + + assert %Ecto.Changeset{} = changeset + assert String.starts_with?(changeset.changes.channel_id, "some_channel_id_") + + assert %{ + name: "some name", + media_profile_id: ^media_profile_id, + original_url: "https://www.youtube.com/channel/abc123" + } = changeset.changes + end + + test "it adds an error to the changeset if the runner fails" do + expect(YtDlpRunnerMock, :run, 1, fn _url, _opts, _ot -> + {:error, "some error", 1} + end) + + changeset = + MediaSource.change_channel_from_url(%Channel{}, %{ + original_url: "https://www.youtube.com/channel/abc123" + }) + + assert %Ecto.Changeset{} = changeset + assert errors_on(changeset).original_url == ["could not fetch channel details from URL"] + end + end + + defp runner_function_mock(_url, _opts, _ot) do + { + :ok, + Phoenix.json_library().encode!(%{ + channel: "some name", + channel_id: "some_channel_id_#{:rand.uniform(1_000_000)}" + }) + } + end +end diff --git a/test/pinchflat/media_test.exs b/test/pinchflat/media_test.exs new file mode 100644 index 00000000..d7a99cf6 --- /dev/null +++ b/test/pinchflat/media_test.exs @@ -0,0 +1,126 @@ +defmodule Pinchflat.MediaTest do + use Pinchflat.DataCase + + import Pinchflat.TasksFixtures + import Pinchflat.MediaFixtures + import Pinchflat.MediaSourceFixtures + + alias Pinchflat.Media + alias Pinchflat.Media.MediaItem + + @invalid_attrs %{title: nil, media_id: nil, video_filepath: nil} + + describe "schema" do + test "media_metadata is deleted when media_item is deleted" do + media_item = media_item_fixture(%{metadata: %{client_response: %{foo: "bar"}}}) + metadata = media_item.metadata + assert {:ok, %MediaItem{}} = Media.delete_media_item(media_item) + + assert_raise Ecto.NoResultsError, fn -> + Repo.reload!(metadata) + end + end + end + + describe "list_media_items/0" do + test "it returns all media_items" do + media_item = media_item_fixture() + assert Media.list_media_items() == [media_item] + end + end + + describe "list_pending_media_items_for/1" do + test "it returns pending media_items for a given channel" do + channel = channel_fixture() + media_item = media_item_fixture(%{channel_id: channel.id, video_filepath: nil}) + + assert Media.list_pending_media_items_for(channel) == [media_item] + end + + test "it does not return media_items with video_filepath" do + channel = channel_fixture() + + _media_item = + media_item_fixture(%{ + channel_id: channel.id, + video_filepath: "/video/#{Faker.File.file_name(:video)}" + }) + + assert Media.list_pending_media_items_for(channel) == [] + end + end + + describe "get_media_item!/1" do + test "it returns the media_item with given id" do + media_item = media_item_fixture() + assert Media.get_media_item!(media_item.id) == media_item + end + end + + describe "create_media_item/1" do + test "creating with valid data creates a media_item" do + valid_attrs = %{ + media_id: Faker.String.base64(12), + title: Faker.Commerce.product_name(), + video_filepath: "/video/#{Faker.File.file_name(:video)}", + channel_id: channel_fixture().id + } + + assert {:ok, %MediaItem{} = media_item} = Media.create_media_item(valid_attrs) + assert media_item.title == valid_attrs.title + assert media_item.media_id == valid_attrs.media_id + assert media_item.video_filepath == valid_attrs.video_filepath + end + + test "creating with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Media.create_media_item(@invalid_attrs) + end + end + + describe "update_media_item/2" do + test "updating with valid data updates the media_item" do + media_item = media_item_fixture() + + update_attrs = %{ + media_id: Faker.String.base64(12), + title: Faker.Commerce.product_name(), + video_filepath: "/video/#{Faker.File.file_name(:video)}", + channel_id: channel_fixture().id + } + + assert {:ok, %MediaItem{} = media_item} = Media.update_media_item(media_item, update_attrs) + assert media_item.title == update_attrs.title + assert media_item.media_id == update_attrs.media_id + assert media_item.video_filepath == update_attrs.video_filepath + end + + test "updating with invalid data returns error changeset" do + media_item = media_item_fixture() + assert {:error, %Ecto.Changeset{}} = Media.update_media_item(media_item, @invalid_attrs) + assert media_item == Media.get_media_item!(media_item.id) + end + end + + describe "delete_media_item/1" do + test "deletion deletes the media_item" do + media_item = media_item_fixture() + assert {:ok, %MediaItem{}} = Media.delete_media_item(media_item) + assert_raise Ecto.NoResultsError, fn -> Media.get_media_item!(media_item.id) end + end + + test "it also deletes attached tasks" do + media_item = media_item_fixture() + task = task_fixture(%{media_item_id: media_item.id}) + + assert {:ok, %MediaItem{}} = Media.delete_media_item(media_item) + assert_raise Ecto.NoResultsError, fn -> Repo.reload!(task) end + end + end + + describe "change_media_item/1" do + test "change_media_item/1 returns a media_item changeset" do + media_item = media_item_fixture() + assert %Ecto.Changeset{} = Media.change_media_item(media_item) + end + end +end diff --git a/test/pinchflat/profiles/options/yt_dlp/option_builder_test.exs b/test/pinchflat/profiles/options/yt_dlp/option_builder_test.exs new file mode 100644 index 00000000..b2747314 --- /dev/null +++ b/test/pinchflat/profiles/options/yt_dlp/option_builder_test.exs @@ -0,0 +1,18 @@ +defmodule Pinchflat.Profiles.Options.YtDlp.OptionBuilderTest do + use ExUnit.Case, async: true + + alias Pinchflat.Profiles.MediaProfile + alias Pinchflat.Profiles.Options.YtDlp.OptionBuilder + + @media_profile %MediaProfile{ + output_path_template: "{{ title }}.%(ext)s" + } + + describe "build/1" do + test "it generates an expanded output path based on the given template" do + assert {:ok, res} = OptionBuilder.build(@media_profile) + + assert {:output, "/tmp/videos/%(title)S.%(ext)s"} in res + end + end +end diff --git a/test/pinchflat/profiles_test.exs b/test/pinchflat/profiles_test.exs new file mode 100644 index 00000000..8635750e --- /dev/null +++ b/test/pinchflat/profiles_test.exs @@ -0,0 +1,78 @@ +defmodule Pinchflat.ProfilesTest do + use Pinchflat.DataCase + + alias Pinchflat.Profiles + alias Pinchflat.Profiles.MediaProfile + import Pinchflat.ProfilesFixtures + + @invalid_attrs %{name: nil, output_path_template: nil} + + describe "list_media_profiles/0" do + test "it returns all media_profiles" do + media_profile = media_profile_fixture() + assert Profiles.list_media_profiles() == [media_profile] + end + end + + describe "get_media_profile!/1" do + test "it returns the media_profile with given id" do + media_profile = media_profile_fixture() + assert Profiles.get_media_profile!(media_profile.id) == media_profile + end + end + + describe "create_media_profile/1" do + test "creation with valid data creates a media_profile" do + valid_attrs = %{name: "some name", output_path_template: "some output_path_template"} + + assert {:ok, %MediaProfile{} = media_profile} = Profiles.create_media_profile(valid_attrs) + assert media_profile.name == "some name" + assert media_profile.output_path_template == "some output_path_template" + end + + test "creation with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Profiles.create_media_profile(@invalid_attrs) + end + end + + describe "update_media_profile/2" do + test "updating with valid data updates the media_profile" do + media_profile = media_profile_fixture() + + update_attrs = %{ + name: "some updated name", + output_path_template: "some updated output_path_template" + } + + assert {:ok, %MediaProfile{} = media_profile} = + Profiles.update_media_profile(media_profile, update_attrs) + + assert media_profile.name == "some updated name" + assert media_profile.output_path_template == "some updated output_path_template" + end + + test "updating with invalid data returns error changeset" do + media_profile = media_profile_fixture() + + assert {:error, %Ecto.Changeset{}} = + Profiles.update_media_profile(media_profile, @invalid_attrs) + + assert media_profile == Profiles.get_media_profile!(media_profile.id) + end + end + + describe "delete_media_profile/1" do + test "deletion deletes the media_profile" do + media_profile = media_profile_fixture() + assert {:ok, %MediaProfile{}} = Profiles.delete_media_profile(media_profile) + assert_raise Ecto.NoResultsError, fn -> Profiles.get_media_profile!(media_profile.id) end + end + end + + describe "change_media_profile/1" do + test "it returns a media_profile changeset" do + media_profile = media_profile_fixture() + assert %Ecto.Changeset{} = Profiles.change_media_profile(media_profile) + end + end +end diff --git a/test/pinchflat/rendered_string/parser_test.exs b/test/pinchflat/rendered_string/parser_test.exs new file mode 100644 index 00000000..b7c4b702 --- /dev/null +++ b/test/pinchflat/rendered_string/parser_test.exs @@ -0,0 +1,40 @@ +defmodule Pinchflat.RenderedString.ParserTest do + use ExUnit.Case, async: true + + alias Pinchflat.RenderedString.Parser + + describe "parse/2" do + test "it returns the rendered string when the string is valid" do + assert {:ok, "bar"} = Parser.parse("{{ foo }}", %{"foo" => "bar"}) + end + + test "it works with filepath-like strings" do + assert {:ok, "bar/baz"} = + Parser.parse("{{ foo }}/{{ bar }}", %{"foo" => "bar", "bar" => "baz"}) + end + + test "it works when mixing text and variables" do + assert {:ok, "bar text baz"} = + Parser.parse("{{ foo }} text {{ bar }}", %{"foo" => "bar", "bar" => "baz"}) + end + + test "it removes the placeholder but doesn't blow up when the variable isn't provided" do + assert {:ok, ""} = Parser.parse("{{ foo }}", %{}) + end + + test "it accepts any number of spaces between open and closing tags" do + assert {:ok, "bar"} = Parser.parse("{{foo}}", %{"foo" => "bar"}) + assert {:ok, "bar"} = Parser.parse("{{ foo}}", %{"foo" => "bar"}) + assert {:ok, "bar"} = Parser.parse("{{foo }}", %{"foo" => "bar"}) + assert {:ok, "bar"} = Parser.parse("{{ foo }}", %{"foo" => "bar"}) + end + + test "it doesn't interpret single braces as variables" do + assert {:ok, "{foo}"} = Parser.parse("{foo}", %{}) + end + + test "it returns an error when the string is invalid" do + assert {:error, "expected end of string"} = Parser.parse("{{ 1-1 }", %{}) + end + end +end diff --git a/test/pinchflat/repo_test.exs b/test/pinchflat/repo_test.exs new file mode 100644 index 00000000..0d7eea25 --- /dev/null +++ b/test/pinchflat/repo_test.exs @@ -0,0 +1,26 @@ +defmodule Pinchflat.RepoTest do + use Pinchflat.DataCase + + alias Pinchflat.JobFixtures.TestJobWorker + + describe "insert_unique_job/1" do + test "returns {:ok, job} if there is no conflict" do + job = TestJobWorker.new(%{}) + + assert {:ok, %Oban.Job{}} = Pinchflat.Repo.insert_unique_job(job) + end + + test "returns {:duplicate, original_job} if there is a conflict" do + job = TestJobWorker.new(%{foo: "bar"}, unique: [period: :infinity]) + + {:ok, saved_job_1} = Pinchflat.Repo.insert_unique_job(job) + + assert {:duplicate, saved_job_2} = Pinchflat.Repo.insert_unique_job(job) + assert saved_job_1.id == saved_job_2.id + end + + test "returns the error if there is an error" do + assert {:error, _} = Pinchflat.Repo.insert_unique_job(%Ecto.Changeset{}) + end + end +end diff --git a/test/pinchflat/tasks/channel_tasks_test.exs b/test/pinchflat/tasks/channel_tasks_test.exs new file mode 100644 index 00000000..23145232 --- /dev/null +++ b/test/pinchflat/tasks/channel_tasks_test.exs @@ -0,0 +1,45 @@ +defmodule Pinchflat.Tasks.ChannelTasksTest do + use Pinchflat.DataCase + + import Pinchflat.TasksFixtures + import Pinchflat.MediaSourceFixtures + + alias Pinchflat.Tasks.Task + alias Pinchflat.Tasks.ChannelTasks + alias Pinchflat.Workers.MediaIndexingWorker + + describe "kickoff_indexing_task/1" do + test "it does not schedule a job if the interval is <= 0" do + channel = channel_fixture(index_frequency_minutes: -1) + + assert {:ok, :should_not_index} = ChannelTasks.kickoff_indexing_task(channel) + + refute_enqueued(worker: MediaIndexingWorker, args: %{"id" => channel.id}) + end + + test "it schedules a job if the interval is > 0" do + channel = channel_fixture(index_frequency_minutes: 1) + + assert {:ok, _} = ChannelTasks.kickoff_indexing_task(channel) + + assert_enqueued(worker: MediaIndexingWorker, args: %{"id" => channel.id}) + end + + test "it creates and attaches a task if the interval is > 0" do + channel = channel_fixture(index_frequency_minutes: 1) + + assert {:ok, %Task{} = task} = ChannelTasks.kickoff_indexing_task(channel) + + assert task.channel_id == channel.id + end + + test "it deletes any pending tasks for the channel" do + channel = channel_fixture() + task = task_fixture(channel_id: channel.id) + + assert {:ok, _} = ChannelTasks.kickoff_indexing_task(channel) + + assert_raise Ecto.NoResultsError, fn -> Repo.reload!(task) end + end + end +end diff --git a/test/pinchflat/tasks_test.exs b/test/pinchflat/tasks_test.exs new file mode 100644 index 00000000..fbcc6707 --- /dev/null +++ b/test/pinchflat/tasks_test.exs @@ -0,0 +1,211 @@ +defmodule Pinchflat.TasksTest do + use Pinchflat.DataCase + import Pinchflat.JobFixtures + import Pinchflat.TasksFixtures + import Pinchflat.MediaFixtures + import Pinchflat.MediaSourceFixtures + + alias Pinchflat.Tasks + alias Pinchflat.Tasks.Task + alias Pinchflat.JobFixtures.TestJobWorker + + @invalid_attrs %{job_id: nil} + + describe "schema" do + test "it deletes a task when the job gets deleted" do + task = Repo.preload(task_fixture(), [:job]) + + {:ok, _} = Repo.delete(task.job) + + assert_raise Ecto.NoResultsError, fn -> Repo.reload!(task) end + end + + test "it does not delete the other record when a job gets deleted" do + task = Repo.preload(task_fixture(), [:channel, :job]) + + {:ok, _} = Repo.delete(task.job) + + assert Repo.reload!(task.channel) + end + end + + describe "list_tasks/0" do + test "it returns all tasks" do + task = task_fixture() + assert Tasks.list_tasks() == [task] + end + end + + describe "list_tasks_for/3" do + test "it lets you specify which record type/ID to join on" do + task = task_fixture() + + assert Tasks.list_tasks_for(:channel_id, task.channel_id) == [task] + end + + test "it lets you specify which job states to include" do + task = task_fixture() + + assert Tasks.list_tasks_for(:channel_id, task.channel_id, [:available]) == [task] + assert Tasks.list_tasks_for(:channel_id, task.channel_id, [:cancelled]) == [] + end + end + + describe "list_pending_tasks_for/2" do + test "it lists pending tasks" do + task = task_fixture() + + assert Tasks.list_pending_tasks_for(:channel_id, task.channel_id) == [task] + end + + test "it does not list non-pending tasks" do + task = Repo.preload(task_fixture(), :job) + :ok = Oban.cancel_job(task.job) + + assert Tasks.list_pending_tasks_for(:channel_id, task.channel_id) == [] + end + end + + describe "get_task!/1" do + test "it returns the task with given id" do + task = task_fixture() + assert Tasks.get_task!(task.id) == task + end + end + + describe "create_task/1" do + test "creation with valid data creates a task" do + valid_attrs = %{job_id: job_fixture().id} + + assert {:ok, %Task{} = _task} = Tasks.create_task(valid_attrs) + end + + test "creation with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Tasks.create_task(@invalid_attrs) + end + + test "accepts a job and channel" do + job = job_fixture() + channel = channel_fixture() + + assert {:ok, %Task{} = task} = Tasks.create_task(job, channel) + + assert task.job_id == job.id + assert task.channel_id == channel.id + end + + test "accepts a job and media item" do + job = job_fixture() + media_item = media_item_fixture() + + assert {:ok, %Task{} = task} = Tasks.create_task(job, media_item) + + assert task.job_id == job.id + assert task.media_item_id == media_item.id + end + end + + describe "create_job_with_task/2" do + test "it enqueues the given job" do + media_item = media_item_fixture() + + refute_enqueued(worker: TestJobWorker) + assert {:ok, %Task{}} = Tasks.create_job_with_task(TestJobWorker.new(%{}), media_item) + assert_enqueued(worker: TestJobWorker) + end + + test "it creates a task record if successful" do + channel = channel_fixture() + + assert {:ok, %Task{} = task} = Tasks.create_job_with_task(TestJobWorker.new(%{}), channel) + + assert task.channel_id == channel.id + end + + test "it returns an error if the job already exists" do + channel = channel_fixture() + job = TestJobWorker.new(%{foo: "bar"}, unique: [period: :infinity]) + + assert {:ok, %Task{}} = Tasks.create_job_with_task(job, channel) + assert {:error, :duplicate_job} = Tasks.create_job_with_task(job, channel) + end + + test "it returns an error if the job fails to enqueue" do + channel = channel_fixture() + + assert {:error, %Ecto.Changeset{}} = Tasks.create_job_with_task(%Ecto.Changeset{}, channel) + end + end + + describe "delete_task/1" do + test "deletion deletes the task" do + task = task_fixture() + assert {:ok, %Task{}} = Tasks.delete_task(task) + assert_raise Ecto.NoResultsError, fn -> Tasks.get_task!(task.id) end + end + + test "deletion also cancels the attached job" do + task = Repo.preload(task_fixture(), :job) + + assert {:ok, %Task{}} = Tasks.delete_task(task) + job = Repo.reload!(task.job) + + assert job.state == "cancelled" + end + end + + describe "delete_tasks_for/1" do + test "it deletes tasks attached to a channel" do + channel = channel_fixture() + task = task_fixture(channel_id: channel.id) + + assert :ok = Tasks.delete_tasks_for(channel) + assert_raise Ecto.NoResultsError, fn -> Tasks.get_task!(task.id) end + end + + test "it deletes the tasks attached to a media_item" do + media_item = media_item_fixture() + task = task_fixture(media_item_id: media_item.id) + + assert :ok = Tasks.delete_tasks_for(media_item) + assert_raise Ecto.NoResultsError, fn -> Tasks.get_task!(task.id) end + end + end + + describe "delete_pending_tasks_for/1" do + test "it deletes pending tasks attached to a channel" do + channel = channel_fixture() + task = task_fixture(channel_id: channel.id) + + assert :ok = Tasks.delete_pending_tasks_for(channel) + assert_raise Ecto.NoResultsError, fn -> Tasks.get_task!(task.id) end + end + + test "it does not delete non-pending tasks" do + channel = channel_fixture() + task = Repo.preload(task_fixture(channel_id: channel.id), :job) + :ok = Oban.cancel_job(task.job) + + assert :ok = Tasks.delete_pending_tasks_for(channel) + assert Tasks.get_task!(task.id) + end + + test "it works on media_items" do + media_item = media_item_fixture() + pending_task = task_fixture(media_item_id: media_item.id) + cancelled_task = Repo.preload(task_fixture(media_item_id: media_item.id), :job) + :ok = Oban.cancel_job(cancelled_task.job) + + assert :ok = Tasks.delete_pending_tasks_for(media_item) + assert Tasks.get_task!(cancelled_task.id) + assert_raise Ecto.NoResultsError, fn -> Repo.reload!(pending_task) end + end + end + + describe "change_task/1" do + test "it returns a task changeset" do + task = task_fixture() + assert %Ecto.Changeset{} = Tasks.change_task(task) + end + end +end diff --git a/test/pinchflat/utils/string_utils_test.exs b/test/pinchflat/utils/string_utils_test.exs index 59ebbfc1..d77e468c 100644 --- a/test/pinchflat/utils/string_utils_test.exs +++ b/test/pinchflat/utils/string_utils_test.exs @@ -1,7 +1,7 @@ defmodule Pinchflat.Utils.StringUtilsTest do use ExUnit.Case, async: true - alias Pinchflat.Utils.StringUtils, as: StringUtils + alias Pinchflat.Utils.StringUtils describe "to_kebab_case/1" do test "converts a space-delimited string to kebab-case" do @@ -12,4 +12,19 @@ defmodule Pinchflat.Utils.StringUtilsTest do assert StringUtils.to_kebab_case("hello_world") == "hello-world" end end + + describe "random_string/1" do + test "generates a random string" do + assert is_binary(StringUtils.random_string()) + assert StringUtils.random_string() != StringUtils.random_string() + end + + test "has a defined default length" do + assert String.length(StringUtils.random_string()) == 32 + end + + test "can generate a string of a given length" do + assert String.length(StringUtils.random_string(64)) == 64 + end + end end diff --git a/test/pinchflat/workers/media_indexing_worker_test.exs b/test/pinchflat/workers/media_indexing_worker_test.exs new file mode 100644 index 00000000..154f9ab0 --- /dev/null +++ b/test/pinchflat/workers/media_indexing_worker_test.exs @@ -0,0 +1,110 @@ +defmodule Pinchflat.Workers.MediaIndexingWorkerTest do + use Pinchflat.DataCase + + import Mox + import Pinchflat.MediaFixtures + import Pinchflat.MediaSourceFixtures + + alias Pinchflat.Tasks + alias Pinchflat.Workers.MediaIndexingWorker + alias Pinchflat.Workers.VideoDownloadWorker + + setup :verify_on_exit! + + describe "perform/1" do + test "it does not do any indexing if the channel shouldn't be indexed" do + expect(YtDlpRunnerMock, :run, 0, fn _url, _opts, _ot -> {:ok, ""} end) + + channel = channel_fixture(index_frequency_minutes: -1) + + perform_job(MediaIndexingWorker, %{id: channel.id}) + end + + test "it does not reschedule if the channel shouldn't be indexed" do + expect(YtDlpRunnerMock, :run, 0, fn _url, _opts, _ot -> {:ok, ""} end) + + channel = channel_fixture(index_frequency_minutes: -1) + perform_job(MediaIndexingWorker, %{id: channel.id}) + + refute_enqueued(worker: MediaIndexingWorker, args: %{"id" => channel.id}) + end + + test "it indexes the channel if it should be indexed" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:ok, ""} end) + + channel = channel_fixture(index_frequency_minutes: 10) + + perform_job(MediaIndexingWorker, %{id: channel.id}) + end + + test "it kicks off a download job for each pending media item" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:ok, "video1"} end) + + channel = channel_fixture(index_frequency_minutes: 10) + perform_job(MediaIndexingWorker, %{id: channel.id}) + + assert [_] = all_enqueued(worker: VideoDownloadWorker) + end + + test "it starts a job for any pending media item even if it's from another run" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:ok, "video1"} end) + + channel = channel_fixture(index_frequency_minutes: 10) + media_item_fixture(%{channel_id: channel.id, video_filepath: nil}) + perform_job(MediaIndexingWorker, %{id: channel.id}) + + assert [_, _] = all_enqueued(worker: VideoDownloadWorker) + end + + test "it does not kick off a job for media items that could not be saved" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:ok, "video1\nvideo1"} end) + + channel = channel_fixture(index_frequency_minutes: 10) + perform_job(MediaIndexingWorker, %{id: channel.id}) + + # Only one job should be enqueued, since the second video is a duplicate + assert [_] = all_enqueued(worker: VideoDownloadWorker) + end + + test "it reschedules the job based on the index frequency" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:ok, ""} end) + + channel = channel_fixture(index_frequency_minutes: 10) + perform_job(MediaIndexingWorker, %{id: channel.id}) + + assert_enqueued( + worker: MediaIndexingWorker, + args: %{"id" => channel.id}, + scheduled_at: now_plus(channel.index_frequency_minutes, :minutes) + ) + end + + test "it creates a task for the rescheduled job" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:ok, ""} end) + + channel = channel_fixture(index_frequency_minutes: 10) + task_count_fetcher = fn -> Enum.count(Tasks.list_tasks()) end + + assert_changed([from: 0, to: 1], task_count_fetcher, fn -> + perform_job(MediaIndexingWorker, %{id: channel.id}) + end) + end + + test "it creates the basic media_item records" do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:ok, "video1\nvideo2"} end) + + channel = channel_fixture(index_frequency_minutes: 10) + + media_item_fetcher = fn -> + channel + |> Repo.preload(:media_items) + |> Map.get(:media_items) + |> Enum.map(fn media_item -> media_item.media_id end) + end + + assert_changed([from: [], to: ["video1", "video2"]], media_item_fetcher, fn -> + perform_job(MediaIndexingWorker, %{id: channel.id}) + end) + end + end +end diff --git a/test/pinchflat/workers/video_download_worker_test.exs b/test/pinchflat/workers/video_download_worker_test.exs new file mode 100644 index 00000000..d4f09958 --- /dev/null +++ b/test/pinchflat/workers/video_download_worker_test.exs @@ -0,0 +1,59 @@ +defmodule Pinchflat.Workers.VideoDownloadWorkerTest do + use Pinchflat.DataCase + + import Mox + import Pinchflat.MediaFixtures + + alias Pinchflat.Workers.VideoDownloadWorker + + setup :verify_on_exit! + + setup do + media_item = + Repo.preload( + media_item_fixture(%{video_filepath: nil}), + [:metadata, channel: :media_profile] + ) + + {:ok, %{media_item: media_item}} + end + + describe "perform/1" do + test "it saves attributes to the media_item", %{media_item: media_item} do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + {:ok, render_metadata(:media_metadata)} + end) + + assert media_item.video_filepath == nil + perform_job(VideoDownloadWorker, %{id: media_item.id}) + assert Repo.reload(media_item).video_filepath != nil + end + + test "it saves the metadata to the media_item", %{media_item: media_item} do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + {:ok, render_metadata(:media_metadata)} + end) + + assert media_item.metadata == nil + perform_job(VideoDownloadWorker, %{id: media_item.id}) + assert Repo.reload(media_item).metadata != nil + end + + test "it won't double-schedule downloading jobs", %{media_item: media_item} do + Oban.insert(VideoDownloadWorker.new(%{id: media_item.id})) + Oban.insert(VideoDownloadWorker.new(%{id: media_item.id})) + + assert [_] = all_enqueued(worker: VideoDownloadWorker) + end + + test "it sets the job to retryable if the download fails", %{media_item: media_item} do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:error, "error"} end) + + Oban.Testing.with_testing_mode(:inline, fn -> + {:ok, job} = Oban.insert(VideoDownloadWorker.new(%{id: media_item.id})) + + assert job.state == "retryable" + end) + end + end +end diff --git a/test/pinchflat_web/controllers/channel_controller_test.exs b/test/pinchflat_web/controllers/channel_controller_test.exs new file mode 100644 index 00000000..5e71f11f --- /dev/null +++ b/test/pinchflat_web/controllers/channel_controller_test.exs @@ -0,0 +1,119 @@ +defmodule PinchflatWeb.ChannelControllerTest do + use PinchflatWeb.ConnCase + import Mox + + import Pinchflat.ProfilesFixtures + import Pinchflat.MediaSourceFixtures + + setup do + media_profile = media_profile_fixture() + + { + :ok, + %{ + create_attrs: %{ + media_profile_id: media_profile.id, + original_url: "https://www.youtube.com/channel/abc123" + }, + update_attrs: %{ + original_url: "https://www.youtube.com/channel/321xyz" + }, + invalid_attrs: %{original_url: nil, media_profile_id: nil} + } + } + end + + setup :verify_on_exit! + + describe "index" do + test "lists all channels", %{conn: conn} do + conn = get(conn, ~p"/media_sources/channels") + assert html_response(conn, 200) =~ "Listing Channels" + end + end + + describe "new channel" do + test "renders form", %{conn: conn} do + conn = get(conn, ~p"/media_sources/channels/new") + assert html_response(conn, 200) =~ "New Channel" + end + end + + describe "create channel" do + test "redirects to show when data is valid", %{conn: conn, create_attrs: create_attrs} do + expect(YtDlpRunnerMock, :run, 1, &runner_function_mock/3) + conn = post(conn, ~p"/media_sources/channels", channel: create_attrs) + + assert %{id: id} = redirected_params(conn) + assert redirected_to(conn) == ~p"/media_sources/channels/#{id}" + + conn = get(conn, ~p"/media_sources/channels/#{id}") + assert html_response(conn, 200) =~ "Channel #{id}" + end + + test "renders errors when data is invalid", %{conn: conn, invalid_attrs: invalid_attrs} do + conn = post(conn, ~p"/media_sources/channels", channel: invalid_attrs) + assert html_response(conn, 200) =~ "New Channel" + end + end + + describe "edit channel" do + setup [:create_channel] + + test "renders form for editing chosen channel", %{conn: conn, channel: channel} do + conn = get(conn, ~p"/media_sources/channels/#{channel}/edit") + assert html_response(conn, 200) =~ "Edit Channel" + end + end + + describe "update channel" do + setup [:create_channel] + + test "redirects when data is valid", %{conn: conn, channel: channel, update_attrs: update_attrs} do + expect(YtDlpRunnerMock, :run, 1, &runner_function_mock/3) + + conn = put(conn, ~p"/media_sources/channels/#{channel}", channel: update_attrs) + assert redirected_to(conn) == ~p"/media_sources/channels/#{channel}" + + conn = get(conn, ~p"/media_sources/channels/#{channel}") + assert html_response(conn, 200) =~ "https://www.youtube.com/channel/321xyz" + end + + test "renders errors when data is invalid", %{ + conn: conn, + channel: channel, + invalid_attrs: invalid_attrs + } do + conn = put(conn, ~p"/media_sources/channels/#{channel}", channel: invalid_attrs) + assert html_response(conn, 200) =~ "Edit Channel" + end + end + + describe "delete channel" do + setup [:create_channel] + + test "deletes chosen channel", %{conn: conn, channel: channel} do + conn = delete(conn, ~p"/media_sources/channels/#{channel}") + assert redirected_to(conn) == ~p"/media_sources/channels" + + assert_error_sent 404, fn -> + get(conn, ~p"/media_sources/channels/#{channel}") + end + end + end + + defp create_channel(_) do + channel = channel_fixture() + %{channel: channel} + end + + defp runner_function_mock(_url, _opts, _ot) do + { + :ok, + Phoenix.json_library().encode!(%{ + channel: "some name", + channel_id: "some_channel_id_#{:rand.uniform(1_000_000)}" + }) + } + end +end diff --git a/test/pinchflat_web/controllers/media_profile_controller_test.exs b/test/pinchflat_web/controllers/media_profile_controller_test.exs new file mode 100644 index 00000000..b5bac1e5 --- /dev/null +++ b/test/pinchflat_web/controllers/media_profile_controller_test.exs @@ -0,0 +1,90 @@ +defmodule PinchflatWeb.MediaProfileControllerTest do + use PinchflatWeb.ConnCase + + import Pinchflat.ProfilesFixtures + + @create_attrs %{name: "some name", output_path_template: "some output_path_template"} + @update_attrs %{ + name: "some updated name", + output_path_template: "some updated output_path_template" + } + @invalid_attrs %{name: nil, output_path_template: nil} + + describe "index" do + test "lists all media_profiles", %{conn: conn} do + conn = get(conn, ~p"/media_profiles") + assert html_response(conn, 200) =~ "Listing Media profiles" + end + end + + describe "new media_profile" do + test "renders form", %{conn: conn} do + conn = get(conn, ~p"/media_profiles/new") + assert html_response(conn, 200) =~ "New Media profile" + end + end + + describe "create media_profile" do + test "redirects to show when data is valid", %{conn: conn} do + conn = post(conn, ~p"/media_profiles", media_profile: @create_attrs) + + assert %{id: id} = redirected_params(conn) + assert redirected_to(conn) == ~p"/media_profiles/#{id}" + + conn = get(conn, ~p"/media_profiles/#{id}") + assert html_response(conn, 200) =~ "Media profile #{id}" + end + + test "renders errors when data is invalid", %{conn: conn} do + conn = post(conn, ~p"/media_profiles", media_profile: @invalid_attrs) + assert html_response(conn, 200) =~ "New Media profile" + end + end + + describe "edit media_profile" do + setup [:create_media_profile] + + test "renders form for editing chosen media_profile", %{ + conn: conn, + media_profile: media_profile + } do + conn = get(conn, ~p"/media_profiles/#{media_profile}/edit") + assert html_response(conn, 200) =~ "Edit Media profile" + end + end + + describe "update media_profile" do + setup [:create_media_profile] + + test "redirects when data is valid", %{conn: conn, media_profile: media_profile} do + conn = put(conn, ~p"/media_profiles/#{media_profile}", media_profile: @update_attrs) + assert redirected_to(conn) == ~p"/media_profiles/#{media_profile}" + + conn = get(conn, ~p"/media_profiles/#{media_profile}") + assert html_response(conn, 200) =~ "some updated name" + end + + test "renders errors when data is invalid", %{conn: conn, media_profile: media_profile} do + conn = put(conn, ~p"/media_profiles/#{media_profile}", media_profile: @invalid_attrs) + assert html_response(conn, 200) =~ "Edit Media profile" + end + end + + describe "delete media_profile" do + setup [:create_media_profile] + + test "deletes chosen media_profile", %{conn: conn, media_profile: media_profile} do + conn = delete(conn, ~p"/media_profiles/#{media_profile}") + assert redirected_to(conn) == ~p"/media_profiles" + + assert_error_sent 404, fn -> + get(conn, ~p"/media_profiles/#{media_profile}") + end + end + end + + defp create_media_profile(_) do + media_profile = media_profile_fixture() + %{media_profile: media_profile} + end +end diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index 012ef2f0..ff478a0f 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -28,6 +28,7 @@ defmodule PinchflatWeb.ConnCase do import Plug.Conn import Phoenix.ConnTest import PinchflatWeb.ConnCase + import Pinchflat.TestingHelperMethods end end diff --git a/test/support/data_case.ex b/test/support/data_case.ex index df05c538..d2177491 100644 --- a/test/support/data_case.ex +++ b/test/support/data_case.ex @@ -20,10 +20,13 @@ defmodule Pinchflat.DataCase do quote do alias Pinchflat.Repo + use Oban.Testing, repo: Repo + import Ecto import Ecto.Changeset import Ecto.Query import Pinchflat.DataCase + import Pinchflat.TestingHelperMethods end end diff --git a/test/support/files/media_metadata.json b/test/support/files/media_metadata.json new file mode 100644 index 00000000..6c4f3ec8 --- /dev/null +++ b/test/support/files/media_metadata.json @@ -0,0 +1,5772 @@ +{ + "id": "bwRHIkYqYJo", + "title": "Trying to Wheelie Without the Rear Brake", + "formats": [ + { + "format_id": "sb2", + "format_note": "storyboard", + "ext": "mhtml", + "protocol": "mhtml", + "acodec": "none", + "vcodec": "none", + "url": "https://i.ytimg.com/sb/bwRHIkYqYJo/storyboard3_L0/default.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgii-ZutBg==&sigh=rs$AOn4CLC-WTfZiOcDKw9i37-6XwkDXvNewg", + "width": 48, + "height": 27, + "fps": 0.1718213058419244, + "rows": 10, + "columns": 10, + "fragments": [ + { + "url": "https://i.ytimg.com/sb/bwRHIkYqYJo/storyboard3_L0/default.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgii-ZutBg==&sigh=rs$AOn4CLC-WTfZiOcDKw9i37-6XwkDXvNewg", + "duration": 582.0 + } + ], + "resolution": "48x27", + "aspect_ratio": 1.78, + "http_headers": {}, + "audio_ext": "none", + "video_ext": "none", + "vbr": 0, + "abr": 0, + "tbr": null, + "format": "sb2 - 48x27 (storyboard)" + }, + { + "format_id": "sb1", + "format_note": "storyboard", + "ext": "mhtml", + "protocol": "mhtml", + "acodec": "none", + "vcodec": "none", + "url": "https://i.ytimg.com/sb/bwRHIkYqYJo/storyboard3_L1/M$M.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgii-ZutBg==&sigh=rs$AOn4CLD1JarTwbQfCQTsU00-DbrN5S0TRw", + "width": 79, + "height": 45, + "fps": 0.2027491408934708, + "rows": 10, + "columns": 10, + "fragments": [ + { + "url": "https://i.ytimg.com/sb/bwRHIkYqYJo/storyboard3_L1/M0.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgii-ZutBg==&sigh=rs$AOn4CLD1JarTwbQfCQTsU00-DbrN5S0TRw", + "duration": 493.22033898305085 + }, + { + "url": "https://i.ytimg.com/sb/bwRHIkYqYJo/storyboard3_L1/M1.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgii-ZutBg==&sigh=rs$AOn4CLD1JarTwbQfCQTsU00-DbrN5S0TRw", + "duration": 88.77966101694915 + } + ], + "resolution": "79x45", + "aspect_ratio": 1.76, + "http_headers": {}, + "audio_ext": "none", + "video_ext": "none", + "vbr": 0, + "abr": 0, + "tbr": null, + "format": "sb1 - 79x45 (storyboard)" + }, + { + "format_id": "sb0", + "format_note": "storyboard", + "ext": "mhtml", + "protocol": "mhtml", + "acodec": "none", + "vcodec": "none", + "url": "https://i.ytimg.com/sb/bwRHIkYqYJo/storyboard3_L2/M$M.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgii-ZutBg==&sigh=rs$AOn4CLBC5n1OzoB3jwZTrzvCQWFGwSZX1w", + "width": 159, + "height": 90, + "fps": 0.2027491408934708, + "rows": 5, + "columns": 5, + "fragments": [ + { + "url": "https://i.ytimg.com/sb/bwRHIkYqYJo/storyboard3_L2/M0.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgii-ZutBg==&sigh=rs$AOn4CLBC5n1OzoB3jwZTrzvCQWFGwSZX1w", + "duration": 123.30508474576271 + }, + { + "url": "https://i.ytimg.com/sb/bwRHIkYqYJo/storyboard3_L2/M1.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgii-ZutBg==&sigh=rs$AOn4CLBC5n1OzoB3jwZTrzvCQWFGwSZX1w", + "duration": 123.30508474576271 + }, + { + "url": "https://i.ytimg.com/sb/bwRHIkYqYJo/storyboard3_L2/M2.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgii-ZutBg==&sigh=rs$AOn4CLBC5n1OzoB3jwZTrzvCQWFGwSZX1w", + "duration": 123.30508474576271 + }, + { + "url": "https://i.ytimg.com/sb/bwRHIkYqYJo/storyboard3_L2/M3.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgii-ZutBg==&sigh=rs$AOn4CLBC5n1OzoB3jwZTrzvCQWFGwSZX1w", + "duration": 123.30508474576271 + }, + { + "url": "https://i.ytimg.com/sb/bwRHIkYqYJo/storyboard3_L2/M4.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgii-ZutBg==&sigh=rs$AOn4CLBC5n1OzoB3jwZTrzvCQWFGwSZX1w", + "duration": 88.77966101694915 + } + ], + "resolution": "159x90", + "aspect_ratio": 1.77, + "http_headers": {}, + "audio_ext": "none", + "video_ext": "none", + "vbr": 0, + "abr": 0, + "tbr": null, + "format": "sb0 - 159x90 (storyboard)" + }, + { + "format_id": "233", + "format_note": "Default", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/233/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/goi/133/sgoap/clen%3D3552258%3Bdur%3D582.402%3Bgir%3Dyes%3Bitag%3D139%3Blmt%3D1705441259000142/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/6318224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,goi,sgoap,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRQIgbCaCGS0nhRSFgZg8OsT10tDuIe8XPCZ_zAjccY4_Fc0CIQDp56A2F57OqrJ_eidw70fAlmO-7gug6DdJ4o51VE9LOg%3D%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRQIhAPLxk_HQV_ZFBRaw8LoqR40VEIPazvN72t0Jp3WOt5H-AiABF-sb2dSvkGTwHn67ozX99m46kmOF6G7g50lqpYBAbA%3D%3D/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "language": "en", + "ext": "mp4", + "protocol": "m3u8_native", + "preference": null, + "quality": -1, + "has_drm": false, + "vcodec": "none", + "source_preference": -1, + "resolution": "audio only", + "aspect_ratio": null, + "http_headers": {}, + "audio_ext": "mp4", + "video_ext": "none", + "vbr": 0, + "abr": null, + "tbr": null, + "format": "233 - audio only (Default)" + }, + { + "format_id": "234", + "format_note": "Default", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/234/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/goi/133/sgoap/clen%3D9425155%3Bdur%3D582.333%3Bgir%3Dyes%3Bitag%3D140%3Blmt%3D1705441258942374/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/6318224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,goi,sgoap,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRQIgXivzAy8pyeLSQRo2Xo5vtwHERLIQsZDunepkJJHXKRECIQCxJjC-2b85V7aKyKWkZGkO6vAGML1TEO2ezmhEfVRj9w%3D%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRQIgQ44w_X6TfA_ERAP4Vzy4C9em8983DeFJrcOJgyS5oe8CIQC1uzL1RI_lsx32LJy5ZiJ1e6Mr8w6j-RGLYSE2s7Ay1w%3D%3D/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "language": "en", + "ext": "mp4", + "protocol": "m3u8_native", + "preference": null, + "quality": -1, + "has_drm": false, + "vcodec": "none", + "source_preference": -1, + "resolution": "audio only", + "aspect_ratio": null, + "http_headers": {}, + "audio_ext": "mp4", + "video_ext": "none", + "vbr": 0, + "abr": null, + "tbr": null, + "format": "234 - audio only (Default)" + }, + { + "asr": 22050, + "filesize": 2242064, + "format_id": "599", + "format_note": "ultralow", + "source_preference": -1, + "fps": null, + "audio_channels": 2, + "height": null, + "quality": 1.0, + "has_drm": false, + "tbr": 30.797, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23ZZznK7ucsfIP0rW_wAk&ip=184.65.71.108&id=o-AF5FdjYiL4g-CkbZ54_ilBCjxrEgT73c7TlGEfvr2meT&itag=599&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=audio%2Fmp4&gir=yes&clen=2242064&dur=582.402&lmt=1705441248506215&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=ANDROID&txp=6318224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgPzjWp5WhLuzU1BF9Zss3z1ypbGp65aPxDP433xEbtMYCIQDYnBdGBwokwLzPYeos1XwA_sJ6wMpfWRmv_MmSzzVZcA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRgIhAIdNHwY7qZ_DjsmvAH3GfDsZvkQygk757LbYqhfbhihYAiEA2K4C8d_ghWmB6fQatxNumDoyqVqHmhA0LcO8X0Dkp2I%3D", + "width": null, + "language": "en", + "language_preference": -1, + "preference": null, + "ext": "m4a", + "vcodec": "none", + "acodec": "mp4a.40.5", + "dynamic_range": null, + "container": "m4a_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "audio only", + "aspect_ratio": null, + "http_headers": {}, + "audio_ext": "m4a", + "video_ext": "none", + "vbr": 0, + "abr": 30.797, + "format": "599 - audio only (ultralow)" + }, + { + "asr": 48000, + "filesize": 2350616, + "format_id": "600", + "format_note": "ultralow", + "source_preference": -1, + "fps": null, + "audio_channels": 2, + "height": null, + "quality": 1.0, + "has_drm": false, + "tbr": 32.294, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23ZZznK7ucsfIP0rW_wAk&ip=184.65.71.108&id=o-AF5FdjYiL4g-CkbZ54_ilBCjxrEgT73c7TlGEfvr2meT&itag=600&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=audio%2Fwebm&gir=yes&clen=2350616&dur=582.301&lmt=1705441327063661&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=ANDROID&txp=6318224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAPsYQ5yQbaPM7oDI9YUaZ6CnXw_QXPdGM25yFjZr134KAiEAzzU-qQD-9lX-WHmEk7l-1zbXJakGLKTfNGc1rKShkpE%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRgIhAIdNHwY7qZ_DjsmvAH3GfDsZvkQygk757LbYqhfbhihYAiEA2K4C8d_ghWmB6fQatxNumDoyqVqHmhA0LcO8X0Dkp2I%3D", + "width": null, + "language": "en", + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "none", + "acodec": "opus", + "dynamic_range": null, + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "audio only", + "aspect_ratio": null, + "http_headers": {}, + "audio_ext": "webm", + "video_ext": "none", + "vbr": 0, + "abr": 32.294, + "format": "600 - audio only (ultralow)" + }, + { + "asr": 22050, + "filesize": 3552258, + "format_id": "139", + "format_note": "low", + "source_preference": -1, + "fps": null, + "audio_channels": 2, + "height": null, + "quality": 2.0, + "has_drm": false, + "tbr": 48.794, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=139&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=audio%2Fmp4&gir=yes&clen=3552258&dur=582.402&lmt=1705441259000142&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=6318224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgMbJoNILf7hPQlKjaYGtlD6nZkfD-K3KFvdjreHL95MMCIQCB7LXN_jApFpmBk98htmW5MaFv-I9MPbHwp8BfWAADqw%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": null, + "language": "en", + "language_preference": -1, + "preference": null, + "ext": "m4a", + "vcodec": "none", + "acodec": "mp4a.40.5", + "dynamic_range": null, + "container": "m4a_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "audio only", + "aspect_ratio": null, + "http_headers": {}, + "audio_ext": "m4a", + "video_ext": "none", + "vbr": 0, + "abr": 48.794, + "format": "139 - audio only (low)" + }, + { + "asr": 48000, + "filesize": 3488131, + "format_id": "249", + "format_note": "low", + "source_preference": -1, + "fps": null, + "audio_channels": 2, + "height": null, + "quality": 2.0, + "has_drm": false, + "tbr": 47.922, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23ZZznK7ucsfIP0rW_wAk&ip=184.65.71.108&id=o-AF5FdjYiL4g-CkbZ54_ilBCjxrEgT73c7TlGEfvr2meT&itag=249&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=audio%2Fwebm&gir=yes&clen=3488131&dur=582.301&lmt=1705441327177140&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=ANDROID&txp=6318224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIhAO0x_TsrdvaWwrEMNK_23yJiXmJIiQGl1qbSHoLsPzZPAiBA2LtboX-IKmwH1KOmCdnC1FLGuTdekjoAfOjEDW52UA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRgIhAIdNHwY7qZ_DjsmvAH3GfDsZvkQygk757LbYqhfbhihYAiEA2K4C8d_ghWmB6fQatxNumDoyqVqHmhA0LcO8X0Dkp2I%3D", + "width": null, + "language": "en", + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "none", + "acodec": "opus", + "dynamic_range": null, + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "audio only", + "aspect_ratio": null, + "http_headers": {}, + "audio_ext": "webm", + "video_ext": "none", + "vbr": 0, + "abr": 47.922, + "format": "249 - audio only (low)" + }, + { + "asr": 48000, + "filesize": 4272694, + "format_id": "250", + "format_note": "low", + "source_preference": -1, + "fps": null, + "audio_channels": 2, + "height": null, + "quality": 2.0, + "has_drm": false, + "tbr": 58.7, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23ZZznK7ucsfIP0rW_wAk&ip=184.65.71.108&id=o-AF5FdjYiL4g-CkbZ54_ilBCjxrEgT73c7TlGEfvr2meT&itag=250&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=audio%2Fwebm&gir=yes&clen=4272694&dur=582.301&lmt=1705441327109569&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=ANDROID&txp=6318224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRAIgFzpZfKGibXfdRrK1xr5m98A4NCWoDg2ZHFAjURdhaFQCIE8gxwn8ZWkqxPLCoJJTK9OhZr7i6fRRcR9Z3KhCdVHC&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRgIhAIdNHwY7qZ_DjsmvAH3GfDsZvkQygk757LbYqhfbhihYAiEA2K4C8d_ghWmB6fQatxNumDoyqVqHmhA0LcO8X0Dkp2I%3D", + "width": null, + "language": "en", + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "none", + "acodec": "opus", + "dynamic_range": null, + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "audio only", + "aspect_ratio": null, + "http_headers": {}, + "audio_ext": "webm", + "video_ext": "none", + "vbr": 0, + "abr": 58.7, + "format": "250 - audio only (low)" + }, + { + "asr": 44100, + "filesize": 9425155, + "format_id": "140", + "format_note": "medium", + "source_preference": -1, + "fps": null, + "audio_channels": 2, + "height": null, + "quality": 3.0, + "has_drm": false, + "tbr": 129.481, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=140&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=audio%2Fmp4&gir=yes&clen=9425155&dur=582.333&lmt=1705441258942374&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=6318224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgQJMe3IBXC_MDoxK1HE4_hOneKFrU4WuDpqrJLk3OjW0CIQCQ8PM5dQjyZgSARTggysTr69FrS5IcF2fZOtdqABduzw%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": null, + "language": "en", + "language_preference": -1, + "preference": null, + "ext": "m4a", + "vcodec": "none", + "acodec": "mp4a.40.2", + "dynamic_range": null, + "container": "m4a_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "audio only", + "aspect_ratio": null, + "http_headers": {}, + "audio_ext": "m4a", + "video_ext": "none", + "vbr": 0, + "abr": 129.481, + "format": "140 - audio only (medium)" + }, + { + "asr": 48000, + "filesize": 8264649, + "format_id": "251", + "format_note": "medium", + "source_preference": -1, + "fps": null, + "audio_channels": 2, + "height": null, + "quality": 3.0, + "has_drm": false, + "tbr": 113.544, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23ZZznK7ucsfIP0rW_wAk&ip=184.65.71.108&id=o-AF5FdjYiL4g-CkbZ54_ilBCjxrEgT73c7TlGEfvr2meT&itag=251&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=audio%2Fwebm&gir=yes&clen=8264649&dur=582.301&lmt=1705441327139531&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=ANDROID&txp=6318224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAKheHfJYdKMVCKmhCmKHRc_Dx9THKe1AxARvtPWpEXHaAiEAmyg7s-nuvB0Qlq67_OWk6UdaptzYtVujTE0tTAvD2F4%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRgIhAIdNHwY7qZ_DjsmvAH3GfDsZvkQygk757LbYqhfbhihYAiEA2K4C8d_ghWmB6fQatxNumDoyqVqHmhA0LcO8X0Dkp2I%3D", + "width": null, + "language": "en", + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "none", + "acodec": "opus", + "dynamic_range": null, + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "audio only", + "aspect_ratio": null, + "http_headers": {}, + "audio_ext": "webm", + "video_ext": "none", + "vbr": 0, + "abr": 113.544, + "format": "251 - audio only (medium)" + }, + { + "asr": null, + "filesize": 2407895, + "format_id": "597", + "format_note": "144p", + "source_preference": -1, + "fps": 12, + "audio_channels": null, + "height": 144, + "quality": 0.0, + "has_drm": false, + "tbr": 33.084, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23ZZznK7ucsfIP0rW_wAk&ip=184.65.71.108&id=o-AF5FdjYiL4g-CkbZ54_ilBCjxrEgT73c7TlGEfvr2meT&itag=597&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fmp4&gir=yes&clen=2407895&dur=582.248&lmt=1705442098175374&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=ANDROID&txp=6319224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIhAK_ZvxSCyhy0g8ReQZsqbs0EMRt7XS89BarIcD3WDRvtAiB3suU29Sd1Iomkf_wF0TqzXPq4dEsNG4lvJ4JXcj18sA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRgIhAIdNHwY7qZ_DjsmvAH3GfDsZvkQygk757LbYqhfbhihYAiEA2K4C8d_ghWmB6fQatxNumDoyqVqHmhA0LcO8X0Dkp2I%3D", + "width": 256, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "mp4", + "vcodec": "avc1.4d400b", + "acodec": "none", + "dynamic_range": "SDR", + "container": "mp4_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "256x144", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 33.084, + "format": "597 - 256x144 (144p)" + }, + { + "format_id": "602", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/602/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/wft/1/sgovp/clen%3D2070301%3Bdur%3D582.249%3Bgir%3Dyes%3Bitag%3D598%3Blmt%3D1705442118702877/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/631F224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,wft,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRQIgIy3w8Sr5PYKGemSScmdCie_OalRKZxFjiB7JHHhN3roCIQDRHRUgVSprFZygIH1txAVeHe0RNlD8qOpUldRBJRqclQ%3D%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRgIhAIUigAsP21VeXHGJyFS9o4jQLqC7IexKQTcVLk-IAzD0AiEAsINmuLR_fxOqWNtjunyjbKsbgY3vdkR1Csoynia1Uns%3D/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 94.431, + "ext": "mp4", + "fps": 12.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 0, + "has_drm": false, + "width": 256, + "height": 144, + "vcodec": "vp09.00.10.08", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "256x144", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 94.431, + "format": "602 - 256x144" + }, + { + "asr": null, + "filesize": 2070301, + "format_id": "598", + "format_note": "144p", + "source_preference": -1, + "fps": 12, + "audio_channels": null, + "height": 144, + "quality": 0.0, + "has_drm": false, + "tbr": 28.445, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23ZZznK7ucsfIP0rW_wAk&ip=184.65.71.108&id=o-AF5FdjYiL4g-CkbZ54_ilBCjxrEgT73c7TlGEfvr2meT&itag=598&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fwebm&gir=yes&clen=2070301&dur=582.249&lmt=1705442118702877&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=ANDROID&txp=631F224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgQEfkfqB19QGDfPeDiuD1LOdmG5mfjsr1YFc4gQqJqOcCIQChK-xs80ymX62-yMW1dqPlS86kVIDJnE1O8ZAENZug6Q%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRgIhAIdNHwY7qZ_DjsmvAH3GfDsZvkQygk757LbYqhfbhihYAiEA2K4C8d_ghWmB6fQatxNumDoyqVqHmhA0LcO8X0Dkp2I%3D", + "width": 256, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "vp9", + "acodec": "none", + "dynamic_range": "SDR", + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "256x144", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "webm", + "audio_ext": "none", + "abr": 0, + "vbr": 28.445, + "format": "598 - 256x144 (144p)" + }, + { + "format_id": "269", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/269/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/sgovp/clen%3D6537008%3Bdur%3D582.289%3Bgir%3Dyes%3Bitag%3D160%3Blmt%3D1705442097174021/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/6319224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRQIgORsp3UfGesdndN1aXs7AmxWVW1tvW0Q1QFkc_3xdUtsCIQD8LLr9wiEY9Cka883z0oDQEnUWBL-EmE-LEUn4RXfWYQ%3D%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRgIhANdXUbkh2M_PpL4Ijgqjq6bRH64-I9opv1p5qRSPazncAiEA1TKYM3WaybEd8gdiJUk1YtmbCoPfFVm9X0lLFGROQWQ%3D/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 201.919, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 0, + "has_drm": false, + "width": 256, + "height": 144, + "vcodec": "avc1.4D400C", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "256x144", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 201.919, + "format": "269 - 256x144" + }, + { + "asr": null, + "filesize": 6537008, + "format_id": "160", + "format_note": "144p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 144, + "quality": 0.0, + "has_drm": false, + "tbr": 89.811, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=160&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fmp4&gir=yes&clen=6537008&dur=582.289&lmt=1705442097174021&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=6319224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRAIgN5xpT-BBnkxVvedxNs9sRdI4JuXVj6ztGZl9n2IynYoCIEvJuPwl4fLp-eaTAzWeaf63rj7n1fOvdVT-GfWjxeH4&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 256, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "mp4", + "vcodec": "avc1.4D400C", + "acodec": "none", + "dynamic_range": "SDR", + "container": "mp4_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "256x144", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 89.811, + "format": "160 - 256x144 (144p)" + }, + { + "format_id": "603", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/603/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/wft/1/sgovp/clen%3D6584603%3Bdur%3D582.290%3Bgir%3Dyes%3Bitag%3D278%3Blmt%3D1705442116315246/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/631F224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,wft,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRgIhAO9C3APNxStsV4W8-dvJ0HpRpeLxOJW2jC7r2MTFF8WPAiEAsfN3HqfVHblotNU2vxB8BKKZ5w9Ku_1WM-vLk5IniEQ%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRgIhAIq-cM7RFgju53motvi5WuZQ6mliOq4baFVb0StR7KayAiEAnP32_n-EEZBzWvgFJbERWxBRHhRVfMkUV_cqGQzFAtE%3D/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 179.819, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 0, + "has_drm": false, + "width": 256, + "height": 144, + "vcodec": "vp09.00.11.08", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "256x144", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 179.819, + "format": "603 - 256x144" + }, + { + "asr": null, + "filesize": 6584603, + "format_id": "278", + "format_note": "144p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 144, + "quality": 0.0, + "has_drm": false, + "tbr": 90.464, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=278&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fwebm&gir=yes&clen=6584603&dur=582.290&lmt=1705442116315246&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=631F224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgAijFrojddeA1uI2ym7gQIGwnGD7dm-V7scLgOPTlEQcCIQDvhQa2hVZNIPBUeFpdR_V3_C4Lm_fE-DNmMCTXf1N_ag%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 256, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "vp09.00.11.08", + "acodec": "none", + "dynamic_range": "SDR", + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "256x144", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "webm", + "audio_ext": "none", + "abr": 0, + "vbr": 90.464, + "format": "278 - 256x144 (144p)" + }, + { + "format_id": "229", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/229/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/sgovp/clen%3D14938064%3Bdur%3D582.289%3Bgir%3Dyes%3Bitag%3D133%3Blmt%3D1705442097770962/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/6319224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRQIhAIVNLkJ1nWePnf0genOGXGAA1opeCcbHdo3xKeOoVDStAiAniI58mRUcJXae-vBWndbe7nhwXrcar-GMKIcGsZcYOg%3D%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRAIhAPqes6IUf0F5q4ItAnSBMQ4P_FjkJOFdn4hE01QhQjZrAh8UA5R5u2aZTi_dfWjarDXxNbdBwbYUnd2k7pH2hHll/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 328.263, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 5, + "has_drm": false, + "width": 426, + "height": 240, + "vcodec": "avc1.4D4015", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "426x240", + "aspect_ratio": 1.77, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 328.263, + "format": "229 - 426x240" + }, + { + "asr": null, + "filesize": 14938064, + "format_id": "133", + "format_note": "240p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 240, + "quality": 5.0, + "has_drm": false, + "tbr": 205.232, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=133&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fmp4&gir=yes&clen=14938064&dur=582.289&lmt=1705442097770962&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=6319224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhANH9WKQowvFEFnvoGCz_Vn1anCa9YqZRCBHz84xex_G6AiEA-P6VSAjRT0RccCbFcqN_0hOWTXI9MvelKOFUulTicyc%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 426, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "mp4", + "vcodec": "avc1.4D4015", + "acodec": "none", + "dynamic_range": "SDR", + "container": "mp4_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "426x240", + "aspect_ratio": 1.77, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 205.232, + "format": "133 - 426x240 (240p)" + }, + { + "format_id": "604", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/604/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/wft/1/sgovp/clen%3D12758651%3Bdur%3D582.290%3Bgir%3Dyes%3Bitag%3D242%3Blmt%3D1705442116412531/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/631F224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,wft,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRAIgdsQUgIA4kQX7OzJ4VtsY6e3Z6CTIfHCxV8UbM4jfItMCIF0bTTDbt4I13uzaI00mjDCai6qr_sr6UV7E8f1sIhim/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRAIgZRU-HyLJa9GUlC2dtoiNXowPHMLCPw7dBhftztN5JF4CICaTHBIc300wMqA_o2zjmTYIeWOiEuBGBKxQIgDLlZj0/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 322.938, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 5, + "has_drm": false, + "width": 426, + "height": 240, + "vcodec": "vp09.00.20.08", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "426x240", + "aspect_ratio": 1.77, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 322.938, + "format": "604 - 426x240" + }, + { + "asr": null, + "filesize": 12758651, + "format_id": "242", + "format_note": "240p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 240, + "quality": 5.0, + "has_drm": false, + "tbr": 175.289, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=242&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fwebm&gir=yes&clen=12758651&dur=582.290&lmt=1705442116412531&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=631F224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRAIgfccDqbll4oecYPIYeokgj9NDGFFzy5wUcVUcUPnkL-8CIB6wKACWbMy_UTS7ng7sZ-yFKkLmjuBsyqBlX6fmfmGW&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 426, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "vp09.00.20.08", + "acodec": "none", + "dynamic_range": "SDR", + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "426x240", + "aspect_ratio": 1.77, + "http_headers": {}, + "video_ext": "webm", + "audio_ext": "none", + "abr": 0, + "vbr": 175.289, + "format": "242 - 426x240 (240p)" + }, + { + "format_id": "230", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/230/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/sgovp/clen%3D32652201%3Bdur%3D582.289%3Bgir%3Dyes%3Bitag%3D134%3Blmt%3D1705442102480890/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/6319224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRQIhANQ8uAftzj-0ttP53zjrqKmZKD_joOeZlOAExMBPRaruAiA6X9MOEJSrkEOzBL7VNyHn0WBlYk1dw8q7S_GT3nMgnw%3D%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRQIgVXuspj2giIusrC2B8jwWl6ybKYtPzdS3Wea39ZyLO-YCIQC9WfxskjXDX4703p-Jb6roh92IMYKv7kohRpn7pIGSBA%3D%3D/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 757.292, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 6, + "has_drm": false, + "width": 640, + "height": 360, + "vcodec": "avc1.4D401E", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "640x360", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 757.292, + "format": "230 - 640x360" + }, + { + "asr": null, + "filesize": 32652201, + "format_id": "134", + "format_note": "360p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 360, + "quality": 6.0, + "has_drm": false, + "tbr": 448.604, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=134&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fmp4&gir=yes&clen=32652201&dur=582.289&lmt=1705442102480890&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=6319224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIhAP7ECj5E6BibfqWMDYIsqeuJjM5_c8PDCyNpTkifYGMMAiACou7VKLCedJTkxLFrkPz_C_fpe7xxxLZD5E-NrLoyyw%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 640, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "mp4", + "vcodec": "avc1.4D401E", + "acodec": "none", + "dynamic_range": "SDR", + "container": "mp4_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "640x360", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 448.604, + "format": "134 - 640x360 (360p)" + }, + { + "asr": 44100, + "filesize": null, + "format_id": "18", + "format_note": "360p", + "source_preference": -1, + "fps": 24, + "audio_channels": 2, + "height": 360, + "quality": 6.0, + "has_drm": false, + "tbr": 577.449, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23ZZznK7ucsfIP0rW_wAk&ip=184.65.71.108&id=o-AF5FdjYiL4g-CkbZ54_ilBCjxrEgT73c7TlGEfvr2meT&itag=18&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fmp4&cnr=14&ratebypass=yes&dur=582.333&lmt=1705442106949238&mt=1706495125&fvip=3&fexp=24007246&c=ANDROID&txp=6319224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Ccnr%2Cratebypass%2Cdur%2Clmt&sig=AJfQdSswRAIgH-Tvs4w8hlYbWd9tbsD8nCWjCVKqf-O8Bp_rYIpLMKUCIGxF4A53V8Zaa2i96Vfp4YT0HJN7selhU_yrDGFMjZVA&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRgIhAIdNHwY7qZ_DjsmvAH3GfDsZvkQygk757LbYqhfbhihYAiEA2K4C8d_ghWmB6fQatxNumDoyqVqHmhA0LcO8X0Dkp2I%3D", + "width": 640, + "language": "en", + "language_preference": -1, + "preference": null, + "ext": "mp4", + "vcodec": "avc1.42001E", + "acodec": "mp4a.40.2", + "dynamic_range": "SDR", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "640x360", + "aspect_ratio": 1.78, + "filesize_approx": 43017640, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "vbr": null, + "abr": null, + "format": "18 - 640x360 (360p)" + }, + { + "format_id": "605", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/605/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/wft/1/sgovp/clen%3D22260935%3Bdur%3D582.290%3Bgir%3Dyes%3Bitag%3D243%3Blmt%3D1705442115397901/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/631F224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,wft,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRAIgBhnUYNq4uR76lwwkRa9thLaF8EVclG8YsDzoQpHUfy0CIBdyb-RVgXlOSo9QPF36CEK7wkqirlvlV2OL0BLTk8Ae/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRQIhAMqt7KXDGpMN5bnzvxlX0m5EM8nyBdHKYxTdbyTouILRAiAawvTHQaMQRjX45qz3EHhHmksrG3UqFVtRLjzBb6mEtA%3D%3D/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 628.879, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 6, + "has_drm": false, + "width": 640, + "height": 360, + "vcodec": "vp09.00.21.08", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "640x360", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 628.879, + "format": "605 - 640x360" + }, + { + "asr": null, + "filesize": 22260935, + "format_id": "243", + "format_note": "360p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 360, + "quality": 6.0, + "has_drm": false, + "tbr": 305.839, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=243&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fwebm&gir=yes&clen=22260935&dur=582.290&lmt=1705442115397901&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=631F224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRAIgdzLPkertxxeDWhgYAxhAFZ0JLRHB1frabc5dXgUznYMCIBNxGHLHjpFlggEzizF8fOgJSnt4TTvNK49XZQG4P9jT&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 640, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "vp09.00.21.08", + "acodec": "none", + "dynamic_range": "SDR", + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "640x360", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "webm", + "audio_ext": "none", + "abr": 0, + "vbr": 305.839, + "format": "243 - 640x360 (360p)" + }, + { + "format_id": "231", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/231/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/sgovp/clen%3D66171838%3Bdur%3D582.289%3Bgir%3Dyes%3Bitag%3D135%3Blmt%3D1705442099222466/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/6319224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRgIhAJn4KGXiDtuCol8WCho8gWscCGzEMFuh6s6Zi6MAUqYWAiEApfn9QkOsRw1qqIU6wjrxjjlddZy-TT9IYAW_CZpVZAE%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRQIhANe43rw3hW1W9LFUUquhS3FVPXyUD9gzZOm-wkeFjQazAiANXLU7holjBwsubTRtx-5L4nW3nJ-Sy_A96p3zGw5yJw%3D%3D/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 1332.057, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 7, + "has_drm": false, + "width": 854, + "height": 480, + "vcodec": "avc1.4D401E", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "854x480", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 1332.057, + "format": "231 - 854x480" + }, + { + "asr": null, + "filesize": 66171838, + "format_id": "135", + "format_note": "480p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 480, + "quality": 7.0, + "has_drm": false, + "tbr": 909.127, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=135&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fmp4&gir=yes&clen=66171838&dur=582.289&lmt=1705442099222466&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=6319224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRAIgCeVjGUlbnvHtwqztq4D_J-zqEllWxeD7Omv7avAmNfoCIDX1-T2hP_kMCdCglICoFsyyA5OAlcx03wSzJJIA3-Ek&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 854, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "mp4", + "vcodec": "avc1.4D401E", + "acodec": "none", + "dynamic_range": "SDR", + "container": "mp4_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "854x480", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 909.127, + "format": "135 - 854x480 (480p)" + }, + { + "format_id": "606", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/606/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/wft/1/sgovp/clen%3D39530767%3Bdur%3D582.290%3Bgir%3Dyes%3Bitag%3D244%3Blmt%3D1705442120064036/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/631F224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,wft,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRQIhAPfP1dUeil-qKWsVhhjRNjvNaSiLaif_Jo3d51op_NiXAiAXK2VNqMFsrCBLPAKH-gufp1dEFiyRomp014iY0lS91w%3D%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRAIgOSzKV3vVNbT4mu9khYkleROV3DtrHRQK5thqRAlu9QcCIEJX-GR8tNH4I5pYHENPM8AufZt-bBc7p0w4XqJuZWZK/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 1143.402, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 7, + "has_drm": false, + "width": 854, + "height": 480, + "vcodec": "vp09.00.30.08", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "854x480", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 1143.402, + "format": "606 - 854x480" + }, + { + "asr": null, + "filesize": 39530767, + "format_id": "244", + "format_note": "480p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 480, + "quality": 7.0, + "has_drm": false, + "tbr": 543.107, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=244&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fwebm&gir=yes&clen=39530767&dur=582.290&lmt=1705442120064036&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=631F224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAOc3t7KNMcMXwWC19tIIsUm_QrRuhdzDoDQ9a7PrqmI2AiEA-p0sqQva3Lc7d0ULtq3dHGf2nDSOd__n0FhDJ2XIpyY%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 854, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "vp09.00.30.08", + "acodec": "none", + "dynamic_range": "SDR", + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "854x480", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "webm", + "audio_ext": "none", + "abr": 0, + "vbr": 543.107, + "format": "244 - 854x480 (480p)" + }, + { + "asr": 44100, + "filesize": null, + "format_id": "22", + "format_note": "720p", + "source_preference": -5, + "fps": 24, + "audio_channels": 2, + "height": 720, + "quality": 8.0, + "has_drm": false, + "tbr": 1944.429, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23ZZznK7ucsfIP0rW_wAk&ip=184.65.71.108&id=o-AF5FdjYiL4g-CkbZ54_ilBCjxrEgT73c7TlGEfvr2meT&itag=22&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fmp4&cnr=14&ratebypass=yes&dur=582.333&lmt=1705442115314438&mt=1706495125&fvip=3&fexp=24007246&c=ANDROID&txp=6318224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Ccnr%2Cratebypass%2Cdur%2Clmt&sig=AJfQdSswRQIhAKmufadG8cYU3Obyq3SjQ8oYQrgFKltcroNffADWJY5HAiBA7wVxejLbvN0OHAcANxZU2O_FVqxPA7ck50Iz6tELFA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRgIhAIdNHwY7qZ_DjsmvAH3GfDsZvkQygk757LbYqhfbhihYAiEA2K4C8d_ghWmB6fQatxNumDoyqVqHmhA0LcO8X0Dkp2I%3D", + "width": 1280, + "language": "en", + "language_preference": -1, + "preference": null, + "ext": "mp4", + "vcodec": "avc1.64001F", + "acodec": "mp4a.40.2", + "dynamic_range": "SDR", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "1280x720", + "aspect_ratio": 1.78, + "filesize_approx": 144852182, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "vbr": null, + "abr": null, + "format": "22 - 1280x720 (720p)" + }, + { + "format_id": "232", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/232/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/sgovp/clen%3D132182825%3Bdur%3D582.289%3Bgir%3Dyes%3Bitag%3D136%3Blmt%3D1705442100378662/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/6319224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRgIhALdZDgVrxuaXJrlN9CNvBj56jfqsOqUqLdbN8V-I0FYxAiEAvs1tulEdcTtj9npUjcPppCtblJzqhYIQf5twxwyF6qY%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRAIgH2TvAAJj4lfHKcgIk9OWPVDjxr2aMSqLo5cACd6E3YQCIGOvYOwOioPYysnhg_PKBRveLQlq9AxqTIRoByuYFJme/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 2498.751, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 8, + "has_drm": false, + "width": 1280, + "height": 720, + "vcodec": "avc1.64001F", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "1280x720", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 2498.751, + "format": "232 - 1280x720" + }, + { + "asr": null, + "filesize": 132182825, + "format_id": "136", + "format_note": "720p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 720, + "quality": 8.0, + "has_drm": false, + "tbr": 1816.044, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=136&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fmp4&gir=yes&clen=132182825&dur=582.289&lmt=1705442100378662&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=6319224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAL06jAwcH16mubeKAAVykG0d-CsOR_AWIl-BJOqW0ycrAiEAyV9XRg1JrQl8bFrrMVirncT4AFdjf_ox6J4hivxxWws%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 1280, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "mp4", + "vcodec": "avc1.64001F", + "acodec": "none", + "dynamic_range": "SDR", + "container": "mp4_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "1280x720", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 1816.044, + "format": "136 - 1280x720 (720p)" + }, + { + "format_id": "609", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/609/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/wft/1/sgovp/clen%3D71768264%3Bdur%3D582.290%3Bgir%3Dyes%3Bitag%3D247%3Blmt%3D1705442115293982/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/631F224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,wft,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRQIgJlhSWSy6NcacUVNK_GhJtx9JeQXGc5SWlTscZegolPMCIQClaDFGPKb5ddH_XVK-YJqMgQDGtiA1a0G5KejPLk5Ndw%3D%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRAIgDkn4_sr8-mD3AfsZn0DdNulEOdNhprGRi9LZnBz4BnICIHGJuSqgmsHt9wIUlDmX99KF6Y635sTIzpnzovQo0v1J/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 2147.06, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 8, + "has_drm": false, + "width": 1280, + "height": 720, + "vcodec": "vp09.00.31.08", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "1280x720", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 2147.06, + "format": "609 - 1280x720" + }, + { + "asr": null, + "filesize": 71768264, + "format_id": "247", + "format_note": "720p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 720, + "quality": 8.0, + "has_drm": false, + "tbr": 986.014, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=247&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fwebm&gir=yes&clen=71768264&dur=582.290&lmt=1705442115293982&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=631F224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRAIgOAAlf5LQm0XlnDpccyj0OP4M5ybPf7B-qAQBWgZ834gCIDyNLUJvwR3l0G5n1meeZo7mwcWaodzIthZoJIfvncA_&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 1280, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "vp09.00.31.08", + "acodec": "none", + "dynamic_range": "SDR", + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "1280x720", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "webm", + "audio_ext": "none", + "abr": 0, + "vbr": 986.014, + "format": "247 - 1280x720 (720p)" + }, + { + "format_id": "270", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/270/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/sgovp/clen%3D279799316%3Bdur%3D582.289%3Bgir%3Dyes%3Bitag%3D137%3Blmt%3D1705442109297038/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/6319224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRQIgGadphIHanE95t2MGfIf5QgN9SpZ2BJKpf-XT_jfinpACIQDJR2heL3mtLswoDHrO5Inhp-lzznoaIsKg0qs1UapYAA%3D%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRQIhAM7KZIiMIAIN0ryBot1-ClVWT1JzPWFNyJZZxppqbESFAiBe6mArxaHQh9FqqEk5SathTM1bv9LmVoEdTdGkFwwRJQ%3D%3D/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 5171.578, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 9, + "has_drm": false, + "width": 1920, + "height": 1080, + "vcodec": "avc1.640028", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "1920x1080", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 5171.578, + "format": "270 - 1920x1080" + }, + { + "asr": null, + "filesize": 279799316, + "format_id": "137", + "format_note": "1080p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 1080, + "quality": 9.0, + "has_drm": false, + "tbr": 3844.129, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=137&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fmp4&gir=yes&clen=279799316&dur=582.289&lmt=1705442109297038&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=6319224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRAIgdfvqRfI4uOqsSzxwy6oeA6rpjqW1fF1aGRLtmkhycxcCICl5OSwnFCQJJqXlYn2HVFUg-A1Z38NGSNieEoNAJX7R&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 1920, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "mp4", + "vcodec": "avc1.640028", + "acodec": "none", + "dynamic_range": "SDR", + "container": "mp4_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "1920x1080", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 3844.129, + "format": "137 - 1920x1080 (1080p)" + }, + { + "format_id": "614", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/614/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/wft/1/sgovp/clen%3D126606213%3Bdur%3D582.290%3Bgir%3Dyes%3Bitag%3D248%3Blmt%3D1705442116086720/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/631F224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,wft,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRAIgOtZttQAdbK687Ebvzf4V5d1mOwe5qLj5mKjWqIlVa34CICO1GBH6CjsUZdKTN6wf9cGXNLzyVqrtS4aasZBWvkWc/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRgIhAOudk5-76OEQjVacqys4_f2SS4qSR4AMtDzPLLPmn3agAiEAi8RwQLQa5R4kq1wiBsJVQRgDzB9MDRBofH5Jz3oxoyI%3D/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 3214.656, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 9, + "has_drm": false, + "width": 1920, + "height": 1080, + "vcodec": "vp09.00.40.08", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "1920x1080", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 3214.656, + "format": "614 - 1920x1080" + }, + { + "asr": null, + "filesize": 126606213, + "format_id": "248", + "format_note": "1080p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 1080, + "quality": 9.0, + "has_drm": false, + "tbr": 1739.424, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=248&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fwebm&gir=yes&clen=126606213&dur=582.290&lmt=1705442116086720&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=631F224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAKs_UJRJ-JOodWnGkmdqHIv1Rjpa_OEh_1a1ZYZTiwaNAiEA9h31IBRRaEeTbaGiKEkCO3sIdYMfpKMc8NxweuEmLKQ%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 1920, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "vp09.00.40.08", + "acodec": "none", + "dynamic_range": "SDR", + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "1920x1080", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "webm", + "audio_ext": "none", + "abr": 0, + "vbr": 1739.424, + "format": "248 - 1920x1080 (1080p)" + }, + { + "format_id": "620", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/620/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/wft/1/sgovp/clen%3D473726761%3Bdur%3D582.290%3Bgir%3Dyes%3Bitag%3D271%3Blmt%3D1705442124346309/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/631F224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,wft,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRQIgAYgySlJMJx619APO9rr0T4PDyaM2qTrU9c1WtUm2UiICIQDeR34COR3eDnY2mwOjvTSEKDTtF_64VS6kmisq6yzlxQ%3D%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRQIhALOBajfqCNStXkvi21BEcludGhvD6KuHCGIzURLoJSHFAiAsXGLNURKOWivUdx_mSHhLQLR3reR1nUJomlvJ6pKXlg%3D%3D/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 8891.797, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 10, + "has_drm": false, + "width": 2560, + "height": 1440, + "vcodec": "vp09.00.50.08", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "2560x1440", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 8891.797, + "format": "620 - 2560x1440" + }, + { + "asr": null, + "filesize": 473726761, + "format_id": "271", + "format_note": "1440p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 1440, + "quality": 10.0, + "has_drm": false, + "tbr": 6508.465, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=271&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fwebm&gir=yes&clen=473726761&dur=582.290&lmt=1705442124346309&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=631F224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgF78UCudbpjsqJWvAzbEuhIDxBgdUsTA2tItViF0JuVUCIQCkR9nACCgd7nYe-7ujSwHq1l2EcPVj-rTj75FFi1rZ2g%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 2560, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "vp09.00.50.08", + "acodec": "none", + "dynamic_range": "SDR", + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "2560x1440", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "webm", + "audio_ext": "none", + "abr": 0, + "vbr": 6508.465, + "format": "271 - 2560x1440 (1440p)" + }, + { + "format_id": "625", + "format_index": null, + "url": "https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/itag/625/source/youtube/requiressl/yes/ratebypass/yes/pfa/1/wft/1/sgovp/clen%3D897486343%3Bdur%3D582.290%3Bgir%3Dyes%3Bitag%3D313%3Blmt%3D1705442131826507/rqh/1/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/dover/13/txp/631F224/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,pfa,wft,sgovp,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRQIhAKCvk4yb0OjGri1sJxbu8D9u6XfLZkwd137v0BKvB6h7AiBcFakOXPzVdmsZY6JkMaOckElhj9_aP4wVjAW9rE8-vg%3D%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRQIgHRrC6BZ-G37CeySKt6jdthbED5dXuiv_uITsuqL_GbACIQDF6Lc1jZ5q9bkXN4OPZmPrYl7lkPCSrnrnuIm7MJ4XQA%3D%3D/playlist/index.m3u8", + "manifest_url": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/xpc/EgVo2aDSNQ%3D%3D/playback_host/rr2---sn-ni5f-t8g6.googlevideo.com/mh/Pz/mm/31%2C26/mn/sn-ni5f-t8g6%2Csn-vgqskn6s/ms/au%2Conr/mv/m/mvi/2/pl/22/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1712500/vprv/1/go/1/mt/1706495125/fvip/3/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AJfQdSswRQIhAJxx9gvD4fp863z3-0A8QfmmNPA_HtAofRNzExQtvSOTAiBVxu9ODg_Lio2zwG7AO3Efx7NOGQRWWBfKD8j_gG9hsA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AAO5W4owRgIhAJgFS-NygOqVmlS-JjNRCxRp6g6p5nQvd31q-Il43qBBAiEAzMV-kH4PCy2QrgkPXDLHAcMrCLl3MrSYl2S9MqADpx4%3D/file/index.m3u8", + "tbr": 17120.78, + "ext": "mp4", + "fps": 24.0, + "protocol": "m3u8_native", + "preference": null, + "quality": 11, + "has_drm": false, + "width": 3840, + "height": 2160, + "vcodec": "vp09.00.50.08", + "acodec": "none", + "dynamic_range": "SDR", + "source_preference": -1, + "resolution": "3840x2160", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "mp4", + "audio_ext": "none", + "abr": 0, + "vbr": 17120.78, + "format": "625 - 3840x2160" + }, + { + "asr": null, + "filesize": 897486343, + "format_id": "313", + "format_note": "2160p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 2160, + "quality": 11.0, + "has_drm": false, + "tbr": 12330.438, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=313&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fwebm&gir=yes&clen=897486343&dur=582.290&lmt=1705442131826507&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=631F224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIge4wXEaYaDt1t9iDHaO0TcxNf9RJiUKcHBwUclcvKFw0CIQD70la1_R0wLekw4Zo0hXK-EyxT3DftYLR7pDkk_Sz2lA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 3840, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "vp09.00.50.08", + "acodec": "none", + "dynamic_range": "SDR", + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "3840x2160", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "webm", + "audio_ext": "none", + "abr": 0, + "vbr": 12330.438, + "format": "313 - 3840x2160 (2160p)" + } + ], + "thumbnails": [ + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/3.jpg", "preference": -37, "id": "0" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/3.webp", "preference": -36, "id": "1" }, + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/2.jpg", "preference": -35, "id": "2" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/2.webp", "preference": -34, "id": "3" }, + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/1.jpg", "preference": -33, "id": "4" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/1.webp", "preference": -32, "id": "5" }, + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/mq3.jpg", "preference": -31, "id": "6" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/mq3.webp", "preference": -30, "id": "7" }, + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/mq2.jpg", "preference": -29, "id": "8" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/mq2.webp", "preference": -28, "id": "9" }, + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/mq1.jpg", "preference": -27, "id": "10" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/mq1.webp", "preference": -26, "id": "11" }, + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/hq3.jpg", "preference": -25, "id": "12" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/hq3.webp", "preference": -24, "id": "13" }, + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/hq2.jpg", "preference": -23, "id": "14" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/hq2.webp", "preference": -22, "id": "15" }, + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/hq1.jpg", "preference": -21, "id": "16" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/hq1.webp", "preference": -20, "id": "17" }, + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/sd3.jpg", "preference": -19, "id": "18" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/sd3.webp", "preference": -18, "id": "19" }, + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/sd2.jpg", "preference": -17, "id": "20" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/sd2.webp", "preference": -16, "id": "21" }, + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/sd1.jpg", "preference": -15, "id": "22" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/sd1.webp", "preference": -14, "id": "23" }, + { + "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/default.jpg", + "height": 90, + "width": 120, + "preference": -13, + "id": "24", + "resolution": "120x90" + }, + { + "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/default.webp", + "preference": -12, + "id": "25" + }, + { + "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/mqdefault.jpg", + "height": 180, + "width": 320, + "preference": -11, + "id": "26", + "resolution": "320x180" + }, + { + "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/mqdefault.webp", + "preference": -10, + "id": "27" + }, + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/0.jpg", "preference": -9, "id": "28" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/0.webp", "preference": -8, "id": "29" }, + { + "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCfnqZqzf3SpMWSBlr5eEkYrRbeOw", + "height": 94, + "width": 168, + "preference": -7, + "id": "30", + "resolution": "168x94" + }, + { + "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAnj5wtnbYGzZX9gerMKQ-FS5sSeA", + "height": 110, + "width": 196, + "preference": -7, + "id": "31", + "resolution": "196x110" + }, + { + "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC5fmbFoduOVcifLAMu006pXlcicQ", + "height": 138, + "width": 246, + "preference": -7, + "id": "32", + "resolution": "246x138" + }, + { + "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDISoJqnSXFGgqsSCMRd9NCiV5Dyg", + "height": 188, + "width": 336, + "preference": -7, + "id": "33", + "resolution": "336x188" + }, + { + "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/hqdefault.jpg", + "height": 360, + "width": 480, + "preference": -7, + "id": "34", + "resolution": "480x360" + }, + { + "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/hqdefault.webp", + "preference": -6, + "id": "35" + }, + { + "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/sddefault.jpg", + "height": 480, + "width": 640, + "preference": -5, + "id": "36", + "resolution": "640x480" + }, + { + "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/sddefault.webp", + "preference": -4, + "id": "37" + }, + { "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/hq720.jpg", "preference": -3, "id": "38" }, + { "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/hq720.webp", "preference": -2, "id": "39" }, + { + "url": "https://i.ytimg.com/vi/bwRHIkYqYJo/maxresdefault.jpg", + "height": 1080, + "width": 1920, + "preference": -1, + "id": "40", + "resolution": "1920x1080" + }, + { + "url": "https://i.ytimg.com/vi_webp/bwRHIkYqYJo/maxresdefault.webp", + "preference": 0, + "id": "41", + "filepath": "/app/tmp/videos/bwRHIkYqYJo/Trying to Wheelie Without the Rear Brake-bwRHIkYqYJo.webp" + } + ], + "thumbnail": "https://i.ytimg.com/vi/bwRHIkYqYJo/maxresdefault.jpg", + "description": "Because I use my rear brake too much when doing wheelies, I came up with this challenge - wheelie a long distance completely without using it.\n\nYou can join my Patreon to support the channel: https://www.patreon.com/UselessTrials\n\n00:00 Introduction\n00:31 Rules\n00:46 Challenge #1\n07:07 Challenge #2\n08:03 Conclusion\n08:46 Skillshare\n09:30 Longest No Brake Wheelie\n_________________________________________________________________\nInstagram: @max_fiergolla\n\nbusiness inquiries: uselesstrials@gmail.com\n_________________________________________________________________\n\nStreet Trial is a mixture of two sports - Bike Trials and Street BMX. It gained popularity on Youtube in recent years through riders like Martyn Ashton, Danny MacAskill, Ali Clarkson, Duncan Shaw, Sean Watson, Fabio Wibmer and John Langlois.\nTrials riding is all about riding/hopping over and balancing on obstacles. BMX Street is all about tricks and style. Street Trials combines the two and does tricks over, off and onto obstacles.\nVideos like Danny MacAskill 's 'Way Back Home', 'Imaginate', 'Inspired Bicycles 2009\" or Fabio Wibmer 's 'Fabiolous Escape' showcase lots of what Street Trials is about.\n\n\n#wheeliechallenge", + "channel_id": "UCEi9yL4vhQlLafWRsAgAr3w", + "channel_url": "https://www.youtube.com/channel/UCEi9yL4vhQlLafWRsAgAr3w", + "duration": 582, + "view_count": 9948, + "average_rating": null, + "age_limit": 0, + "webpage_url": "https://www.youtube.com/watch?v=bwRHIkYqYJo", + "categories": ["Sports"], + "tags": [ + "mtb wheelie challenge", + "brakeless wheelie challenge", + "no brake wheelie challenge", + "riding challenge", + "berm peak", + "pinkbike", + "sick series", + "sam pilgrim", + "gmbn", + "fun bike challenge", + "Urban Freeride", + "Freeriding", + "free ride", + "downhill freeride", + "wheelie freeride", + "stunts", + "bike stunt" + ], + "playable_in_embed": true, + "live_status": "not_live", + "release_timestamp": null, + "_format_sort_fields": [ + "quality", + "res", + "fps", + "hdr:12", + "source", + "vcodec:vp9.2", + "channels", + "acodec", + "lang", + "proto" + ], + "automatic_captions": { + "de": [ + { + "url": "https://manifest.googlevideo.com/api/manifest/hls_timedtext_playlist/expire/1706517002/ei/qg23Ze2uGcefsfIPo8eGqA0/ip/184.65.71.108/id/6f044722462a609a/source/youtube/requiressl/yes/dur/582.289/tts_params/caps%3Dasr%26v%3DbwRHIkYqYJo%26lang%3Dde%26ip%3D184.65.71.108%26ipbits%3D0%26expire%3D1706517002%26sparams%3Dip,ipbits,expire,caps,v%26signature%3D35009B07A412610EC270F8E37B72782D3A81A645.1321F1D202435FF4D21FD653FE845008A4D7346A%26key%3Ddg_yt0/rqh/4/hls_chunk_host/rr2---sn-ni5f-t8g6.googlevideo.com/xpc/EgVo2aDSNQ%3D%3D/mh/Pz/mm/31,26/mn/sn-ni5f-t8g6,sn-vgqskn6s/ms/au,onr/mv/m/mvi/2/pl/22/initcwndbps/1712500/vprv/1/playlist_type/DVR/mt/1706495125/fvip/3/short_key/1/keepalive/yes/fexp/24007246/sparams/expire,ei,ip,id,source,requiressl,dur,tts_params,rqh,xpc,vprv,playlist_type/sig/AJfQdSswRQIhAJkguP00DNxeOeyg68QLOoKN4CYyB28cLHWkklkDr5ZrAiBu4p-ckTsFZDOurShNblpGyyHd4mffuHK6JscywulvpA%3D%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl,initcwndbps/lsig/AAO5W4owRAIgKDue_oW7p0nB7Gia-MtVqS65nJleSup6NuDhI_hUuGQCIDxAU5HEKenw_qwGwqOB6AIaekVbgMv89XgXDWF_N_Oo/playlist/index.m3u8", + "ext": "vtt", + "protocol": "m3u8_native" + }, + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=de&fmt=json3", + "name": "German" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=de&fmt=srv1", + "name": "German" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=de&fmt=srv2", + "name": "German" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=de&fmt=srv3", + "name": "German" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=de&fmt=ttml", + "name": "German" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=de&fmt=vtt", + "name": "German" + } + ], + "af": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=af&fmt=json3", + "name": "Afrikaans" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=af&fmt=srv1", + "name": "Afrikaans" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=af&fmt=srv2", + "name": "Afrikaans" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=af&fmt=srv3", + "name": "Afrikaans" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=af&fmt=ttml", + "name": "Afrikaans" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=af&fmt=vtt", + "name": "Afrikaans" + } + ], + "ak": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ak&fmt=json3", + "name": "Akan" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ak&fmt=srv1", + "name": "Akan" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ak&fmt=srv2", + "name": "Akan" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ak&fmt=srv3", + "name": "Akan" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ak&fmt=ttml", + "name": "Akan" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ak&fmt=vtt", + "name": "Akan" + } + ], + "sq": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sq&fmt=json3", + "name": "Albanian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sq&fmt=srv1", + "name": "Albanian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sq&fmt=srv2", + "name": "Albanian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sq&fmt=srv3", + "name": "Albanian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sq&fmt=ttml", + "name": "Albanian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sq&fmt=vtt", + "name": "Albanian" + } + ], + "am": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=am&fmt=json3", + "name": "Amharic" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=am&fmt=srv1", + "name": "Amharic" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=am&fmt=srv2", + "name": "Amharic" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=am&fmt=srv3", + "name": "Amharic" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=am&fmt=ttml", + "name": "Amharic" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=am&fmt=vtt", + "name": "Amharic" + } + ], + "ar": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ar&fmt=json3", + "name": "Arabic" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ar&fmt=srv1", + "name": "Arabic" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ar&fmt=srv2", + "name": "Arabic" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ar&fmt=srv3", + "name": "Arabic" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ar&fmt=ttml", + "name": "Arabic" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ar&fmt=vtt", + "name": "Arabic" + } + ], + "hy": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hy&fmt=json3", + "name": "Armenian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hy&fmt=srv1", + "name": "Armenian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hy&fmt=srv2", + "name": "Armenian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hy&fmt=srv3", + "name": "Armenian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hy&fmt=ttml", + "name": "Armenian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hy&fmt=vtt", + "name": "Armenian" + } + ], + "as": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=as&fmt=json3", + "name": "Assamese" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=as&fmt=srv1", + "name": "Assamese" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=as&fmt=srv2", + "name": "Assamese" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=as&fmt=srv3", + "name": "Assamese" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=as&fmt=ttml", + "name": "Assamese" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=as&fmt=vtt", + "name": "Assamese" + } + ], + "ay": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ay&fmt=json3", + "name": "Aymara" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ay&fmt=srv1", + "name": "Aymara" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ay&fmt=srv2", + "name": "Aymara" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ay&fmt=srv3", + "name": "Aymara" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ay&fmt=ttml", + "name": "Aymara" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ay&fmt=vtt", + "name": "Aymara" + } + ], + "az": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=az&fmt=json3", + "name": "Azerbaijani" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=az&fmt=srv1", + "name": "Azerbaijani" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=az&fmt=srv2", + "name": "Azerbaijani" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=az&fmt=srv3", + "name": "Azerbaijani" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=az&fmt=ttml", + "name": "Azerbaijani" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=az&fmt=vtt", + "name": "Azerbaijani" + } + ], + "bn": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bn&fmt=json3", + "name": "Bangla" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bn&fmt=srv1", + "name": "Bangla" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bn&fmt=srv2", + "name": "Bangla" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bn&fmt=srv3", + "name": "Bangla" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bn&fmt=ttml", + "name": "Bangla" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bn&fmt=vtt", + "name": "Bangla" + } + ], + "eu": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=eu&fmt=json3", + "name": "Basque" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=eu&fmt=srv1", + "name": "Basque" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=eu&fmt=srv2", + "name": "Basque" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=eu&fmt=srv3", + "name": "Basque" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=eu&fmt=ttml", + "name": "Basque" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=eu&fmt=vtt", + "name": "Basque" + } + ], + "be": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=be&fmt=json3", + "name": "Belarusian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=be&fmt=srv1", + "name": "Belarusian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=be&fmt=srv2", + "name": "Belarusian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=be&fmt=srv3", + "name": "Belarusian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=be&fmt=ttml", + "name": "Belarusian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=be&fmt=vtt", + "name": "Belarusian" + } + ], + "bho": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bho&fmt=json3", + "name": "Bhojpuri" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bho&fmt=srv1", + "name": "Bhojpuri" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bho&fmt=srv2", + "name": "Bhojpuri" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bho&fmt=srv3", + "name": "Bhojpuri" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bho&fmt=ttml", + "name": "Bhojpuri" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bho&fmt=vtt", + "name": "Bhojpuri" + } + ], + "bs": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bs&fmt=json3", + "name": "Bosnian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bs&fmt=srv1", + "name": "Bosnian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bs&fmt=srv2", + "name": "Bosnian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bs&fmt=srv3", + "name": "Bosnian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bs&fmt=ttml", + "name": "Bosnian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bs&fmt=vtt", + "name": "Bosnian" + } + ], + "bg": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bg&fmt=json3", + "name": "Bulgarian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bg&fmt=srv1", + "name": "Bulgarian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bg&fmt=srv2", + "name": "Bulgarian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bg&fmt=srv3", + "name": "Bulgarian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bg&fmt=ttml", + "name": "Bulgarian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=bg&fmt=vtt", + "name": "Bulgarian" + } + ], + "my": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=my&fmt=json3", + "name": "Burmese" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=my&fmt=srv1", + "name": "Burmese" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=my&fmt=srv2", + "name": "Burmese" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=my&fmt=srv3", + "name": "Burmese" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=my&fmt=ttml", + "name": "Burmese" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=my&fmt=vtt", + "name": "Burmese" + } + ], + "ca": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ca&fmt=json3", + "name": "Catalan" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ca&fmt=srv1", + "name": "Catalan" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ca&fmt=srv2", + "name": "Catalan" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ca&fmt=srv3", + "name": "Catalan" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ca&fmt=ttml", + "name": "Catalan" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ca&fmt=vtt", + "name": "Catalan" + } + ], + "ceb": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ceb&fmt=json3", + "name": "Cebuano" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ceb&fmt=srv1", + "name": "Cebuano" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ceb&fmt=srv2", + "name": "Cebuano" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ceb&fmt=srv3", + "name": "Cebuano" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ceb&fmt=ttml", + "name": "Cebuano" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ceb&fmt=vtt", + "name": "Cebuano" + } + ], + "zh-Hans": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zh-Hans&fmt=json3", + "name": "Chinese (Simplified)" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zh-Hans&fmt=srv1", + "name": "Chinese (Simplified)" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zh-Hans&fmt=srv2", + "name": "Chinese (Simplified)" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zh-Hans&fmt=srv3", + "name": "Chinese (Simplified)" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zh-Hans&fmt=ttml", + "name": "Chinese (Simplified)" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zh-Hans&fmt=vtt", + "name": "Chinese (Simplified)" + } + ], + "zh-Hant": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zh-Hant&fmt=json3", + "name": "Chinese (Traditional)" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zh-Hant&fmt=srv1", + "name": "Chinese (Traditional)" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zh-Hant&fmt=srv2", + "name": "Chinese (Traditional)" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zh-Hant&fmt=srv3", + "name": "Chinese (Traditional)" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zh-Hant&fmt=ttml", + "name": "Chinese (Traditional)" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zh-Hant&fmt=vtt", + "name": "Chinese (Traditional)" + } + ], + "co": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=co&fmt=json3", + "name": "Corsican" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=co&fmt=srv1", + "name": "Corsican" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=co&fmt=srv2", + "name": "Corsican" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=co&fmt=srv3", + "name": "Corsican" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=co&fmt=ttml", + "name": "Corsican" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=co&fmt=vtt", + "name": "Corsican" + } + ], + "hr": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hr&fmt=json3", + "name": "Croatian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hr&fmt=srv1", + "name": "Croatian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hr&fmt=srv2", + "name": "Croatian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hr&fmt=srv3", + "name": "Croatian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hr&fmt=ttml", + "name": "Croatian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hr&fmt=vtt", + "name": "Croatian" + } + ], + "cs": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=cs&fmt=json3", + "name": "Czech" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=cs&fmt=srv1", + "name": "Czech" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=cs&fmt=srv2", + "name": "Czech" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=cs&fmt=srv3", + "name": "Czech" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=cs&fmt=ttml", + "name": "Czech" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=cs&fmt=vtt", + "name": "Czech" + } + ], + "da": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=da&fmt=json3", + "name": "Danish" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=da&fmt=srv1", + "name": "Danish" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=da&fmt=srv2", + "name": "Danish" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=da&fmt=srv3", + "name": "Danish" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=da&fmt=ttml", + "name": "Danish" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=da&fmt=vtt", + "name": "Danish" + } + ], + "dv": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=dv&fmt=json3", + "name": "Divehi" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=dv&fmt=srv1", + "name": "Divehi" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=dv&fmt=srv2", + "name": "Divehi" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=dv&fmt=srv3", + "name": "Divehi" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=dv&fmt=ttml", + "name": "Divehi" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=dv&fmt=vtt", + "name": "Divehi" + } + ], + "nl": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=nl&fmt=json3", + "name": "Dutch" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=nl&fmt=srv1", + "name": "Dutch" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=nl&fmt=srv2", + "name": "Dutch" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=nl&fmt=srv3", + "name": "Dutch" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=nl&fmt=ttml", + "name": "Dutch" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=nl&fmt=vtt", + "name": "Dutch" + } + ], + "en-orig": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&fmt=json3", + "name": "English (Original)" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&fmt=srv1", + "name": "English (Original)" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&fmt=srv2", + "name": "English (Original)" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&fmt=srv3", + "name": "English (Original)" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&fmt=ttml", + "name": "English (Original)" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&fmt=vtt", + "name": "English (Original)" + } + ], + "en": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&fmt=json3", + "name": "English" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&fmt=srv1", + "name": "English" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&fmt=srv2", + "name": "English" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&fmt=srv3", + "name": "English" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&fmt=ttml", + "name": "English" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&fmt=vtt", + "name": "English" + } + ], + "eo": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=eo&fmt=json3", + "name": "Esperanto" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=eo&fmt=srv1", + "name": "Esperanto" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=eo&fmt=srv2", + "name": "Esperanto" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=eo&fmt=srv3", + "name": "Esperanto" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=eo&fmt=ttml", + "name": "Esperanto" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=eo&fmt=vtt", + "name": "Esperanto" + } + ], + "et": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=et&fmt=json3", + "name": "Estonian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=et&fmt=srv1", + "name": "Estonian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=et&fmt=srv2", + "name": "Estonian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=et&fmt=srv3", + "name": "Estonian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=et&fmt=ttml", + "name": "Estonian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=et&fmt=vtt", + "name": "Estonian" + } + ], + "ee": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ee&fmt=json3", + "name": "Ewe" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ee&fmt=srv1", + "name": "Ewe" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ee&fmt=srv2", + "name": "Ewe" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ee&fmt=srv3", + "name": "Ewe" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ee&fmt=ttml", + "name": "Ewe" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ee&fmt=vtt", + "name": "Ewe" + } + ], + "fil": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fil&fmt=json3", + "name": "Filipino" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fil&fmt=srv1", + "name": "Filipino" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fil&fmt=srv2", + "name": "Filipino" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fil&fmt=srv3", + "name": "Filipino" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fil&fmt=ttml", + "name": "Filipino" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fil&fmt=vtt", + "name": "Filipino" + } + ], + "fi": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fi&fmt=json3", + "name": "Finnish" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fi&fmt=srv1", + "name": "Finnish" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fi&fmt=srv2", + "name": "Finnish" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fi&fmt=srv3", + "name": "Finnish" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fi&fmt=ttml", + "name": "Finnish" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fi&fmt=vtt", + "name": "Finnish" + } + ], + "fr": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fr&fmt=json3", + "name": "French" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fr&fmt=srv1", + "name": "French" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fr&fmt=srv2", + "name": "French" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fr&fmt=srv3", + "name": "French" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fr&fmt=ttml", + "name": "French" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fr&fmt=vtt", + "name": "French" + } + ], + "gl": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gl&fmt=json3", + "name": "Galician" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gl&fmt=srv1", + "name": "Galician" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gl&fmt=srv2", + "name": "Galician" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gl&fmt=srv3", + "name": "Galician" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gl&fmt=ttml", + "name": "Galician" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gl&fmt=vtt", + "name": "Galician" + } + ], + "lg": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lg&fmt=json3", + "name": "Ganda" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lg&fmt=srv1", + "name": "Ganda" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lg&fmt=srv2", + "name": "Ganda" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lg&fmt=srv3", + "name": "Ganda" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lg&fmt=ttml", + "name": "Ganda" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lg&fmt=vtt", + "name": "Ganda" + } + ], + "ka": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ka&fmt=json3", + "name": "Georgian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ka&fmt=srv1", + "name": "Georgian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ka&fmt=srv2", + "name": "Georgian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ka&fmt=srv3", + "name": "Georgian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ka&fmt=ttml", + "name": "Georgian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ka&fmt=vtt", + "name": "Georgian" + } + ], + "el": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=el&fmt=json3", + "name": "Greek" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=el&fmt=srv1", + "name": "Greek" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=el&fmt=srv2", + "name": "Greek" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=el&fmt=srv3", + "name": "Greek" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=el&fmt=ttml", + "name": "Greek" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=el&fmt=vtt", + "name": "Greek" + } + ], + "gn": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gn&fmt=json3", + "name": "Guarani" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gn&fmt=srv1", + "name": "Guarani" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gn&fmt=srv2", + "name": "Guarani" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gn&fmt=srv3", + "name": "Guarani" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gn&fmt=ttml", + "name": "Guarani" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gn&fmt=vtt", + "name": "Guarani" + } + ], + "gu": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gu&fmt=json3", + "name": "Gujarati" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gu&fmt=srv1", + "name": "Gujarati" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gu&fmt=srv2", + "name": "Gujarati" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gu&fmt=srv3", + "name": "Gujarati" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gu&fmt=ttml", + "name": "Gujarati" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gu&fmt=vtt", + "name": "Gujarati" + } + ], + "ht": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ht&fmt=json3", + "name": "Haitian Creole" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ht&fmt=srv1", + "name": "Haitian Creole" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ht&fmt=srv2", + "name": "Haitian Creole" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ht&fmt=srv3", + "name": "Haitian Creole" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ht&fmt=ttml", + "name": "Haitian Creole" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ht&fmt=vtt", + "name": "Haitian Creole" + } + ], + "ha": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ha&fmt=json3", + "name": "Hausa" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ha&fmt=srv1", + "name": "Hausa" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ha&fmt=srv2", + "name": "Hausa" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ha&fmt=srv3", + "name": "Hausa" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ha&fmt=ttml", + "name": "Hausa" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ha&fmt=vtt", + "name": "Hausa" + } + ], + "haw": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=haw&fmt=json3", + "name": "Hawaiian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=haw&fmt=srv1", + "name": "Hawaiian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=haw&fmt=srv2", + "name": "Hawaiian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=haw&fmt=srv3", + "name": "Hawaiian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=haw&fmt=ttml", + "name": "Hawaiian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=haw&fmt=vtt", + "name": "Hawaiian" + } + ], + "iw": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=iw&fmt=json3", + "name": "Hebrew" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=iw&fmt=srv1", + "name": "Hebrew" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=iw&fmt=srv2", + "name": "Hebrew" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=iw&fmt=srv3", + "name": "Hebrew" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=iw&fmt=ttml", + "name": "Hebrew" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=iw&fmt=vtt", + "name": "Hebrew" + } + ], + "hi": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hi&fmt=json3", + "name": "Hindi" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hi&fmt=srv1", + "name": "Hindi" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hi&fmt=srv2", + "name": "Hindi" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hi&fmt=srv3", + "name": "Hindi" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hi&fmt=ttml", + "name": "Hindi" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hi&fmt=vtt", + "name": "Hindi" + } + ], + "hmn": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hmn&fmt=json3", + "name": "Hmong" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hmn&fmt=srv1", + "name": "Hmong" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hmn&fmt=srv2", + "name": "Hmong" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hmn&fmt=srv3", + "name": "Hmong" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hmn&fmt=ttml", + "name": "Hmong" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hmn&fmt=vtt", + "name": "Hmong" + } + ], + "hu": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hu&fmt=json3", + "name": "Hungarian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hu&fmt=srv1", + "name": "Hungarian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hu&fmt=srv2", + "name": "Hungarian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hu&fmt=srv3", + "name": "Hungarian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hu&fmt=ttml", + "name": "Hungarian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=hu&fmt=vtt", + "name": "Hungarian" + } + ], + "is": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=is&fmt=json3", + "name": "Icelandic" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=is&fmt=srv1", + "name": "Icelandic" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=is&fmt=srv2", + "name": "Icelandic" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=is&fmt=srv3", + "name": "Icelandic" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=is&fmt=ttml", + "name": "Icelandic" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=is&fmt=vtt", + "name": "Icelandic" + } + ], + "ig": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ig&fmt=json3", + "name": "Igbo" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ig&fmt=srv1", + "name": "Igbo" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ig&fmt=srv2", + "name": "Igbo" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ig&fmt=srv3", + "name": "Igbo" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ig&fmt=ttml", + "name": "Igbo" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ig&fmt=vtt", + "name": "Igbo" + } + ], + "id": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=id&fmt=json3", + "name": "Indonesian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=id&fmt=srv1", + "name": "Indonesian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=id&fmt=srv2", + "name": "Indonesian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=id&fmt=srv3", + "name": "Indonesian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=id&fmt=ttml", + "name": "Indonesian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=id&fmt=vtt", + "name": "Indonesian" + } + ], + "ga": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ga&fmt=json3", + "name": "Irish" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ga&fmt=srv1", + "name": "Irish" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ga&fmt=srv2", + "name": "Irish" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ga&fmt=srv3", + "name": "Irish" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ga&fmt=ttml", + "name": "Irish" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ga&fmt=vtt", + "name": "Irish" + } + ], + "it": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=it&fmt=json3", + "name": "Italian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=it&fmt=srv1", + "name": "Italian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=it&fmt=srv2", + "name": "Italian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=it&fmt=srv3", + "name": "Italian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=it&fmt=ttml", + "name": "Italian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=it&fmt=vtt", + "name": "Italian" + } + ], + "ja": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ja&fmt=json3", + "name": "Japanese" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ja&fmt=srv1", + "name": "Japanese" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ja&fmt=srv2", + "name": "Japanese" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ja&fmt=srv3", + "name": "Japanese" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ja&fmt=ttml", + "name": "Japanese" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ja&fmt=vtt", + "name": "Japanese" + } + ], + "jv": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=jv&fmt=json3", + "name": "Javanese" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=jv&fmt=srv1", + "name": "Javanese" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=jv&fmt=srv2", + "name": "Javanese" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=jv&fmt=srv3", + "name": "Javanese" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=jv&fmt=ttml", + "name": "Javanese" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=jv&fmt=vtt", + "name": "Javanese" + } + ], + "kn": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kn&fmt=json3", + "name": "Kannada" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kn&fmt=srv1", + "name": "Kannada" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kn&fmt=srv2", + "name": "Kannada" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kn&fmt=srv3", + "name": "Kannada" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kn&fmt=ttml", + "name": "Kannada" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kn&fmt=vtt", + "name": "Kannada" + } + ], + "kk": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kk&fmt=json3", + "name": "Kazakh" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kk&fmt=srv1", + "name": "Kazakh" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kk&fmt=srv2", + "name": "Kazakh" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kk&fmt=srv3", + "name": "Kazakh" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kk&fmt=ttml", + "name": "Kazakh" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kk&fmt=vtt", + "name": "Kazakh" + } + ], + "km": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=km&fmt=json3", + "name": "Khmer" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=km&fmt=srv1", + "name": "Khmer" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=km&fmt=srv2", + "name": "Khmer" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=km&fmt=srv3", + "name": "Khmer" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=km&fmt=ttml", + "name": "Khmer" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=km&fmt=vtt", + "name": "Khmer" + } + ], + "rw": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=rw&fmt=json3", + "name": "Kinyarwanda" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=rw&fmt=srv1", + "name": "Kinyarwanda" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=rw&fmt=srv2", + "name": "Kinyarwanda" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=rw&fmt=srv3", + "name": "Kinyarwanda" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=rw&fmt=ttml", + "name": "Kinyarwanda" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=rw&fmt=vtt", + "name": "Kinyarwanda" + } + ], + "ko": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ko&fmt=json3", + "name": "Korean" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ko&fmt=srv1", + "name": "Korean" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ko&fmt=srv2", + "name": "Korean" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ko&fmt=srv3", + "name": "Korean" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ko&fmt=ttml", + "name": "Korean" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ko&fmt=vtt", + "name": "Korean" + } + ], + "kri": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kri&fmt=json3", + "name": "Krio" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kri&fmt=srv1", + "name": "Krio" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kri&fmt=srv2", + "name": "Krio" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kri&fmt=srv3", + "name": "Krio" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kri&fmt=ttml", + "name": "Krio" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=kri&fmt=vtt", + "name": "Krio" + } + ], + "ku": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ku&fmt=json3", + "name": "Kurdish" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ku&fmt=srv1", + "name": "Kurdish" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ku&fmt=srv2", + "name": "Kurdish" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ku&fmt=srv3", + "name": "Kurdish" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ku&fmt=ttml", + "name": "Kurdish" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ku&fmt=vtt", + "name": "Kurdish" + } + ], + "ky": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ky&fmt=json3", + "name": "Kyrgyz" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ky&fmt=srv1", + "name": "Kyrgyz" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ky&fmt=srv2", + "name": "Kyrgyz" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ky&fmt=srv3", + "name": "Kyrgyz" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ky&fmt=ttml", + "name": "Kyrgyz" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ky&fmt=vtt", + "name": "Kyrgyz" + } + ], + "lo": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lo&fmt=json3", + "name": "Lao" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lo&fmt=srv1", + "name": "Lao" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lo&fmt=srv2", + "name": "Lao" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lo&fmt=srv3", + "name": "Lao" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lo&fmt=ttml", + "name": "Lao" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lo&fmt=vtt", + "name": "Lao" + } + ], + "la": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=la&fmt=json3", + "name": "Latin" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=la&fmt=srv1", + "name": "Latin" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=la&fmt=srv2", + "name": "Latin" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=la&fmt=srv3", + "name": "Latin" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=la&fmt=ttml", + "name": "Latin" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=la&fmt=vtt", + "name": "Latin" + } + ], + "lv": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lv&fmt=json3", + "name": "Latvian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lv&fmt=srv1", + "name": "Latvian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lv&fmt=srv2", + "name": "Latvian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lv&fmt=srv3", + "name": "Latvian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lv&fmt=ttml", + "name": "Latvian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lv&fmt=vtt", + "name": "Latvian" + } + ], + "ln": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ln&fmt=json3", + "name": "Lingala" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ln&fmt=srv1", + "name": "Lingala" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ln&fmt=srv2", + "name": "Lingala" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ln&fmt=srv3", + "name": "Lingala" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ln&fmt=ttml", + "name": "Lingala" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ln&fmt=vtt", + "name": "Lingala" + } + ], + "lt": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lt&fmt=json3", + "name": "Lithuanian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lt&fmt=srv1", + "name": "Lithuanian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lt&fmt=srv2", + "name": "Lithuanian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lt&fmt=srv3", + "name": "Lithuanian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lt&fmt=ttml", + "name": "Lithuanian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lt&fmt=vtt", + "name": "Lithuanian" + } + ], + "lb": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lb&fmt=json3", + "name": "Luxembourgish" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lb&fmt=srv1", + "name": "Luxembourgish" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lb&fmt=srv2", + "name": "Luxembourgish" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lb&fmt=srv3", + "name": "Luxembourgish" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lb&fmt=ttml", + "name": "Luxembourgish" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=lb&fmt=vtt", + "name": "Luxembourgish" + } + ], + "mk": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mk&fmt=json3", + "name": "Macedonian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mk&fmt=srv1", + "name": "Macedonian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mk&fmt=srv2", + "name": "Macedonian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mk&fmt=srv3", + "name": "Macedonian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mk&fmt=ttml", + "name": "Macedonian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mk&fmt=vtt", + "name": "Macedonian" + } + ], + "mg": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mg&fmt=json3", + "name": "Malagasy" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mg&fmt=srv1", + "name": "Malagasy" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mg&fmt=srv2", + "name": "Malagasy" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mg&fmt=srv3", + "name": "Malagasy" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mg&fmt=ttml", + "name": "Malagasy" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mg&fmt=vtt", + "name": "Malagasy" + } + ], + "ms": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ms&fmt=json3", + "name": "Malay" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ms&fmt=srv1", + "name": "Malay" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ms&fmt=srv2", + "name": "Malay" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ms&fmt=srv3", + "name": "Malay" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ms&fmt=ttml", + "name": "Malay" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ms&fmt=vtt", + "name": "Malay" + } + ], + "ml": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ml&fmt=json3", + "name": "Malayalam" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ml&fmt=srv1", + "name": "Malayalam" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ml&fmt=srv2", + "name": "Malayalam" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ml&fmt=srv3", + "name": "Malayalam" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ml&fmt=ttml", + "name": "Malayalam" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ml&fmt=vtt", + "name": "Malayalam" + } + ], + "mt": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mt&fmt=json3", + "name": "Maltese" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mt&fmt=srv1", + "name": "Maltese" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mt&fmt=srv2", + "name": "Maltese" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mt&fmt=srv3", + "name": "Maltese" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mt&fmt=ttml", + "name": "Maltese" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mt&fmt=vtt", + "name": "Maltese" + } + ], + "mi": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mi&fmt=json3", + "name": "M\u0101ori" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mi&fmt=srv1", + "name": "M\u0101ori" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mi&fmt=srv2", + "name": "M\u0101ori" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mi&fmt=srv3", + "name": "M\u0101ori" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mi&fmt=ttml", + "name": "M\u0101ori" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mi&fmt=vtt", + "name": "M\u0101ori" + } + ], + "mr": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mr&fmt=json3", + "name": "Marathi" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mr&fmt=srv1", + "name": "Marathi" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mr&fmt=srv2", + "name": "Marathi" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mr&fmt=srv3", + "name": "Marathi" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mr&fmt=ttml", + "name": "Marathi" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mr&fmt=vtt", + "name": "Marathi" + } + ], + "mn": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mn&fmt=json3", + "name": "Mongolian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mn&fmt=srv1", + "name": "Mongolian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mn&fmt=srv2", + "name": "Mongolian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mn&fmt=srv3", + "name": "Mongolian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mn&fmt=ttml", + "name": "Mongolian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=mn&fmt=vtt", + "name": "Mongolian" + } + ], + "ne": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ne&fmt=json3", + "name": "Nepali" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ne&fmt=srv1", + "name": "Nepali" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ne&fmt=srv2", + "name": "Nepali" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ne&fmt=srv3", + "name": "Nepali" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ne&fmt=ttml", + "name": "Nepali" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ne&fmt=vtt", + "name": "Nepali" + } + ], + "nso": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=nso&fmt=json3", + "name": "Northern Sotho" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=nso&fmt=srv1", + "name": "Northern Sotho" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=nso&fmt=srv2", + "name": "Northern Sotho" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=nso&fmt=srv3", + "name": "Northern Sotho" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=nso&fmt=ttml", + "name": "Northern Sotho" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=nso&fmt=vtt", + "name": "Northern Sotho" + } + ], + "no": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=no&fmt=json3", + "name": "Norwegian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=no&fmt=srv1", + "name": "Norwegian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=no&fmt=srv2", + "name": "Norwegian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=no&fmt=srv3", + "name": "Norwegian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=no&fmt=ttml", + "name": "Norwegian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=no&fmt=vtt", + "name": "Norwegian" + } + ], + "ny": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ny&fmt=json3", + "name": "Nyanja" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ny&fmt=srv1", + "name": "Nyanja" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ny&fmt=srv2", + "name": "Nyanja" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ny&fmt=srv3", + "name": "Nyanja" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ny&fmt=ttml", + "name": "Nyanja" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ny&fmt=vtt", + "name": "Nyanja" + } + ], + "or": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=or&fmt=json3", + "name": "Odia" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=or&fmt=srv1", + "name": "Odia" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=or&fmt=srv2", + "name": "Odia" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=or&fmt=srv3", + "name": "Odia" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=or&fmt=ttml", + "name": "Odia" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=or&fmt=vtt", + "name": "Odia" + } + ], + "om": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=om&fmt=json3", + "name": "Oromo" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=om&fmt=srv1", + "name": "Oromo" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=om&fmt=srv2", + "name": "Oromo" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=om&fmt=srv3", + "name": "Oromo" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=om&fmt=ttml", + "name": "Oromo" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=om&fmt=vtt", + "name": "Oromo" + } + ], + "ps": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ps&fmt=json3", + "name": "Pashto" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ps&fmt=srv1", + "name": "Pashto" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ps&fmt=srv2", + "name": "Pashto" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ps&fmt=srv3", + "name": "Pashto" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ps&fmt=ttml", + "name": "Pashto" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ps&fmt=vtt", + "name": "Pashto" + } + ], + "fa": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fa&fmt=json3", + "name": "Persian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fa&fmt=srv1", + "name": "Persian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fa&fmt=srv2", + "name": "Persian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fa&fmt=srv3", + "name": "Persian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fa&fmt=ttml", + "name": "Persian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fa&fmt=vtt", + "name": "Persian" + } + ], + "pl": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pl&fmt=json3", + "name": "Polish" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pl&fmt=srv1", + "name": "Polish" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pl&fmt=srv2", + "name": "Polish" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pl&fmt=srv3", + "name": "Polish" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pl&fmt=ttml", + "name": "Polish" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pl&fmt=vtt", + "name": "Polish" + } + ], + "pt": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pt&fmt=json3", + "name": "Portuguese" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pt&fmt=srv1", + "name": "Portuguese" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pt&fmt=srv2", + "name": "Portuguese" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pt&fmt=srv3", + "name": "Portuguese" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pt&fmt=ttml", + "name": "Portuguese" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pt&fmt=vtt", + "name": "Portuguese" + } + ], + "pa": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pa&fmt=json3", + "name": "Punjabi" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pa&fmt=srv1", + "name": "Punjabi" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pa&fmt=srv2", + "name": "Punjabi" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pa&fmt=srv3", + "name": "Punjabi" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pa&fmt=ttml", + "name": "Punjabi" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=pa&fmt=vtt", + "name": "Punjabi" + } + ], + "qu": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=qu&fmt=json3", + "name": "Quechua" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=qu&fmt=srv1", + "name": "Quechua" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=qu&fmt=srv2", + "name": "Quechua" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=qu&fmt=srv3", + "name": "Quechua" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=qu&fmt=ttml", + "name": "Quechua" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=qu&fmt=vtt", + "name": "Quechua" + } + ], + "ro": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ro&fmt=json3", + "name": "Romanian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ro&fmt=srv1", + "name": "Romanian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ro&fmt=srv2", + "name": "Romanian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ro&fmt=srv3", + "name": "Romanian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ro&fmt=ttml", + "name": "Romanian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ro&fmt=vtt", + "name": "Romanian" + } + ], + "ru": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ru&fmt=json3", + "name": "Russian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ru&fmt=srv1", + "name": "Russian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ru&fmt=srv2", + "name": "Russian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ru&fmt=srv3", + "name": "Russian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ru&fmt=ttml", + "name": "Russian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ru&fmt=vtt", + "name": "Russian" + } + ], + "sm": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sm&fmt=json3", + "name": "Samoan" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sm&fmt=srv1", + "name": "Samoan" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sm&fmt=srv2", + "name": "Samoan" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sm&fmt=srv3", + "name": "Samoan" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sm&fmt=ttml", + "name": "Samoan" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sm&fmt=vtt", + "name": "Samoan" + } + ], + "sa": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sa&fmt=json3", + "name": "Sanskrit" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sa&fmt=srv1", + "name": "Sanskrit" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sa&fmt=srv2", + "name": "Sanskrit" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sa&fmt=srv3", + "name": "Sanskrit" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sa&fmt=ttml", + "name": "Sanskrit" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sa&fmt=vtt", + "name": "Sanskrit" + } + ], + "gd": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gd&fmt=json3", + "name": "Scottish Gaelic" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gd&fmt=srv1", + "name": "Scottish Gaelic" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gd&fmt=srv2", + "name": "Scottish Gaelic" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gd&fmt=srv3", + "name": "Scottish Gaelic" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gd&fmt=ttml", + "name": "Scottish Gaelic" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=gd&fmt=vtt", + "name": "Scottish Gaelic" + } + ], + "sr": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sr&fmt=json3", + "name": "Serbian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sr&fmt=srv1", + "name": "Serbian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sr&fmt=srv2", + "name": "Serbian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sr&fmt=srv3", + "name": "Serbian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sr&fmt=ttml", + "name": "Serbian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sr&fmt=vtt", + "name": "Serbian" + } + ], + "sn": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sn&fmt=json3", + "name": "Shona" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sn&fmt=srv1", + "name": "Shona" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sn&fmt=srv2", + "name": "Shona" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sn&fmt=srv3", + "name": "Shona" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sn&fmt=ttml", + "name": "Shona" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sn&fmt=vtt", + "name": "Shona" + } + ], + "sd": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sd&fmt=json3", + "name": "Sindhi" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sd&fmt=srv1", + "name": "Sindhi" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sd&fmt=srv2", + "name": "Sindhi" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sd&fmt=srv3", + "name": "Sindhi" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sd&fmt=ttml", + "name": "Sindhi" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sd&fmt=vtt", + "name": "Sindhi" + } + ], + "si": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=si&fmt=json3", + "name": "Sinhala" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=si&fmt=srv1", + "name": "Sinhala" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=si&fmt=srv2", + "name": "Sinhala" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=si&fmt=srv3", + "name": "Sinhala" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=si&fmt=ttml", + "name": "Sinhala" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=si&fmt=vtt", + "name": "Sinhala" + } + ], + "sk": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sk&fmt=json3", + "name": "Slovak" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sk&fmt=srv1", + "name": "Slovak" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sk&fmt=srv2", + "name": "Slovak" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sk&fmt=srv3", + "name": "Slovak" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sk&fmt=ttml", + "name": "Slovak" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sk&fmt=vtt", + "name": "Slovak" + } + ], + "sl": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sl&fmt=json3", + "name": "Slovenian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sl&fmt=srv1", + "name": "Slovenian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sl&fmt=srv2", + "name": "Slovenian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sl&fmt=srv3", + "name": "Slovenian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sl&fmt=ttml", + "name": "Slovenian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sl&fmt=vtt", + "name": "Slovenian" + } + ], + "so": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=so&fmt=json3", + "name": "Somali" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=so&fmt=srv1", + "name": "Somali" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=so&fmt=srv2", + "name": "Somali" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=so&fmt=srv3", + "name": "Somali" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=so&fmt=ttml", + "name": "Somali" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=so&fmt=vtt", + "name": "Somali" + } + ], + "st": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=st&fmt=json3", + "name": "Southern Sotho" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=st&fmt=srv1", + "name": "Southern Sotho" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=st&fmt=srv2", + "name": "Southern Sotho" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=st&fmt=srv3", + "name": "Southern Sotho" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=st&fmt=ttml", + "name": "Southern Sotho" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=st&fmt=vtt", + "name": "Southern Sotho" + } + ], + "es": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=es&fmt=json3", + "name": "Spanish" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=es&fmt=srv1", + "name": "Spanish" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=es&fmt=srv2", + "name": "Spanish" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=es&fmt=srv3", + "name": "Spanish" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=es&fmt=ttml", + "name": "Spanish" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=es&fmt=vtt", + "name": "Spanish" + } + ], + "su": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=su&fmt=json3", + "name": "Sundanese" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=su&fmt=srv1", + "name": "Sundanese" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=su&fmt=srv2", + "name": "Sundanese" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=su&fmt=srv3", + "name": "Sundanese" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=su&fmt=ttml", + "name": "Sundanese" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=su&fmt=vtt", + "name": "Sundanese" + } + ], + "sw": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sw&fmt=json3", + "name": "Swahili" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sw&fmt=srv1", + "name": "Swahili" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sw&fmt=srv2", + "name": "Swahili" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sw&fmt=srv3", + "name": "Swahili" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sw&fmt=ttml", + "name": "Swahili" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sw&fmt=vtt", + "name": "Swahili" + } + ], + "sv": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sv&fmt=json3", + "name": "Swedish" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sv&fmt=srv1", + "name": "Swedish" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sv&fmt=srv2", + "name": "Swedish" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sv&fmt=srv3", + "name": "Swedish" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sv&fmt=ttml", + "name": "Swedish" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=sv&fmt=vtt", + "name": "Swedish" + } + ], + "tg": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tg&fmt=json3", + "name": "Tajik" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tg&fmt=srv1", + "name": "Tajik" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tg&fmt=srv2", + "name": "Tajik" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tg&fmt=srv3", + "name": "Tajik" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tg&fmt=ttml", + "name": "Tajik" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tg&fmt=vtt", + "name": "Tajik" + } + ], + "ta": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ta&fmt=json3", + "name": "Tamil" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ta&fmt=srv1", + "name": "Tamil" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ta&fmt=srv2", + "name": "Tamil" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ta&fmt=srv3", + "name": "Tamil" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ta&fmt=ttml", + "name": "Tamil" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ta&fmt=vtt", + "name": "Tamil" + } + ], + "tt": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tt&fmt=json3", + "name": "Tatar" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tt&fmt=srv1", + "name": "Tatar" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tt&fmt=srv2", + "name": "Tatar" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tt&fmt=srv3", + "name": "Tatar" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tt&fmt=ttml", + "name": "Tatar" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tt&fmt=vtt", + "name": "Tatar" + } + ], + "te": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=te&fmt=json3", + "name": "Telugu" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=te&fmt=srv1", + "name": "Telugu" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=te&fmt=srv2", + "name": "Telugu" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=te&fmt=srv3", + "name": "Telugu" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=te&fmt=ttml", + "name": "Telugu" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=te&fmt=vtt", + "name": "Telugu" + } + ], + "th": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=th&fmt=json3", + "name": "Thai" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=th&fmt=srv1", + "name": "Thai" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=th&fmt=srv2", + "name": "Thai" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=th&fmt=srv3", + "name": "Thai" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=th&fmt=ttml", + "name": "Thai" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=th&fmt=vtt", + "name": "Thai" + } + ], + "ti": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ti&fmt=json3", + "name": "Tigrinya" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ti&fmt=srv1", + "name": "Tigrinya" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ti&fmt=srv2", + "name": "Tigrinya" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ti&fmt=srv3", + "name": "Tigrinya" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ti&fmt=ttml", + "name": "Tigrinya" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ti&fmt=vtt", + "name": "Tigrinya" + } + ], + "ts": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ts&fmt=json3", + "name": "Tsonga" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ts&fmt=srv1", + "name": "Tsonga" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ts&fmt=srv2", + "name": "Tsonga" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ts&fmt=srv3", + "name": "Tsonga" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ts&fmt=ttml", + "name": "Tsonga" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ts&fmt=vtt", + "name": "Tsonga" + } + ], + "tr": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tr&fmt=json3", + "name": "Turkish" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tr&fmt=srv1", + "name": "Turkish" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tr&fmt=srv2", + "name": "Turkish" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tr&fmt=srv3", + "name": "Turkish" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tr&fmt=ttml", + "name": "Turkish" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tr&fmt=vtt", + "name": "Turkish" + } + ], + "tk": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tk&fmt=json3", + "name": "Turkmen" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tk&fmt=srv1", + "name": "Turkmen" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tk&fmt=srv2", + "name": "Turkmen" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tk&fmt=srv3", + "name": "Turkmen" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tk&fmt=ttml", + "name": "Turkmen" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=tk&fmt=vtt", + "name": "Turkmen" + } + ], + "uk": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=uk&fmt=json3", + "name": "Ukrainian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=uk&fmt=srv1", + "name": "Ukrainian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=uk&fmt=srv2", + "name": "Ukrainian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=uk&fmt=srv3", + "name": "Ukrainian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=uk&fmt=ttml", + "name": "Ukrainian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=uk&fmt=vtt", + "name": "Ukrainian" + } + ], + "ur": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ur&fmt=json3", + "name": "Urdu" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ur&fmt=srv1", + "name": "Urdu" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ur&fmt=srv2", + "name": "Urdu" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ur&fmt=srv3", + "name": "Urdu" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ur&fmt=ttml", + "name": "Urdu" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ur&fmt=vtt", + "name": "Urdu" + } + ], + "ug": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ug&fmt=json3", + "name": "Uyghur" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ug&fmt=srv1", + "name": "Uyghur" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ug&fmt=srv2", + "name": "Uyghur" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ug&fmt=srv3", + "name": "Uyghur" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ug&fmt=ttml", + "name": "Uyghur" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=ug&fmt=vtt", + "name": "Uyghur" + } + ], + "uz": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=uz&fmt=json3", + "name": "Uzbek" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=uz&fmt=srv1", + "name": "Uzbek" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=uz&fmt=srv2", + "name": "Uzbek" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=uz&fmt=srv3", + "name": "Uzbek" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=uz&fmt=ttml", + "name": "Uzbek" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=uz&fmt=vtt", + "name": "Uzbek" + } + ], + "vi": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=vi&fmt=json3", + "name": "Vietnamese" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=vi&fmt=srv1", + "name": "Vietnamese" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=vi&fmt=srv2", + "name": "Vietnamese" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=vi&fmt=srv3", + "name": "Vietnamese" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=vi&fmt=ttml", + "name": "Vietnamese" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=vi&fmt=vtt", + "name": "Vietnamese" + } + ], + "cy": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=cy&fmt=json3", + "name": "Welsh" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=cy&fmt=srv1", + "name": "Welsh" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=cy&fmt=srv2", + "name": "Welsh" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=cy&fmt=srv3", + "name": "Welsh" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=cy&fmt=ttml", + "name": "Welsh" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=cy&fmt=vtt", + "name": "Welsh" + } + ], + "fy": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fy&fmt=json3", + "name": "Western Frisian" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fy&fmt=srv1", + "name": "Western Frisian" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fy&fmt=srv2", + "name": "Western Frisian" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fy&fmt=srv3", + "name": "Western Frisian" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fy&fmt=ttml", + "name": "Western Frisian" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=fy&fmt=vtt", + "name": "Western Frisian" + } + ], + "xh": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=xh&fmt=json3", + "name": "Xhosa" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=xh&fmt=srv1", + "name": "Xhosa" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=xh&fmt=srv2", + "name": "Xhosa" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=xh&fmt=srv3", + "name": "Xhosa" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=xh&fmt=ttml", + "name": "Xhosa" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=xh&fmt=vtt", + "name": "Xhosa" + } + ], + "yi": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=yi&fmt=json3", + "name": "Yiddish" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=yi&fmt=srv1", + "name": "Yiddish" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=yi&fmt=srv2", + "name": "Yiddish" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=yi&fmt=srv3", + "name": "Yiddish" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=yi&fmt=ttml", + "name": "Yiddish" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=yi&fmt=vtt", + "name": "Yiddish" + } + ], + "yo": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=yo&fmt=json3", + "name": "Yoruba" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=yo&fmt=srv1", + "name": "Yoruba" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=yo&fmt=srv2", + "name": "Yoruba" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=yo&fmt=srv3", + "name": "Yoruba" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=yo&fmt=ttml", + "name": "Yoruba" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=yo&fmt=vtt", + "name": "Yoruba" + } + ], + "zu": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zu&fmt=json3", + "name": "Zulu" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zu&fmt=srv1", + "name": "Zulu" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zu&fmt=srv2", + "name": "Zulu" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zu&fmt=srv3", + "name": "Zulu" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zu&fmt=ttml", + "name": "Zulu" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&kind=asr&lang=en&tlang=zu&fmt=vtt", + "name": "Zulu" + } + ] + }, + "subtitles": { + "de": [ + { + "ext": "json3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&lang=de&fmt=json3", + "name": "German" + }, + { + "ext": "srv1", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&lang=de&fmt=srv1", + "name": "German" + }, + { + "ext": "srv2", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&lang=de&fmt=srv2", + "name": "German" + }, + { + "ext": "srv3", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&lang=de&fmt=srv3", + "name": "German" + }, + { + "ext": "ttml", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&lang=de&fmt=ttml", + "name": "German" + }, + { + "ext": "vtt", + "url": "https://www.youtube.com/api/timedtext?v=bwRHIkYqYJo&ei=qQ23Zbv4OcjhsfIPt-C1iAk&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1706520601&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=5A41669CF69DF1733DEA84A46C1571C6F95361DF.2C70AE6B35952DDDA183BAB32A0C964F00F512BF&key=yt8&lang=de&fmt=vtt", + "name": "German" + } + ] + }, + "comment_count": 44, + "chapters": [ + { "start_time": 0.0, "title": "Introduction", "end_time": 31.0 }, + { "start_time": 31.0, "title": "Rules", "end_time": 46.0 }, + { "start_time": 46.0, "title": "Challenge #1", "end_time": 427.0 }, + { "start_time": 427.0, "title": "Challenge #2", "end_time": 483.0 }, + { "start_time": 483.0, "title": "Conclusion", "end_time": 526.0 }, + { "start_time": 526.0, "title": "Skillshare", "end_time": 570.0 }, + { "start_time": 570.0, "title": "Longest No Brake Wheelie", "end_time": 582 } + ], + "heatmap": null, + "like_count": 333, + "channel": "TheUselessTrials", + "channel_follower_count": 35000, + "uploader": "TheUselessTrials", + "uploader_id": "@TheUselessTrials", + "uploader_url": "https://www.youtube.com/@TheUselessTrials", + "upload_date": "20210720", + "availability": "public", + "original_url": "bwRHIkYqYJo", + "webpage_url_basename": "watch", + "webpage_url_domain": "youtube.com", + "extractor": "youtube", + "extractor_key": "Youtube", + "playlist": null, + "playlist_index": null, + "display_id": "bwRHIkYqYJo", + "fulltitle": "Trying to Wheelie Without the Rear Brake", + "duration_string": "9:42", + "release_year": null, + "is_live": false, + "was_live": false, + "requested_subtitles": {}, + "_has_drm": null, + "epoch": 1706495402, + "requested_formats": [ + { + "asr": null, + "filesize": 897486343, + "format_id": "313", + "format_note": "2160p", + "source_preference": -1, + "fps": 24, + "audio_channels": null, + "height": 2160, + "quality": 11.0, + "has_drm": false, + "tbr": 12330.438, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=313&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fwebm&gir=yes&clen=897486343&dur=582.290&lmt=1705442131826507&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=631F224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIge4wXEaYaDt1t9iDHaO0TcxNf9RJiUKcHBwUclcvKFw0CIQD70la1_R0wLekw4Zo0hXK-EyxT3DftYLR7pDkk_Sz2lA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D", + "width": 3840, + "language": null, + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "vp09.00.50.08", + "acodec": "none", + "dynamic_range": "SDR", + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "3840x2160", + "aspect_ratio": 1.78, + "http_headers": {}, + "video_ext": "webm", + "audio_ext": "none", + "abr": 0, + "vbr": 12330.438, + "format": "313 - 3840x2160 (2160p)" + }, + { + "asr": 48000, + "filesize": 8264649, + "format_id": "251", + "format_note": "medium", + "source_preference": -1, + "fps": null, + "audio_channels": 2, + "height": null, + "quality": 3.0, + "has_drm": false, + "tbr": 113.544, + "url": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23ZZznK7ucsfIP0rW_wAk&ip=184.65.71.108&id=o-AF5FdjYiL4g-CkbZ54_ilBCjxrEgT73c7TlGEfvr2meT&itag=251&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=audio%2Fwebm&gir=yes&clen=8264649&dur=582.301&lmt=1705441327139531&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=ANDROID&txp=6318224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAKheHfJYdKMVCKmhCmKHRc_Dx9THKe1AxARvtPWpEXHaAiEAmyg7s-nuvB0Qlq67_OWk6UdaptzYtVujTE0tTAvD2F4%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRgIhAIdNHwY7qZ_DjsmvAH3GfDsZvkQygk757LbYqhfbhihYAiEA2K4C8d_ghWmB6fQatxNumDoyqVqHmhA0LcO8X0Dkp2I%3D", + "width": null, + "language": "en", + "language_preference": -1, + "preference": null, + "ext": "webm", + "vcodec": "none", + "acodec": "opus", + "dynamic_range": null, + "container": "webm_dash", + "downloader_options": { "http_chunk_size": 10485760 }, + "protocol": "https", + "resolution": "audio only", + "aspect_ratio": null, + "http_headers": {}, + "audio_ext": "webm", + "video_ext": "none", + "vbr": 0, + "abr": 113.544, + "format": "251 - audio only (medium)" + } + ], + "format": "313 - 3840x2160 (2160p)+251 - audio only (medium)", + "format_id": "313+251", + "ext": "mkv", + "protocol": "https+https", + "language": "en", + "format_note": "2160p+medium", + "filesize_approx": 905750992, + "tbr": 12443.982, + "width": 3840, + "height": 2160, + "resolution": "3840x2160", + "fps": 24, + "dynamic_range": "SDR", + "vcodec": "vp09.00.50.08", + "vbr": 12330.438, + "stretched_ratio": null, + "aspect_ratio": 1.78, + "acodec": "opus", + "abr": 113.544, + "asr": 48000, + "audio_channels": 2, + "_filename": "/app/tmp/videos/bwRHIkYqYJo/Trying to Wheelie Without the Rear Brake-bwRHIkYqYJo.webm", + "filename": "/app/tmp/videos/bwRHIkYqYJo/Trying to Wheelie Without the Rear Brake-bwRHIkYqYJo.webm", + "__real_download": false, + "__finaldir": "/app/tmp/videos/bwRHIkYqYJo", + "filepath": "/app/tmp/videos/bwRHIkYqYJo/Trying to Wheelie Without the Rear Brake-bwRHIkYqYJo.mkv", + "urls": "https://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23Ze2uGcefsfIPo8eGqA0&ip=184.65.71.108&id=o-AHhRvYwPEO0UnD7KxDiUfokDAmY-UEtICR497GfnL8Fp&itag=313&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=video%2Fwebm&gir=yes&clen=897486343&dur=582.290&lmt=1705442131826507&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=IOS&txp=631F224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIge4wXEaYaDt1t9iDHaO0TcxNf9RJiUKcHBwUclcvKFw0CIQD70la1_R0wLekw4Zo0hXK-EyxT3DftYLR7pDkk_Sz2lA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRQIgHiAwpirT_yn-IrlySUhQ6bdnYf911YV5D2HQMG_ClEcCIQDo1sUhDJjqQ6LQqkS83bm6LFFaZlHdCG8f_H12azzAKg%3D%3D\nhttps://rr2---sn-ni5f-t8g6.googlevideo.com/videoplayback?expire=1706517002&ei=qg23ZZznK7ucsfIP0rW_wAk&ip=184.65.71.108&id=o-AF5FdjYiL4g-CkbZ54_ilBCjxrEgT73c7TlGEfvr2meT&itag=251&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=Pz&mm=31%2C26&mn=sn-ni5f-t8g6%2Csn-vgqskn6s&ms=au%2Conr&mv=m&mvi=2&pl=22&initcwndbps=1712500&vprv=1&svpuc=1&mime=audio%2Fwebm&gir=yes&clen=8264649&dur=582.301&lmt=1705441327139531&mt=1706495125&fvip=3&keepalive=yes&fexp=24007246&c=ANDROID&txp=6318224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAKheHfJYdKMVCKmhCmKHRc_Dx9THKe1AxARvtPWpEXHaAiEAmyg7s-nuvB0Qlq67_OWk6UdaptzYtVujTE0tTAvD2F4%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AAO5W4owRgIhAIdNHwY7qZ_DjsmvAH3GfDsZvkQygk757LbYqhfbhihYAiEA2K4C8d_ghWmB6fQatxNumDoyqVqHmhA0LcO8X0Dkp2I%3D", + "formats_table": "ID EXT RESOLUTION FPS CH | FILESIZE TBR PROTO | VCODEC VBR ACODEC ABR ASR MORE INFO\n-------------------------------------------------------------------------------------------------------------------------\nsb2 mhtml 48x27 0 | mhtml | images storyboard\nsb1 mhtml 79x45 0 | mhtml | images storyboard\nsb0 mhtml 159x90 0 | mhtml | images storyboard\n233 mp4 audio only | m3u8 | audio only unknown [en] Default\n234 mp4 audio only | m3u8 | audio only unknown [en] Default\n599 m4a audio only 2 | 2.14MiB 31k https | audio only mp4a.40.5 31k 22k [en] ultralow, m4a_dash\n600 webm audio only 2 | 2.24MiB 32k https | audio only opus 32k 48k [en] ultralow, webm_dash\n139 m4a audio only 2 | 3.39MiB 49k https | audio only mp4a.40.5 49k 22k [en] low, m4a_dash\n249 webm audio only 2 | 3.33MiB 48k https | audio only opus 48k 48k [en] low, webm_dash\n250 webm audio only 2 | 4.07MiB 59k https | audio only opus 59k 48k [en] low, webm_dash\n140 m4a audio only 2 | 8.99MiB 129k https | audio only mp4a.40.2 129k 44k [en] medium, m4a_dash\n251 webm audio only 2 | 7.88MiB 114k https | audio only opus 114k 48k [en] medium, webm_dash\n597 mp4 256x144 12 | 2.30MiB 33k https | avc1.4d400b 33k video only 144p, mp4_dash\n602 mp4 256x144 12 | ~ 6.71MiB 94k m3u8 | vp09.00.10.08 94k video only\n598 webm 256x144 12 | 1.97MiB 28k https | vp9 28k video only 144p, webm_dash\n269 mp4 256x144 24 | ~ 14.35MiB 202k m3u8 | avc1.4D400C 202k video only\n160 mp4 256x144 24 | 6.23MiB 90k https | avc1.4D400C 90k video only 144p, mp4_dash\n603 mp4 256x144 24 | ~ 12.78MiB 180k m3u8 | vp09.00.11.08 180k video only\n278 webm 256x144 24 | 6.28MiB 90k https | vp09.00.11.08 90k video only 144p, webm_dash\n229 mp4 426x240 24 | ~ 23.32MiB 328k m3u8 | avc1.4D4015 328k video only\n133 mp4 426x240 24 | 14.25MiB 205k https | avc1.4D4015 205k video only 240p, mp4_dash\n604 mp4 426x240 24 | ~ 22.94MiB 323k m3u8 | vp09.00.20.08 323k video only\n242 webm 426x240 24 | 12.17MiB 175k https | vp09.00.20.08 175k video only 240p, webm_dash\n230 mp4 640x360 24 | ~ 53.80MiB 757k m3u8 | avc1.4D401E 757k video only\n134 mp4 640x360 24 | 31.14MiB 449k https | avc1.4D401E 449k video only 360p, mp4_dash\n18 mp4 640x360 24 2 | \u2248 41.02MiB 577k https | avc1.42001E mp4a.40.2 44k [en] 360p\n605 mp4 640x360 24 | ~ 44.68MiB 629k m3u8 | vp09.00.21.08 629k video only\n243 webm 640x360 24 | 21.23MiB 306k https | vp09.00.21.08 306k video only 360p, webm_dash\n231 mp4 854x480 24 | ~ 94.64MiB 1332k m3u8 | avc1.4D401E 1332k video only\n135 mp4 854x480 24 | 63.11MiB 909k https | avc1.4D401E 909k video only 480p, mp4_dash\n606 mp4 854x480 24 | ~ 81.23MiB 1143k m3u8 | vp09.00.30.08 1143k video only\n244 webm 854x480 24 | 37.70MiB 543k https | vp09.00.30.08 543k video only 480p, webm_dash\n22 mp4 1280x720 24 2 | \u2248138.14MiB 1944k https | avc1.64001F mp4a.40.2 44k [en] 720p\n232 mp4 1280x720 24 | ~177.52MiB 2499k m3u8 | avc1.64001F 2499k video only\n136 mp4 1280x720 24 | 126.06MiB 1816k https | avc1.64001F 1816k video only 720p, mp4_dash\n609 mp4 1280x720 24 | ~152.54MiB 2147k m3u8 | vp09.00.31.08 2147k video only\n247 webm 1280x720 24 | 68.44MiB 986k https | vp09.00.31.08 986k video only 720p, webm_dash\n270 mp4 1920x1080 24 | ~367.41MiB 5172k m3u8 | avc1.640028 5172k video only\n137 mp4 1920x1080 24 | 266.84MiB 3844k https | avc1.640028 3844k video only 1080p, mp4_dash\n614 mp4 1920x1080 24 | ~228.38MiB 3215k m3u8 | vp09.00.40.08 3215k video only\n248 webm 1920x1080 24 | 120.74MiB 1739k https | vp09.00.40.08 1739k video only 1080p, webm_dash\n620 mp4 2560x1440 24 | ~631.72MiB 8892k m3u8 | vp09.00.50.08 8892k video only\n271 webm 2560x1440 24 | 451.78MiB 6508k https | vp09.00.50.08 6508k video only 1440p, webm_dash\n625 mp4 3840x2160 24 | ~ 1.19GiB 17121k m3u8 | vp09.00.50.08 17121k video only\n313 webm 3840x2160 24 | 855.91MiB 12330k https | vp09.00.50.08 12330k video only 2160p, webm_dash", + "thumbnails_table": "ID Width Height URL\n0 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/3.jpg\n1 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/3.webp\n2 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/2.jpg\n3 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/2.webp\n4 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/1.jpg\n5 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/1.webp\n6 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/mq3.jpg\n7 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/mq3.webp\n8 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/mq2.jpg\n9 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/mq2.webp\n10 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/mq1.jpg\n11 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/mq1.webp\n12 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/hq3.jpg\n13 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/hq3.webp\n14 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/hq2.jpg\n15 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/hq2.webp\n16 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/hq1.jpg\n17 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/hq1.webp\n18 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/sd3.jpg\n19 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/sd3.webp\n20 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/sd2.jpg\n21 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/sd2.webp\n22 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/sd1.jpg\n23 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/sd1.webp\n24 120 90 https://i.ytimg.com/vi/bwRHIkYqYJo/default.jpg\n25 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/default.webp\n26 320 180 https://i.ytimg.com/vi/bwRHIkYqYJo/mqdefault.jpg\n27 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/mqdefault.webp\n28 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/0.jpg\n29 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/0.webp\n30 168 94 https://i.ytimg.com/vi/bwRHIkYqYJo/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCfnqZqzf3SpMWSBlr5eEkYrRbeOw\n31 196 110 https://i.ytimg.com/vi/bwRHIkYqYJo/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAnj5wtnbYGzZX9gerMKQ-FS5sSeA\n32 246 138 https://i.ytimg.com/vi/bwRHIkYqYJo/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC5fmbFoduOVcifLAMu006pXlcicQ\n33 336 188 https://i.ytimg.com/vi/bwRHIkYqYJo/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDISoJqnSXFGgqsSCMRd9NCiV5Dyg\n34 480 360 https://i.ytimg.com/vi/bwRHIkYqYJo/hqdefault.jpg\n35 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/hqdefault.webp\n36 640 480 https://i.ytimg.com/vi/bwRHIkYqYJo/sddefault.jpg\n37 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/sddefault.webp\n38 unknown unknown https://i.ytimg.com/vi/bwRHIkYqYJo/hq720.jpg\n39 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/hq720.webp\n40 1920 1080 https://i.ytimg.com/vi/bwRHIkYqYJo/maxresdefault.jpg\n41 unknown unknown https://i.ytimg.com/vi_webp/bwRHIkYqYJo/maxresdefault.webp", + "subtitles_table": "Language Name Formats\nde German vtt, ttml, srv3, srv2, srv1, json3", + "automatic_captions_table": "Language Name Formats\nde German, German, German, German, German, German, unknown vtt, ttml, srv3, srv2, srv1, json3, vtt\naf Afrikaans vtt, ttml, srv3, srv2, srv1, json3\nak Akan vtt, ttml, srv3, srv2, srv1, json3\nsq Albanian vtt, ttml, srv3, srv2, srv1, json3\nam Amharic vtt, ttml, srv3, srv2, srv1, json3\nar Arabic vtt, ttml, srv3, srv2, srv1, json3\nhy Armenian vtt, ttml, srv3, srv2, srv1, json3\nas Assamese vtt, ttml, srv3, srv2, srv1, json3\nay Aymara vtt, ttml, srv3, srv2, srv1, json3\naz Azerbaijani vtt, ttml, srv3, srv2, srv1, json3\nbn Bangla vtt, ttml, srv3, srv2, srv1, json3\neu Basque vtt, ttml, srv3, srv2, srv1, json3\nbe Belarusian vtt, ttml, srv3, srv2, srv1, json3\nbho Bhojpuri vtt, ttml, srv3, srv2, srv1, json3\nbs Bosnian vtt, ttml, srv3, srv2, srv1, json3\nbg Bulgarian vtt, ttml, srv3, srv2, srv1, json3\nmy Burmese vtt, ttml, srv3, srv2, srv1, json3\nca Catalan vtt, ttml, srv3, srv2, srv1, json3\nceb Cebuano vtt, ttml, srv3, srv2, srv1, json3\nzh-Hans Chinese (Simplified) vtt, ttml, srv3, srv2, srv1, json3\nzh-Hant Chinese (Traditional) vtt, ttml, srv3, srv2, srv1, json3\nco Corsican vtt, ttml, srv3, srv2, srv1, json3\nhr Croatian vtt, ttml, srv3, srv2, srv1, json3\ncs Czech vtt, ttml, srv3, srv2, srv1, json3\nda Danish vtt, ttml, srv3, srv2, srv1, json3\ndv Divehi vtt, ttml, srv3, srv2, srv1, json3\nnl Dutch vtt, ttml, srv3, srv2, srv1, json3\nen-orig English (Original) vtt, ttml, srv3, srv2, srv1, json3\nen English vtt, ttml, srv3, srv2, srv1, json3\neo Esperanto vtt, ttml, srv3, srv2, srv1, json3\net Estonian vtt, ttml, srv3, srv2, srv1, json3\nee Ewe vtt, ttml, srv3, srv2, srv1, json3\nfil Filipino vtt, ttml, srv3, srv2, srv1, json3\nfi Finnish vtt, ttml, srv3, srv2, srv1, json3\nfr French vtt, ttml, srv3, srv2, srv1, json3\ngl Galician vtt, ttml, srv3, srv2, srv1, json3\nlg Ganda vtt, ttml, srv3, srv2, srv1, json3\nka Georgian vtt, ttml, srv3, srv2, srv1, json3\nel Greek vtt, ttml, srv3, srv2, srv1, json3\ngn Guarani vtt, ttml, srv3, srv2, srv1, json3\ngu Gujarati vtt, ttml, srv3, srv2, srv1, json3\nht Haitian Creole vtt, ttml, srv3, srv2, srv1, json3\nha Hausa vtt, ttml, srv3, srv2, srv1, json3\nhaw Hawaiian vtt, ttml, srv3, srv2, srv1, json3\niw Hebrew vtt, ttml, srv3, srv2, srv1, json3\nhi Hindi vtt, ttml, srv3, srv2, srv1, json3\nhmn Hmong vtt, ttml, srv3, srv2, srv1, json3\nhu Hungarian vtt, ttml, srv3, srv2, srv1, json3\nis Icelandic vtt, ttml, srv3, srv2, srv1, json3\nig Igbo vtt, ttml, srv3, srv2, srv1, json3\nid Indonesian vtt, ttml, srv3, srv2, srv1, json3\nga Irish vtt, ttml, srv3, srv2, srv1, json3\nit Italian vtt, ttml, srv3, srv2, srv1, json3\nja Japanese vtt, ttml, srv3, srv2, srv1, json3\njv Javanese vtt, ttml, srv3, srv2, srv1, json3\nkn Kannada vtt, ttml, srv3, srv2, srv1, json3\nkk Kazakh vtt, ttml, srv3, srv2, srv1, json3\nkm Khmer vtt, ttml, srv3, srv2, srv1, json3\nrw Kinyarwanda vtt, ttml, srv3, srv2, srv1, json3\nko Korean vtt, ttml, srv3, srv2, srv1, json3\nkri Krio vtt, ttml, srv3, srv2, srv1, json3\nku Kurdish vtt, ttml, srv3, srv2, srv1, json3\nky Kyrgyz vtt, ttml, srv3, srv2, srv1, json3\nlo Lao vtt, ttml, srv3, srv2, srv1, json3\nla Latin vtt, ttml, srv3, srv2, srv1, json3\nlv Latvian vtt, ttml, srv3, srv2, srv1, json3\nln Lingala vtt, ttml, srv3, srv2, srv1, json3\nlt Lithuanian vtt, ttml, srv3, srv2, srv1, json3\nlb Luxembourgish vtt, ttml, srv3, srv2, srv1, json3\nmk Macedonian vtt, ttml, srv3, srv2, srv1, json3\nmg Malagasy vtt, ttml, srv3, srv2, srv1, json3\nms Malay vtt, ttml, srv3, srv2, srv1, json3\nml Malayalam vtt, ttml, srv3, srv2, srv1, json3\nmt Maltese vtt, ttml, srv3, srv2, srv1, json3\nmi M\u0101ori vtt, ttml, srv3, srv2, srv1, json3\nmr Marathi vtt, ttml, srv3, srv2, srv1, json3\nmn Mongolian vtt, ttml, srv3, srv2, srv1, json3\nne Nepali vtt, ttml, srv3, srv2, srv1, json3\nnso Northern Sotho vtt, ttml, srv3, srv2, srv1, json3\nno Norwegian vtt, ttml, srv3, srv2, srv1, json3\nny Nyanja vtt, ttml, srv3, srv2, srv1, json3\nor Odia vtt, ttml, srv3, srv2, srv1, json3\nom Oromo vtt, ttml, srv3, srv2, srv1, json3\nps Pashto vtt, ttml, srv3, srv2, srv1, json3\nfa Persian vtt, ttml, srv3, srv2, srv1, json3\npl Polish vtt, ttml, srv3, srv2, srv1, json3\npt Portuguese vtt, ttml, srv3, srv2, srv1, json3\npa Punjabi vtt, ttml, srv3, srv2, srv1, json3\nqu Quechua vtt, ttml, srv3, srv2, srv1, json3\nro Romanian vtt, ttml, srv3, srv2, srv1, json3\nru Russian vtt, ttml, srv3, srv2, srv1, json3\nsm Samoan vtt, ttml, srv3, srv2, srv1, json3\nsa Sanskrit vtt, ttml, srv3, srv2, srv1, json3\ngd Scottish Gaelic vtt, ttml, srv3, srv2, srv1, json3\nsr Serbian vtt, ttml, srv3, srv2, srv1, json3\nsn Shona vtt, ttml, srv3, srv2, srv1, json3\nsd Sindhi vtt, ttml, srv3, srv2, srv1, json3\nsi Sinhala vtt, ttml, srv3, srv2, srv1, json3\nsk Slovak vtt, ttml, srv3, srv2, srv1, json3\nsl Slovenian vtt, ttml, srv3, srv2, srv1, json3\nso Somali vtt, ttml, srv3, srv2, srv1, json3\nst Southern Sotho vtt, ttml, srv3, srv2, srv1, json3\nes Spanish vtt, ttml, srv3, srv2, srv1, json3\nsu Sundanese vtt, ttml, srv3, srv2, srv1, json3\nsw Swahili vtt, ttml, srv3, srv2, srv1, json3\nsv Swedish vtt, ttml, srv3, srv2, srv1, json3\ntg Tajik vtt, ttml, srv3, srv2, srv1, json3\nta Tamil vtt, ttml, srv3, srv2, srv1, json3\ntt Tatar vtt, ttml, srv3, srv2, srv1, json3\nte Telugu vtt, ttml, srv3, srv2, srv1, json3\nth Thai vtt, ttml, srv3, srv2, srv1, json3\nti Tigrinya vtt, ttml, srv3, srv2, srv1, json3\nts Tsonga vtt, ttml, srv3, srv2, srv1, json3\ntr Turkish vtt, ttml, srv3, srv2, srv1, json3\ntk Turkmen vtt, ttml, srv3, srv2, srv1, json3\nuk Ukrainian vtt, ttml, srv3, srv2, srv1, json3\nur Urdu vtt, ttml, srv3, srv2, srv1, json3\nug Uyghur vtt, ttml, srv3, srv2, srv1, json3\nuz Uzbek vtt, ttml, srv3, srv2, srv1, json3\nvi Vietnamese vtt, ttml, srv3, srv2, srv1, json3\ncy Welsh vtt, ttml, srv3, srv2, srv1, json3\nfy Western Frisian vtt, ttml, srv3, srv2, srv1, json3\nxh Xhosa vtt, ttml, srv3, srv2, srv1, json3\nyi Yiddish vtt, ttml, srv3, srv2, srv1, json3\nyo Yoruba vtt, ttml, srv3, srv2, srv1, json3\nzu Zulu vtt, ttml, srv3, srv2, srv1, json3", + "autonumber": 1, + "video_autonumber": 1 +} diff --git a/test/support/fixtures/job_fixtures.ex b/test/support/fixtures/job_fixtures.ex new file mode 100644 index 00000000..4aab0dd3 --- /dev/null +++ b/test/support/fixtures/job_fixtures.ex @@ -0,0 +1,19 @@ +defmodule Pinchflat.JobFixtures do + @moduledoc false + + defmodule TestJobWorker do + @moduledoc false + use Oban.Worker, queue: :default + + @impl Oban.Worker + def perform(%Oban.Job{}) do + :ok + end + end + + def job_fixture() do + {:ok, job} = Oban.insert(TestJobWorker.new(%{})) + + job + end +end diff --git a/test/support/fixtures/media_fixtures.ex b/test/support/fixtures/media_fixtures.ex new file mode 100644 index 00000000..7fe9e734 --- /dev/null +++ b/test/support/fixtures/media_fixtures.ex @@ -0,0 +1,45 @@ +defmodule Pinchflat.MediaFixtures do + @moduledoc """ + This module defines test helpers for creating + entities via the `Pinchflat.Media` context. + """ + + alias Pinchflat.MediaSourceFixtures + + @doc """ + Generate a media_item. + """ + def media_item_fixture(attrs \\ %{}) do + {:ok, media_item} = + attrs + |> Enum.into(%{ + media_id: Faker.String.base64(12), + title: Faker.Commerce.product_name(), + video_filepath: "/video/#{Faker.File.file_name(:video)}", + channel_id: MediaSourceFixtures.channel_fixture().id + }) + |> Pinchflat.Media.create_media_item() + + media_item + end + + @doc """ + Generate a media_item with metadata. + """ + def media_item_with_metadata(attrs \\ %{}) do + json_filepath = + Path.join([ + Path.dirname(__ENV__.file), + "support", + "fixtures", + "files", + "media_metadata.json" + ]) + + {:ok, file_body} = File.read(json_filepath) + {:ok, parsed_json} = Phoenix.json_library().decode(file_body) + merged_attrs = Map.merge(attrs, %{metadata: %{client_respinse: parsed_json}}) + + media_item_fixture(merged_attrs) + end +end diff --git a/test/support/fixtures/media_source_fixtures.ex b/test/support/fixtures/media_source_fixtures.ex new file mode 100644 index 00000000..007c9d4a --- /dev/null +++ b/test/support/fixtures/media_source_fixtures.ex @@ -0,0 +1,30 @@ +defmodule Pinchflat.MediaSourceFixtures do + @moduledoc """ + This module defines test helpers for creating + entities via the `Pinchflat.MediaSource` context. + """ + + alias Pinchflat.Repo + alias Pinchflat.ProfilesFixtures + alias Pinchflat.MediaSource.Channel + + @doc """ + Generate a channel. + """ + def channel_fixture(attrs \\ %{}) do + {:ok, channel} = + %Channel{} + |> Channel.changeset( + Enum.into(attrs, %{ + name: "Channel ##{:rand.uniform(1_000_000)}", + channel_id: Base.encode16(:crypto.hash(:md5, "#{:rand.uniform(1_000_000)}")), + original_url: "https://www.youtube.com/channel/#{Faker.String.base64(12)}", + media_profile_id: ProfilesFixtures.media_profile_fixture().id, + index_frequency_minutes: 60 + }) + ) + |> Repo.insert() + + channel + end +end diff --git a/test/support/fixtures/profiles_fixtures.ex b/test/support/fixtures/profiles_fixtures.ex new file mode 100644 index 00000000..4697fa24 --- /dev/null +++ b/test/support/fixtures/profiles_fixtures.ex @@ -0,0 +1,21 @@ +defmodule Pinchflat.ProfilesFixtures do + @moduledoc """ + This module defines test helpers for creating + entities via the `Pinchflat.Profiles` context. + """ + + @doc """ + Generate a media_profile. + """ + def media_profile_fixture(attrs \\ %{}) do + {:ok, media_profile} = + attrs + |> Enum.into(%{ + name: "Media Profile ##{:rand.uniform(1_000_000)}", + output_path_template: "{{title}}.{{ext}}" + }) + |> Pinchflat.Profiles.create_media_profile() + + media_profile + end +end diff --git a/test/support/fixtures/tasks_fixtures.ex b/test/support/fixtures/tasks_fixtures.ex new file mode 100644 index 00000000..c310ea60 --- /dev/null +++ b/test/support/fixtures/tasks_fixtures.ex @@ -0,0 +1,24 @@ +defmodule Pinchflat.TasksFixtures do + @moduledoc """ + This module defines test helpers for creating + entities via the `Pinchflat.Tasks` context. + """ + + alias Pinchflat.JobFixtures + alias Pinchflat.MediaSourceFixtures + + @doc """ + Generate a task. + """ + def task_fixture(attrs \\ %{}) do + {:ok, task} = + attrs + |> Enum.into(%{ + channel_id: MediaSourceFixtures.channel_fixture().id, + job_id: JobFixtures.job_fixture().id + }) + |> Pinchflat.Tasks.create_task() + + task + end +end diff --git a/test/support/scripts/yt-dlp-mocks/repeater.sh b/test/support/scripts/yt-dlp-mocks/repeater.sh index 169303d2..da53a84f 100755 --- a/test/support/scripts/yt-dlp-mocks/repeater.sh +++ b/test/support/scripts/yt-dlp-mocks/repeater.sh @@ -1,7 +1,16 @@ #!/bin/bash -if [[ "$@" == *"--dump-json"* ]]; then - echo '{ "args": "'$@'"}' -else - echo $@ -fi +# Args come in the format of " --print-to-file ". +# I need to extract and write all args to it. + +# Extract the file location (in an unknown position BUT it's 2 args after --print-to-file). +for ((i = 1; i <= $#; i++)); do + if [ "${!i}" == "--print-to-file" ]; then + # Extract the file location. + file_location="${@:i+2:1}" + break + fi +done + +# Write all args to the file +echo "$@" >"$file_location" diff --git a/test/support/testing_helper_methods.ex b/test/support/testing_helper_methods.ex new file mode 100644 index 00000000..09f16adb --- /dev/null +++ b/test/support/testing_helper_methods.ex @@ -0,0 +1,43 @@ +defmodule Pinchflat.TestingHelperMethods do + @moduledoc false + + use ExUnit.CaseTemplate + + def now do + DateTime.utc_now() + end + + def now_plus(offset, unit) when unit in [:minute, :minutes] do + DateTime.add(now(), offset, :minute) + end + + def assert_changed(checker_fun, action_fn) do + before_res = checker_fun.() + action_fn.() + after_res = checker_fun.() + + assert before_res != after_res + end + + def assert_changed([from: from, to: to], checker_fun, action_fn) do + before_res = checker_fun.() + action_fn.() + after_res = checker_fun.() + + assert before_res == from + assert after_res == to + end + + def render_metadata(metadata_name) do + json_filepath = + Path.join([ + File.cwd!(), + "test", + "support", + "files", + "#{metadata_name}.json" + ]) + + File.read!(json_filepath) + end +end diff --git a/test/test_helper.exs b/test/test_helper.exs index 2511d464..40d12027 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1,5 +1,6 @@ -Mox.defmock(CommandRunnerMock, for: Pinchflat.DownloaderBackends.BackendCommandRunner) -Application.put_env(:pinchflat, :yt_dlp_runner, CommandRunnerMock) +Mox.defmock(YtDlpRunnerMock, for: Pinchflat.MediaClient.Backends.BackendCommandRunner) +Application.put_env(:pinchflat, :yt_dlp_runner, YtDlpRunnerMock) ExUnit.start() Ecto.Adapters.SQL.Sandbox.mode(Pinchflat.Repo, :manual) +Faker.start()