From 33baa99aaec8ed0381912f1b8fc0304a64411623 Mon Sep 17 00:00:00 2001 From: Kieran Date: Tue, 12 Mar 2024 17:54:55 -0700 Subject: [PATCH] Refactor modules into contexts (#78) * [WIP] break out a few contexts, start refactoring fast index modules * [WIP] more contexts, this time around slow indexing and downloads * [WIP] got all tests passing * [WIP] Added moduledocs * Built a genserver to rename old jobs on boot * Added a module naming check; moved things around * Fixed specs --- .credo.exs | 11 +- .iex.exs | 13 +- config/config.exs | 2 +- dump_all.sql | 401 ++++++++++++++++++ lib/pinchflat/application.ex | 3 +- .../{workers => boot}/data_backfill_worker.ex | 4 +- .../post_job_startup_tasks.ex} | 14 +- lib/pinchflat/boot/pre_job_startup_tasks.ex | 73 ++++ .../download_option_builder.ex | 4 +- .../downloading/downloading_helpers.ex | 50 +++ .../media_download_worker.ex | 6 +- .../media_downloader.ex | 6 +- .../output_path}/base.ex | 4 +- .../output_path}/parser.ex | 4 +- .../output_path_builder.ex | 4 +- .../fast_indexing/fast_indexing_helpers.ex | 94 ++++ .../fast_indexing_worker.ex | 6 +- .../media_indexing_worker.ex | 8 +- .../{api => fast_indexing}/youtube_rss.ex | 2 +- .../filesystem_data_worker.ex | 6 +- .../filesystem_helpers.ex} | 19 +- lib/pinchflat/{ => media}/media.ex | 2 +- lib/pinchflat/media/media_item.ex | 6 +- .../media/media_items_search_index.ex | 2 +- .../{media => metadata}/media_metadata.ex | 2 +- lib/pinchflat/{ => profiles}/profiles.ex | 0 lib/pinchflat/{ => settings}/settings.ex | 0 .../file_follower_server.ex | 2 +- .../media_collection_indexing_worker.ex | 14 +- .../slow_indexing_helpers.ex} | 123 +----- lib/pinchflat/{ => sources}/sources.ex | 18 +- lib/pinchflat/tasks/media_item_tasks.ex | 61 --- lib/pinchflat/{ => tasks}/tasks.ex | 0 .../{backend => }/backend_command_runner.ex | 2 +- .../yt_dlp/{backend => }/command_runner.ex | 6 +- lib/pinchflat/yt_dlp/{backend => }/media.ex | 2 +- .../yt_dlp/{backend => }/media_collection.ex | 8 +- mix.exs | 1 + mix.lock | 1 + .../data_backfill_worker_test.exs | 6 +- .../boot/pre_job_startup_tasks_test.exs | 25 ++ .../download_option_builder_test.exs | 4 +- .../downloading/downloading_helpers_test.exs | 75 ++++ .../media_download_worker_test.exs | 6 +- .../media_downloader_test.exs | 4 +- .../output_path}/parser_test.exs | 4 +- .../downloading}/output_path_builder_test.exs | 4 +- .../fast_indexing_helpers_test.exs | 142 +++++++ .../fast_indexing_worker_test.exs | 4 +- .../media_indexing_worker_test.exs | 6 +- .../youtube_rss_test.exs | 4 +- .../filesystem_data_worker_test.exs | 4 +- .../filesystem/filesystem_helpers_test.exs | 36 ++ test/pinchflat/media_test.exs | 2 +- .../metadata/metadata_parser_test.exs | 2 +- .../file_follower_server_test.exs | 8 +- .../media_collection_indexing_worker_test.exs | 8 +- .../slow_indexing_helpers_test.exs} | 169 ++------ test/pinchflat/sources_test.exs | 12 +- test/pinchflat/startup_tasks_test.exs | 16 - .../tasks/media_items_tasks_test.exs | 103 ----- .../pinchflat/utils/filesystem_utils_test.exs | 16 - .../{backend => }/command_runner_test.exs | 4 +- .../{backend => }/media_collection_test.exs | 6 +- .../yt_dlp/{backend => }/media_test.exs | 4 +- test/test_helper.exs | 2 +- 66 files changed, 1092 insertions(+), 568 deletions(-) create mode 100644 dump_all.sql rename lib/pinchflat/{workers => boot}/data_backfill_worker.ex (94%) rename lib/pinchflat/{startup_tasks.ex => boot/post_job_startup_tasks.ex} (81%) create mode 100644 lib/pinchflat/boot/pre_job_startup_tasks.ex rename lib/pinchflat/{yt_dlp => downloading}/download_option_builder.ex (97%) create mode 100644 lib/pinchflat/downloading/downloading_helpers.ex rename lib/pinchflat/{workers => downloading}/media_download_worker.ex (90%) rename lib/pinchflat/{yt_dlp => downloading}/media_downloader.ex (92%) rename lib/pinchflat/{rendered_string => downloading/output_path}/base.ex (92%) rename lib/pinchflat/{rendered_string => downloading/output_path}/parser.ex (92%) rename lib/pinchflat/{profiles => downloading}/output_path_builder.ex (93%) create mode 100644 lib/pinchflat/fast_indexing/fast_indexing_helpers.ex rename lib/pinchflat/{workers => fast_indexing}/fast_indexing_worker.ex (85%) rename lib/pinchflat/{workers => fast_indexing}/media_indexing_worker.ex (87%) rename lib/pinchflat/{api => fast_indexing}/youtube_rss.ex (97%) rename lib/pinchflat/{workers => filesystem}/filesystem_data_worker.ex (76%) rename lib/pinchflat/{utils/filesystem_utils.ex => filesystem/filesystem_helpers.ex} (57%) rename lib/pinchflat/{ => media}/media.ex (99%) rename lib/pinchflat/{media => metadata}/media_metadata.ex (94%) rename lib/pinchflat/{ => profiles}/profiles.ex (100%) rename lib/pinchflat/{ => settings}/settings.ex (100%) rename lib/pinchflat/{utils/filesystem_utils => slow_indexing}/file_follower_server.ex (98%) rename lib/pinchflat/{workers => slow_indexing}/media_collection_indexing_worker.ex (90%) rename lib/pinchflat/{tasks/source_tasks.ex => slow_indexing/slow_indexing_helpers.ex} (55%) rename lib/pinchflat/{ => sources}/sources.ex (93%) delete mode 100644 lib/pinchflat/tasks/media_item_tasks.ex rename lib/pinchflat/{ => tasks}/tasks.ex (100%) rename lib/pinchflat/yt_dlp/{backend => }/backend_command_runner.ex (87%) rename lib/pinchflat/yt_dlp/{backend => }/command_runner.ex (94%) rename lib/pinchflat/yt_dlp/{backend => }/media.ex (98%) rename lib/pinchflat/yt_dlp/{backend => }/media_collection.ex (91%) rename test/pinchflat/{workers => boot}/data_backfill_worker_test.exs (92%) create mode 100644 test/pinchflat/boot/pre_job_startup_tasks_test.exs rename test/pinchflat/{yt_dlp => downloading}/download_option_builder_test.exs (98%) create mode 100644 test/pinchflat/downloading/downloading_helpers_test.exs rename test/pinchflat/{workers => downloading}/media_download_worker_test.exs (94%) rename test/pinchflat/{yt_dlp => downloading}/media_downloader_test.exs (97%) rename test/pinchflat/{rendered_string => downloading/output_path}/parser_test.exs (93%) rename test/{profiles => pinchflat/downloading}/output_path_builder_test.exs (89%) create mode 100644 test/pinchflat/fast_indexing/fast_indexing_helpers_test.exs rename test/pinchflat/{workers => fast_indexing}/fast_indexing_worker_test.exs (92%) rename test/pinchflat/{workers => fast_indexing}/media_indexing_worker_test.exs (87%) rename test/pinchflat/{api => fast_indexing}/youtube_rss_test.exs (96%) rename test/pinchflat/{workers => filesystem}/filesystem_data_worker_test.exs (77%) create mode 100644 test/pinchflat/filesystem/filesystem_helpers_test.exs rename test/pinchflat/{utils/filesystem_utils => slow_indexing}/file_follower_server_test.exs (84%) rename test/pinchflat/{workers => slow_indexing}/media_collection_indexing_worker_test.exs (96%) rename test/pinchflat/{tasks/source_tasks_test.exs => slow_indexing/slow_indexing_helpers_test.exs} (59%) delete mode 100644 test/pinchflat/startup_tasks_test.exs delete mode 100644 test/pinchflat/tasks/media_items_tasks_test.exs delete mode 100644 test/pinchflat/utils/filesystem_utils_test.exs rename test/pinchflat/yt_dlp/{backend => }/command_runner_test.exs (95%) rename test/pinchflat/yt_dlp/{backend => }/media_collection_test.exs (96%) rename test/pinchflat/yt_dlp/{backend => }/media_test.exs (98%) diff --git a/.credo.exs b/.credo.exs index f5085d3..8b4586a 100644 --- a/.credo.exs +++ b/.credo.exs @@ -157,7 +157,16 @@ {Credo.Check.Warning.UnusedRegexOperation, []}, {Credo.Check.Warning.UnusedStringOperation, []}, {Credo.Check.Warning.UnusedTupleOperation, []}, - {Credo.Check.Warning.WrongTestFileExtension, []} + {Credo.Check.Warning.WrongTestFileExtension, []}, + + # + ## Naming Checks + # + {CredoNaming.Check.Consistency.ModuleFilename, + [ + priority: :normal, + excluded_paths: [~r/test\/support/, ~r/priv/, ~r/lib\/pinchflat_web/, ~r/test\/pinchflat_web/] + ]} ], disabled: [ # diff --git a/.iex.exs b/.iex.exs index bf39442..3773ca2 100644 --- a/.iex.exs +++ b/.iex.exs @@ -4,8 +4,7 @@ alias Pinchflat.Repo alias Pinchflat.Tasks.Task alias Pinchflat.Sources.Source alias Pinchflat.Media.MediaItem -alias Pinchflat.Tasks.SourceTasks -alias Pinchflat.Media.MediaMetadata +alias Pinchflat.Metadata.MediaMetadata alias Pinchflat.Profiles.MediaProfile alias Pinchflat.Tasks @@ -14,14 +13,14 @@ alias Pinchflat.Profiles alias Pinchflat.Sources alias Pinchflat.Settings -alias Pinchflat.MediaClient.MediaDownloader -alias Pinchflat.YtDlp.Backend.Media, as: YtDlpMedia -alias Pinchflat.YtDlp.Backend.MediaCollection, as: YtDlpCollection +alias Pinchflat.Downloading.MediaDownloader +alias Pinchflat.YtDlp.Media, as: YtDlpMedia +alias Pinchflat.YtDlp.MediaCollection, as: YtDlpCollection -alias Pinchflat.Api.YoutubeRss +alias Pinchflat.FastIndexing.YoutubeRss alias Pinchflat.Metadata.MetadataFileHelpers -alias Pinchflat.Utils.FilesystemUtils.FileFollowerServer +alias Pinchflat.SlowIndexing.FileFollowerServer defmodule IexHelpers do def playlist_url do diff --git a/config/config.exs b/config/config.exs index fba9c7e..cb1b7d1 100644 --- a/config/config.exs +++ b/config/config.exs @@ -12,7 +12,7 @@ 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.YtDlp.Backend.CommandRunner, + yt_dlp_runner: Pinchflat.YtDlp.CommandRunner, media_directory: "/downloads", # The user may or may not store metadata for their needs, but the app will always store its copy metadata_directory: "/config/metadata", diff --git a/dump_all.sql b/dump_all.sql new file mode 100644 index 0000000..3b5ae3a --- /dev/null +++ b/dump_all.sql @@ -0,0 +1,401 @@ +PRAGMA foreign_keys=OFF; +CREATE TABLE IF NOT EXISTS "schema_migrations" ("version" INTEGER PRIMARY KEY, "inserted_at" TEXT); +INSERT INTO schema_migrations VALUES(20240122030944,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240123174417,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240125025325,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240125043813,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240125165519,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240125212753,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240129015810,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240130161316,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240131042824,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240131182114,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240131183153,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240202190351,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240205194558,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240205215634,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240206201218,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240206204740,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240208194729,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240210005919,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240210045410,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240210051038,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240215215205,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240220215056,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240223184259,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240302194115,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240303021902,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240306173305,'2024-03-07T18:24:34'); +INSERT INTO schema_migrations VALUES(20240309052602,'2024-03-09T05:26:56'); +INSERT INTO schema_migrations VALUES(20240309182418,'2024-03-10T23:44:38'); +INSERT INTO schema_migrations VALUES(20240310230713,'2024-03-10T23:44:38'); +INSERT INTO schema_migrations VALUES(20240311033214,'2024-03-11T03:32:45'); +CREATE TABLE IF NOT EXISTS "media_profiles" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT NOT NULL, "output_path_template" TEXT NOT NULL, "inserted_at" TEXT NOT NULL, "updated_at" TEXT NOT NULL, "download_subs" INTEGER DEFAULT true NOT NULL, "download_auto_subs" INTEGER DEFAULT true NOT NULL, "embed_subs" INTEGER DEFAULT true NOT NULL, "sub_langs" TEXT DEFAULT 'en' NOT NULL, "download_thumbnail" INTEGER DEFAULT true NOT NULL, "embed_thumbnail" INTEGER DEFAULT true NOT NULL, "shorts_behaviour" TEXT DEFAULT 'include' NOT NULL, "livestream_behaviour" TEXT DEFAULT 'include' NOT NULL, "download_metadata" INTEGER DEFAULT true NOT NULL, "embed_metadata" INTEGER DEFAULT true NOT NULL, "preferred_resolution" TEXT DEFAULT '1080p' NOT NULL); +CREATE TABLE IF NOT EXISTS "sources" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "collection_name" TEXT NOT NULL, "collection_id" TEXT NOT NULL, "collection_type" TEXT NOT NULL, "original_url" TEXT NOT NULL, "media_profile_id" INTEGER NOT NULL CONSTRAINT "sources_media_profile_id_fkey" REFERENCES "media_profiles"("id") ON DELETE RESTRICT, "inserted_at" TEXT NOT NULL, "updated_at" TEXT NOT NULL, "index_frequency_minutes" INTEGER DEFAULT 1440 NOT NULL, "download_media" INTEGER DEFAULT true NOT NULL, "last_indexed_at" TEXT, "custom_name" TEXT NOT NULL, "fast_index" INTEGER DEFAULT false NOT NULL, "download_cutoff_date" TEXT); +CREATE TABLE IF NOT EXISTS "media_items" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "media_id" TEXT NOT NULL, "title" TEXT, "media_filepath" TEXT, "source_id" INTEGER NOT NULL CONSTRAINT "media_items_source_id_fkey" REFERENCES "sources"("id") ON DELETE RESTRICT, "inserted_at" TEXT NOT NULL, "updated_at" TEXT NOT NULL, "subtitle_filepaths" TEXT DEFAULT ('[]'), "thumbnail_filepath" TEXT, "metadata_filepath" TEXT, "livestream" INTEGER DEFAULT false NOT NULL, "original_url" TEXT NOT NULL, "media_downloaded_at" TEXT, "details_updated_at" TEXT, "description" TEXT, "media_size_bytes" INTEGER, "short_form_content" INTEGER DEFAULT false NOT NULL, "upload_date" TEXT DEFAULT '1970-01-01' NOT NULL); +CREATE TABLE IF NOT EXISTS "oban_jobs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "state" TEXT DEFAULT 'available' NOT NULL, "queue" TEXT DEFAULT 'default' NOT NULL, "worker" TEXT NOT NULL, "args" JSON DEFAULT ('{}') NOT NULL, "meta" JSON DEFAULT ('{}') NOT NULL, "tags" JSON DEFAULT ('[]') NOT NULL, "errors" JSON DEFAULT ('[]') NOT NULL, "attempt" INTEGER DEFAULT 0 NOT NULL, "max_attempts" INTEGER DEFAULT 20 NOT NULL, "priority" INTEGER DEFAULT 0 NOT NULL, "inserted_at" TEXT DEFAULT CURRENT_TIMESTAMP NOT NULL, "scheduled_at" TEXT DEFAULT CURRENT_TIMESTAMP NOT NULL, "attempted_at" TEXT, "attempted_by" JSON DEFAULT ('[]') NOT NULL, "cancelled_at" TEXT, "completed_at" TEXT, "discarded_at" TEXT); +INSERT INTO oban_jobs VALUES(1,'completed','media_indexing','Pinchflat.FastIndexing.MediaIndexingWorker','{"id":1}','{}','["media_source","media_indexing"]','[]',1,20,0,'2024-03-07 18:25:26','2024-03-07 18:25:26','2024-03-07T18:25:26.854662','["53cbe73c3670"]',NULL,'2024-03-07T18:25:33.089129',NULL); +INSERT INTO oban_jobs VALUES(2,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":1}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-07 18:25:28','2024-03-07 18:25:28','2024-03-07T18:25:28.885247','["53cbe73c3670"]',NULL,'2024-03-07T18:25:41.357837',NULL); +INSERT INTO oban_jobs VALUES(3,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":2}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-07 18:25:30','2024-03-07 18:25:30','2024-03-07T18:25:30.898089','["53cbe73c3670"]',NULL,'2024-03-07T18:25:40.003369',NULL); +INSERT INTO oban_jobs VALUES(4,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":3}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-07 18:25:31','2024-03-07 18:25:31','2024-03-07T18:25:40.010089','["53cbe73c3670"]',NULL,'2024-03-07T18:25:44.162010',NULL); +INSERT INTO oban_jobs VALUES(5,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":2}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-07 18:25:39','2024-03-07 18:25:39','2024-03-07T18:25:40.007139','["53cbe73c3670"]',NULL,'2024-03-07T18:25:40.015253',NULL); +INSERT INTO oban_jobs VALUES(6,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":1}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-07 18:25:41','2024-03-07 18:25:41','2024-03-07T18:25:41.362075','["53cbe73c3670"]',NULL,'2024-03-07T18:25:41.367568',NULL); +INSERT INTO oban_jobs VALUES(7,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":3}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-07 18:25:44','2024-03-07 18:25:44','2024-03-07T18:25:44.166666','["53cbe73c3670"]',NULL,'2024-03-07T18:25:44.172178',NULL); +INSERT INTO oban_jobs VALUES(8,'completed','media_indexing','Pinchflat.FastIndexing.MediaIndexingWorker','{"id":2}','{}','["media_source","media_indexing"]','[]',1,20,0,'2024-03-07 21:24:15','2024-03-07 21:24:15','2024-03-07T21:24:15.204831','["53cbe73c3670"]',NULL,'2024-03-07T21:24:20.795394',NULL); +INSERT INTO oban_jobs VALUES(9,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":4}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-07 21:24:18','2024-03-07 21:24:18','2024-03-07T21:24:18.234022','["53cbe73c3670"]',NULL,'2024-03-07T21:24:29.462784',NULL); +INSERT INTO oban_jobs VALUES(10,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":5}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-07 21:24:19','2024-03-07 21:24:19','2024-03-07T21:24:19.245494','["53cbe73c3670"]',NULL,'2024-03-07T21:24:27.570848',NULL); +INSERT INTO oban_jobs VALUES(11,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":6}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-07 21:24:20','2024-03-07 21:24:20','2024-03-07T21:24:20.493604','["53cbe73c3670"]',NULL,'2024-03-07T21:24:26.524574',NULL); +INSERT INTO oban_jobs VALUES(12,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":6}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-07 21:24:26','2024-03-07 21:24:26','2024-03-07T21:24:26.523267','["53cbe73c3670"]',NULL,'2024-03-07T21:24:26.536349',NULL); +INSERT INTO oban_jobs VALUES(13,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":5}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-07 21:24:27','2024-03-07 21:24:27','2024-03-07T21:24:27.572914','["53cbe73c3670"]',NULL,'2024-03-07T21:24:27.579954',NULL); +INSERT INTO oban_jobs VALUES(14,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":4}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-07 21:24:29','2024-03-07 21:24:29','2024-03-07T21:24:29.465960','["53cbe73c3670"]',NULL,'2024-03-07T21:24:29.474190',NULL); +INSERT INTO oban_jobs VALUES(15,'completed','media_indexing','Pinchflat.FastIndexing.MediaIndexingWorker','{"id":3}','{}','["media_source","media_indexing"]','[]',1,20,0,'2024-03-07 21:25:12','2024-03-07 21:25:12','2024-03-07T21:25:12.814519','["53cbe73c3670"]',NULL,'2024-03-07T21:25:18.211587',NULL); +INSERT INTO oban_jobs VALUES(16,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":7}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-07 21:25:14','2024-03-07 21:25:14','2024-03-07T21:25:14.838588','["53cbe73c3670"]',NULL,'2024-03-07T21:25:25.417553',NULL); +INSERT INTO oban_jobs VALUES(17,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":8}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-07 21:25:16','2024-03-07 21:25:16','2024-03-07T21:25:16.859632','["53cbe73c3670"]',NULL,'2024-03-07T21:25:24.367804',NULL); +INSERT INTO oban_jobs VALUES(18,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":9}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-07 21:25:17','2024-03-07 21:25:17','2024-03-07T21:25:18.746963','["53cbe73c3670"]',NULL,'2024-03-07T21:25:23.629327',NULL); +INSERT INTO oban_jobs VALUES(19,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":9}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-07 21:25:23','2024-03-07 21:25:23','2024-03-07T21:25:23.631966','["53cbe73c3670"]',NULL,'2024-03-07T21:25:23.640338',NULL); +INSERT INTO oban_jobs VALUES(20,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":8}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-07 21:25:24','2024-03-07 21:25:24','2024-03-07T21:25:24.370592','["53cbe73c3670"]',NULL,'2024-03-07T21:25:24.377932',NULL); +INSERT INTO oban_jobs VALUES(21,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":7}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-07 21:25:25','2024-03-07 21:25:25','2024-03-07T21:25:25.421791','["53cbe73c3670"]',NULL,'2024-03-07T21:25:25.427506',NULL); +INSERT INTO oban_jobs VALUES(22,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":3}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 03:25:38','2024-03-10 03:25:38','2024-03-10T03:25:38.585081','["53cbe73c3670"]',NULL,'2024-03-10T03:25:39.367251',NULL); +INSERT INTO oban_jobs VALUES(23,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":3}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 03:25:39','2024-03-10T03:26:39.360398','2024-03-10T03:26:39.923971','["53cbe73c3670"]',NULL,'2024-03-10T03:26:39.956904',NULL); +INSERT INTO oban_jobs VALUES(24,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":3}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 03:26:39','2024-03-10T03:27:39.948047','2024-03-10T03:27:40.306093','["53cbe73c3670"]',NULL,'2024-03-10T03:27:40.335000',NULL); +INSERT INTO oban_jobs VALUES(25,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":3}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 03:27:40','2024-03-10T03:28:40.330147','2024-03-10T03:28:40.700158','["53cbe73c3670"]',NULL,'2024-03-10T03:28:40.745435',NULL); +INSERT INTO oban_jobs VALUES(26,'cancelled','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":3}','{}','["media_source","fast_indexing"]','[]',0,20,0,'2024-03-10 03:28:40','2024-03-10T03:29:40.738368',NULL,'[]','2024-03-10T03:29:30.142976',NULL,NULL); +INSERT INTO oban_jobs VALUES(27,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":3}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-10 03:29:30','2024-03-10 03:29:30','2024-03-10T03:29:30.156903','["53cbe73c3670"]',NULL,'2024-03-10T03:29:37.076647',NULL); +INSERT INTO oban_jobs VALUES(28,'cancelled','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":3}','{}','["media_source","fast_indexing"]','[]',0,20,0,'2024-03-10 03:29:37','2024-03-10T03:44:37.068757',NULL,'[]','2024-03-10T03:31:01.098454',NULL,NULL); +INSERT INTO oban_jobs VALUES(29,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":3}','{}','["media_source","media_collection_indexing"]','[]',0,20,0,'2024-03-10 03:29:37','2024-04-09T03:29:37.073151',NULL,'[]','2024-03-11T03:30:14.847932',NULL,NULL); +INSERT INTO oban_jobs VALUES(30,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":3}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 03:31:01','2024-03-10 03:31:01','2024-03-10T03:31:01.112728','["53cbe73c3670"]',NULL,'2024-03-10T03:31:01.177789',NULL); +INSERT INTO oban_jobs VALUES(31,'cancelled','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":3}','{}','["media_source","fast_indexing"]','[]',0,20,0,'2024-03-10 03:31:01','2024-03-10T03:46:01.172093',NULL,'[]','2024-03-10T03:31:21.310920',NULL,NULL); +INSERT INTO oban_jobs VALUES(32,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":4}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-10 20:36:50','2024-03-10 20:36:50','2024-03-10T20:36:50.193590','["53cbe73c3670"]',NULL,'2024-03-10T20:36:52.605887',NULL); +INSERT INTO oban_jobs VALUES(33,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":10}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-10 20:36:52','2024-03-10 20:36:52','2024-03-10T20:36:52.599039','["53cbe73c3670"]',NULL,'2024-03-10T20:37:04.159797',NULL); +INSERT INTO oban_jobs VALUES(34,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 20:36:52','2024-03-10T20:38:52.597023','2024-03-10T20:38:53.383997','["53cbe73c3670"]',NULL,'2024-03-10T20:38:53.926359',NULL); +INSERT INTO oban_jobs VALUES(35,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":4}','{}','["media_source","media_collection_indexing"]','[]',0,20,0,'2024-03-10 20:36:52','2024-04-09T20:36:52.601495',NULL,'[]','2024-03-11T05:57:06.374748',NULL,NULL); +INSERT INTO oban_jobs VALUES(36,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":10}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-10 20:37:04','2024-03-10 20:37:04','2024-03-10T20:37:04.163201','["53cbe73c3670"]',NULL,'2024-03-10T20:37:04.170371',NULL); +INSERT INTO oban_jobs VALUES(37,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 20:38:53','2024-03-10T20:40:53.913240','2024-03-10T20:40:54.193260','["53cbe73c3670"]',NULL,'2024-03-10T20:40:54.389280',NULL); +INSERT INTO oban_jobs VALUES(38,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 20:40:54','2024-03-10T20:42:54.381872','2024-03-10T20:42:55.081455','["53cbe73c3670"]',NULL,'2024-03-10T20:42:55.171425',NULL); +INSERT INTO oban_jobs VALUES(39,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 20:42:55','2024-03-10T20:44:55.165804','2024-03-10T20:44:55.772626','["53cbe73c3670"]',NULL,'2024-03-10T20:44:56.241978',NULL); +INSERT INTO oban_jobs VALUES(40,'completed','media_indexing','Pinchflat.FastIndexing.MediaIndexingWorker','{"id":4,"media_url":"https://www.youtube.com/watch?v=rswr-IOX6SI"}','{}','["media_source","media_indexing"]','[]',1,20,0,'2024-03-10 20:44:56','2024-03-10 20:44:56','2024-03-10T20:44:56.236030','["53cbe73c3670"]',NULL,'2024-03-10T20:44:58.238395',NULL); +INSERT INTO oban_jobs VALUES(41,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 20:44:56','2024-03-10T20:46:56.236255','2024-03-10T20:46:56.460701','["53cbe73c3670"]',NULL,'2024-03-10T20:46:56.541386',NULL); +INSERT INTO oban_jobs VALUES(42,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 20:46:56','2024-03-10T20:48:56.536910','2024-03-10T20:48:57.120695','["53cbe73c3670"]',NULL,'2024-03-10T20:48:57.206293',NULL); +INSERT INTO oban_jobs VALUES(43,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 20:48:57','2024-03-10T20:50:57.200728','2024-03-10T20:50:57.889932','["53cbe73c3670"]',NULL,'2024-03-10T20:50:57.967262',NULL); +INSERT INTO oban_jobs VALUES(44,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 20:50:57','2024-03-10T20:52:57.963110','2024-03-10T20:52:58.602727','["53cbe73c3670"]',NULL,'2024-03-10T20:52:58.793127',NULL); +INSERT INTO oban_jobs VALUES(45,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 20:52:58','2024-03-10T20:54:58.786175','2024-03-10T20:54:59.339792','["53cbe73c3670"]',NULL,'2024-03-10T20:54:59.450202',NULL); +INSERT INTO oban_jobs VALUES(46,'completed','media_indexing','Pinchflat.FastIndexing.MediaIndexingWorker','{"id":4,"media_url":"https://www.youtube.com/watch?v=-aw7u7C9sUw"}','{}','["media_source","media_indexing"]','[]',1,20,0,'2024-03-10 20:54:59','2024-03-10 20:54:59','2024-03-10T20:54:59.439673','["53cbe73c3670"]',NULL,'2024-03-10T20:55:01.474220',NULL); +INSERT INTO oban_jobs VALUES(47,'completed','media_indexing','Pinchflat.FastIndexing.MediaIndexingWorker','{"id":4,"media_url":"https://www.youtube.com/watch?v=Lz_Du7IPk08"}','{}','["media_source","media_indexing"]','[]',1,20,0,'2024-03-10 20:54:59','2024-03-10 20:54:59','2024-03-10T20:54:59.439673','["53cbe73c3670"]',NULL,'2024-03-10T20:55:01.521710',NULL); +INSERT INTO oban_jobs VALUES(48,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 20:54:59','2024-03-10T20:56:59.440747','2024-03-10T20:56:59.920248','["53cbe73c3670"]',NULL,'2024-03-10T20:57:00.004646',NULL); +INSERT INTO oban_jobs VALUES(49,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":12}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-10 20:55:01','2024-03-10 20:55:01','2024-03-10T20:55:01.478053','["53cbe73c3670"]',NULL,'2024-03-10T20:55:22.310804',NULL); +INSERT INTO oban_jobs VALUES(50,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":13}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-10 20:55:01','2024-03-10 20:55:01','2024-03-10T20:55:01.524992','["53cbe73c3670"]',NULL,'2024-03-10T20:55:20.388596',NULL); +INSERT INTO oban_jobs VALUES(51,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":13}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-10 20:55:20','2024-03-10 20:55:20','2024-03-10T20:55:20.391711','["53cbe73c3670"]',NULL,'2024-03-10T20:55:20.396870',NULL); +INSERT INTO oban_jobs VALUES(52,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":12}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-10 20:55:22','2024-03-10 20:55:22','2024-03-10T20:55:22.313999','["53cbe73c3670"]',NULL,'2024-03-10T20:55:22.320456',NULL); +INSERT INTO oban_jobs VALUES(53,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 20:56:59','2024-03-10T20:58:59.998536','2024-03-10T20:59:00.638279','["53cbe73c3670"]',NULL,'2024-03-10T20:59:00.731592',NULL); +INSERT INTO oban_jobs VALUES(54,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 20:59:00','2024-03-10T21:01:00.723054','2024-03-10T21:01:01.283486','["53cbe73c3670"]',NULL,'2024-03-10T21:01:01.609670',NULL); +INSERT INTO oban_jobs VALUES(55,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 21:01:01','2024-03-10T21:03:01.596992','2024-03-10T21:03:01.908622','["53cbe73c3670"]',NULL,'2024-03-10T21:03:01.998777',NULL); +INSERT INTO oban_jobs VALUES(56,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 21:03:01','2024-03-10T21:05:01.990935','2024-03-10T21:05:02.598057','["53cbe73c3670"]',NULL,'2024-03-10T21:05:02.705070',NULL); +INSERT INTO oban_jobs VALUES(57,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 21:05:02','2024-03-10T21:07:02.684679','2024-03-10T21:07:03.225034','["53cbe73c3670"]',NULL,'2024-03-10T21:07:03.311141',NULL); +INSERT INTO oban_jobs VALUES(58,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-10 21:07:03','2024-03-10T21:09:03.304480','2024-03-10T21:09:03.875726','["53cbe73c3670"]',NULL,'2024-03-10T21:09:04.254014',NULL); +INSERT INTO oban_jobs VALUES(59,'completed','media_indexing','Pinchflat.FastIndexing.MediaIndexingWorker','{"id":4,"media_url":"https://www.youtube.com/watch?v=M_CMSfV9QOI"}','{}','["media_source","media_indexing"]','[]',1,20,0,'2024-03-10 21:09:04','2024-03-10 21:09:04','2024-03-10T21:09:04.242661','["53cbe73c3670"]',NULL,'2024-03-10T21:09:06.350150',NULL); +INSERT INTO oban_jobs VALUES(60,'cancelled','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":4}','{}','["media_source","fast_indexing"]','[]',0,20,0,'2024-03-10 21:09:04','2024-03-10T21:11:04.241273',NULL,'[]','2024-03-10T21:10:52.592020',NULL,NULL); +INSERT INTO oban_jobs VALUES(61,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-10 22:07:41','2024-03-10 22:07:41','2024-03-10T22:07:41.131902','["53cbe73c3670"]',NULL,'2024-03-10T22:07:41.143599',NULL); +INSERT INTO oban_jobs VALUES(62,'cancelled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-10 22:07:41','2024-03-10T23:07:41.140412',NULL,'[]','2024-03-10T22:08:42.276662',NULL,NULL); +INSERT INTO oban_jobs VALUES(63,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-10 22:08:42','2024-03-10 22:08:42','2024-03-10T22:08:42.313234','["53cbe73c3670"]',NULL,'2024-03-10T22:08:42.325997',NULL); +INSERT INTO oban_jobs VALUES(64,'cancelled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-10 22:08:42','2024-03-10T23:08:42.321733',NULL,'[]','2024-03-10T22:09:02.322406',NULL,NULL); +INSERT INTO oban_jobs VALUES(65,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-10 22:09:02','2024-03-10 22:09:02','2024-03-10T22:09:02.364109','["53cbe73c3670"]',NULL,'2024-03-10T22:09:02.381904',NULL); +INSERT INTO oban_jobs VALUES(66,'cancelled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-10 22:09:02','2024-03-10T23:09:02.378380',NULL,'[]','2024-03-10T23:06:38.464339',NULL,NULL); +INSERT INTO oban_jobs VALUES(67,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-10 23:06:38','2024-03-10 23:06:38','2024-03-10T23:06:38.506328','["53cbe73c3670"]',NULL,'2024-03-10T23:06:38.528846',NULL); +INSERT INTO oban_jobs VALUES(68,'cancelled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-10 23:06:38','2024-03-11T00:06:38.524676',NULL,'[]','2024-03-10T23:15:09.779493',NULL,NULL); +INSERT INTO oban_jobs VALUES(69,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-10 23:15:09','2024-03-10 23:15:09','2024-03-10T23:15:09.804436','["53cbe73c3670"]',NULL,'2024-03-10T23:15:09.819208',NULL); +INSERT INTO oban_jobs VALUES(70,'cancelled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-10 23:15:09','2024-03-11T00:15:09.815175',NULL,'[]','2024-03-10T23:15:28.741174',NULL,NULL); +INSERT INTO oban_jobs VALUES(71,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-10 23:15:28','2024-03-10 23:15:28','2024-03-10T23:15:28.780212','["53cbe73c3670"]',NULL,'2024-03-10T23:15:28.799120',NULL); +INSERT INTO oban_jobs VALUES(72,'cancelled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-10 23:15:28','2024-03-11T00:15:28.795653',NULL,'[]','2024-03-10T23:16:31.400988',NULL,NULL); +INSERT INTO oban_jobs VALUES(73,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-10 23:16:31','2024-03-10 23:16:31','2024-03-10T23:16:31.442766','["53cbe73c3670"]',NULL,'2024-03-10T23:16:31.462027',NULL); +INSERT INTO oban_jobs VALUES(74,'cancelled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-10 23:16:31','2024-03-11T00:16:31.459378',NULL,'[]','2024-03-10T23:44:44.772608',NULL,NULL); +INSERT INTO oban_jobs VALUES(75,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-10 23:44:44','2024-03-10 23:44:44','2024-03-10T23:44:44.811111','["53cbe73c3670"]',NULL,'2024-03-10T23:44:44.826657',NULL); +INSERT INTO oban_jobs VALUES(76,'cancelled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-10 23:44:44','2024-03-11T00:44:44.823891',NULL,'[]','2024-03-10T23:49:25.378326',NULL,NULL); +INSERT INTO oban_jobs VALUES(77,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-10 23:49:25','2024-03-10 23:49:25','2024-03-10T23:49:25.411606','["53cbe73c3670"]',NULL,'2024-03-10T23:49:25.422548',NULL); +INSERT INTO oban_jobs VALUES(78,'cancelled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-10 23:49:25','2024-03-11T00:49:25.419170',NULL,'[]','2024-03-10T23:53:33.580797',NULL,NULL); +INSERT INTO oban_jobs VALUES(79,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','["{\"error\":\"** (ArgumentError) schema Pinchflat.Media.MediaItem does not have association or embed :media_metadata\\n (elixir 1.16.1) lib/enum.ex:2528: Enum.\\\"-reduce/3-lists^foldl/2-0-\\\"/3\\n (pinchflat 0.1.0-alpha) lib/pinchflat/workers/data_backfill_worker.ex:75: Pinchflat.Workers.DataBackfillWorker.backfill_upload_date/0\\n (pinchflat 0.1.0-alpha) lib/pinchflat/workers/data_backfill_worker.ex:48: Pinchflat.Workers.DataBackfillWorker.perform/1\\n (oban 2.17.3) lib/oban/queue/executor.ex:129: Oban.Queue.Executor.perform/1\\n (oban 2.17.3) lib/oban/queue/executor.ex:74: Oban.Queue.Executor.call/1\\n (elixir 1.16.1) lib/task/supervised.ex:101: Task.Supervised.invoke_mfa/2\\n (elixir 1.16.1) lib/task/supervised.ex:36: Task.Supervised.reply/4\\n\",\"at\":\"2024-03-10T23:53:33.635253Z\",\"attempt\":1}"]',2,20,0,'2024-03-10 23:53:33','2024-03-10T23:53:50.635270','2024-03-10T23:53:51.297283','["53cbe73c3670"]',NULL,'2024-03-10T23:53:51.303156',NULL); +INSERT INTO oban_jobs VALUES(80,'cancelled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-10 23:53:51','2024-03-11T00:53:51.300467',NULL,'[]','2024-03-10T23:53:51.421925',NULL,NULL); +INSERT INTO oban_jobs VALUES(81,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-10 23:53:51','2024-03-10 23:53:51','2024-03-10T23:53:51.457974','["53cbe73c3670"]',NULL,'2024-03-10T23:53:51.505047',NULL); +INSERT INTO oban_jobs VALUES(82,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-10 23:53:51','2024-03-11T00:53:51.501083','2024-03-11T01:43:12.532483','["53cbe73c3670"]',NULL,'2024-03-11T01:43:12.549091',NULL); +INSERT INTO oban_jobs VALUES(83,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 01:43:12','2024-03-11T02:43:12.540549','2024-03-11T03:07:37.110623','["53cbe73c3670"]',NULL,'2024-03-11T03:07:37.136537',NULL); +INSERT INTO oban_jobs VALUES(84,'cancelled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-11 03:07:37','2024-03-11T04:07:37.124321',NULL,'[]','2024-03-11T03:28:33.578841',NULL,NULL); +INSERT INTO oban_jobs VALUES(85,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 03:28:33','2024-03-11 03:28:33','2024-03-11T03:28:33.617517','["53cbe73c3670"]',NULL,'2024-03-11T03:28:33.634506',NULL); +INSERT INTO oban_jobs VALUES(86,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 03:28:33','2024-03-11T04:28:33.631292','2024-03-11T04:28:34.229507','["53cbe73c3670"]',NULL,'2024-03-11T04:28:34.243231',NULL); +INSERT INTO oban_jobs VALUES(87,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":3}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 03:30:14','2024-03-11 03:30:14','2024-03-11T03:30:14.861632','["53cbe73c3670"]',NULL,'2024-03-11T03:30:22.141028',NULL); +INSERT INTO oban_jobs VALUES(88,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":3}','{}','["media_source","media_collection_indexing"]','[]',0,20,0,'2024-03-11 03:30:22','2024-03-18T03:30:22.136564',NULL,'[]','2024-03-11T03:45:20.989515',NULL,NULL); +INSERT INTO oban_jobs VALUES(89,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":5}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 03:45:37','2024-03-11 03:45:37','2024-03-11T03:45:37.225630','["53cbe73c3670"]',NULL,'2024-03-11T03:45:44.088028',NULL); +INSERT INTO oban_jobs VALUES(90,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":22}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 03:45:40','2024-03-11 03:45:40','2024-03-11T03:45:40.297340','["53cbe73c3670"]',NULL,'2024-03-11T03:45:59.917922',NULL); +INSERT INTO oban_jobs VALUES(91,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":23}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 03:45:41','2024-03-11 03:45:41','2024-03-11T03:45:41.318340','["53cbe73c3670"]',NULL,'2024-03-11T03:45:58.815951',NULL); +INSERT INTO oban_jobs VALUES(92,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":24}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 03:45:43','2024-03-11 03:45:43','2024-03-11T03:45:58.823229','["53cbe73c3670"]',NULL,'2024-03-11T03:46:05.674503',NULL); +INSERT INTO oban_jobs VALUES(93,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":5}','{}','["media_source","media_collection_indexing"]','[]',0,20,0,'2024-03-11 03:45:44','2024-03-12T03:45:44.083558',NULL,'[]','2024-03-11T03:46:25.206549',NULL,NULL); +INSERT INTO oban_jobs VALUES(94,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":23}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 03:45:58','2024-03-11 03:45:58','2024-03-11T03:45:58.819221','["53cbe73c3670"]',NULL,'2024-03-11T03:45:58.824638',NULL); +INSERT INTO oban_jobs VALUES(95,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":22}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 03:45:59','2024-03-11 03:45:59','2024-03-11T03:45:59.922255','["53cbe73c3670"]',NULL,'2024-03-11T03:45:59.928460',NULL); +INSERT INTO oban_jobs VALUES(96,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":24}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 03:46:05','2024-03-11 03:46:05','2024-03-11T03:46:05.678641','["53cbe73c3670"]',NULL,'2024-03-11T03:46:05.685029',NULL); +INSERT INTO oban_jobs VALUES(97,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":6}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 03:47:19','2024-03-11 03:47:19','2024-03-11T03:47:19.320123','["53cbe73c3670"]',NULL,'2024-03-11T03:47:25.960008',NULL); +INSERT INTO oban_jobs VALUES(98,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":30}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 03:47:23','2024-03-11 03:47:23','2024-03-11T03:47:23.375087','["53cbe73c3670"]',NULL,'2024-03-11T03:47:31.974710',NULL); +INSERT INTO oban_jobs VALUES(99,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":31}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 03:47:25','2024-03-11 03:47:25','2024-03-11T03:47:25.394139','["53cbe73c3670"]',NULL,'2024-03-11T03:47:32.841518',NULL); +INSERT INTO oban_jobs VALUES(100,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":6}','{}','["media_source","media_collection_indexing"]','[]',0,20,0,'2024-03-11 03:47:25','2024-03-12T03:47:25.954278',NULL,'[]','2024-03-11T05:57:06.451471',NULL,NULL); +INSERT INTO oban_jobs VALUES(101,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":30}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 03:47:31','2024-03-11 03:47:31','2024-03-11T03:47:31.977091','["53cbe73c3670"]',NULL,'2024-03-11T03:47:31.986590',NULL); +INSERT INTO oban_jobs VALUES(102,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":31}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 03:47:32','2024-03-11 03:47:32','2024-03-11T03:47:32.844115','["53cbe73c3670"]',NULL,'2024-03-11T03:47:32.851351',NULL); +INSERT INTO oban_jobs VALUES(103,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":7}','{}','["media_source","media_collection_indexing"]','["{\"error\":\"** (Oban.PerformError) Pinchflat.Workers.MediaCollectionIndexingWorker failed with {:cancel, :shutdown}\",\"at\":\"2024-03-11T03:49:57.366932Z\",\"attempt\":1}"]',1,20,0,'2024-03-11 03:49:45','2024-03-11 03:49:45','2024-03-11T03:49:45.973138','["53cbe73c3670"]','2024-03-11T03:49:57.366941',NULL,NULL); +INSERT INTO oban_jobs VALUES(104,'cancelled','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":36}','{}','["media_item","media_fetching"]','["{\"error\":\"** (Oban.PerformError) Pinchflat.Workers.MediaDownloadWorker failed with {:cancel, :shutdown}\",\"at\":\"2024-03-11T03:49:57.261970Z\",\"attempt\":1}"]',1,20,0,'2024-03-11 03:49:49','2024-03-11 03:49:49','2024-03-11T03:49:49.039212','["53cbe73c3670"]','2024-03-11T03:49:57.261988',NULL,NULL); +INSERT INTO oban_jobs VALUES(105,'cancelled','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":37}','{}','["media_item","media_fetching"]','["{\"error\":\"** (Oban.PerformError) Pinchflat.Workers.MediaDownloadWorker failed with {:cancel, :shutdown}\",\"at\":\"2024-03-11T03:49:57.285891Z\",\"attempt\":1}"]',1,20,0,'2024-03-11 03:49:50','2024-03-11 03:49:50','2024-03-11T03:49:50.057360','["53cbe73c3670"]','2024-03-11T03:49:57.285899',NULL,NULL); +INSERT INTO oban_jobs VALUES(106,'cancelled','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":38}','{}','["media_item","media_fetching"]','["{\"error\":\"** (Oban.PerformError) Pinchflat.Workers.MediaDownloadWorker failed with {:cancel, :shutdown}\",\"at\":\"2024-03-11T03:49:57.298656Z\",\"attempt\":1}"]',1,20,0,'2024-03-11 03:49:52','2024-03-11 03:49:52','2024-03-11T03:49:57.263071','["53cbe73c3670"]','2024-03-11T03:49:57.298667',NULL,NULL); +INSERT INTO oban_jobs VALUES(107,'cancelled','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":39}','{}','["media_item","media_fetching"]','["{\"error\":\"** (Oban.PerformError) Pinchflat.Workers.MediaDownloadWorker failed with {:cancel, :shutdown}\",\"at\":\"2024-03-11T03:49:57.320154Z\",\"attempt\":1}"]',1,20,0,'2024-03-11 03:49:54','2024-03-11 03:49:54','2024-03-11T03:49:57.293978','["53cbe73c3670"]','2024-03-11T03:49:57.320163',NULL,NULL); +INSERT INTO oban_jobs VALUES(108,'cancelled','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":40}','{}','["media_item","media_fetching"]','["{\"error\":\"** (Oban.PerformError) Pinchflat.Workers.MediaDownloadWorker failed with {:cancel, :shutdown}\",\"at\":\"2024-03-11T03:49:57.340755Z\",\"attempt\":1}"]',1,20,0,'2024-03-11 03:49:55','2024-03-11 03:49:55','2024-03-11T03:49:57.303771','["53cbe73c3670"]','2024-03-11T03:49:57.340769',NULL,NULL); +INSERT INTO oban_jobs VALUES(109,'cancelled','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":41}','{}','["media_item","media_fetching"]','["{\"error\":\"** (Oban.PerformError) Pinchflat.Workers.MediaDownloadWorker failed with {:cancel, :shutdown}\",\"at\":\"2024-03-11T03:49:57.359114Z\",\"attempt\":1}"]',1,20,0,'2024-03-11 03:49:57','2024-03-11 03:49:57','2024-03-11T03:49:57.330344','["53cbe73c3670"]','2024-03-11T03:49:57.359123',NULL,NULL); +INSERT INTO oban_jobs VALUES(110,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":8}','{}','["media_source","media_collection_indexing"]','["{\"error\":\"** (Oban.PerformError) Pinchflat.Workers.MediaCollectionIndexingWorker failed with {:cancel, :shutdown}\",\"at\":\"2024-03-11T04:00:11.744062Z\",\"attempt\":1}"]',1,20,0,'2024-03-11 04:00:03','2024-03-11 04:00:03','2024-03-11T04:00:03.574066','["53cbe73c3670"]','2024-03-11T04:00:11.744071',NULL,NULL); +INSERT INTO oban_jobs VALUES(111,'cancelled','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":42}','{}','["media_item","media_fetching"]','["{\"error\":\"** (Oban.PerformError) Pinchflat.Workers.MediaDownloadWorker failed with {:cancel, :shutdown}\",\"at\":\"2024-03-11T04:00:11.648553Z\",\"attempt\":1}"]',1,20,0,'2024-03-11 04:00:06','2024-03-11 04:00:06','2024-03-11T04:00:06.611121','["53cbe73c3670"]','2024-03-11T04:00:11.648562',NULL,NULL); +INSERT INTO oban_jobs VALUES(112,'cancelled','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":43}','{}','["media_item","media_fetching"]','["{\"error\":\"** (Oban.PerformError) Pinchflat.Workers.MediaDownloadWorker failed with {:cancel, :shutdown}\",\"at\":\"2024-03-11T04:00:11.669526Z\",\"attempt\":1}"]',1,20,0,'2024-03-11 04:00:07','2024-03-11 04:00:07','2024-03-11T04:00:07.632128','["53cbe73c3670"]','2024-03-11T04:00:11.669535',NULL,NULL); +INSERT INTO oban_jobs VALUES(113,'cancelled','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":44}','{}','["media_item","media_fetching"]','["{\"error\":\"** (Oban.PerformError) Pinchflat.Workers.MediaDownloadWorker failed with {:cancel, :shutdown}\",\"at\":\"2024-03-11T04:00:11.683733Z\",\"attempt\":1}"]',1,20,0,'2024-03-11 04:00:09','2024-03-11 04:00:09','2024-03-11T04:00:11.653972','["53cbe73c3670"]','2024-03-11T04:00:11.683745',NULL,NULL); +INSERT INTO oban_jobs VALUES(114,'cancelled','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":45}','{}','["media_item","media_fetching"]','["{\"error\":\"** (Oban.PerformError) Pinchflat.Workers.MediaDownloadWorker failed with {:cancel, :shutdown}\",\"at\":\"2024-03-11T04:00:11.740576Z\",\"attempt\":1}"]',1,20,0,'2024-03-11 04:00:10','2024-03-11 04:00:10','2024-03-11T04:00:11.679060','["53cbe73c3670"]','2024-03-11T04:00:11.740588',NULL,NULL); +INSERT INTO oban_jobs VALUES(115,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":9}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 04:00:34','2024-03-11 04:00:34','2024-03-11T04:00:34.214030','["53cbe73c3670"]',NULL,'2024-03-11T04:00:59.437101',NULL); +INSERT INTO oban_jobs VALUES(116,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":53}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 04:00:48','2024-03-11 04:00:48','2024-03-11T04:00:48.426421','["53cbe73c3670"]',NULL,'2024-03-11T04:01:04.877494',NULL); +INSERT INTO oban_jobs VALUES(117,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":54}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 04:00:49','2024-03-11 04:00:49','2024-03-11T04:00:49.448246','["53cbe73c3670"]',NULL,'2024-03-11T04:01:08.278661',NULL); +INSERT INTO oban_jobs VALUES(118,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":55}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 04:00:51','2024-03-11 04:00:51','2024-03-11T04:01:04.883994','["53cbe73c3670"]',NULL,'2024-03-11T04:01:22.929551',NULL); +INSERT INTO oban_jobs VALUES(119,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":56}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 04:00:52','2024-03-11 04:00:52','2024-03-11T04:01:08.285022','["53cbe73c3670"]',NULL,'2024-03-11T04:01:32.121503',NULL); +INSERT INTO oban_jobs VALUES(120,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":57}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 04:00:54','2024-03-11 04:00:54','2024-03-11T04:01:22.936095','["53cbe73c3670"]',NULL,'2024-03-11T04:01:39.594334',NULL); +INSERT INTO oban_jobs VALUES(121,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":58}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 04:00:56','2024-03-11 04:00:56','2024-03-11T04:01:32.128064','["53cbe73c3670"]',NULL,'2024-03-11T04:01:53.410415',NULL); +INSERT INTO oban_jobs VALUES(122,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":59}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 04:00:57','2024-03-11 04:00:57','2024-03-11T04:01:39.600894','["53cbe73c3670"]',NULL,'2024-03-11T04:02:10.425664',NULL); +INSERT INTO oban_jobs VALUES(123,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":74}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 04:00:59','2024-03-11 04:00:59','2024-03-11T04:01:53.416897','["53cbe73c3670"]',NULL,'2024-03-11T04:02:24.580915',NULL); +INSERT INTO oban_jobs VALUES(124,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":9}','{}','["media_source","media_collection_indexing"]','[]',0,20,0,'2024-03-11 04:00:59','2024-03-12T04:00:59.433908',NULL,'[]','2024-03-11T05:57:06.752483',NULL,NULL); +INSERT INTO oban_jobs VALUES(125,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":53}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 04:01:04','2024-03-11 04:01:04','2024-03-11T04:01:04.881025','["53cbe73c3670"]',NULL,'2024-03-11T04:01:04.885071',NULL); +INSERT INTO oban_jobs VALUES(126,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":54}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 04:01:08','2024-03-11 04:01:08','2024-03-11T04:01:08.282576','["53cbe73c3670"]',NULL,'2024-03-11T04:01:08.285988',NULL); +INSERT INTO oban_jobs VALUES(127,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":55}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 04:01:22','2024-03-11 04:01:22','2024-03-11T04:01:22.934104','["53cbe73c3670"]',NULL,'2024-03-11T04:01:22.940223',NULL); +INSERT INTO oban_jobs VALUES(128,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":56}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 04:01:32','2024-03-11 04:01:32','2024-03-11T04:01:32.126090','["53cbe73c3670"]',NULL,'2024-03-11T04:01:32.133803',NULL); +INSERT INTO oban_jobs VALUES(129,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":57}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 04:01:39','2024-03-11 04:01:39','2024-03-11T04:01:39.598884','["53cbe73c3670"]',NULL,'2024-03-11T04:01:39.604125',NULL); +INSERT INTO oban_jobs VALUES(130,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":58}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 04:01:53','2024-03-11 04:01:53','2024-03-11T04:01:53.412997','["53cbe73c3670"]',NULL,'2024-03-11T04:01:53.418405',NULL); +INSERT INTO oban_jobs VALUES(131,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":59}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 04:02:10','2024-03-11 04:02:10','2024-03-11T04:02:10.429241','["53cbe73c3670"]',NULL,'2024-03-11T04:02:10.437091',NULL); +INSERT INTO oban_jobs VALUES(132,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":74}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 04:02:24','2024-03-11 04:02:24','2024-03-11T04:02:24.584094','["53cbe73c3670"]',NULL,'2024-03-11T04:02:24.594079',NULL); +INSERT INTO oban_jobs VALUES(133,'cancelled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-11 04:28:34','2024-03-11T05:28:34.240324',NULL,'[]','2024-03-11T04:54:56.927865',NULL,NULL); +INSERT INTO oban_jobs VALUES(134,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 04:54:56','2024-03-11 04:54:56','2024-03-11T04:54:56.969378','["53cbe73c3670"]',NULL,'2024-03-11T04:54:56.985252',NULL); +INSERT INTO oban_jobs VALUES(135,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 04:54:56','2024-03-11T05:54:56.983006','2024-03-11T05:54:57.840064','["53cbe73c3670"]',NULL,'2024-03-11T05:54:57.905154',NULL); +INSERT INTO oban_jobs VALUES(137,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":10}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 05:58:07','2024-03-11 05:58:07','2024-03-11T05:58:07.318512','["53cbe73c3670"]',NULL,'2024-03-11T05:58:13.881967',NULL); +INSERT INTO oban_jobs VALUES(138,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":75}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 05:58:10','2024-03-11 05:58:10','2024-03-11T05:58:10.355354','["53cbe73c3670"]',NULL,'2024-03-11T05:58:31.071323',NULL); +INSERT INTO oban_jobs VALUES(139,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":76}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 05:58:11','2024-03-11 05:58:11','2024-03-11T05:58:11.371479','["53cbe73c3670"]',NULL,'2024-03-11T05:58:26.787009',NULL); +INSERT INTO oban_jobs VALUES(140,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":77}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 05:58:12','2024-03-11 05:58:12','2024-03-11T05:58:12.958211','["53cbe73c3670"]',NULL,'2024-03-11T05:58:24.682201',NULL); +INSERT INTO oban_jobs VALUES(141,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":10}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-11 05:58:13','2024-03-11T06:13:13.873841','2024-03-11T06:13:14.341720','["53cbe73c3670"]',NULL,'2024-03-11T06:13:15.016993',NULL); +INSERT INTO oban_jobs VALUES(142,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":10}','{}','["media_source","media_collection_indexing"]','[]',0,20,0,'2024-03-11 05:58:13','2024-04-10T05:58:13.877902',NULL,'[]','2024-03-11T15:44:54.088395',NULL,NULL); +INSERT INTO oban_jobs VALUES(143,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":77}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 05:58:24','2024-03-11 05:58:24','2024-03-11T05:58:24.681293','["53cbe73c3670"]',NULL,'2024-03-11T05:58:24.704674',NULL); +INSERT INTO oban_jobs VALUES(144,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":76}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 05:58:26','2024-03-11 05:58:26','2024-03-11T05:58:26.790760','["53cbe73c3670"]',NULL,'2024-03-11T05:58:26.797522',NULL); +INSERT INTO oban_jobs VALUES(145,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":75}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 05:58:31','2024-03-11 05:58:31','2024-03-11T05:58:31.075774','["53cbe73c3670"]',NULL,'2024-03-11T05:58:31.081442',NULL); +INSERT INTO oban_jobs VALUES(146,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":10}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-11 06:13:15','2024-03-11T06:28:15.007753','2024-03-11T15:21:51.202135','["53cbe73c3670"]',NULL,'2024-03-11T15:21:51.752627',NULL); +INSERT INTO oban_jobs VALUES(147,'completed','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":10}','{}','["media_source","fast_indexing"]','[]',1,20,0,'2024-03-11 15:21:51','2024-03-11T15:36:51.744913','2024-03-11T15:37:52.214134','["53cbe73c3670"]',NULL,'2024-03-11T15:37:52.724052',NULL); +INSERT INTO oban_jobs VALUES(148,'cancelled','fast_indexing','Pinchflat.FastIndexing.FastIndexingWorker','{"id":10}','{}','["media_source","fast_indexing"]','[]',0,20,0,'2024-03-11 15:37:52','2024-03-11T15:52:52.392093',NULL,'[]','2024-03-11T15:44:54.095763',NULL,NULL); +INSERT INTO oban_jobs VALUES(149,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":11}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 15:45:06','2024-03-11 15:45:06','2024-03-11T15:45:06.080280','["53cbe73c3670"]',NULL,'2024-03-11T15:45:12.747089',NULL); +INSERT INTO oban_jobs VALUES(150,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":82}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 15:45:09','2024-03-11 15:45:09','2024-03-11T15:45:09.107091','["53cbe73c3670"]',NULL,'2024-03-11T15:45:20.828597',NULL); +INSERT INTO oban_jobs VALUES(151,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":83}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 15:45:10','2024-03-11 15:45:10','2024-03-11T15:45:10.124215','["53cbe73c3670"]',NULL,'2024-03-11T15:45:19.238242',NULL); +INSERT INTO oban_jobs VALUES(152,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":84}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 15:45:12','2024-03-11 15:45:12','2024-03-11T15:45:12.474614','["53cbe73c3670"]',NULL,'2024-03-11T15:45:18.965597',NULL); +INSERT INTO oban_jobs VALUES(153,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":11}','{}','["media_source","media_collection_indexing"]','[]',0,20,0,'2024-03-11 15:45:12','2024-04-10T15:45:12.740090',NULL,'[]','2024-03-11T21:37:51.860536',NULL,NULL); +INSERT INTO oban_jobs VALUES(154,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":84}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 15:45:18','2024-03-11 15:45:18','2024-03-11T15:45:18.968605','["53cbe73c3670"]',NULL,'2024-03-11T15:45:18.975371',NULL); +INSERT INTO oban_jobs VALUES(155,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":83}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 15:45:19','2024-03-11 15:45:19','2024-03-11T15:45:19.242052','["53cbe73c3670"]',NULL,'2024-03-11T15:45:19.246560',NULL); +INSERT INTO oban_jobs VALUES(156,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":82}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 15:45:20','2024-03-11 15:45:20','2024-03-11T15:45:20.832113','["53cbe73c3670"]',NULL,'2024-03-11T15:45:20.839234',NULL); +INSERT INTO oban_jobs VALUES(157,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 16:49:18','2024-03-11 16:49:18','2024-03-11T16:49:18.969455','["d0bc65fe04ad"]',NULL,'2024-03-11T16:49:18.985152',NULL); +INSERT INTO oban_jobs VALUES(158,'cancelled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-11 16:49:18','2024-03-11T17:49:18.982705',NULL,'[]','2024-03-11T16:49:37.294954',NULL,NULL); +INSERT INTO oban_jobs VALUES(159,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 16:49:37','2024-03-11 16:49:37','2024-03-11T16:49:37.337683','["d0bc65fe04ad"]',NULL,'2024-03-11T16:49:37.352389',NULL); +INSERT INTO oban_jobs VALUES(160,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 16:49:37','2024-03-11T17:49:37.350357','2024-03-11T17:49:38.062126','["d0bc65fe04ad"]',NULL,'2024-03-11T17:49:38.080893',NULL); +INSERT INTO oban_jobs VALUES(161,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 17:49:38','2024-03-11T18:49:38.074908','2024-03-11T18:49:38.599064','["d0bc65fe04ad"]',NULL,'2024-03-11T18:49:38.610867',NULL); +INSERT INTO oban_jobs VALUES(162,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 18:49:38','2024-03-11T19:49:38.606034','2024-03-11T19:49:38.933315','["d0bc65fe04ad"]',NULL,'2024-03-11T19:49:38.955745',NULL); +INSERT INTO oban_jobs VALUES(163,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":12}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 19:48:38','2024-03-11 19:48:38','2024-03-11T19:48:38.622472','["d0bc65fe04ad"]',NULL,'2024-03-11T19:48:40.176917',NULL); +INSERT INTO oban_jobs VALUES(164,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":89}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 19:48:40','2024-03-11 19:48:40','2024-03-11T19:48:40.181036','["d0bc65fe04ad"]',NULL,'2024-03-11T19:48:42.756368',NULL); +INSERT INTO oban_jobs VALUES(165,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":89}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 19:48:42','2024-03-11 19:48:42','2024-03-11T19:48:42.760044','["d0bc65fe04ad"]',NULL,'2024-03-11T19:48:42.767669',NULL); +INSERT INTO oban_jobs VALUES(166,'executing','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 19:49:38','2024-03-11T20:49:38.949449','2024-03-11T20:53:22.154635','["d0bc65fe04ad"]',NULL,NULL,NULL); +INSERT INTO oban_jobs VALUES(167,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":13}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 19:53:05','2024-03-11 19:53:05','2024-03-11T19:53:05.662103','["d0bc65fe04ad"]',NULL,'2024-03-11T19:53:07.255034',NULL); +INSERT INTO oban_jobs VALUES(168,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":90}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 19:53:07','2024-03-11 19:53:07','2024-03-11T19:53:07.258388','["d0bc65fe04ad"]',NULL,'2024-03-11T19:53:16.346708',NULL); +INSERT INTO oban_jobs VALUES(169,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":90}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 19:53:16','2024-03-11 19:53:16','2024-03-11T19:53:16.349173','["d0bc65fe04ad"]',NULL,'2024-03-11T19:53:16.355237',NULL); +INSERT INTO oban_jobs VALUES(170,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":14}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 19:56:55','2024-03-11 19:56:55','2024-03-11T19:56:55.481577','["d0bc65fe04ad"]',NULL,'2024-03-11T19:56:57.059003',NULL); +INSERT INTO oban_jobs VALUES(171,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":91}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 19:56:57','2024-03-11 19:56:57','2024-03-11T19:56:57.062594','["d0bc65fe04ad"]',NULL,'2024-03-11T19:57:05.391641',NULL); +INSERT INTO oban_jobs VALUES(172,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":91}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 19:57:05','2024-03-11 19:57:05','2024-03-11T19:57:05.395751','["d0bc65fe04ad"]',NULL,'2024-03-11T19:57:05.405887',NULL); +INSERT INTO oban_jobs VALUES(173,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":15}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 20:00:28','2024-03-11 20:00:28','2024-03-11T20:00:28.138794','["d0bc65fe04ad"]',NULL,'2024-03-11T20:00:29.688475',NULL); +INSERT INTO oban_jobs VALUES(174,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":92}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 20:00:29','2024-03-11 20:00:29','2024-03-11T20:00:29.687817','["d0bc65fe04ad"]',NULL,'2024-03-11T20:00:37.445341',NULL); +INSERT INTO oban_jobs VALUES(175,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":15}','{}','["media_source","media_collection_indexing"]','[]',0,20,0,'2024-03-11 20:00:29','2024-04-10T20:00:29.684335',NULL,'[]','2024-03-11T20:02:29.735300',NULL,NULL); +INSERT INTO oban_jobs VALUES(176,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":92}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 20:00:37','2024-03-11 20:00:37','2024-03-11T20:00:37.449105','["d0bc65fe04ad"]',NULL,'2024-03-11T20:00:37.456417',NULL); +INSERT INTO oban_jobs VALUES(177,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":16}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 20:02:49','2024-03-11 20:02:49','2024-03-11T20:02:49.488309','["d0bc65fe04ad"]',NULL,'2024-03-11T20:02:51.316544',NULL); +INSERT INTO oban_jobs VALUES(178,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":93}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 20:02:51','2024-03-11 20:02:51','2024-03-11T20:02:51.318722','["d0bc65fe04ad"]',NULL,'2024-03-11T20:02:58.858689',NULL); +INSERT INTO oban_jobs VALUES(179,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":93}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 20:02:58','2024-03-11 20:02:58','2024-03-11T20:02:58.862353','["d0bc65fe04ad"]',NULL,'2024-03-11T20:02:58.869710',NULL); +INSERT INTO oban_jobs VALUES(180,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":17}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 20:05:33','2024-03-11 20:05:33','2024-03-11T20:05:33.408891','["d0bc65fe04ad"]',NULL,'2024-03-11T20:05:35.329844',NULL); +INSERT INTO oban_jobs VALUES(181,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":94}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 20:05:35','2024-03-11 20:05:35','2024-03-11T20:05:35.332659','["d0bc65fe04ad"]',NULL,'2024-03-11T20:05:43.945647',NULL); +INSERT INTO oban_jobs VALUES(182,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":94}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 20:05:43','2024-03-11 20:05:43','2024-03-11T20:05:43.949846','["d0bc65fe04ad"]',NULL,'2024-03-11T20:05:43.955834',NULL); +INSERT INTO oban_jobs VALUES(183,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":18}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 20:06:40','2024-03-11 20:06:40','2024-03-11T20:06:40.643149','["d0bc65fe04ad"]',NULL,'2024-03-11T20:06:42.231885',NULL); +INSERT INTO oban_jobs VALUES(184,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":95}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 20:06:42','2024-03-11 20:06:42','2024-03-11T20:06:42.236738','["d0bc65fe04ad"]',NULL,'2024-03-11T20:06:50.095663',NULL); +INSERT INTO oban_jobs VALUES(185,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":95}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 20:06:50','2024-03-11 20:06:50','2024-03-11T20:06:50.100135','["d0bc65fe04ad"]',NULL,'2024-03-11T20:06:50.107858',NULL); +INSERT INTO oban_jobs VALUES(186,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":19}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 20:17:50','2024-03-11 20:17:50','2024-03-11T20:17:50.204196','["d0bc65fe04ad"]',NULL,'2024-03-11T20:17:51.939603',NULL); +INSERT INTO oban_jobs VALUES(187,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":96}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 20:17:51','2024-03-11 20:17:51','2024-03-11T20:17:51.930188','["d0bc65fe04ad"]',NULL,'2024-03-11T20:17:59.706052',NULL); +INSERT INTO oban_jobs VALUES(188,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":96}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 20:17:59','2024-03-11 20:17:59','2024-03-11T20:17:59.709952','["d0bc65fe04ad"]',NULL,'2024-03-11T20:17:59.716619',NULL); +INSERT INTO oban_jobs VALUES(189,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":19}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 20:20:26','2024-03-11 20:20:26','2024-03-11T20:20:26.852669','["d0bc65fe04ad"]',NULL,'2024-03-11T20:20:29.609190',NULL); +INSERT INTO oban_jobs VALUES(190,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":99}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 20:20:29','2024-03-11 20:20:29','2024-03-11T20:20:29.609643','["d0bc65fe04ad"]',NULL,'2024-03-11T20:20:36.184941',NULL); +INSERT INTO oban_jobs VALUES(191,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":19}','{}','["media_source","media_collection_indexing"]','[]',0,20,0,'2024-03-11 20:20:29','2024-04-10T20:20:29.606086',NULL,'[]','2024-03-11T20:22:44.201545',NULL,NULL); +INSERT INTO oban_jobs VALUES(192,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":99}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 20:20:36','2024-03-11 20:20:36','2024-03-11T20:20:36.188632','["d0bc65fe04ad"]',NULL,'2024-03-11T20:20:36.193428',NULL); +INSERT INTO oban_jobs VALUES(193,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":19}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 20:22:44','2024-03-11 20:22:44','2024-03-11T20:22:44.211582','["d0bc65fe04ad"]',NULL,'2024-03-11T20:22:48.943049',NULL); +INSERT INTO oban_jobs VALUES(194,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":104}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 20:22:48','2024-03-11 20:22:48','2024-03-11T20:22:48.945751','["d0bc65fe04ad"]',NULL,'2024-03-11T20:22:57.792943',NULL); +INSERT INTO oban_jobs VALUES(195,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":19}','{}','["media_source","media_collection_indexing"]','[]',0,20,0,'2024-03-11 20:22:48','2024-03-18T20:22:48.940784',NULL,'[]','2024-03-11T20:53:22.144755',NULL,NULL); +INSERT INTO oban_jobs VALUES(196,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":104}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 20:22:57','2024-03-11 20:22:57','2024-03-11T20:22:57.797550','["d0bc65fe04ad"]',NULL,'2024-03-11T20:22:57.802926',NULL); +INSERT INTO oban_jobs VALUES(197,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 20:53:22','2024-03-11T21:53:22.159099','2024-03-11T21:53:22.310521','["d0bc65fe04ad"]',NULL,'2024-03-11T21:53:22.331217',NULL); +INSERT INTO oban_jobs VALUES(198,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":20}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 20:53:44','2024-03-11 20:53:44','2024-03-11T20:53:44.404261','["d0bc65fe04ad"]',NULL,'2024-03-11T20:53:49.205948',NULL); +INSERT INTO oban_jobs VALUES(199,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":105}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 20:53:46','2024-03-11 20:53:46','2024-03-11T20:53:46.437784','["d0bc65fe04ad"]',NULL,'2024-03-11T20:53:48.661498',NULL); +INSERT INTO oban_jobs VALUES(200,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":106}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 20:53:47','2024-03-11 20:53:47','2024-03-11T20:53:47.458289','["d0bc65fe04ad"]',NULL,'2024-03-11T20:53:49.422489',NULL); +INSERT INTO oban_jobs VALUES(201,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":105}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 20:53:48','2024-03-11 20:53:48','2024-03-11T20:53:48.665222','["d0bc65fe04ad"]',NULL,'2024-03-11T20:53:48.670010',NULL); +INSERT INTO oban_jobs VALUES(202,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":109}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 20:53:49','2024-03-11 20:53:49','2024-03-11T20:53:49.205340','["d0bc65fe04ad"]',NULL,'2024-03-11T20:53:52.798318',NULL); +INSERT INTO oban_jobs VALUES(203,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":20}','{}','["media_source","media_collection_indexing"]','[]',0,20,0,'2024-03-11 20:53:49','2024-04-10T20:53:49.202249',NULL,'[]','2024-03-11T20:55:37.775902',NULL,NULL); +INSERT INTO oban_jobs VALUES(204,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":106}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 20:53:49','2024-03-11 20:53:49','2024-03-11T20:53:49.427268','["d0bc65fe04ad"]',NULL,'2024-03-11T20:53:49.430604',NULL); +INSERT INTO oban_jobs VALUES(205,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":109}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 20:53:52','2024-03-11 20:53:52','2024-03-11T20:53:52.802410','["d0bc65fe04ad"]',NULL,'2024-03-11T20:53:52.809845',NULL); +INSERT INTO oban_jobs VALUES(206,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":21}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 20:57:03','2024-03-11 20:57:03','2024-03-11T20:57:03.111087','["d0bc65fe04ad"]',NULL,'2024-03-11T20:57:08.070242',NULL); +INSERT INTO oban_jobs VALUES(207,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":110}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 20:57:05','2024-03-11 20:57:05','2024-03-11T20:57:05.176926','["d0bc65fe04ad"]',NULL,'2024-03-11T20:57:07.161099',NULL); +INSERT INTO oban_jobs VALUES(208,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":111}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 20:57:06','2024-03-11 20:57:06','2024-03-11T20:57:06.221282','["d0bc65fe04ad"]',NULL,'2024-03-11T20:57:08.220776',NULL); +INSERT INTO oban_jobs VALUES(209,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":110}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 20:57:07','2024-03-11 20:57:07','2024-03-11T20:57:07.164861','["d0bc65fe04ad"]',NULL,'2024-03-11T20:57:07.169743',NULL); +INSERT INTO oban_jobs VALUES(210,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":114}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 20:57:08','2024-03-11 20:57:08','2024-03-11T20:57:08.068895','["d0bc65fe04ad"]',NULL,'2024-03-11T20:57:11.637508',NULL); +INSERT INTO oban_jobs VALUES(211,'cancelled','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":21}','{}','["media_source","media_collection_indexing"]','[]',0,20,0,'2024-03-11 20:57:08','2024-04-10T20:57:08.066524',NULL,'[]','2024-03-11T21:37:57.014066',NULL,NULL); +INSERT INTO oban_jobs VALUES(212,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":111}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 20:57:08','2024-03-11 20:57:08','2024-03-11T20:57:08.224913','["d0bc65fe04ad"]',NULL,'2024-03-11T20:57:08.229602',NULL); +INSERT INTO oban_jobs VALUES(213,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":114}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 20:57:11','2024-03-11 20:57:11','2024-03-11T20:57:11.641962','["d0bc65fe04ad"]',NULL,'2024-03-11T20:57:11.648295',NULL); +INSERT INTO oban_jobs VALUES(214,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":22}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 21:53:19','2024-03-11 21:53:19','2024-03-11T21:53:19.675048','["d0bc65fe04ad"]',NULL,'2024-03-11T21:53:24.699371',NULL); +INSERT INTO oban_jobs VALUES(215,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 21:53:22','2024-03-11T22:53:22.321861','2024-03-11T22:53:22.416090','["d0bc65fe04ad"]',NULL,'2024-03-11T22:53:22.420665',NULL); +INSERT INTO oban_jobs VALUES(216,'completed','media_collection_indexing','Pinchflat.SlowIndexing.MediaCollectionIndexingWorker','{"id":23}','{}','["media_source","media_collection_indexing"]','[]',1,20,0,'2024-03-11 22:03:48','2024-03-11 22:03:48','2024-03-11T22:03:48.376853','["d0bc65fe04ad"]',NULL,'2024-03-11T22:03:53.132261',NULL); +INSERT INTO oban_jobs VALUES(217,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":121}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 22:03:50','2024-03-11 22:03:50','2024-03-11T22:03:50.424519','["d0bc65fe04ad"]',NULL,'2024-03-11T22:04:02.055412',NULL); +INSERT INTO oban_jobs VALUES(218,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":122}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 22:03:51','2024-03-11 22:03:51','2024-03-11T22:03:51.439493','["d0bc65fe04ad"]',NULL,'2024-03-11T22:04:00.067636',NULL); +INSERT INTO oban_jobs VALUES(219,'completed','media_fetching','Pinchflat.Downloading.MediaDownloadWorker','{"id":123}','{}','["media_item","media_fetching"]','[]',1,20,0,'2024-03-11 22:03:52','2024-03-11 22:03:52','2024-03-11T22:03:52.641184','["d0bc65fe04ad"]',NULL,'2024-03-11T22:03:58.689664',NULL); +INSERT INTO oban_jobs VALUES(220,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":123}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 22:03:58','2024-03-11 22:03:58','2024-03-11T22:03:58.688504','["d0bc65fe04ad"]',NULL,'2024-03-11T22:03:58.705680',NULL); +INSERT INTO oban_jobs VALUES(221,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":122}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 22:04:00','2024-03-11 22:04:00','2024-03-11T22:04:00.072137','["d0bc65fe04ad"]',NULL,'2024-03-11T22:04:00.080176',NULL); +INSERT INTO oban_jobs VALUES(222,'completed','media_local_metadata','Pinchflat.Filesystem.FilesystemDataWorker','{"id":121}','{}','["media_item","media_metadata","local_metadata"]','[]',1,1,0,'2024-03-11 22:04:02','2024-03-11 22:04:02','2024-03-11T22:04:02.060142','["d0bc65fe04ad"]',NULL,'2024-03-11T22:04:02.065836',NULL); +INSERT INTO oban_jobs VALUES(223,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 22:53:22','2024-03-11T23:53:22.418928','2024-03-11T23:53:22.934153','["d0bc65fe04ad"]',NULL,'2024-03-11T23:53:22.942893',NULL); +INSERT INTO oban_jobs VALUES(224,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-11 23:53:22','2024-03-12T00:53:22.938886','2024-03-12T00:53:23.297046','["d0bc65fe04ad"]',NULL,'2024-03-12T00:53:23.389365',NULL); +INSERT INTO oban_jobs VALUES(225,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 00:53:23','2024-03-12T01:53:23.385123','2024-03-12T01:53:23.892389','["d0bc65fe04ad"]',NULL,'2024-03-12T01:53:23.911387',NULL); +INSERT INTO oban_jobs VALUES(226,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 01:53:23','2024-03-12T02:53:23.906432','2024-03-12T02:53:23.945895','["d0bc65fe04ad"]',NULL,'2024-03-12T02:53:24.045970',NULL); +INSERT INTO oban_jobs VALUES(227,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 02:53:24','2024-03-12T03:53:24.040472','2024-03-12T03:53:24.879708','["d0bc65fe04ad"]',NULL,'2024-03-12T03:53:24.902580',NULL); +INSERT INTO oban_jobs VALUES(228,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 03:53:24','2024-03-12T04:53:24.896201','2024-03-12T04:53:25.060576','["d0bc65fe04ad"]',NULL,'2024-03-12T04:53:25.081033',NULL); +INSERT INTO oban_jobs VALUES(229,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 04:53:25','2024-03-12T05:53:25.072156','2024-03-12T05:53:25.399764','["d0bc65fe04ad"]',NULL,'2024-03-12T05:53:25.419375',NULL); +INSERT INTO oban_jobs VALUES(230,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 05:53:25','2024-03-12T06:53:25.411849','2024-03-12T06:53:25.932534','["d0bc65fe04ad"]',NULL,'2024-03-12T06:53:26.050695',NULL); +INSERT INTO oban_jobs VALUES(231,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 06:53:26','2024-03-12T07:53:26.039802','2024-03-12T07:53:26.234973','["d0bc65fe04ad"]',NULL,'2024-03-12T07:53:26.248930',NULL); +INSERT INTO oban_jobs VALUES(232,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 07:53:26','2024-03-12T08:53:26.243243','2024-03-12T08:53:26.365756','["d0bc65fe04ad"]',NULL,'2024-03-12T08:53:26.372910',NULL); +INSERT INTO oban_jobs VALUES(233,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 08:53:26','2024-03-12T09:53:26.370621','2024-03-12T09:53:26.837572','["d0bc65fe04ad"]',NULL,'2024-03-12T09:53:26.850148',NULL); +INSERT INTO oban_jobs VALUES(234,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 09:53:26','2024-03-12T10:53:26.845184','2024-03-12T10:53:30.164548','["d0bc65fe04ad"]',NULL,'2024-03-12T10:53:30.187545',NULL); +INSERT INTO oban_jobs VALUES(235,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 10:53:30','2024-03-12T11:53:30.175302','2024-03-12T11:53:30.444237','["d0bc65fe04ad"]',NULL,'2024-03-12T11:53:30.469121',NULL); +INSERT INTO oban_jobs VALUES(236,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 11:53:30','2024-03-12T12:53:30.459022','2024-03-12T12:53:38.278131','["d0bc65fe04ad"]',NULL,'2024-03-12T12:53:38.288868',NULL); +INSERT INTO oban_jobs VALUES(237,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 12:53:38','2024-03-12T13:53:38.283826','2024-03-12T13:53:42.475123','["d0bc65fe04ad"]',NULL,'2024-03-12T13:53:42.493304',NULL); +INSERT INTO oban_jobs VALUES(238,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 13:53:42','2024-03-12T14:53:42.486518','2024-03-12T14:53:42.969743','["d0bc65fe04ad"]',NULL,'2024-03-12T14:53:43.033336',NULL); +INSERT INTO oban_jobs VALUES(239,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 14:53:43','2024-03-12T15:53:43.030105','2024-03-12T15:53:43.373824','["d0bc65fe04ad"]',NULL,'2024-03-12T15:53:43.386228',NULL); +INSERT INTO oban_jobs VALUES(240,'completed','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',1,20,0,'2024-03-12 15:53:43','2024-03-12T16:53:43.383387','2024-03-12T16:53:43.578808','["d0bc65fe04ad"]',NULL,'2024-03-12T16:53:43.611260',NULL); +INSERT INTO oban_jobs VALUES(241,'scheduled','media_local_metadata','Pinchflat.Boot.DataBackfillWorker','{}','{}','["media_item","media_metadata","local_metadata","data_backfill"]','[]',0,20,0,'2024-03-12 16:53:43','2024-03-12T17:53:43.585065',NULL,'[]',NULL,NULL,NULL); +CREATE TABLE IF NOT EXISTS "tasks" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "job_id" INTEGER NOT NULL CONSTRAINT "tasks_job_id_fkey" REFERENCES "oban_jobs"("id") ON DELETE CASCADE, "source_id" INTEGER NULL CONSTRAINT "tasks_source_id_fkey" REFERENCES "sources"("id") ON DELETE RESTRICT, "inserted_at" TEXT NOT NULL, "updated_at" TEXT NOT NULL, "media_item_id" INTEGER NULL CONSTRAINT "tasks_media_item_id_fkey" REFERENCES "media_items"("id") ON DELETE RESTRICT); +CREATE TABLE IF NOT EXISTS "media_metadata" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "media_item_id" INTEGER NOT NULL CONSTRAINT "media_metadata_media_item_id_fkey" REFERENCES "media_items"("id") ON DELETE CASCADE, "inserted_at" TEXT NOT NULL, "updated_at" TEXT NOT NULL, "metadata_filepath" TEXT NOT NULL, "thumbnail_filepath" TEXT NOT NULL); +PRAGMA writable_schema=ON; +INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)VALUES('table','media_items_search_index','media_items_search_index',0,'CREATE VIRTUAL TABLE media_items_search_index USING fts5( + title, + description, + tokenize=porter + )'); +CREATE TABLE IF NOT EXISTS 'media_items_search_index_data'(id INTEGER PRIMARY KEY, block BLOB); +INSERT INTO media_items_search_index_data VALUES(1,X'000000'); +INSERT INTO media_items_search_index_data VALUES(10,X'000000000315822d000e0301010401010501010601010701010801010901010a01010b01010c01010d01010e01010f010110010100051301021201021501021601021701020002010105020103'); +INSERT INTO media_items_search_index_data VALUES(137438953473,X'00000f0b0230300c0901018150010d0101814b0707010a0101826b060f090101811e010b01016005060201300c090101815101090101814c01080101826c10070101610201330d0b0101815a0a0201381e070101720201390d09010181710101310a0901018221020d01018154813e010d0101814a1106010e01018208630d06200308010701012e0703080201310c090101815d0109010181790108010182750201320e0a010181397c0201331e070101640201350a09010181400204363936350c09010182250201381e0701016c02047a6673653207010142060679706d6b616b3307010141010701013e010901018168010901018124010901018123010701014e010701014d0106010155010601014f0101320a0901018119030d010181610806110901016b0511090901010306070101080203080201300e0a01018270110302323130070101030201351e070101750201380c090101815a0201390d09010181510101330d0b0101817006010a0101827e081009010171051209080101060803090201300d090101815e020236300c0b010181174c02036267710c090101817d0206636a646c74660c0901018237020666626f6e38380e080101821b03056666696f670c090101826503056b62656d6b0c090101824e02056c6b6c61660c0901018244010901018110030573786c70610e0801018223030574636173390e080101824102066d736179636e0d090101811f02056f686877670c090101825d0404717863390d090101811703056a68736b770d090101810403056e65326f6b0c090101823e01090101810a0206706e6b6174670e0801018214020671386c6773610c090101822f0206726a6b6675720e080101822a0206746e66706e630e080101823103056f676975370e080101820d0205766c3166630c09010182550101340d0b0101817806100f0801011881073414030c0803080201301e070101680201310d09010181680201330d09010181560201360c090101815e0201370c090101815501090101817d0201380e0801018279020639643174376f0e0801018237020a6a30786675797a316e7735090101820e03070101740107010173010601017b01060101750101351e030214030a0802080201320d09010181750201341e0701016f0201360d090101816c0201370e0801018305020a6a717475677a777772670e0801018143020f6b696d65717969666764706279637a0e08010181260101360c0901018159270308080207010137340308010138350308020a7a79677171756c38766d35090101820001090101813c01090101813b01070101660107010165010601016d01060101670101610a170101090c4c155112152917020b0101827a150115010106190b2815571508011401010b2810316b156b150f0b0101158100010b010109430e010f0101150515160e0f0701010f010701011002070101120107010104030b0101150f4f010701014301070101420306010106021061726f6e7269646573686179657331350a090101813d0202626c1d0701015d190701014d010701014c03036f75741d0701014c0207010108020563636573730a0901018153030701015001080101815b04076f6d706c6973683507010125030468696576350701012d0304726f73731d0701012003047475616c2f070101050204646170740d07010129030476616e630d0b01011f815d1109030101460204667465721e0701012502026c6c0e080101743d0f07010143180701014d010701011f010701011e030370696e0e08010182050302736f0e08010181291007010154010701014903037761690a0701017d02016d35070101680302617a35090101810003027a6e0e080101823502016e0a090501012e02090101821a290701012a0301640a130101052404270b810302170101042917121a11301315010b0101240d2801140101280f2d0c0f6b81230f0701016801090a0101390109010104360f0901013f09030701010b02070101040211010129192120281c01090101230e010b0101061e0e0109050101070107010104010601010c0106010107030367656c370701010e0301690a0b010118816602090101827101090101812b010801018246020470706c690a0901012b3e03090101817e110701012f0405726f6163680d070101200201720a07010134020d01011e812f1d01070101090106010173100701013d010f070101070c2d3c170901014c09010901014b09030464656e740e080101821d03016d1f090101201303046f756e640a090101810e130701013f0304746973741d090101811f0201730a07010143020901018163010901013f04010a01010a6505210701010d06070101140201740a090101810f13090101571719070101290107010128030574656d70740c07010149040572696275741d0901018116020a7564696f6e61757469781d0b0101810f1402047661696c2e0701011a010901011d0d0107010117010701011d010701010d010701010c010701010902070101130107010112010701011201070101110106010119010601011302037761690c0901018119010162310309020361636b0d0f070101023081240108010181070f090101812b020d040101026b0a050573746f726936070101060508776865656c686f700d090101820503046c616e630c0901017f2e01090101815f10090101360d0301720c090101823303037369630c090101815802060101191009010114180201650a090101086e020b010181720b0107010135011401012e1d3c0b090a0a21260701014c0113010181780909090909010b0101813409010d010181330909010d01015e090909010f01015d0909090901100101650909090909011201015f0909090909090304636175730c0901011b0904026f6d0a090101814e030701014b0108010181561007010149010701013e03016535030504016e36070101270107010126030367696e2e0701010406016e0e0801018312030468696e640a0901018155030701015201080101815d03026e741f07010130030273740c090101814702060101640f0701015a0304747465720d0701012d020269670b02062a0701011603026b650a0d010181143162020b0101822776010f010108353d632d011401010d281d7c3c0981040f090101814605036c69660c09010183200501720a090101822902090101832301090101820a0108010183110504736b696c0a090101822602090101831e01090101820701080101830e0301740c170101822d0a09080c090a0a0111010181020808090a01140101820b09090a09091202096c61636b6c6162656c0e080101821604026b651d0901018127030369747a320701010206016f300701010803036f6f64350901018121030275651d090101810d02026d781d090101814201030b02086f647967756172642f0701010e03026e751e07010173030273732e0903010118010b0301011b0d01090301011501090301011b01090301010b01090301010a010903010107010b030101813401090301011101090301011001090301011001090301010f010803010117010803010111030274680a070101541507010106020f7172336961777264726678666e617a0e080101811f020472616b650a090101813702090101822b010701017a010801018210030365616b0a0701013b0303696e67350701014901090101332701090101322703036f6b650c090101814206016e0c090101814c24030504046f6b65721d090101810c020275690a090101820102090101827601090101813001080101824b2d0601010504026c640a07010124040601011b030273691d0901018104010701017a01070101630301740a0701010e020701012102060101540f07010139020b01010e154f1607010139010701014501070101440201791d110101810e100b090719090101814701090101814d010701017f0109010181050108010181140108010181150101631f070101611203040203616c6c0a0701014703046d7065723a020503016e0a0901010716040a01012d7d100f07010177010901012e270107010148160b0101481c190107010157010701015604036e6f742e070101480807010130010701012f0205656c6562723507010117020668616e6e656c0a0f0101815f320907020d010183000707010d01015c600707010e010181677407070f0701016718070101280404707465720e080101826a0404726163743307010102030365636b2e070101240403727562310701010a0307696c64686f6f64380701010502046972636c350701012405017536030502046c617368310701010d030369636b0a090101817a020d01016d1b816b01090101812901080101824403036f73650e0601015b0402776e2f070101240c0601010f02026f6d0a110101813a15130c34020d010182236811010d01015b0c1a48010c010181660c740f0b010173171c010901015030010b0101451d090f0b01011d110d010d0101200d090f010f01011a0c0b0c0d01110101200d0b0c0b0d01130101100c0b0c0b0b0d011501010f0c0b0c0b0b0b0d011501010c0c0b0c0b0b0b130111010181460d0c0c0c0115010116640c0d0c0c0c1b0115010115640c0d0c0c0c2201170101150f0c0d0c0c0c290801170101140f0c0d0c0c0c3008011601011c0f0c0d0c0c0c370801160101160f0c0d0c0c0c3e080401650a090101810d0307010146210701015207090101810704026963390701010b04036d69740c0701017505026f6e1d09010181150502756e1d070101630404706c65741f07010112160701011b05026f6e0a09010181200506726568656e731d0701015003056e636570740c090101826001090101811a04036669640a070101260602726d0a090101822002090101830f010901018149010801018268050275732e070101230404736973740e06010116040474696e750d07010122010601016b1007010122180701014901070101480503726f6c0a0701012803070101321107010148040476696e630c0701012c0304756c646e0c07010127040272730e0801013d0b03037665721e0701011202067265617469761d0901018114080765636f6d6d6f6e1d090101811904036469740c090101811f030569747465721d090101812f03037569731d090101813002037572620e080101827603017a3607010107020379636c0a090101822702090101832101090101820801080101830f05036973740c090101832201090101820901080101831001036433300c0901018259020461646469360701010e0301690e080101501b03016e1d090101812d0303756e740a07010104251a0a08092d150a08090c080b38250a0908090920090b0b0e0e0d0d130d0d0e0d0c0d130e0e0e0e0d0d19080909090f090e260c0908090912170f0606327018130f180e0b0b0b0b130b1e0b140a080a0a147b0a1c170c340c09110c25190c0d13480b06220c10180916660c1f060d0a091709140b0c2e0b1b1e26110a0a080b0a0d0f095a0e171d0a160b0c0c210e142d300b0a0931140c340c0b0a0a0e0b060b1f0a0e815519090a0a09100a0d130a1c090b1f140b0b0a0a0e0f0b0d0b0b081d170b0b0909'); +INSERT INTO media_items_search_index_data VALUES(137438953474,X'00000f1f0a0730646176786a710a090101811e0204656369640c0701012403036469631e07010134030566747261700d090101811201080101822c03036974690a090101811f020b0101823011010b01017f0e08010e0101821511091103037074681d07010152030673637269707435090101810e03047461696c0c090101815b030576656c6f701e0701014502026964360701010a04016e0c070101300304666665720d090101814f120b0a01013d3e0304726563741d070101440404747061770c0901018251030573636f72640a0b0101817304020b0101820905010901017004010a0101817b040603756e740a0901018141040474616e631d090601013002016f0c0b010107242e020601013a100701010201070101690f070101150107010118010701011201070101180107010108010701010701070101040307010109010701010a0107010107010601010f010601010a03066d696e696f6e0a090101813602090101822a010701017901080101820f03016e0e0a03010103570f07010149040261741d070101780107010157010701014c0401650c0701015d020601012f0302776e0a0701013c0209010181430107010143020472696c6c0e0601017804077665747261696e0a090101812f02037572651e0701010c0101650e080101820723030602036173690d0d030101815b0a0106010138050265720d0701010a060273740d0701011805026c690a07010177020569746865720c090101813c02056b6a3964710a090101812d02016c2f0701013501070101300107010137010701012601070101250107010122010901018149010901018105010901018104010701012f010701012e0106010136010601013002026e64350701013604066c6573736c69360701015e010701015d04016f0c090101816f03046572676939030503036a6f691d0701014d180b01018118210107010168010701016703046f7567680c0b0101811e0b020601015c200701014b03037465720d0701013e040269720a0701011f02057069736f642e0307010b080101022d010f070101051d0a0c01110b010105240a0c0b0111090101160a0c0b0b0113070101150a0c0b0b0b0115070101120a0c0b0b0b0b01210701010c81370d0c0c0c0c0909090909011b0701012e46040b0d0c0c0c0c09011d0701012d46040b0d0c0c0c0c0909011d0801011c040b0d0c0c0c0c090909011f0701011b040b0d0c0c0c0c09090909012007010123040b0d0c0c0c0c090909090901220601011d040b0d0c0c0c0c09090909090902037665721d0901010d4a180901011f6b0501690a09010181480209010181340107010137010a01014f1b6705037974680c0701010f2707010113020178300701010a080304030565726369731e0d0501011f2441030369737439070101030304706563743607010139010701013804046c61696e1f090101394404047265737335070101640101663507010144020361696c0c0701014e03046d696c692e030503017235090101810402056573746976320307020a69627575756e776d39670e080101810d03076572676f6c6c611d09010181030107010179010701015b0305667465656e0c090101814403036775720a0701011103036e616c0c0b0401013c49280309010901010206010701013f010701013e0401640c0701017d02060101130303727374350701011e050601010a030276651e0701011e1507010143010701014001090101816b01090101812701090101812601070101510107010150010601015801080101523603027a7a3b06010102020a6b6961656774626e706d0e080101811402036c61740a090101224102096e6d70747476326b7a0c090101820e02046f6375730c0701017b03046c6c6f770c0901018311290701011103026f740a0b010181050903070101420301720a090101813e020901016e4612030610090101201f0107010123010701011d010701012301070101130107010112010701010f01110101260a30500606010d01010d15192a010d01010c15192a010701010d010701010a01080101080c010601010d0404776172640a0b01018106070305756e6461740c0901018153040172320701013b010701013a0107010137010b010181613901090101811d01090101811c01070101470107010146010801014e390108010148390301780c0b010182500a0203726f6d1e0701012b04026e740c15060101021c4835103523020601017e0603686f700c090101831a0203756c6c0c0701017929070101230501690c07010176030572746865721d070101090207010154010467616d650d070101390301701e070101660302737536090101814801090101814e050467756d6138090101810301090101810901080101811801080101811902036561720c09010182460301740a0b0101814212020f01013d10115172010701014f010a01018147150f07010102110701010a080701014f010701014e03060101030201670a090101817602090101820d010701017301080101817e020969726c667269656e64300701010b04016f0c0901018248030276650c090101811d120701010602036c6164350701017603036f76650c090101824f02046d61696c1d0901018107010701017d010701016602016f0c0901010b4a01070101150301653b0601010303026f640e0801018306030370726f0e08010182320301740c090101810b0204726561740a090101820a02090101827b010901018135010a01018254360402656e380701010e0305696d6f697237070101050401700c090101824001090101810c01080101822603046f756e640a09010123410202756931070101250507010104010168310305020a327a6d766164657a6638330701014a010701014701090101817201090101812e01090101812d01070101580107010157010601015f0106010159020261640c0901014d1429090101811e03026c660c0701014703036e64690d0701014805056c656261720d0901018100010c01018217240603047070656e2e09010116310107010119010701011301070101190107010109010701010801070101050107010138010701010b010701010a010701010b01070101080106010110010601010b050169300701010206070101550107010154030272640c070101202a070101280107010127040272691d0901018133040476657374320305030276653007010104050b0101810607010701012601070101250301790a0901018135020901018229010701017801080101820e0408657362696379636c0a0901018139030701017c0204656172740c0701014803056c6c7576612e0902010117010b0201011a0d01090201011401090201011a01090201010a010902010109010902010106010b0201018133010b020101100a010b0201010f0a01090201010f01090201010e0108020101160108020101100804626f73732e07010154010701014101070101440107010154010701014c0107010154010701015701090101821d01090101814901090101814f01090101810401090101810a01080101811901080101811a0c0b66696e616c65706172743134070101580c07736561736f6e3135090101821e12013236090101814a01090101815001090101810501090101810b01080101811a01080101811b04036d65740c09010182470401700a090101820402090101813a02080101824e2007010142030272650c0b01018165090206010172100901013c1201070101411007010106060b01010a8137010701011c010701011b04036f69632e07010110020169300701010d0807010104030267680c090101823102080101823b110901012d42030272652e0701010b010701010902036f6d6538070101060404696369642e070101110301700c17070101031c483510350d18010d090101048152010801018120100701016a010f0501010327460a040165360701016601070101650303726e69300701011e0401733209010105110301770a07010176010202010d02010105816a02080101827a0f1702010106367c05060606090107010116170d0101341f16200406746f6d616e751d0901018151020a716d7769716a727874710e080101810402037474700a1d0101811a090a090a14130c0a09250229010181700b0a0c0b0f0d0a09080c090a0a091f11011d0101580c0a090c080808090a091f012e010181010b090a0a2111160c0a091009090a0909080c230f0b0101702a0a010701014d01090101421d0f0b01011b100d010d01011e0d080f010f0101180b0b0c0d011101011e0c0b0c0b0d011301010e0b0b0c0b0b0d011501010d0b0b0c0b0b0b0d011701010a0b0b0c0b0b0b0b0a011d010181430d0c0c0c0c09090909090119010114630c0d0c0c0c0c090a011b010113630c0d0c0c0c0c09090a011f0101130e0c0d0c0c0c0c0909090a0901210101120e0c0d0c0c0c0c090909090a09012201011a0e0c0d0c0c0c0c09090909090a0901240101140e0c0d0c0c0c0c0909090909090a090101690c1f030101090915050b240f182817142b11090101124b010701014201070101350f07010107010701010a060f01014122080e1902046465616c0e0601014a0201660a090101817802090101826d010901018127010a010182422e0f0701012a020169360701013b010701013a02036b6f6e0c090101823902056d6167696e1d0701010e030170310701010c04036f72741d070101260403726f760e0c09010109655302016e0a0b010136286b020d010117772412010901011039010c0101423b391a0f110701010f35113b46010901013008010b0101170d120f0701014e080701016201070101610303626f780a090101814704080101814c030463726564350701012b0302646935070101200504766964750a07010156040575737472690a0901018126030571756972691d0901018105010701017b010701016403077374616772616d0a0b0101816405020b0101831405010901016105010a0101816c050f09010181010107010177010701015906046e746c690c09010181100302746f0a0701014802090101814d290901018126010701014201070101410402726f1e0701016202016f0a0f0101811d090a090201730a0b0101458145040c0101125281720f090101385a1207010104060b0101093406010701011b010701011a03016e1d0701013103027375360701010f0201740a0f0401012c1a8141021701013f0f0d140914338147010901018132010a0101478208270f01013e0e2a0e2b0107010150010701014f010b6a3162666f37766c697734350901018215040701017a010801018102010601017c0203617a7a1d0901018124050e0b0a13220a0e0c0c0908130b0c220b0c551f0f130d140b0f0a0c120909090d0d47091209091b170a09813c111b0f0b0f0a100c0b080a09090a12190d0a1f0d0f3a09120b110b1110650d0d3b0a0a150b0f08110b08101e0b381a10090f0a0b160e080a0b091f090c150c0e063c10090a154d12130a091a1a150b5f53120f270b1a310a0d160e0a0b2c0d0a09330e128223370b210d0b0c080a0d46110b090b0d17340c1f090c2e08093923'); +INSERT INTO media_items_search_index_data VALUES(137438953475,X'00000f1007306a656e736f6e0a0f0101811b090a09030472656d691d090101812602026f620c0701015c0302696e0a0b0101816310020901018205010901016010010a0101816b100f07010160020575726173730d0901018172030273740c0901016a4811070101331907010154010701015302057a307278710a090101812501036b65690e06010111020269643a0601011403026e673507010145020a6a79377432347268673035090101821c05080101810901080101810302036e65650c090101825603026f770c070101110204706e7772310701014101070101300606673236386671300701013a030701012f010701012c01090101815401090101811001090101810f010701013a01070101390106010141010601013b020f7774663772633534703075686577360e080101810601056c61626f7235090101811a010701016a010701016903026e642f090601011503027267390701010c030273741e0701010f02036561643a060101050402726e0a090901010d020b0501014154010b0601010c11010a01012c810e0f0f0101052681200701070101180606746f6d616e751d0901018152040273741d070101580306626f7769747a1d090101812e030264670a0b0101042f4201020702056963656e731d0d0101811108060302666531070101100401740e0a010181000b03026b65360701010503026e6b0a090101817f02090101827401090101812e0108010182490f0701017d010701015c0107010151030374746c0d090101814e110701010a030276650e0601015a05037769720c090101826102016c0a0b01013a1a23030901011422120701013602016f370701010d0302636b0c090101812d0504646f776e1e0701010d03026e671d090501012f03016f2f0d0403010113030301740e08010182720f0701012301070101380302766535090101811c010701016c010701016b0301771f0901011d550201790c170101822e0a09080c090a0a0111010181030808090a01140101820c09090a09091203097531797364756c77613b080101810a01016d0c0701010a2207010108010701010b0609010142340205616368696e0c09010182200302696e0a0701014a03026b650c07010119110901011d440107010155010701014a03016e31070101150401690c0701016602060101220f07010146040375616c0c090101821f010b01012e8154101d04010108191127650506060606060111040101080a392418010f02010105165804030372696e0a09010181160408010182040304737465721e07010128030274741d0901018132050265720c090101813b0301781d09010181020107010178010701015a040278690c090101823801090101810501080101821c0201650a0901018205021101014f228124810302080101824f0f0701017f010701015e01070101570303616e74350701010f0602696d3607010164010701016303046d6265720a0901018150030701014d01080101815803037263680a090101816c020b010182006a01090101693b0108010181742007010119010901011c0d0107010116010701011c010701010c010701010b0107010108020701011201070101110107010111010701011001060101180106010112030474686f641d070101160207696c6573746f6e350701011a04016b3b060101060301700c090101824a03057373696f6e3a0601010702036f64650d090101817303046e6461690a090101814904080101814e03026f6e320306030272650a0901018159030901011e3a01080101816127090101813e010b0101352716010b010134271601070101180107010117010601011f0106010119030273740e060101550f090101252c030474696f6e0a0901015f090306756e7461696e0d07010107010e01010c281d8136090362696b0a090101822402090101831d01090101820301080101830c030276651d0701013c030378786938070101020206010102020274620a0b0b0101822202090101821b010901018201010c0601010683060f090101813e0103090403696b650d090101820401080101831304046c6966650c090101831f01090101820601080101830d03056e62696b650a090101822502037563682e0701013c07070101520304726465722e0304030373696334070101100201790a0901018113020f0101368112625f01090101754a010a010182005e0f07010161030473656c660c0701012d01046e616b652e0701012102036565640c0701013202080501010505016c390701010d030a696768626f72686f6f640e060101440301770c0b010137815202080101813a280701012d010701012c0405736c6574740e0801018154030278742e070101500203696e650a090101812704026a610c090101821c02056b7764626d0e080101811c02016f1f0701015316090101810c0304726d616c1e070101310301740c0701011a030177350701014e010701015b010701015a01056f626c69671f070101550305737461636c0a0b0101061518020663746176696137070101020201660a090101817d020f0101468101812f010901013a7401100101231d091381730f0701011701090101152c010701011412090101060d0411010118064f0a2c21010901013c31010901013b31030366657235090101811102046c61686e310701012e010701011d0606726c636773342e0701012f0207010127030701011c0107010119020701017b010701017a01070101250107010124010601012c010601012603016431090101141202016e0a0d01012141811d020f01017c81186025010d010105812747010a0101518176100701011b010701010a0f0b0101033121010901010f2d01090101291601090101301f010901011f28010901011e31010901011b3701110101048134080843010b01012b5543010d01012a554309010b0101284310010b0101274317010a01012f431e010a010129432502026f683803060301703b0204020670706f7369740a090101810415070101130201720a090101301202090101821e1109010156211207010137010701013b010701014b0107010143010701014b010701014e02090101813d0109010181430107010175010701017b01080101810a01080101810b03036465720e08010181330f090101810b0301671d090101811a03046967696e2e07010127070701010e0204746865720c09010181081107010147180b0101810d0401070101710107010170010701011b010701011a0106010122010601011c02027572350701011d0107010170010701016f010701011a01070101190106010121010601011b0301740a0b01011281760408010182500f0901018129110901010e19080701015101070101500402726f1e0701017602037665720a0303020701013e020c01011f1e8249230701010e0202776c2e0701012202037a7a6934030401070101120101702e07010109010701010c0209327a6b70626e6463620a0901018177030701017401080101817f020261640c0901018257030267650e08010181530302726b0e08010182710f07010122010901013706120701010e0401740a0b01014b8139020d0101814f812a010b010181313601080101824c27090101076b010701013a010701013905086963756c61726c690c0701011f03057469656e63350701015e01070101220107010121040472656f6e1d0901016212010701014f01070101440f0901013305010901013b05010901013e05010901014e05010901014605010901014e05010901015105020b0101814005010b0101814605010901017805010901017e05010a0101810d05010a0101810e0505026f6e1e0701014b010701014003047970616c1d0901017a06010901015906010901014e0a0201633107010138010701012703066867666a6e382f0701013601070101310307010126010701012301090101814a0109010181060109010181050107010130010701012f0106010137010601013102046564616c0a0f01013e1333812c030b010181135801080101822d03066e64756c756d0e0801018110030572666563740a090101811108026c690a07010168020369636b0a0701011c03036c6f742e07010128020701011f010701012601070101150107010114010701011102070101730107010172010701011d010701011c0106010124010601011e02046c656173350b01014f490302046f696e740c0b010181002e010901018160100701013703037369741f0d09010110204c03067765726c696e0d090101811b02067261637469630a090101163f0406010117100701013503066f67726573730d07010123110701012404036d69730c0901018164020601017104037065720c0901018122020601015e0402756435070101660204756e63680a070101410301740a0701015904080101812e2709010181250105717565656e350304030369636b0e0601014006026c690e080101813701017231030702036163650e080101821e03026d700c090101821d03016e360701014101070101400304746865721f0701012c0201650a0701016b040601013703036164690a0901013539130701010304016c0e0601011027090101812005026c691f0701011c0401721f0901010c1c0301660c090101822404056572656e630c090101816b0402696e0d090101817603046d656d620a0701017b0305736f6c75740c070101390401743509010181390304776172641d0701016b020467687367320701013906066b7a6b656467310701014a0207010138010701013501090101815e01090101811a01090101811901070101440107010143010601014b010601014502036964650a0b020101026e010204010d0101820f381c010901018119010e01014c1d5a813f1007010132050a6c696b65616e696e6a610c09010182220501720a0b0101816b2b020b0101817f6a01090101683b011001010e6381068118030266740a090101811703036768740c090101811802086f6164626c6f636b360701014401070101430302636b0a0901015e090101730c09010182790109010181332307010109040305010b010105106e0201312e030601030701030601030a010308010306010306011706010181400d0c0c0c0c09011501013e400d0c0c0c0c09011501013d400d0c0c0c0c0901130101260d0c0c0c0c0901130101250d0c0c0c0c09011201012d0d0c0c0c0c0901120101270d0c0c0c0c09020132350f01018201090909010306010b060101813c010b0701016709010d060101660909010e0601016e09090901100501016809090909020b39616f6969687177686c780e0801018146020261643b0601010e04110c09230d190d0a09091e0b09103d17170a09090a2d0e090e0e0f090a092b10090b15080a0b0a0b1314092611180d0919081235110b0a0a1316280a0e17600b0e08090c0b12073e0f0c161d090f2811180d0f090a240b0b1008111a0d090b0a0d0e0b08120c0e0d4e0b103a09810d07061355110910362726091a090d0d1c0a0a1a2f0f16680e180d421c0e0d090a410d180d0e18121010090b140a0a0a060b0a0d0b0d100e0909090d0a0b0c090b0b3d2b12210a0b140a1e693813'); +INSERT INTO media_items_search_index_data VALUES(137438953476,X'00000f2f053073616d650a07010164130701016e020463656e650a0901018157030701015401080101815f03036f6f700a0701015003090101816a02056561736f6e2e070101020307010108040f0101032081160801090101192f01090101182f070374776f36090101814b01090101815101090101810601090101810c01080101811b01080101811c0301652e0701014c0407010103030901017a0a02030404036b65723303050305676d656e740c070101640304727665720c090101820a03057373696f6e0c0701017a020601014103037475700a0901018115020901018228010901017763010801018203030376656e35090101817c0109010181380109010181370107010162010701016101060101690106010163020468617265350701015605066b726f626f742e0701011c010901011f0d0107010119010701011f010701010f010701010e010701010b0207010115010701011401070101140107010113010601011b01060101150308656e616e6967616e3a06010115030469747469310701011303026f650c090101825e0109010181180401770e0601017a0f07010113010701011c10070101440201690e12010181050b090b0921030264650c090101823202080101823c03036d706c1d0701011903026e63350901018109050265723509010181130402676c0d0701013803037269751d09010181230301783407010149010901018175010901018131010901018130010701015b010701015a0106010162010601015c02026a760a0f0101811c090a0902046b6174651e0701013a06047061726b1e070101700303696c6c0a0d0c01010b4c26030701012b010c01011e0b513d02036c6f770e0601012502016f0c090101655a020a0101218115200701013b070901014334010701010203026d651d0701016a010701013e050374696d0a0701014603026e671d090101810903026f6e2e070101530807010136010701013503037572630c090101824902077065637472756d1f07010116040265640e0601012604026e640c09010181260501740c070101780304696e646c350701016b03026f740e0801018303220701010f030472696e6730030403087578786e756c3075350901018207020901018142010701016d010701016c0106010174010601016e020372616d0a090101812e02037461691f09010109140501720e080101827d04026e640a0701014c0401723703050501740a0701017e02090101810401090101816d030365616c300701010c07070101030401701d0d0901011a81380303696c6c350701013c03036f6c612f070101080401701e0701016d03067261696768741f0701011f04036565741e09070101650404696b6572390701010204036f6e670a090101810a03047564696f3507010130040266661e0701012c020275620a090101821f02090101830e010901018148010801018267040573637269620a090101821002090101830101090101813b01080101825a110701015c080270740e080101815505047461636b0a090101814c03037065720a0b0101816a2b020b0101817e6a01090101673b01080101817206037269640a0d0101813b1226020b010182036a010b01016c1429010a01018151280904657274760a0901018169020d01018218810301070101660108010181710404706f72740a090101820d02090101827e0109010181380108010182570f070101651109010130120107010138010701013c010701014c0107010144010701014c010701014f02090101615f0109010160660107010176010701017c01080101810b01080101810c04067261637573680e0801018225030272652e070101140107010117010701011101070101170107010107010701010601070101030207010109010701010801070101090107010106010601010e01060101090404707269730a0701017504057669766f722e0701011202047765617435090101812202097a6e6d7274756f76610c09010181730101740c110101280b3d082c1f020a04010104570f090101321a1809010133320203616b651f0701012a0f0701010d03026c6b1d0701014b16070101030210646b3868637435787338766c627472340a0b010181613e02090101830c010901015e6a010a010181697e0204656163680c0701010d04016d350701016c040172350901018124030563686e6963350701012c070271750a090101202402090101815c010901018177010a01012981141107010125020368616e0d0701010d100701010a05016b2e0901013912070f01015a3c160606010901011d41010901011c410401740a090101632602110101250b550b220f010701013c010601012a1007010120170b0101310b650301650a1301011e2155481e1e06021f0101182c1b250b08090f33170f147b011102010117152b1e4c011c01010f0b0e1a1813140936301e600f110101242c0d0f093f010d01010e071819010f0801010b0616560f0b010106222b030b010103060a010304031101011918300f0f43010f040101211e2505010f0101041e1e250503060101090404617465723a060101130401690c090101814a0206010136110701013b050172350701017b04016d0a0701015a020b010108240b010701011c110701011904016e0a0901012a300307010125280901018110040272650d07010149040273650a090101817e02090101827301090101812d010801018248280701012c010701012b040a7573656c6573737472690c0701016113070101620301690a0f0a010137438111020d01011224810d010901011135010c0101614c81280f090101106e010901011a4301090101331f0f07010143070f01010b1e323d090107010169010701016804026e670c09010181091107010127110701011301070101160107010110010701011601070101060107010105010701010201070101350107010108010701010701070101080107010105010601010d010601010805016b0d0701010f03036f73653607010138010701013703037265650c090101814e250701014301070101320107010131010701012e010b010181573c010901018113010901018112010701013d010901013c3c01080101443c010801013e3c0403696c6c350701014604046f7567680d07010116100701017b010701015a010701014f0307756d626e61696c36090101814601090101814c010701017e0109010181040108010181130108010181140203696d650a0901018112020b010167430f02060101200f0701016f1d0601010b0301700c09010181480402746f1d0901018128030272650c090101823a01090101810601080101821f02016f0a1b0801010c0b1a421157052e0e0701020301210101060831110c072e0f105081090a07011d0501010b110909062405600a07450124080101080f072114140b581f055c160e07220f25030101040523071007200853050606060605010d010105141e13100701010c0107010112060d0101103d0c2e01090101321e01090101311e030601010401060101040304676574680a0701015b03016f0d0701014a04016b0c0701015802047261696c0e12070101072f210e812904056e736665720a0701017a030369616c0c0b01018176140208010182380f090101813a0103080109010124580402636b0c0d01011332811e020a01018273060401702f0701011103037574683303040301790c09010181111307010137020a746174617a73707171770e0801018124020575746f72690c090101831c11090101480e0201760a0901018170020d010182041557010901016d3b010a010181522802047765616b0c090101816004036e74690c09010115310304697463680c0b0101821305050374657238090101810101090101810701080101811601080101811703016f0a070101490209010181680109010181662307010133010701013a010701012901070101280107010125010b0101814d3f010b01011a2f44010b0101192f4401090101333f01090101323f010801013a3f01080101343f0101753103080203637a6e0a0b010181603e02090101830b010901015d6a010a010181687e02046e6465721d090101811206057374616e643509010150120107010124010701012303066578706563740a0306030568617070693a020403046c6f636b1d07010169030374696c0c070101732a0701014a01070101490201700a0f0101031c243214010205030a01011c826627070101370202726c0e080101811d0201730a090101813c04060101571007010143100701013101070101390305656c6573730c090101817508037472691d0b0101740e08010b010151101f010b010146140f020a7967616d7877347465690e08010181160101762e0701012e0107010134010b0101260b0c010d01012d0b0c0b010f01011c0b0c0b0b011101011b0b0c0b0b0b01110101180b0c0b0b0b0111010181480d0c0c0c011101017a0c0d0c0c0c01110101790c0d0c0c0c01110101240c0d0c0c0c01110101230c0d0c0c0c011001012b0c0d0c0c0c01100101250c0d0c0c0c0201650a07010110130701010c01070101270302726935090101811f040473696f6e0d090101817b020269611d070101790107010158010701014d030364656f0a0d010138810e18020b010181402b010901011247010c01017d311f1b0f070101110107010111010701013403037369743807010103030d7669656e6e656d656472616e6f2e07010138010701014001070101430107010153010701014b0107010153010701015602090101814501090101814b010701017d01090101810301080101811201080101811304067a6965706f702e0701011e01090101210d010701011b010701012101070101110107010110010701010d0207010117010701011601070101160107010115010601011d01060101170201730e0801018307110903010172020f76667a366b747134726a32336d64610e080101810f010277610c0d010114281a3f110701015c180701010d0306636b6965737431070101040301690a0f07010114768105020d0101810e8170011304010119108111280a010c01011453817204017435090101812b0107010131010701013003026e741d0701012c01070101041707010154010701016d010701016c01070101170107010116010601011e01060101180302726e2e0701011f0107010122010701011c010701012201070101120107010111010701010e020701010c010701010b010701010c01070101090106010111010601010c0302736e0c0d01016b082c1f290701013203037463680c0701016002080101812a200901012d130107010133010b0101250b0c010d01012c0b0c0b010f01011b0b0c0b0b0111010104101710262916080c0c111d2b0b4a0f0b10170e100a0a0a090b2e0d0b0b1a0a200e0a0a130b0e090a080b0f092a0b0b090906140f0b0a0a080d0b0b0b0b091c240a0c1f221f690e450b0c0c11200f0e2c0b08090c220f1e2981060b130819140926164c55080f490a1a2c21090a16810f0b0808110c211308080e12131e0c0b0d1d5a061f0c170b0a0b141b0a1d0d1a127f120a0c13310a554a0f17160d2713314511'); +INSERT INTO media_items_search_index_data VALUES(137438953477,X'000a04c71a0b0c0b0b0b34110101170b0c0b0b0b01130101812f1a0d0c0c0c011301016f0c0c0d0c0c0c011301016e0c0c0d0c0c0c01130101190c0c0d0c0c0c01130101180c0c0d0c0c0c01120101200c0c0d0c0c0c011201011a0c0c0d0c0c0c033077650a0b01010f2c1a0307010113010801012b50110701016a0f07010147070b0101470e3401110101251d0d09061101110101241d0d0906110304696768741d0701013e03046c636f6d310701010204016c0d0701014003026e740c090101813103027265350701016e0305737465726e3903040304787862630c090101817c02036861740e080101826d270701013d050265760c07010156030365656c0a0901018128030f08010103308124010801017f0b110901010d1c06036261730e08010181180601690a0b01014d815d04016e0a09010132392407010105010701010701070101070107010109040272651d0701013403036963680e080101812d0f0901011b2c03016f350701016d04026c651d070101210301791f0d0601013a300f0203696c6c1d0701011c01070101211807010148010701014703016e0d07010136030274680a090101810202090101821001090101816e120b01011e1325160701015805036f75740a07010117040601013002036f726b350701017c010701012a010701012905036f75741e0901010b7804026c6435070101780303756c640d070101450106010148020277770a0f0101815c0c0a2c02110101820215571f11010f0101590c0a3b1f011001018150160c0a6c0f07010171010701014e01090101431d0f0901012a0d01090101300f010d0101220b0c0d010f0101290b0c0b0d01110101180b0c0b0b0d01130101170b0c0b0b0b0d01130101140b0c0b0b0b130111010181440d0c0c0c01130101760c0d0c0c0c1b01130101750c0d0c0c0c2201130101200c0d0c0c0c29011301011f0c0d0c0c0c3001120101270c0d0c0c0c3701120101210c0d0c0c0c3e010679327135726e0a09010181340203346e610e080101811702036561720c0d01011621050f02026f750a1101011a1b390a8109020b01010e8262010d01010e270c6d01120201010281271081100f0f01010b0b0c0f4d010f0101031c0b0927010b01011a11200f0d01013a090b05071301014c0f043c16060601110101031d1827060c010f01011d1827060c0401720a0f0101255c06083f040c01011d287d0f0f090101350a01090101071e040274750c0b010181710b0212010181020b090a0a21260701014b0113010181770909090909010b0101813309010d010181320909010d01015d090909010f01015c0909090901100101640909090909011201015e0909090909090601620a0d0101815d3a06020b0101830406010b01015a6606010c010181657a06110701015f0f0701012b0107010131010b0101230b0c010d01012a0b0c0b010f0101190b0c0b0b01110101180b0c0b0b0b01110101150b0c0b0b0b0111010181450d0c0c0c01110101770c0d0c0c0c01110101760c0d0c0c0c01110101210c0d0c0c0c01110101200c0d0c0c0c01100101280c0d0c0c0c01100101220c0d0c0c0c020a7865726c697362787871340701014d010901018179010901018135010901018134010701015f010701015e0106010166010601016001047a6f6e650a090101811802027a370e0801018145613b0b0b080a090a0c1009200b0a1d091108090b1908220f140b090f81430e0b0d67205b8122370c'); +INSERT INTO media_items_search_index_data VALUES(274877906945,X'00000eab0230300c01010101010f0101012d01010106090101811e010b01016005060201300c010101010110012e0107070101610201330d010201381e012e0107070101720201390d010101310a010201010101012001010107010201310c01010101010201320e010201331e012e0107070101640201350a010204363936350c010201381e012e01070701016c02047a6673653201060679706d6b616b3301010101010101010101010101010101010f010101320a01030111011101060102011501070901016b050201300e010302323130010201351e012e0107070101750201380c010201390d010101330d01010110011201080114010709010171050201300d01020236300c0102036267710c010206636a646c74660c01020666626f6e38380e0103056666696f670c0103056b62656d6b0c0102056c6b6c61660c010101030573786c70610e01030574636173390e0102066d736179636e0d0102056f686877670c010404717863390d0103056a68736b770d0103056e65326f6b0c0101010206706e6b6174670e01020671386c6773610c010206726a6b6675720e010206746e66706e630e0103056f676975370e010205766c3166630c010101340d011001140108011201070f080101188107340201301e012e0107070101680201310d010201330d010201360c010201370c0101010201380e01020639643174376f0e01020a6a30786675797a316e77350103010101010101010f010101351e011401080112010703020201320d010201341e012e01070701016f0201360d010201370e01020a6a717475677a777772670e01020f6b696d65717969666764706279637a0e010101360c0127010801010137340116010101383501020a7a79677171756c38766d35010101010101010101010101010f010101610a010201010101010f01010101010f0101010201010103010101010103011001010101010101050b0101158100010b010109430e010f0101150515160e021061726f6e7269646573686179657331350a010202626c1d01190101011401070701015d03036f75741d0102012c010201050701014c0207010108020563636573730a010301010104076f6d706c697368350103046869657635010304726f73731d012e01070701012003047475616c2f010204646170740d01030476616e630d0111012e010709030101460204667465721e012e01070701012502026c6c0e010f0118010101010114010707010143030370696e0e010302736f0e01100101012d0101010607010154010701014903037761690a0102016d35010302617a350103027a6e0e0102016e0a01020129010301640a010201010101010f01010101010f010301020102010101010101010101010101010f01010101010101050701016801090a010139010901010436030367656c37010301690a01020101010101020470706c690a01030111012e01070701012f0405726f6163680d010201720a01020101010101100101011701010115010101060701013d010f070101070c2d3c030464656e740e0103016d1f012e0107090101201303046f756e640a0113012e01070701013f0304746973741d012e0107090101811f0201730a01020101010101210106010201740a011301190101011401070901015717030574656d70740c01040572696275741d012e01070901018116020a7564696f6e61757469781d012e01070b0101810f1402047661696c2e010101010101010101010101010201010101010101010101010f0102037761690c010101623101020361636b0d0101010f0102012c01020105090101812b020d040101026b0a050573746f726936010508776865656c686f700d0103046c616e630c01010110012e0107090101360d0301720c0103037369630c01020110012e010709010114180201650a01020101010101260101010101010101010101010101010f010304636175730c0104026f6d0a0103010101100101012d0101010607010149010701013e030165350104016e36010101030367696e2e0106016e0e01030468696e640a010301010103026e741f012e010707010130030273740c0102010f012e01070701015a0304747465720d01020269670b012a0103026b650a010201010101010f012e0107090101814605036c69660c010501720a010201010101010504736b696c0a010201010101010301740c010101010102096c61636b6c6162656c0e0104026b651d012e01070901018127030369747a320106016f300103036f6f643501030275651d012e0107090101810d02026d781d0101012d01010106090101814201030b02086f647967756172642f0103026e751e012e010707010173030273732e0101010101010101010101010101010101010101010101010101010f01030274680a0115012e010707010106020f7172336961777264726678666e617a0e01020472616b650a01020101010101030365616b0a010303696e6735010101010103036f6b650c0106016e0c01240104046f6b65721d012e0107090101810c020275690a010201010101012d0104026c640a010401030273691d01010101012c0101010101050901018104010701017a01070101630301740a01020102010f010201160101010101140102010507010139020b01010e154f0201791d011901010101010101010101010f01010107110101810e100b09070101631f0112011c0107070101610203616c6c0a0103046d7065723a0103016e0a0104010f01010101011601010101011401010101010507010177010901012e27010701014804036e6f742e01080101010205656c6562723501020668616e6e656c0a010201010101010f011801160107070101670404707465720e010404726163743301030365636b2e01040372756231010307696c64686f6f64380102046972636c3501050175360102046c6173683101030369636b0a0102010101010103036f73650e010402776e2f010c010f0102026f6d0a010201010101010f01010101010f0101010101010101010101010101010101010101010101010101010f01010101010101050b010173171c010901015030010b0101451d090401650a0103012101070104026963390104036d69740c0105026f6e1d012e010709010181150502756e1d012e0107070101630404706c65741f0116011801070701011205026f6e0a010506726568656e731d012e01070701015003056e636570740c01010104036669640a010602726d0a01020101010101050275732e010404736973740e01040474696e750d010101100118010101150107070101220503726f6c0a01030111012e010707010148040476696e630c010304756c646e0c01040272730e0103037665721e012e01070701011202067265617469761d012e01070901018114080765636f6d6d6f6e1d012e0107090101811904036469740c01030569747465721d012e0107090101812f03037569731d012e0107090101813002037572620e0103017a3601020379636c0a0102010101010105036973740c010101010101036433300c0102046164646936010301690e0103016e1d012e0107090101812d0303756e740a01030476786a710a010204656369640c0103036469631e012e010707010134030566747261700d01010103036974690a0102010101010103037074681d012e0107070101520306736372697074350103047461696c0c01030576656c6f701e012e01070701014502026964360104016e0c010304666665720d0112012e01070b0a01013d3e0304726563741d012e0107070101440404747061770c01030573636f72640a010201010101010603756e740a01040474616e631d012e0107090601013002016f0c010201100101010f01010101010101010101010101030101010101010101010f01020101010607010102010701016903066d696e696f6e0a0102010101010103016e0e010f012e010707010149040261741d01010101012c010101010105070101780107010157010701014c0401650c0102010302776e0a0102010101020472696c6c0e0104077665747261696e0a0102037572651e012e01070701010c0101650e01230102036173690d010101050265720d01060273740d0105026c690a01020569746865720c0102056b6a3964710a0102016c2f010101010101010101010101010101010101010101010101010f0102026e64350104066c6573736c693601010104016f0c01030465726769390103036a6f691d011801010101011401070701014d03046f7567680c010201200103037465720d01040269720a0102057069736f642e0101010101010101010101010101010101010101010101010101010f0102037665721d0118011601070901010d4a0501690a0102010101010105037974680c01270102017830010801030565726369731e012e01070d0501011f2441030369737439010304706563743601010104046c61696e1f012e0107090101394404047265737335010101663501020361696c0c0103046d696c692e010301723501020565737469763201020a69627575756e776d39670e0103076572676f6c6c611d01010101012c01010101010509010181030107010179010701015b0305667465656e0c0103036775720a0103036e616c0c0128010101010101010401640c010201030372737435010501030276651e011501010101010101010101010101010101010f010201070701011e03027a7a3b01050661726f6c6c694a01020a6b6961656774626e706d0e0102036c61740a0102096e6d70747476326b7a0c0102046f6375730c0103046c6c6f770c01290103026f740a0103010301720a0102011201100101010101010101010101010101010101010101010101010101010f0102010703060404776172640a010305756e6461740c0104017232010101010101010101010101010101010101010f010301780c010203726f6d1e012e01070701012b04026e740c0102010603686f700c010201744a010203756c6c0c0129010501690c01030572746865721d0102012c01020105070101090207010154010467616d650d010301701e012e0107070101660302737536010101050467756d6138010101010101010f0102036561720c010301740a010201010101010f011101080101010301110107070101020201670a01020101010101041e12050c051109050c05080c081c1705060c0505150506070a0a09090b09090a0908090b0a0a0a0a0909160c05050507050a180e050c05050e130907051c401411170d0b080f0808120f15071807050606093e070b130925080d11100f130911172207051f090c1405131d081c050707050c0d11080816070b0e090d0e0705070e150c0d220f130e070b0707100e0820231f0e0708290b091b080807070b0805080d070a4a0b06070e0d1106110b070c060817120808060e121307110f07050d0b0708050d0708080e0b0d0e0a08100605130f080f071033100e1f070a080b0e070906060609091f060c0508140c070625110b090713070a100805070805090e2509070f070921060a0e070d080a082c080919050e080705090519080c0810071c'); +INSERT INTO media_items_search_index_data VALUES(274877906946,X'00000ec40b306769726c667269656e64300104016f0c01030276650c0112012e01070701010602036c6164350103036f76650c0102046d61696c1d01010101012c0101010101050901018107010701017d010701016602016f0c0101010301653b0103026f640e01030370726f0e010301740c010204726561740a010201010101010402656e38010305696d6f697237010401700c010101010103046f756e640a0102027569310105010101683101020a327a6d766164657a66383301010101010101010101010101010101010f010201614a010301640c01290103026c660c0103036e64690d0105056c656261720d01010103047070656e2e0101010101010101010101010101010101010101010101010101010f01050169300106010101030272640c012a010101040272691d012e0107090101813304047665737432010302766530010501010101010301790a010201010101010408657362696379636c0a0103010204656172740c0103056c6c7576612e0101010101010101010101010101010101010101010101010101010f010804626f73732e0101010101010101010101010101010101010101010101010101010f010c0b66696e616c65706172743134010c07736561736f6e3135011201323601010101010101010101010f0104036d65740c010401700a01020102012001030272650c01020110010101100106010101010115010101060901013c12010701014104036f69632e0102016930010801030267680c01020111012e01070901012d42030272652e01010102036f6d6538010404696369642e010301700c0101010101100101012d010101060701016a010f0501010327460a040165360101010303726e69300104017332010301770a010101010102010f010101170116010101061702010106367c050606060901070101160406746f6d616e751d012e01070901018151020a716d7769716a727874710e0102037474700a010201010101010f01010101010f0101010101010101010101010101010101010101010101010101010f01010101010101050b0101702a0a010701014d01090101421d0101690c011101010101010f010101060116010101010105090101124b0107010142010701013502046465616c0e010201660a010201010101010f012e01070701012a0201693601010102036b6f6e0c0102056d6167696e1d012e01070701010e030170310104036f72741d012e0107070101260403726f760e0102016e0a010201010101010f01010101010f0108010101130101010101010105110701010f35113b46010901013008010b0101170d120303626f780a01040103046372656435010302646935010504766964750a01040575737472690a01030571756972691d01010101012c0101010101050901018105010701017b010701016403077374616772616d0a010201010101010f01010101012c01010101010509010181010107010177010701015906046e746c690c010302746f0a0102012901010101010402726f1e012e01070701016202016f0a010201730a0104010f011201060101010101140107090101385a03016e1d012e0107070101310302737536010201740a01020101010101270101010101010b6a3162666f37766c69773435010401010101010f010203617a7a1d012e010709010181240205656e736f6e0a01030472656d691d012e0107090101812602026f620c010302696e0a010201010101010f012e010707010160020575726173730d01030273740c011101190101011401070701013302057a307278710a0101036b65690e01020269643a0103026e673501020a6a7937743234726867303501050101010f0102036e65650c0103026f770c010204706e777231010101060667323638667130010301010101010101010101010101010101010f01020f7774663772633534703075686577360e0101056c61626f7235010101010103026e642f01030272673901030273741e012e01070701010f02036561643a010402726e0a010201010101010f0101012d010101060f0101052681200701070101180606746f6d616e751d012e01070901018152040273741d012e0107070101580306626f7769747a1d012e0107090101812e030264670a01010102056963656e731d012e01070d0101811108060302666531010401740e0103026b65360103026e6b0a010201010101010f01010101012c0101010101050701017d010701015c0107010151030374746c0d0111012e01070701010a030276650e0105037769720c0102016c0a01030112012e01070701013602016f37010302636b0c010504646f776e1e012e01070701010d03026e671d012e0107090501012f03016f2f010301740e010f0101012d01010106070101230107010138030276653501010101010301771f012e01070901011d550201790c010101010103097531797364756c77613b010f0101016d0c012201010106010205616368696e0c010306676e696669634a010302696e0a0103026b650c011101010101012c0101010101050901011d440107010155010701014a03046d6d6f6e4a0103016e31010401690c0102010f012e010707010146040375616c0c0101011001010101012c0101010101051d04010108191127650506060606060111040101080a392418010f02010105165804030372696e0a0104010304737465721e012e010707010128030274741d012e01070901018132050265720c010301781d01010101012c01010101010509010181020107010178010701015a040278690c01010101010201650a01020102010f01010101012c0101010101050701017f010701015e01070101570303616e7435010602696d3601010103046d6265720a010301010103037263680a0102010101010120010101010101010101010101010201010101010101010101010f01030474686f641d012e010707010116020269644a0103066c6573746f6e350104016b3b010301700c0103057373696f6e3a0102036f64650d0103046e6461690a01040103026f6e3201030272650a010301010127010101010101010101010101010f01030273740e010f012e0107090101252c030474696f6e0a010306756e7461696e0d010101090362696b0a01020101010101030276651d012e01070701013c030378786938010201020274620a010201010101010f0101012d01010106090101813e0103090403696b650d01010104046c6966650c010101010103056e62696b650a0102037563682e0107010304726465722e010303736963340116010201790a010201010101010f012e010707010161030473656c660c0101046e616b652e0102036565640c01020105016c3901030a696768626f72686f6f640e010301770c010201280101010405736c6574740e01030278742e010203696e650a0104026a610c0102056b7764626d0e0102016f1f011601180107070101530304726d616c1e012e0107070101310301740c0103017735010101010101056f626c69671f012e0107070101550305737461636c0a01020663746176696137010201660a010201010101010f010101010112010401010101011301010101010101050701011701090101152c01070101140303666572350102046c61686e310101010606726c636773342e010201030101010201010101010101010101010f01030164310102016e0a01020101010101100101010f0101010101010101010101010101010101010101010101010101010f0102010101060701011b010701010a02026f6838010301703b01020670706f7369740a0115012e0107070101130201720a01020111011201010101010101010101010201010101010101010101010f01010107090101562103036465720e010f012e0107090101810b0301671d012e0107090101811a03046967696e2e0107010204746865720c01110118010101010101010101010101010f01010107070101470202757235010101010101010101010101010f010301740a0104010f0111010801010114010709010181290402726f1e012e01070701017602037665720a010201020123010202776c2e0102037a7a69340101010101702e0101010209327a6b70626e6463620a0103010101020261640c01030267650e010503616e744a010302726b0e010f01010112011b01010106070101220109010137060401740a0102010101010127010101010105086963756c61726c690c0103057469656e63350101010101040472656f6e1d01010101010f010101010101010101010101010201010101010101010101010f01010101010101050901016212010701014f010701014405026f6e1e0101012d010101060701014b010701014003047970616c1d01010101012c0101010101050901017a06010901015906010901014e0a0201633101010103066867666a6e382f0101010301010101010101010101010101010101010f0102046564616c0a010301010103066e64756c756d0e01030572666563740a0108026c690a01020369636b0a0103036c6f742e01020101010101010101010201010101010101010101010f0102046c656173350102046f696e740c01010110012e01070701013703037369741f012e01070d09010110204c03067765726c696e0d0102067261637469630a01040110012e01070701013503066f67726573730d0111012e01070701012404036d69730c01020104037065720c0102010402756435010204756e63680a010301740a01040127010105717565656e3501030369636b0e0106026c690e01010172310102036163650e0103026d700c0103016e360101010304746865721f012e01070701012c0201650a01040103036164690a0113012e01070701010304016c0e01270105026c691f012e01070701011c0401721f012e01070901010c1c0301660c0104056572656e630c010402696e0d0103046d656d620a010305736f6c75740c0104017435010304776172641d012e01070701016b020467687367320106066b7a6b65646731010201010101010101010101010101010101010f0102036964650a01010101010101010110012e010707010132050a6c696b65616e696e6a610c010501720a01020101010101030266740a0103036768740c0102086f6164626c6f636b360101010302636b0a010101730c01010123010401010115010201312e0101010101010101010101010101010101040e050f07072207050607050e06090908080520050706070b24090a0e080c0b0e0825240f0b11070b230707120807081f07070527120e49270814070710050e07360908060809232d080e0d05190c0611170f091006150913090706061407060a1e130d06060d0722120d120813060506271006071005060f0e05170a0d090f0b090a062208051038090f0e061f0a2407080c290f060a050509070a061a10080c0d0d091d090c0909080914080809050e0b09060706090e0f050910090a31070a1e053b0605132b110d0a2114170d0d060907110606071b110c0d3e162407200c0a0906071f0813110a15130909060809090706050706070f0710070d0d0509060809050f081e180e0b06070e060f'); +INSERT INTO media_items_search_index_data VALUES(274877906947,X'00040c2f370101010101010101010f010330733235010101010101010101010101010f01020b39616f6969687177686c780e01020261643b0103026d650a0113012e01070701016e020463656e650a010301010103036f6f700a01030102056561736f6e2e0103010401010101011301070374776f3601010101010101010101010f010301652e0104010301020104036b657233010305676d656e740c010304727665720c0103057373696f6e0c01020103037475700a01020101010101030376656e35010101010101010101010101010f01020468617265350105066b726f626f742e010101010101010101010101010201010101010101010101010f010308656e616e6967616e3a01030469747469310103026f650c0101010401770e010f01010110011d0101010607010113010701011c0201690e01030264650c01020103036d706c1d012e01070701011903026e6335010502657235010402676c0d0103037269751d012e01070901018123030178340101010101010101010101010101010f0102026a760a0102046b6174651e012e01070701013a06047061726b1e012e0107070101700303696c6c0a010301010102036c6f770e0102016f0c01020120010701010103026d651d0101012d010101060701016a010701013e050374696d0a0103026e671d012e0107090101810903026f6e2e010801010103037572630c01020670656369616c4a0105047472756d1f012e010707010116040265640e0104026e640c010501740c010304696e646c350103026f740e012201030472696e67300103087578786e756c30753501020101010101010101010f01020372616d0a0102037461691f012e010709010109140501720e0104026e640a0104017237010501740a0102010101030365616c300107010401701d012e01070d0901011a81380303696c6c350103036f6c612f010401701e012e01070701016d03067261696768741f012e01070701011f04036565741e012e010709070101650404696b6572390104036f6e670a0103047564696f3501040266661e012e01070701012c020275620a01020101010101040573637269620a0102010101010111012e01070701015c080270740e0105047461636b0a0103037065720a0102010101010106037269640a010201010101010904657274760a010201010101010404706f72740a010201010101010f0111010101010101010101010101010201010101010101010101010f010101070701016504067261637573680e01030272652e010101010101010101010101010201010101010101010101010f010404707269730a0104057669766f722e01020477656174350102097a6e6d7274756f76610c010101740c0102010f011801160107090101321a0203616b651f010f011f01070701012a03026c6b1d0116011801070701014b0210646b3868637435787338766c627472340a010201010101010204656163680c0104016d35010401723501030563686e69633501070271750a0102010101010111012e010707010125020368616e0d0110012e01070701010a05016b2e010701010101010401740a0102010101010110011701170107070101200301650a010201010101010f01010101010f0103010101030101010101030111010101010105110101242c0d0f093f010d01010e071819010f0801010b0616560404617465723a010401690c01020111012e01070701013b050172350104016d0a010201010111012e01070701011904016e0a0103012801040272650d01040273650a0102010101010128010101040a7573656c6573737472690c0113012e0107070101620301690a010201010101010f01010101010f01070101010101130101010101010105090101106e010901011a4301090101331f04026e670c011101110101010101010101010101010101010101010101010101010101010f010101070701012705016b0d0103036f73653601010103037265650c01250101010101010101010101010101010101010101010f010403696c6c350104046f7567680d011001010101012c0101010101050701017b010701015a010701014f0307756d626e61696c3601010101010101010101010f010203696d650a01020102010f011d011101070701016f0301700c010402746f1d012e01070901018128030272650c010101010102016f0a0101010101010101010f0101011001010106010101010103010101100101010625030101040523071007200853050606060605010d010105141e130304676574680a0103016f0d0104016b0c0102047261696c0e0104056e736665720a01030369616c0c0102010f01010101012c010101010105090101813a0103080109010124580402636b0c0102010401702f01030375746833010301790c0113012e010707010137020a746174617a73707171770e01020575746f72690c0111012e0107090101480e0201760a0102010101010102047765616b0c0104036e74690c010304697463680c01050374657238010101010101010f0103016f0a01020101012301010101010101010101010101010101010101010101010f0101017531010203637a6e0a0102010101010102046e6465721d012e0107090101811206057374616e6435010101010103066578706563740a01030568617070693a0103046c6f636b1d012e010707010169030374696c0c012a0101010201700a010101030127010202726c0e010201730a0104011001100101011d0107070101430305656c6573730c0108037472691d01010101012c0101010101050b0101740e08010b010151101f010b010146140f020a7967616d7877347465690e010101762e0101010101010101010101010101010101010101010101010101010f010201650a01130101012d010101060701010c01070101270302726935011501040473696f6e0d01020269611d01010101012c010101010105070101790107010158010701014d030364656f0a010201010101010f01010101012c010101010105070101110107010111010701013403037369743801030d7669656e6e656d656472616e6f2e010101010101010101010101010201010101010101010101010f0104067a6965706f702e010101010101010101010101010201010101010101010101010f010201730e0111012e01070903010172020f76667a366b747134726a32336d64610e01010277610c01110118011601070701015c0306636b6965737431010301690a0102010101010104017435010101010103026e741d01010117010101010101010101010101010f0101010101060701012c01070101040302726e2e010101010101010101010101010201010101010101010101010f010302736e0c01290103037463680c010201200101010101010101010101010101010101010101010101010101010f010201650a010301010111010f010701010101011601070701016a0304696768741d012e01070701013e03046c636f6d310104016c0d0103026e740c010302726535010305737465726e39010304787862630c0102036861740e012701050265760c01030365656c0a010301010111012e01070901010d1c06036261730e010601690a0104016e0a012401010101010101040272651d012e01070701013403036963680e010f012e01070901011b2c03016f350104026c651d012e0107070101210301791f012e01070d0601013a300f0203696c6c1d0101011801010114010101060701011c010701012103016e0d01030274680a0102010101120116011801070b01011e132505036f75740a01040102036f726b35010101010105036f75741e012e01070901010b7804026c6435010303756c640d010101020277770a010201010101010f01010101010f0101010101010101010101010101010101010101010101010101010f010101010101010507010171010701014e01090101431d010b79317366367a65617375304a010205327135726e0a010203346e610e0102036561720c0105026c694a0102026f750a010201010101010f01010101010f01070101010101140101010101050f01010b0b0c0f4d010f0101031c0b0927010b01011a11200401720a0104010f0101012d01010106090101350a01090101071e040274750c010201260101010101010101010101010101010f010601620a0102010101010111010f0101010101010101010101010101010101010101010101010101010f010301070701015f020a7865726c697362787871340101010101010101010101010101010f0101047a6f6e650a0102027a370e0110140f060f0c0913130b0709080b0d1508240c08081905080e0606060f15060f0f0b070d16070e0a070a0f06060508080818070f05060509090f07070c110f0807080d0c1806080d0d0e330a200809080d13100f1a0805050915100b16400810051209061017332d05091f07231716050e0a3f0805050809240805070e0e130b0807080f23050d100d0a090f0b0b061409260e211708081f28072b240f13110a0b09262008271a0f08050606090809061507050d0d11050d0f1b0517090b0f0609460f09070706391b1a321e08'); +INSERT INTO media_items_search_index_data VALUES(412316860417,X'000003430230617b0e0101150515160e0204626f75747b0601010802036c736f7b0601014902026e647b08010104360201727b0e070101070c2d3c03016d7b080101201301046261636b7b0c040101026b0a020465636f6d7b0601013e03026e747b0601013002036f74687b0601010602037573697b060101630301747b0a01010e154f0101637b060101610202616e7b0601014802026f6d7b0a0101451d090404706c65747b0601011201066469666665727b0a0a01013d3e02016f7b0601016903036e61747b0601014c01076578706c61696e7b0801013944010966696572676f6c6c617b0601015b02067572746865727b060101540105676d61696c7b060101660104686572657b0601014102036967687b0801012d4202026f707b0e0501010327460a02037474707b080101421d0101697b0601013502016e7b0a0101170d12030571756972697b0601016403077374616772616d7b0601015901046c696e6b7b0601015102016c7b0601013602026f777b0801011d5501046d616b657b0601014a03046e75616c7b0e020101051658040301787b0601015a0201657b0601015701026e6f7b0601015301056f626c69677b060101550201667b0601011402016e7b0601010a020670706f7369747b06010113010770617472656f6e7b0601014405026f6e7b0601014003047970616c7b0801014e0a02046f7369747b0c09010110204c01067261746865727b0601012c020565616c6c697b0601011c0401727b0801010c1c0108737065637472756d7b0601011602037461697b080101091403067261696768747b0601011f0207756273637269627b0601015c010474616b657b0601012a02076563686e6971757b06010125020268657b0e0801010b0616560401697b0601013b040a7573656c6573737472697b060101620301697b080101331f0305726f7567687b0601014f02047269616c7b08010124580301797b06010137010a7573656c6573737472697b0a010146140f01037669617b0601014d030364656f7b060101340201737b0803010172010277657b0601016a02046865656c7b0801010d1c0301797b0c0601013a300f02036974687b0a01011e1325020277777b080101431d0103796f757b0a01011a112004037475627b0601015f040c0b0a0a0c090e0b090a0a0a08090b0b0f080a0f100d0c0b0b0d0b080a0c0e0b080a0b0f0808090c08080d0e090c0e0d0c090f0b0d0e0b0e0d0811090c0c08130a0a09090c0b0c0a0c'); +INSERT INTO media_items_search_index_data VALUES(549755813889,X'000005c802303079090101811e010134790f08010118810734010161790b01011581000202626c790701015d03036f7574790701014c020563726f7373790701012002026c6c790701014302026e6479070101680205726f756e64790701013f03047469737479090101811f0201747909010157170306747269627574790901018116020a7564696f6e6175746978790b0101810f1401046261636b79090101812b03046c616e6379090101360d0203657374790701015a0203696b6579090101814602046c616b657909010181270302756579090101810d02026d787909010181420206726f6f6b657279090101810c0203757369790901018104030174790701013902017979110101810e100b0907010363616e7907010177020668616e6e656c790701016702026f6d790b010173171c04036d6f6e7909010181150502756e7907010163040770726568656e7379070101500206726561746976790901018114080765636f6d6d6f6e7909010181190305697474657279090101812f0303756973790901018130010364616e79090101812d020465707468790701015202056972656374790701014403057374616e6379090601013002026f6e79070101490402617479070101780105656e6a6f69790701014d0203766572790901010d4a010966696572676f6c6c61790901018103020675727468657279070101090103676574790701010202046d61696c7909010181070105686172726979090101813302026f77791702010106367c05060606090406746f6d616e757909010181510203747470790b0101702a0a01016979090101124b020166790701012a02056d6167696e790701010e0304706f7274790701012602016e79110701010f35113b460305717569726979090101810503077374616772616d79090101810102017379090101385a03016e790701013101046a617a7a79090101812402056572656d6979090101812602036f696e79070101600203757374790701013301056c6561726e790f010105268120070606746f6d616e757909010181520402737479070101580306626f7769747a79090101812e02056963656e73790d01018111080603026e6b790701017d02036f6e6779090501012f030174790701012301046d616b65790901011d4403026e697907010146040375616c791d040101081911276505060606060603027474790901018132030178790901018102020165790701017f030474686f64790701011602036f737479090101252c03027665790701013c0202746279090101813e020179790701016101026f667907010117020172790901015621030364657279090101810b03016779090101811a02047468657279070101470202757479090101812901047061726b790701012203057472656f6e79090101621203047970616c790901017a0602046f696e747907010137010572656164697907010103030477617264790701016b010473616d65790701016e0203686f7779070101130204696d706c7907010119030372697579090101812302036f6d65790701016a03026e677909010181090203746570790d0901011a813802067570706f7274790701016501017479090101321a0203616c6b790701014b020368616e790701010a03016579110101242c0d0f093f03016979090101106e04026e6779070101270305726f756768790701017b0203696d65790701016f030370746f79090101812802016f792503010104052307100720085305060606060502047269616c79090101813a020575746f726979090101480e0105756e64657279090101811203046c6f636b7907010169020973656c657373747269790b0101740e0801027665790701010c020269617907010179030364656f790701011101027761790701015c03026e74790701012c02056569676874790701013e02046865726579070101340303696368790901011b2c03036f6c6579070101210203696c6c790701011c0202777779070101710103796f75790f01010b0b0c0f4d04017279090101350a04090c0a090a0c09090c0c090e130c0c0a0b0c0a0a0e0b080d0a0d0b0b090e0e0f0d0b0b0b0c0d09090c0b110d0a0c0d110e0c09080c0b0d0d0f09080c0d0a0a100e090e0f090b080c09150a09080b0b090a0809090b090b0a0b0d0c0b0c0b0b0a0b0b0a0a0d0d090a0a0d09090c0a0b170c0d0d0b1209090a09090c0b0b0a0a090e'); +INSERT INTO media_items_search_index_data VALUES(687194767361,X'000003ff0230307a0b01016005060201307a070101610201387a07010172010231337a070101640201387a0701016c0101327a0901016b050201357a070101750101337a0901017105010234307a070101680101357a03020201347a0701016f0101617a0b010109430e02056476616e637a09030101460204667465727a0701012502036c736f7a0701015402026e647a090a010139020470706c697a0701012f0201727a0701013d010562617369637a0901011418020465636f6d7a0701014902026d787a030b02036f6e757a0701017302037573697a0701017a010363616e7a0901012e2702026f6d7a090101503003056e74696e757a070101220503726f6c7a0701014803037665727a07010112010564656469637a07010134030576656c6f707a0701014502016f7a0701010203036e61747a0701015702037572657a0701010c0107657865726369737a0d0501011f2441010966696572676f6c6c617a07010179030276657a0701011e02026f727a03060203726f6d7a0701012b01036761707a0701016602036976657a0701010602046d61696c7a0701017d0104686572657a0901013c1202026f707a0701016a0301777a0701011602037474707a0701014d0101697a0701014202016e7a0901013008030571756972697a0701017b03077374616772616d7a07010177030374726f7a0701016201046c6173747a0701010f02046561726e7a070101180203696e6b7a0701015c030374746c7a0701010a02076f636b646f776e7a0701010d0301747a0701013801046d616b657a0701015503046e75616c7a11040101080a3924180304737465727a070101280301787a070101780201657a0701015e020274627a030901066e6f726d616c7a0701013101026f667a090101152c02016e7a0701011b02047574726f7a0701017601047061726b7a090101370603057472656f6e7a0701014f05026f6e7a0701014b03047970616c7a090101590602067261637469637a0701013503066f67726573737a070101240104726964657a07010132010473686f777a0701011c02046b6174657a0701013a06047061726b7a0701017002036f6d657a0701013e0203746f707a0701016d0304726565747a090701016503037566667a0701012c0104746861747a070101200301657a0d01010e07181904016d7a070101190301697a0901011a430305726f7567687a0701015a02016f7a0d010105141e1302047269616c7a0308010275737a070101430308656c6573737472697a0b010151101f010276657a07010127020269617a07010158030364656f7a07010111010477616e747a070101040203696c6c7a0701012102066f726b6f75747a0901010b78020277777a0701014e0103796f757a0f0101031c0b09270401727a090101071e040a080809080908090906080a0d0b0a0a0b080d0b070a0a0b0a0c0a0a0c0c080a0a111009070a0a0a0b0c09080a08090c0e0a0b0b0a0a0e080b100b0808070d0a080b0c0c090c0d0d0b0b0b0b0a0a0c0a0b0b08090c0b09091109090a0b0a0e090e'); +INSERT INTO media_items_search_index_data VALUES(824633720833,X'000003430230617b0f0101150515160e0204626f75747b0701010802036c736f7b0701014902026e647b09010104360201727b0f070101070c2d3c03016d7b090101201301046261636b7b0d040101026b0a020465636f6d7b0701013e03026e747b0701013002036f74687b0701010602037573697b070101630301747b0b01010e154f0101637b070101610202616e7b0701014802026f6d7b0b0101451d090404706c65747b0701011201066469666665727b0b0a01013d3e02016f7b0701016903036e61747b0701014c01076578706c61696e7b0901013944010966696572676f6c6c617b0701015b02067572746865727b070101540105676d61696c7b070101660104686572657b0701014102036967687b0901012d4202026f707b0f0501010327460a02037474707b090101421d0101697b0701013502016e7b0b0101170d12030571756972697b0701016403077374616772616d7b0701015901046c696e6b7b0701015102016c7b0701013602026f777b0901011d5501046d616b657b0701014a03046e75616c7b0f020101051658040301787b0701015a0201657b0701015701026e6f7b0701015301056f626c69677b070101550201667b0701011402016e7b0701010a020670706f7369747b07010113010770617472656f6e7b0701014405026f6e7b0701014003047970616c7b0901014e0a02046f7369747b0d09010110204c01067261746865727b0701012c020565616c6c697b0701011c0401727b0901010c1c0108737065637472756d7b0701011602037461697b090101091403067261696768747b0701011f0207756273637269627b0701015c010474616b657b0701012a02076563686e6971757b07010125020268657b0f0801010b0616560401697b0701013b040a7573656c6573737472697b070101620301697b090101331f0305726f7567687b0701014f02047269616c7b09010124580301797b07010137010a7573656c6573737472697b0b010146140f01037669617b0701014d030364656f7b070101340201737b0903010172010277657b0701016a02046865656c7b0901010d1c0301797b0d0601013a300f02036974687b0b01011e1325020277777b090101431d0103796f757b0b01011a112004037475627b0701015f040c0b0a0a0c090e0b090a0a0a08090b0b0f080a0f100d0c0b0b0d0b080a0c0e0b080a0b0f0808090c08080d0e090c0e0d0c090f0b0d0e0b0e0d0811090c0c08130a0a09090c0b0c0a0c'); +INSERT INTO media_items_search_index_data VALUES(962072674305,X'000003430230617b0f0101150515160e0204626f75747b0701010802036c736f7b0701014902026e647b09010104360201727b0f070101070c2d3c03016d7b090101201301046261636b7b0d040101026b0a020465636f6d7b0701013e03026e747b0701013002036f74687b0701010602037573697b070101630301747b0b01010e154f0101637b070101610202616e7b0701014802026f6d7b0b0101451d090404706c65747b0701011201066469666665727b0b0a01013d3e02016f7b0701016903036e61747b0701014c01076578706c61696e7b0901013944010966696572676f6c6c617b0701015b02067572746865727b070101540105676d61696c7b070101660104686572657b0701014102036967687b0901012d4202026f707b0f0501010327460a02037474707b090101421d0101697b0701013502016e7b0b0101170d12030571756972697b0701016403077374616772616d7b0701015901046c696e6b7b0701015102016c7b0701013602026f777b0901011d5501046d616b657b0701014a03046e75616c7b0f020101051658040301787b0701015a0201657b0701015701026e6f7b0701015301056f626c69677b070101550201667b0701011402016e7b0701010a020670706f7369747b07010113010770617472656f6e7b0701014405026f6e7b0701014003047970616c7b0901014e0a02046f7369747b0d09010110204c01067261746865727b0701012c020565616c6c697b0701011c0401727b0901010c1c0108737065637472756d7b0701011602037461697b090101091403067261696768747b0701011f0207756273637269627b0701015c010474616b657b0701012a02076563686e6971757b07010125020268657b0f0801010b0616560401697b0701013b040a7573656c6573737472697b070101620301697b090101331f0305726f7567687b0701014f02047269616c7b09010124580301797b07010137010a7573656c6573737472697b0b010146140f01037669617b0701014d030364656f7b070101340201737b0903010172010277657b0701016a02046865656c7b0901010d1c0301797b0d0601013a300f02036974687b0b01011e1325020277777b090101431d0103796f757b0b01011a112004037475627b0701015f040c0b0a0a0c090e0b090a0a0a08090b0b0f080a0f100d0c0b0b0d0b080a0c0e0b080a0b0f0808090c08080d0e090c0e0d0c090f0b0d0e0b0e0d0811090c0c08130a0a09090c0b0c0a0c'); +INSERT INTO media_items_search_index_data VALUES(1099511627777,X'000003430230617b0f0101150515160e0204626f75747b0701010802036c736f7b0701014902026e647b09010104360201727b0f070101070c2d3c03016d7b090101201301046261636b7b0d040101026b0a020465636f6d7b0701013e03026e747b0701013002036f74687b0701010602037573697b070101630301747b0b01010e154f0101637b070101610202616e7b0701014802026f6d7b0b0101451d090404706c65747b0701011201066469666665727b0b0a01013d3e02016f7b0701016903036e61747b0701014c01076578706c61696e7b0901013944010966696572676f6c6c617b0701015b02067572746865727b070101540105676d61696c7b070101660104686572657b0701014102036967687b0901012d4202026f707b0f0501010327460a02037474707b090101421d0101697b0701013502016e7b0b0101170d12030571756972697b0701016403077374616772616d7b0701015901046c696e6b7b0701015102016c7b0701013602026f777b0901011d5501046d616b657b0701014a03046e75616c7b0f020101051658040301787b0701015a0201657b0701015701026e6f7b0701015301056f626c69677b070101550201667b0701011402016e7b0701010a020670706f7369747b07010113010770617472656f6e7b0701014405026f6e7b0701014003047970616c7b0901014e0a02046f7369747b0d09010110204c01067261746865727b0701012c020565616c6c697b0701011c0401727b0901010c1c0108737065637472756d7b0701011602037461697b090101091403067261696768747b0701011f0207756273637269627b0701015c010474616b657b0701012a02076563686e6971757b07010125020268657b0f0801010b0616560401697b0701013b040a7573656c6573737472697b070101620301697b090101331f0305726f7567687b0701014f02047269616c7b09010124580301797b07010137010a7573656c6573737472697b0b010146140f01037669617b0701014d030364656f7b070101340201737b0903010172010277657b0701016a02046865656c7b0901010d1c0301797b0d0601013a300f02036974687b0b01011e1325020277777b090101431d0103796f757b0b01011a112004037475627b0701015f040c0b0a0a0c090e0b090a0a0a08090b0b0f080a0f100d0c0b0b0d0b080a0c0e0b080a0b0f0808090c08080d0e090c0e0d0c090f0b0d0e0b0e0d0811090c0c08130a0a09090c0b0c0a0c'); +INSERT INTO media_items_search_index_data VALUES(1236950581249,X'000003430230617b0f0101150515160e0204626f75747b0701010802036c736f7b0701014902026e647b09010104360201727b0f070101070c2d3c03016d7b090101201301046261636b7b0d040101026b0a020465636f6d7b0701013e03026e747b0701013002036f74687b0701010602037573697b070101630301747b0b01010e154f0101637b070101610202616e7b0701014802026f6d7b0b0101451d090404706c65747b0701011201066469666665727b0b0a01013d3e02016f7b0701016903036e61747b0701014c01076578706c61696e7b0901013944010966696572676f6c6c617b0701015b02067572746865727b070101540105676d61696c7b070101660104686572657b0701014102036967687b0901012d4202026f707b0f0501010327460a02037474707b090101421d0101697b0701013502016e7b0b0101170d12030571756972697b0701016403077374616772616d7b0701015901046c696e6b7b0701015102016c7b0701013602026f777b0901011d5501046d616b657b0701014a03046e75616c7b0f020101051658040301787b0701015a0201657b0701015701026e6f7b0701015301056f626c69677b070101550201667b0701011402016e7b0701010a020670706f7369747b07010113010770617472656f6e7b0701014405026f6e7b0701014003047970616c7b0901014e0a02046f7369747b0d09010110204c01067261746865727b0701012c020565616c6c697b0701011c0401727b0901010c1c0108737065637472756d7b0701011602037461697b090101091403067261696768747b0701011f0207756273637269627b0701015c010474616b657b0701012a02076563686e6971757b07010125020268657b0f0801010b0616560401697b0701013b040a7573656c6573737472697b070101620301697b090101331f0305726f7567687b0701014f02047269616c7b09010124580301797b07010137010a7573656c6573737472697b0b010146140f01037669617b0701014d030364656f7b070101340201737b0903010172010277657b0701016a02046865656c7b0901010d1c0301797b0d0601013a300f02036974687b0b01011e1325020277777b090101431d0103796f757b0b01011a112004037475627b0701015f040c0b0a0a0c090e0b090a0a0a08090b0b0f080a0f100d0c0b0b0d0b080a0c0e0b080a0b0f0808090c08080d0e090c0e0d0c090f0b0d0e0b0e0d0811090c0c08130a0a09090c0b0c0a0c'); +INSERT INTO media_items_search_index_data VALUES(1374389534721,X'000003ff0230307a0b01016005060201307a070101610201387a07010172010231337a070101640201387a0701016c0101327a0901016b050201357a070101750101337a0901017105010234307a070101680101357a03020201347a0701016f0101617a0b010109430e02056476616e637a09030101460204667465727a0701012502036c736f7a0701015402026e647a090a010139020470706c697a0701012f0201727a0701013d010562617369637a0901011418020465636f6d7a0701014902026d787a030b02036f6e757a0701017302037573697a0701017a010363616e7a0901012e2702026f6d7a090101503003056e74696e757a070101220503726f6c7a0701014803037665727a07010112010564656469637a07010134030576656c6f707a0701014502016f7a0701010203036e61747a0701015702037572657a0701010c0107657865726369737a0d0501011f2441010966696572676f6c6c617a07010179030276657a0701011e02026f727a03060203726f6d7a0701012b01036761707a0701016602036976657a0701010602046d61696c7a0701017d0104686572657a0901013c1202026f707a0701016a0301777a0701011602037474707a0701014d0101697a0701014202016e7a0901013008030571756972697a0701017b03077374616772616d7a07010177030374726f7a0701016201046c6173747a0701010f02046561726e7a070101180203696e6b7a0701015c030374746c7a0701010a02076f636b646f776e7a0701010d0301747a0701013801046d616b657a0701015503046e75616c7a11040101080a3924180304737465727a070101280301787a070101780201657a0701015e020274627a030901066e6f726d616c7a0701013101026f667a090101152c02016e7a0701011b02047574726f7a0701017601047061726b7a090101370603057472656f6e7a0701014f05026f6e7a0701014b03047970616c7a090101590602067261637469637a0701013503066f67726573737a070101240104726964657a07010132010473686f777a0701011c02046b6174657a0701013a06047061726b7a0701017002036f6d657a0701013e0203746f707a0701016d0304726565747a090701016503037566667a0701012c0104746861747a070101200301657a0d01010e07181904016d7a070101190301697a0901011a430305726f7567687a0701015a02016f7a0d010105141e1302047269616c7a0308010275737a070101430308656c6573737472697a0b010151101f010276657a07010127020269617a07010158030364656f7a07010111010477616e747a070101040203696c6c7a0701012102066f726b6f75747a0901010b78020277777a0701014e0103796f757a0f0101031c0b09270401727a090101071e040a080809080908090906080a0d0b0a0a0b080d0b070a0a0b0a0c0a0a0c0c080a0a111009070a0a0a0b0c09080a08090c0e0a0b0b0a0a0e080b100b0808070d0a080b0c0c090c0d0d0b0b0b0b0a0a0c0a0b0b08090c0b09091109090a0b0a0e090e'); +INSERT INTO media_items_search_index_data VALUES(1511828488193,X'000003ff0230307a0b01016005060201307a070101610201387a07010172010231337a070101640201387a0701016c0101327a0901016b050201357a070101750101337a0901017105010234307a070101680101357a03020201347a0701016f0101617a0b010109430e02056476616e637a09030101460204667465727a0701012502036c736f7a0701015402026e647a090a010139020470706c697a0701012f0201727a0701013d010562617369637a0901011418020465636f6d7a0701014902026d787a030b02036f6e757a0701017302037573697a0701017a010363616e7a0901012e2702026f6d7a090101503003056e74696e757a070101220503726f6c7a0701014803037665727a07010112010564656469637a07010134030576656c6f707a0701014502016f7a0701010203036e61747a0701015702037572657a0701010c0107657865726369737a0d0501011f2441010966696572676f6c6c617a07010179030276657a0701011e02026f727a03060203726f6d7a0701012b01036761707a0701016602036976657a0701010602046d61696c7a0701017d0104686572657a0901013c1202026f707a0701016a0301777a0701011602037474707a0701014d0101697a0701014202016e7a0901013008030571756972697a0701017b03077374616772616d7a07010177030374726f7a0701016201046c6173747a0701010f02046561726e7a070101180203696e6b7a0701015c030374746c7a0701010a02076f636b646f776e7a0701010d0301747a0701013801046d616b657a0701015503046e75616c7a11040101080a3924180304737465727a070101280301787a070101780201657a0701015e020274627a030901066e6f726d616c7a0701013101026f667a090101152c02016e7a0701011b02047574726f7a0701017601047061726b7a090101370603057472656f6e7a0701014f05026f6e7a0701014b03047970616c7a090101590602067261637469637a0701013503066f67726573737a070101240104726964657a07010132010473686f777a0701011c02046b6174657a0701013a06047061726b7a0701017002036f6d657a0701013e0203746f707a0701016d0304726565747a090701016503037566667a0701012c0104746861747a070101200301657a0d01010e07181904016d7a070101190301697a0901011a430305726f7567687a0701015a02016f7a0d010105141e1302047269616c7a0308010275737a070101430308656c6573737472697a0b010151101f010276657a07010127020269617a07010158030364656f7a07010111010477616e747a070101040203696c6c7a0701012102066f726b6f75747a0901010b78020277777a0701014e0103796f757a0f0101031c0b09270401727a090101071e040a080809080908090906080a0d0b0a0a0b080d0b070a0a0b0a0c0a0a0c0c080a0a111009070a0a0a0b0c09080a08090c0e0a0b0b0a0a0e080b100b0808070d0a080b0c0c090c0d0d0b0b0b0b0a0a0c0a0b0b08090c0b09091109090a0b0a0e090e'); +INSERT INTO media_items_search_index_data VALUES(1649267441665,X'000005c802303079090101811e010134790f08010118810734010161790b01011581000202626c790701015d03036f7574790701014c020563726f7373790701012002026c6c790701014302026e6479070101680205726f756e64790701013f03047469737479090101811f0201747909010157170306747269627574790901018116020a7564696f6e6175746978790b0101810f1401046261636b79090101812b03046c616e6379090101360d0203657374790701015a0203696b6579090101814602046c616b657909010181270302756579090101810d02026d787909010181420206726f6f6b657279090101810c0203757369790901018104030174790701013902017979110101810e100b0907010363616e7907010177020668616e6e656c790701016702026f6d790b010173171c04036d6f6e7909010181150502756e7907010163040770726568656e7379070101500206726561746976790901018114080765636f6d6d6f6e7909010181190305697474657279090101812f0303756973790901018130010364616e79090101812d020465707468790701015202056972656374790701014403057374616e6379090601013002026f6e79070101490402617479070101780105656e6a6f69790701014d0203766572790901010d4a010966696572676f6c6c61790901018103020675727468657279070101090103676574790701010202046d61696c7909010181070105686172726979090101813302026f77791702010106367c05060606090406746f6d616e757909010181510203747470790b0101702a0a01016979090101124b020166790701012a02056d6167696e790701010e0304706f7274790701012602016e79110701010f35113b460305717569726979090101810503077374616772616d79090101810102017379090101385a03016e790701013101046a617a7a79090101812402056572656d6979090101812602036f696e79070101600203757374790701013301056c6561726e790f010105268120070606746f6d616e757909010181520402737479070101580306626f7769747a79090101812e02056963656e73790d01018111080603026e6b790701017d02036f6e6779090501012f030174790701012301046d616b65790901011d4403026e697907010146040375616c791d040101081911276505060606060603027474790901018132030178790901018102020165790701017f030474686f64790701011602036f737479090101252c03027665790701013c0202746279090101813e020179790701016101026f667907010117020172790901015621030364657279090101810b03016779090101811a02047468657279070101470202757479090101812901047061726b790701012203057472656f6e79090101621203047970616c790901017a0602046f696e747907010137010572656164697907010103030477617264790701016b010473616d65790701016e0203686f7779070101130204696d706c7907010119030372697579090101812302036f6d65790701016a03026e677909010181090203746570790d0901011a813802067570706f7274790701016501017479090101321a0203616c6b790701014b020368616e790701010a03016579110101242c0d0f093f03016979090101106e04026e6779070101270305726f756768790701017b0203696d65790701016f030370746f79090101812802016f792503010104052307100720085305060606060502047269616c79090101813a020575746f726979090101480e0105756e64657279090101811203046c6f636b7907010169020973656c657373747269790b0101740e0801027665790701010c020269617907010179030364656f790701011101027761790701015c03026e74790701012c02056569676874790701013e02046865726579070101340303696368790901011b2c03036f6c6579070101210203696c6c790701011c0202777779070101710103796f75790f01010b0b0c0f4d04017279090101350a04090c0a090a0c09090c0c090e130c0c0a0b0c0a0a0e0b080d0a0d0b0b090e0e0f0d0b0b0b0c0d09090c0b110d0a0c0d110e0c09080c0b0d0d0f09080c0d0a0a100e090e0f090b080c09150a09080b0b090a0809090b090b0a0b0d0c0b0c0b0b0a0b0b0a0a0d0d090a0a0d09090c0a0b170c0d0d0b1209090a09090c0b0b0a0a090e'); +INSERT INTO media_items_search_index_data VALUES(1786706395137,X'000005c802303079090101811e010134790f08010118810734010161790b01011581000202626c790701015d03036f7574790701014c020563726f7373790701012002026c6c790701014302026e6479070101680205726f756e64790701013f03047469737479090101811f0201747909010157170306747269627574790901018116020a7564696f6e6175746978790b0101810f1401046261636b79090101812b03046c616e6379090101360d0203657374790701015a0203696b6579090101814602046c616b657909010181270302756579090101810d02026d787909010181420206726f6f6b657279090101810c0203757369790901018104030174790701013902017979110101810e100b0907010363616e7907010177020668616e6e656c790701016702026f6d790b010173171c04036d6f6e7909010181150502756e7907010163040770726568656e7379070101500206726561746976790901018114080765636f6d6d6f6e7909010181190305697474657279090101812f0303756973790901018130010364616e79090101812d020465707468790701015202056972656374790701014403057374616e6379090601013002026f6e79070101490402617479070101780105656e6a6f69790701014d0203766572790901010d4a010966696572676f6c6c61790901018103020675727468657279070101090103676574790701010202046d61696c7909010181070105686172726979090101813302026f77791702010106367c05060606090406746f6d616e757909010181510203747470790b0101702a0a01016979090101124b020166790701012a02056d6167696e790701010e0304706f7274790701012602016e79110701010f35113b460305717569726979090101810503077374616772616d79090101810102017379090101385a03016e790701013101046a617a7a79090101812402056572656d6979090101812602036f696e79070101600203757374790701013301056c6561726e790f010105268120070606746f6d616e757909010181520402737479070101580306626f7769747a79090101812e02056963656e73790d01018111080603026e6b790701017d02036f6e6779090501012f030174790701012301046d616b65790901011d4403026e697907010146040375616c791d040101081911276505060606060603027474790901018132030178790901018102020165790701017f030474686f64790701011602036f737479090101252c03027665790701013c0202746279090101813e020179790701016101026f667907010117020172790901015621030364657279090101810b03016779090101811a02047468657279070101470202757479090101812901047061726b790701012203057472656f6e79090101621203047970616c790901017a0602046f696e747907010137010572656164697907010103030477617264790701016b010473616d65790701016e0203686f7779070101130204696d706c7907010119030372697579090101812302036f6d65790701016a03026e677909010181090203746570790d0901011a813802067570706f7274790701016501017479090101321a0203616c6b790701014b020368616e790701010a03016579110101242c0d0f093f03016979090101106e04026e6779070101270305726f756768790701017b0203696d65790701016f030370746f79090101812802016f792503010104052307100720085305060606060502047269616c79090101813a020575746f726979090101480e0105756e64657279090101811203046c6f636b7907010169020973656c657373747269790b0101740e0801027665790701010c020269617907010179030364656f790701011101027761790701015c03026e74790701012c02056569676874790701013e02046865726579070101340303696368790901011b2c03036f6c6579070101210203696c6c790701011c0202777779070101710103796f75790f01010b0b0c0f4d04017279090101350a04090c0a090a0c09090c0c090e130c0c0a0b0c0a0a0e0b080d0a0d0b0b090e0e0f0d0b0b0b0c0d09090c0b110d0a0c0d110e0c09080c0b0d0d0f09080c0d0a0a100e090e0f090b080c09150a09080b0b090a0809090b090b0a0b0d0c0b0c0b0b0a0b0b0a0a0d0d090a0a0d09090c0a0b170c0d0d0b1209090a09090c0b0b0a0a090e'); +INSERT INTO media_items_search_index_data VALUES(1924145348609,X'000003bf0230307901010134790101016179010202626c790103036f75747901020563726f7373790102026c6c790102026e6479010205726f756e6479010304746973747901020174790103067472696275747901020a7564696f6e6175746978790101046261636b790103046c616e637901020365737479010203696b65790102046c616b65790103027565790102026d7879010206726f6f6b657279010203757369790103017479010201797901010363616e7901020668616e6e656c790102026f6d790104036d6f6e79010502756e7901040770726568656e73790102067265617469767901080765636f6d6d6f6e790103056974746572790103037569737901010364616e7901020465707468790102056972656374790103057374616e63790102026f6e79010402617479010105656e6a6f69790102037665727901010966696572676f6c6c617901020675727468657279010103676574790102046d61696c790101056861727269790102026f7779010406746f6d616e757901020374747079010101697901020166790102056d6167696e79010304706f7274790102016e790103057175697269790103077374616772616d7901020173790103016e790101046a617a7a790102056572656d69790102036f696e79010203757374790101056c6561726e79010606746f6d616e7579010402737479010306626f7769747a790102056963656e73790103026e6b790102036f6e677901030174790101046d616b65790103026e697901040375616c790103027474790103017879010201657901030474686f64790102036f73747901030276657901020274627901020179790101026f6679010201727901030364657279010301677901020474686572790102027574790101047061726b790103057472656f6e790103047970616c790102046f696e7479010105726561646979010304776172647901010473616d6579010203686f7779010204696d706c79010303726975790102036f6d65790103026e6779010203746570790102067570706f7274790101017479010203616c6b7901020368616e79010301657901030169790104026e6779010305726f75676879010203696d657901030370746f790102016f790102047269616c7901020575746f726979010105756e646572790103046c6f636b7901020973656c6573737472697901010276657901020269617901030364656f790101027761790103026e74790102056569676874790102046865726579010303696368790103036f6c6579010203696c6c79010202777779010103796f75790104017279010405050506070906060908050a0e080807070806060a070505070a0607060b0a0b090707080909060609070d0a070809060a070505090805090b050508090707090a060a090607050806070605050807060605060507050806080908080908080708070706070a05070705050609070705080909080d060607060609080707070607'); +INSERT INTO media_items_search_index_data VALUES(2061584302081,X'000002bb0230307a010201307a010201387a01010231337a010201387a010101327a010201357a010101337a01010234307a010101357a010201347a010101617a0102056476616e637a010204667465727a0102036c736f7a0102026e647a01020470706c697a010201727a01010562617369637a01020465636f6d7a0102026d787a0102036f6e757a0102037573697a01010363616e7a0102026f6d7a0103056e74696e757a010503726f6c7a0103037665727a01010564656469637a01030576656c6f707a0102016f7a0103036e61747a0102037572657a010107657865726369737a01010966696572676f6c6c617a01030276657a0102026f727a010203726f6d7a0101036761707a0102036976657a0102046d61696c7a010104686572657a0102026f707a010301777a0102037474707a010101697a0102016e7a01030571756972697a0103077374616772616d7a01030374726f7a0101046c6173747a0102046561726e7a010203696e6b7a01030374746c7a0102076f636b646f776e7a010301747a0101046d616b657a0103046e75616c7a010304737465727a010301787a010201657a01020274627a0101066e6f726d616c7a0101026f667a0102016e7a0102047574726f7a0101047061726b7a0103057472656f6e7a0105026f6e7a0103047970616c7a0102067261637469637a0103066f67726573737a010104726964657a01010473686f777a0102046b6174657a0106047061726b7a0102036f6d657a010203746f707a010304726565747a0103037566667a010104746861747a010301657a0104016d7a010301697a010305726f7567687a0102016f7a0102047269616c7a01010275737a010308656c6573737472697a01010276657a01020269617a01030364656f7a01010477616e747a010203696c6c7a0102066f726b6f75747a01020277777a010103796f757a010401727a01040505050605050505060505050908070608050908060707070609070709090507070b0d060607070708080605070505090b07080807070b050808080505060a060508080906080a0a080808080707080708050505090508060c06060708070a0607'); +INSERT INTO media_items_search_index_data VALUES(2199023255553,X'0000022c0230617b010204626f75747b0102036c736f7b0102026e647b010201727b0103016d7b0101046261636b7b01020465636f6d7b0103026e747b0102036f74687b0102037573697b010301747b010101637b010202616e7b0102026f6d7b010404706c65747b0101066469666665727b0102016f7b0103036e61747b0101076578706c61696e7b01010966696572676f6c6c617b0102067572746865727b010105676d61696c7b010104686572657b0102036967687b0102026f707b0102037474707b010101697b0102016e7b01030571756972697b0103077374616772616d7b0101046c696e6b7b0102016c7b0102026f777b0101046d616b657b0103046e75616c7b010301787b010201657b0101026e6f7b0101056f626c69677b010201667b0102016e7b01020670706f7369747b01010770617472656f6e7b0105026f6e7b0103047970616c7b0102046f7369747b0101067261746865727b01020565616c6c697b010401727b010108737065637472756d7b0102037461697b0103067261696768747b010207756273637269627b01010474616b657b0102076563686e6971757b01020268657b010401697b01040a7573656c6573737472697b010301697b010305726f7567687b0102047269616c7b010301797b01010a7573656c6573737472697b0101037669617b01030364656f7b010201737b01010277657b0102046865656c7b010301797b0102036974687b01020277777b010103796f757b0104037475627b0104050807060505080806070705050606080a05070b0d0a09080706070505090b08050608080505060905050a0b0608080a09050c070a0b080b06050e050908050e070705060805070607'); +INSERT INTO media_items_search_index_data VALUES(2473901162497,X'00000f0e0230615b010101010101010101010f01017a14170f0c0206646d6f6e69745b010101010101010101010701015703036f726e5b01010101010101010101090101814d030476616e635b010101010101010101010701014102066d65726963615b010101010101010101010701010402016e5b0101010101010101010107010174030561746f6d695b010101010101010101010701014f0301645b01010101010101010101110601011d63340d0d0301745b010101010101010101010701012c0201725b01010101010101010101090101811602047368656e5b010101010101010101010701014e03016b630701015303047472616c5b01010101010101010101070101710201745b01010101010101010101090101816a02047564696f6309080101030101625b01010101010101010101070101090205617272656e5b010101010101010101010b050101812f020365656e5b01010101010101010101070101590303666f725b0101010101010101010107010167020269645b010101010101010101010b010181010502046c6f6f645b0101010101010101010107010152040b77696e796f75726d696e64630701015d02036f726e5b010101010101010101010901018144020972656174686c6573735b010101010101010101010b07010181310401645b010101010101010101010701014803036f776e6309040101050608657965646769726c630701015c020375726e5b010101010101010101010701012e0301745b010101010101010101010701015b0201795b010101010101010101010d01011a0a810003070101080107636164617665725b01010101010101010101090101814103056c616d69745b01010101010101010101090101810d030672656c6573735b01010101010101010101090101817e020668616e6e656c630701011b03036f7275630701015e030272695b010101010101010101010701011b0505737469616e5b010101010101010101010701011e02046c65616e5b01010101010101010101090101813902066f6c6c6563745b010101010101010101010701011403016d5b01010101010101010101090101080d040370656c5b01010101010101010101090101811f03056e74726f6c5b01010101010101010101090101811e03037765725b010101010101010101010701016602067265617475725b010101010101010101010d010181661b0a0307756369666f726d5b01010101010101010101090101814c02037572735b01010101010101010101090101813d01026461630b010173120502036561645b01010101010101010101090101814503036369645b010101010101010101010701013303046d656e745b0101010101010101010107010146030376696363070101560201695b010101010101010101010701013703056361726c6f5b010101010101010101010701012403066d696e6973685b01010101010101010101070101770304726563745b01010101010101010101070101210305736461696e5b010101010101010101010701012a0404706c61695b01010101010101010101090101810b030376696e5b010101010101010101010701013a02016f630701015f03076e616c64736f6e5b010101010101010101010701011f020275675b0101010101010101010109010181600104656163685b01010101010101010101090101812603037274685b010101010101010101010f01018135361b0a06026c695b010101010101010101010701014b020364656e5b010101010101010101010701015602016963090501010602037269635b0101010101010101010107010123020475726f705b010101010101010101010701010f02037665725b0101010101010101010109010181720204786973745b0101010101010101010107010179030570726573735b010101010101010101010701015a030574696e63745b010101010101010101010701013b0201795b0101010101010101010107010131010866616365626f6f6b630701012f0302696c5b01010101010101010101090101811702036561745b0101010101010101010103090204696e616c5b010101010101010101010701014402056f6c6c6f77630701012c07026669630701013407026969630701013a07027369630701014c0702746963070101400702776963070101460301725b010101010101010101010d010181641a0b03070101040204757475725b010101010101010101010701017b01066761746865725b01010101010101010101090101816d020369726c630906010107030276655b01010101010101010101090101813702026f645b010101010101010101010b010129811c0204726176655b01010101010101010101090101815d03036565645b010101010101010101010901018179030269705b01010101010101010101090101811901036861645b010101010101010101010701015803036e646c5b01010101010101010101090101811c02036561645b01010101010101010101090101812802036964655b010101010101010101010701016f0304676865725b01010101010101010101090101812202026f775b010101010101010101010701013902037474705b01010101010101010101090101050d031701010f0f0c0c08080808080204756d616e5b010101010101010101010d01013e81023c0101695b010101010101010101010d01013281060802046d70616c5b01010101010101010101090101814802016e5b010101010101010101010f01014021620e12030463616e745b010101010101010101010701016b030c6469656d6572636873746f725b010101010101010101010701010703077374616772616d63070101350502696c5b010101010101010101010901018173030474656e745b010101010101010101010d0401010c0d5d020372656e5b010101010101010101010701017501046a757374630701017401066b61726d69635b01010101010101010101090101815701026c61632f0101680303030303030303030903030303030303030305030273745b010101010101010101010b010181126602036566745b010101010101010101010901018147020269655b01010101010101010101090101815a03036768745b010101010101010101010701014503026b655b010101010101010101010701012b030701017503047374656e630701010b07027963630701012a0801646307010113030276655b010101010101010101010701013502026e6b63170101110f0c0c080808080802056f6e6765725b010101010101010101010701015d01096d6163726f636f736d5b010101010101010101010b08010181320304676e756d5b010101010101010101010701012603036e676c5b01010101010101010101090101814904046b696e645b01010101010101010101090101812d0204657263685b01010101010101010101090101020d0204696473745b0101010101010101010107010161030472726f725b01010101010101010101090101810e02036f7265630701012204057269736f6e63130301010a060d0d0c2e0204757369635b01010101010101010101090d01011801056e696768745b010101010101010101010701016902016f5b010101010101010101011101015c81081a0b0a02087963746170686f625b010101010101010101010701016a01046f6265695b010101010101010101010701015e0201665b01010101010101010101290301010b0d14161b0f130719060c112b14120b0a0304666963695b01010101010101010101030c030b07010102170201685b010101010101010101010701013802026e635b01010101010101010101090101816b020270755b01010101010101010101070101270201725b01010101010101010101070101360204746865725b010101010101010101010901018127010b70616e64656d6f6e69756d5b010101010101010101010901018110030672616469676d5b010101010101010101010701017605037369745b010101010101010101010701014c02066572666563745b01010101010101010101090101812a02046c6167755b010101010101010101010901018158040169630701015805016e5b010101010101010101010701015402036f73655b01010101010101010101090101814a03037765725b0101010101010101010109010181230204726f63655b010101010101010101010b010181020504036475635b0101010101010101010107010119040567726573735b01010101010101010101090101812b01067265636b6f6e5b010101010101010101010701016403046d656d62630701016104036f72735b010101010101010101010f010181631a0b0a03047075676e5b010101010101010101010901018142020269645b010101010101010101010901018153030973696e676d657263685b010101010101010101010701011202037573745b01010101010101010101090101811b0104736375645b01010101010101010101070101500204657665725b010101010101010101010901018125020268616309010167120403646f775b010101010101010101010b0201010a0d03026f775b01010101010101010101090101810a020369636b5b010101010101010101010701014703026e67630701016602046c6174655b01010101010101010101090101813a02016f5b010101010101010101010901017c050302616b5b0101010101010101010107010153030272655b01010101010101010101090101814f0304756768745b0101010101010101010109010181510206706f7469666963070101470204746f72655b01010101010101010101090101030d0304726e61645b01010101010101010101030b020575626c696d5b010101010101010101010701017d04036d69745b01010101010101010101090101815904057363726962630701011409036579646309010120340304666665725b010101010101010101010901018115020477656c6c5b010101010101010101010701016c0303696e655b010101010101010101010701013f01027465630b0101721205020368617463070101760301655b01010101010101010101390101251a0809091105070a1205050d0508110d2a0b050a070a06070503070101160401695b010101010101010101010d01012d3a412e0501725b010101010101010101010b01014d235404056d73656c765b0101010101010101010109010181540301695b01010101010101010101090101815602016f5b010101010101010101010f010142581d211e031f01010c08050c0c0c080808080808100416171515171216171213150815130c12181414151512151c120b0f14121a1917180d0a13161617131517141a19150b1514150a121617151616140818141618131409141515151616120f1412150c09090909091a15180b14151615141415151416132218151616151d0e1418140b181d15151414180b09081311161c1515161615160a121616171915231a12141312161d1714181608121515171417170b1816141a1515160a1614140916131314160d161316150c0b1615140b0a3015141713'); +INSERT INTO media_items_search_index_data VALUES(2473901162498,X'0000020c0730746f727475725b01010101010101010101090101810802057265766f725b01010101010101010101030a0206776974746572630701013b0105756e6465725b010101010101010101010701012f03046675726c5b0101010101010101010109010181070203706f6e5b010101010101010101010b010149812d0201736307010164010376616e631302010109060d0d0c2e04086d6f727269736f6e63190101100f0c0c08080808080e02046964656f5b01010101010101010101090e0101200307010125030473696f6e5b01010101010101010101090101810902036f69636307010155010577617463685b0101010101010101010107010130030701012102016563070101630304627369746307010141020368656e630701016203016f5b01010101010101010101070101340208696c6c66756c6c695b01010101010101010101090101815f030573656d616e5b010101010101010101010701011c0301745b01010101010101010101090101816f0401685b01010101010101010101090101814e0502696e5b010101010101010101010701016d0204726174685b010101010101010101010901018171020277775b01010101010101010101090101060d0103796f755b010101010101010101010b0101815e1003070101600401726307010154050473656c665b0101010101010101010109010181610403747562630b01011a13240418140d1616160810181b160a1b080b0a121a1613131316141b0816'); +INSERT INTO media_items_search_index_data VALUES(2611340115969,X'00000ed302303052090101811e010b010160050602013053070101610201385307010172010231335307010164020138530701016c010132530901016b050201355307010175010133530901017105010134520f080101188107340201305307010168010135530302020134530701016f010161520b0101158100010b010109430e010f0101150515160e05010101010e01017a14170f0c0202626c520701015d03036f7574520701014c0207010108020563726f737352070101200206646d6f6e697459010101010601015703036f726e5901010101080101814d030476616e63530903010146060101010106010141020466746572530701012502026c6c52070101430302736f5307010154010701014902066d657269636159010101010601010402016e590101010106010174030561746f6d6959010101010601014f030164520701016801090a0101390109010104360501010101100601011d63340d0d03017459010101010601012c020470706c69530701012f020172530701013d010f070101070c2d3c0501010101080101811603016d54090101201303046f756e64520701013f03047469737452090101811f02047368656e59010101010601014e03047472616c5901010101060101710201745209010157170701010101080101816a0306747269627574520901018116020a7564696f6e6175746978520b0101810f14010162590101010106010109020361636b52090101812b020d040101026b0a03046c616e6352090101360d03047272656e59010101010a050101812f0303736963530901011418020465636f6d5307010149010701013e0302656e5901010101060101590303666f7259010101010601016703026e74540701013003027374520701015a0202696459010101010a010181010503026b6552090101814602046c616b6552090101812703036f6f645901010101060101520302756552090101810d02026d7852090101814201030b02036f6e7553070101730302726e59010101010801018144030274685407010106020972656174686c65737359010101010a070101813104016459010101010601014803056f6f6b657252090101810c020375726e59010101010601012e03027369520901018104010701017a01070101630301745207010139020b01010e154f05010101010601015b02017952110101810e100b090707010101010c01011a0a8100010163540701016102066164617665725901010101080101814103056c616d69745901010101080101810d03016e5207010177010901012e270107010148030672656c6573735901010101080101817e020668616e6e656c52070101670302726959010101010601011b0505737469616e59010101010601011e02046c65616e5901010101080101813902066f6c6c65637459010101010601011403016d520b010173171c010901015030010b0101451d090501010101080101080d04036d6f6e5209010181150502756e5207010163040370656c5901010101080101811f05036c657454070101120506726568656e73520701015003056e74696e7553070101220503726f6c53070101480601010101080101811e0303766572530701011203037765725901010101060101660206726561746976520901018114080765636f6d6d6f6e5209010181190602757259010101010c010181661b0a0305697474657252090101812f0307756369666f726d5901010101080101814c0402697352090101813002037572735901010101080101813d010364616e52090101812d02036561645901010101080101814503036369645901010101060101330303646963530701013403046d656e7459010101010601014603037074685207010152030576656c6f70530701014502016959010101010601013703056361726c6f590101010106010124030466666572540b0a01013d3e03066d696e69736859010101010601017703047265637452070101440701010101060101210305736461696e59010101010601012a0404706c61695901010101080101810b040474616e63520906010130030376696e59010101010601013a02016f5307010102010701016903016e52070101490406616c64736f6e59010101010601011f05017452070101780107010157010701014c020275675901010101080101816003027265530701010c01046561636859010101010801018126030372746859010101010e01018135361b0a06026c6959010101010601014b020364656e59010101010601015602046e6a6f69520701014d0203726963590101010106010123020475726f7059010101010601010f0203766572520901010d4a070101010108010181720206786572636973530d0501011f244103036973745901010101060101790305706c61696e54090101394404047265737359010101010601015a030574696e637459010101010601013b02017959010101010601013101046661696c590101010108010181170203656174590101010102090208696572676f6c6c615209010181030107010179010701015b03036e616c59010101010601014403027665530701011e02026f7253030606010101010c010181641a0b0203726f6d530701012b020675727468657252070101090207010154030374757259010101010601017b010367617053070101660304746865725901010101080101816d020265745207010102020369766553070101060601010101080101813702046d61696c520901018107010701017d010701016602026f6459010101010a010129811c0204726176655901010101080101815d0303656564590101010108010181790302697059010101010801018119010368616459010101010601015803036e646c5901010101080101811c030372726952090101813302036561645901010101080101812803027265530901013c120107010141020369646559010101010601016f03026768540901012d42050265725901010101080101812202026f70530701016a010f0501010327460a030177521702010106367c050606060901070101160601010101060101390406746f6d616e755209010181510203747470520b0101702a0a010701014d01090101421d0501010101080101050d0204756d616e59010101010c01013e81023c01016952090101124b0107010142010701013505010101010c010132810608020166520701012a02056d6167696e520701010e030370616c5901010101080101814804036f7274520701012602016e52110701010f35113b46010901013008010b0101170d1205010101010e01014021620e12030463616e7459010101010601016b030c6469656d6572636873746f7259010101010601010703057175697269520901018105010701017b010701016403077374616772616d520901018101010701017701070101590502696c59010101010801018173030474656e7459010101010c0401010c0d5d0402726f5307010162020372656e59010101010601017502017352090101385a03016e520701013101046a617a7a52090101812402056572656d6952090101812602036f696e52070101600203757374520701013301066b61726d69635901010101080101815701046c617374530701010f06010101010a010181126602046561726e520f0101052681200701070101180606746f6d616e755209010181520402737452070101580306626f7769747a52090101812e030266745901010101080101814702056963656e73520d0101811108060301655901010101080101815a030367687459010101010601014503026b6559010101010601012b03026e6b520701017d010701015c0107010151030374746c530701010a0302766559010101010601013502016c540701013602076f636b646f776e530701010d03026e6752090501012f0502657259010101010601015d03017452070101230107010138030177540901011d5501096d6163726f636f736d59010101010a08010181320304676e756d59010101010601012603026b65520901011d440107010155010701014a03036e676c59010101010801018149040169520701014604046b696e645901010101080101812d040375616c521d04010108191127650506060606060111040101080a392418010f020101051658040304737465725307010128030274745209010181320301785209010181020107010178010701015a020165520701017f010701015e010701015703037263685901010101080101020d030474686f645207010116020469647374590101010106010161030472726f725901010101080101810e02036f737452090101252c03027665520701013c0202746252090101813e0103090204757369635901010101080d010118020179520701016101056e6967687459010101010601016902016f540701015305010101011001015c81081a0b0a0304726d616c530701013102087963746170686f6259010101010601016a01046f62656959010101010601015e03036c69675407010155020166520701011701090101152c01070101140501010101280301010b0d14161b0f130719060c112b14120b0a0304666963695901010101020c02016859010101010601013802016e530701011b010701010a0301635901010101080101816b020670706f7369745407010113030175590101010106010127020172520901015621070101010106010136030364657252090101810b03016752090101811a020474686572520701014707010101010801018127020275745209010181290402726f5307010176010b70616e64656d6f6e69756d59010101010801018110030672616469676d590101010106010176050373697459010101010601014c04016b520701012201090101370603057472656f6e520901016212010701014f010701014405026f6e530701014b010701014003047970616c520901017a06010901015906010901014e0a02066572666563745901010101080101812a02046c616775590101010108010181580402696e59010101010601015402046f696e745207010137030273655901010101080101814a04026974540d09010110204c0303776572590101010108010181230206726163746963530701013503036f636559010101010a010181020504036475635901010101060101190405677265737353070101240601010101080101812b0106726174686572540701010410080809080908090c08060827090f0c110f150b090e110c10220c0b1b090b0c0f0f130e130c130c110b100d0e09090f0a0c0e0a0d0a0e09160c0d0e14181908121113120d0d101011210b090f0a0d0c140a0e0e0f100d130a0f0b0f0e0a0f0a0c0c100d111410100c0e0d0811120e0910120d0e0b0e0f15100e0d0f100c100c1a0e09130a120e0a100914160f100f0e0e0f0b0f0f0e0a0e121e0e21121f080c0f0a270f1717190e12090e09080c0d0a0a1216140e090e0e0f0d0e0d130a0d080e0a0d0d09160f140f0810280b0a13120f0b0f100b090d100810160b130f0a2d0d0c0d0d0d0c120b09150a0917110e0e170e1812100d0b0e0c0f0d100e16'); +INSERT INTO media_items_search_index_data VALUES(2611340115970,X'000006052c06307265616469520701010304036c6c69540701011c040172540901010c1c0304636b6f6e59010101010601016403046d6f727359010101010e010181631a0b0a03047075676e59010101010801018142030477617264520701016b02026964590101010108010181530401655307010132030973696e676d6572636859010101010601011202037573745901010101080101811b010473616d65520701016e02036375645901010101060101500204657665725901010101080101812502056861646f7759010101010a0201010a0d03026f775207010113010701011c0601010101080101810a020369636b59010101010601014703036d706c5207010119030372697552090101812302046b617465530701013a06047061726b530701017002046c6174655901010101080101813a02016f59010101010801017c050302616b59010101010601015303026d65520701016a010701013e03026e67520901018109030272655901010101080101814f0304756768745901010101080101815102077065637472756d5407010116020374616954090101091403026570520d0901011a813803026f70530701016d040272655901010101080101030d0306726169676874540701011f040365657453090701016504036e61645901010101020b0303756666530701012c020575626c696d59010101010601017d04036d69745901010101080101815904057363726962540701015c03046666657259010101010801018115030570706f72745207010165020477656c6c59010101010601016c0303696e6559010101010601013f01017452090101321a0203616b65540701012a03026c6b520701014b02076563686e6971755407010125020368616e520701010a040174530701012003016552110101242c0d0f093f010d01010e071819010f0801010b0616560501010101380101251a0809091105070a1205050d0508110d2a0b050a070a060705040169540701013b05010101010c01012d3a412e05017259010101010a01014d235404016d5307010119050473656c7659010101010801018154040a7573656c657373747269540701016203016952090101106e010901011a4301090101331f0501010101080101815604026e6752070101270305726f756768520701017b010701015a010701014f0203696d65520701016f030370746f52090101812802016f5225030101040523071007200853050606060605010d010105141e1306010101010e010142581d211e0304727475725901010101080101810802057265766f725901010101020a030369616c52090101813a0103080109010124580301795407010137020575746f726952090101480e0105756e64657252090101811207010101010601012f03046675726c5901010101080101810703046c6f636b52070101690203706f6e59010101010a010149812d02017353070101430308656c657373747269520b0101740e08010b010151101f010b010146140f01027665520701010c01070101270202696152070101790107010158010701014d030364656f5207010111010701011101070101340501010101080e010120030473696f6e5901010101080101810902017354090301017201027761520701015c03026e74520701012c01070101040303746368590101010106010130020165540701016a030469676874520701013e02046865656c540901010d1c0402726552070101340303696368520901011b2c03016f59010101010601013404026c655207010121030179540d0601013a300f0203696c6c520701011c0107010121050566756c6c695901010101080101815f030573656d616e59010101010601011c0301745901010101080101816f040168540b01011e13250501010101080101814e0502696e59010101010601016d02066f726b6f7574530901010b7802047261746859010101010801018171020277775207010171010701014e01090101431d0501010101080101060d0103796f75520f01010b0b0c0f4d010f0101031c0b0927010b01011a112005010101010a0101815e1004017252090101350a01090101071e050473656c66590101010108010181610403747562540701015f050c0a090f13100b0e08140f0b0e1012180e0a0b0b0b100d0d0e0a0e100e0b0c090e0d0b0c0a100f0c100c0f0e090a090e0a0840140e0810111f09160a0b2c100e14080d16100b10081f0e131e1009090e0e080b0c090b0c090b0f11100d140d0e101e290f10'); +INSERT INTO media_items_search_index_data VALUES(2886218022913,X'00000ed20230316801050701011f01016160010801010f01017a14170f0c040b01014b82350206646d6f6e69746001090701015703036f726e600109090101814d030476616e6360010907010141020765726f706c616e68010533060101088101060c064e060c064d060c0645060c060804060502046761696e680105090101820e02046c62756d6801050701011003037761696801050b010181216002046d6173736801050701016d030565726963616001090701010402016e60010907010174030561746f6d696001090701014f0301646001080101110601011d63340d0d042501015e0e0a070e0d05520d05510d05490d050301746001090701012c02017260010909010181160304746973746801050701016402047368656e6001090701014e03016b6301070701015303047472616c60010907010171020174600109090101816a02047564696f630107090801010302047661696c6801050701012302037761696801050901018264010162600109070101090203616269680105090101821103026e646801050701014d03047272656e6001090b050101812f020165680105090101822d0302656e600109070101590303666f72600108010107010167040b01018138070304747465726801050901018135020269646001090b010181010503056c6c696f6e6801050701016e02046c6f6f6460010907010152040b77696e796f75726d696e646301070701015d02036f726e6001090901018144020972656174686c6573736001090b07010181310401646001090701014803036f776e63010709040101050608657965646769726c6301070701015c020375726e6001090701012e0301746001090701015b020179600103010501010d01011a0a8100010701010803070101090101636801050701011b0206616461766572600109090101814103056c616d6974600109090101810d040569666f726e68010507010152090269616801050701015703016e6801050d010158572407030672656c657373600109090101817e020668616e6e656c63010501020701011b03070101170303696c696801050d0401010c221e0604706570706801050d01013607070503036f6b656801050901018278040272756301070701015e030272696001090701011b0505737469616e6001090701011e02046c65616e60010909010181390305696e746f6e6801050701016702066f6c6c6563746001090701011403016d6001080101090101080d041101011a1906070708040370656c600109090101811f03056e6669726d6801050701011e040474726f6c600109090101811e0303756c64680105130101825c060e0b100803037765726001090701016602067265617475726001090d010181661b0a0307756369666f726d600109090101814c0203757273600109090101813d0301746801050901018304010264616301070b010173120503026e69680105070101560302726b6801050701015f0203656164600109090101814503036369646001090701013304056f6d706f73680105090101814103046d656e74600109070101460303766963630107070101560201696001090701013703056361726c6f60010907010124030165680105090101830c03066d696e69736860010907010177030472656374600109070101210307736170706561726801050b010181520704046461696e6001090701012a0404706c6169600109090101810b030376696e6001090701013a02016f6301070701015f03076e616c64736f6e6001090701011f02027567600109090101816003027374680105090101820d010465616368600109090101812603037274686001090f01018135361b0a06026c696001090701014b030273696801050b010182270b0203646469680105070101680302656e60010907010156020169630107090501010602046c746f6e6801050701016b020372696360010907010123020475726f706001090701010f0203766572600109090101817202047869737460010907010179030570726573736001090701015a030574696e63746001090701013b020179600108010107010131040901018129010866616365626f6f6b63010501020701012f0309010137040302696c600109090101811703026d656801050701017b0203656172680105090101815a04017460010903090204696e616c60010907010144040164680105090101812f02046c6f61746801050b0101825f0602056f6c6c6f7763010501020701012c03070101290702666963010707010134070269696301070701013a070273696301070701014c07027469630107070101400702776963010707010146030172600103010501010d010181641a0b010701010403090101074a0203726f6d6801050b01010e825b020375636b680105090101826d03037475726001090701017b0106676174686572600109090101816d0204656f726768010507010166031074726863706f6e65686f746d696e757468010507010128020369726c6301050102090601010703090101820803027665600109090101813702056c6f62616c6801050701017002026f646001090b010129811c020472617665600109090101815d05036974696801050b01018220060303656564600109090101817903026970600109090101811901036861646001090701015803026c6c6801050701017903036e646c600109090101811c030276656801050901018158020365616460010909010181280301696801050b01015c505f03017268010509010182180401656801050701012402036964656001090701016f03046768657260010909010181220301746801050701015102026f74680105110301010b09110c1e03017760010907010139020374747060010301050101090101050d011701010f0f0c0c080808080803130101180f0c060707070204756d616e6001090d01013e81023c01016960010801010d010132810608042101017d3108090712070a301606193a1f02046d70616c600109090101814802016e60010801010f01014021620e12040f010181261f083d030463616e746001090701016b030c6469656d6572636873746f72600109070101070403756374680105070101730303736964680105090101821a040674616772616d6301050102070101350309010132040502696c6001090901018173030474656e746001090d0401010c0d5d04016f6801050b010174811a020372656e600109070101750201736801051701014a3d105210511049100201746801052101012763103d071210330b171049100e01046a616e656801050f01018110605f5702036f686e6801050701016c0203757374630105010207010174030d010182591b1001066b61726d69636001090901018157020669746368656e680105090101820601026c616301072f01016803030303030303030309030303030303030303050301696801050901018271030273746001090b010181126602036566746001090901018147020269656001080101090101815a04090101827f03036768746001090701014503026b65600103010501010701012b010701017503110101651b605c055703047374656e6301070701010b070279636301070701012a08016463010707010113030276656001090701013502026e6b630107170101110f0c0c080808080802056f6e6765726001090701015d03026f6b6801050d010181251f0803027264680105090101812b0302766568010509010181310204797269636801050701017c01016d6801050d0101820a160602086163726f636f736d6001090b08010181320304676e756d6001090701012603026b65680105150101815007810a06171603036e676c600109090101814904046b696e64600109090101812d03037a7a6968010509010182150201656801051701018137671d29060e0b1603086c616e63686f6c6968010509010182100303726368600109090101020d0204696473746001090701016103036e75746801050901011311030472726f726001080101090101810e040b010181470802036f72656301070701012204057269736f6e630107130301010a060d0d0c2e0308746865726675636b6801050b0101811f600204757369636001080101090d010118041b0801010581011052105110491004017468010509010182160201796801053901018106060c06111f081c060c06110c34060c063413060c0608040601066e6563657373680105070101600204696768746001090701016902016f60010801011101015c81081a0b0a040901018159030174680105090101827d040165680105130101825b0d10080a0802087963746170686f626001090701016a01046f6265696001090701015e0201666001080101290301010b0d14161b0f130719060c112b14120b0a040f01016f0d811c0903046669636960010301050101030c010b0701010217030907010104070c616c6d75736963766964656f6801050901018336020168600108010107010138040701015d02016e6801051701011111823c0d10080a08030163600109090101816b02027075600109070101270201726001090701013602047468657260010909010181270603736964680105070101530206766572636f6d6801050b0101821f060202776e680105090101812801047061696e6801051b010181021d093e1d093d1d3c1d03096e64656d6f6e69756d6001090901018110030672616469676d6001090701017605037369746001090701014c020565707065726801050d0501010d221e03057266656374600109090101812a02046c61677560010909010181580401696301070701015805016e60010907010154030565617375726801051501017f1d451d441d3c1d02036f7365600109090101814a030377657260010909010181230204726f63656001090b010181020504036475636001090701011904056772657373600109090101812b02037573686801050901018217010272656801050b0101822a0b030261726801050b01018145080304636b6f6e600109070101640301646801050d0201010a221e040c686f746368696c69706570706801050d01011c16830903046d656d626301070701016104036f72736001090f010181631a0b0a03046e6f776e6801050701014e03047075676e6001090901018142020269646001090901018153030973696e676d657263686001090701011202036f636b6801050901014c2c040a170f0d0d260e0d0e0d0e0a0e250a0b0d0d0a0d0b0e0d0d0a0d0b0f0b0b150e0d0e0d140d140a0d110c0a1b0a100f0e0b0d10160f100d0b0b0e0e0e0f170d0e0e120c12110d0b0d0b0b0d0c0f0d0c0a0e0b0f0d120d0e0c0a100c0c0e100b0d0c0b0b0d0c0d0d0d0e0e12190c0b0d080d0b0f150b0b0b0b0b1c0e0d0c100d19150c0e0d0e0e0d0c0c0b0d0c0d0c0b0a0c0e0a100a2910210e190d150c0d170c100c0c1217110c1610101f0b0d0d140c1e0d0b0a0b130e0e0c0c0d0d130d120d0e0d12120d0d0d170c14131f0b230f0d170b10110d261c1611120b0b0a0e0c110c17130f0c110f0e0a0a150d0d0f0c0f0d0d0d0d0d180d100d0e0c12'); +INSERT INTO media_items_search_index_data VALUES(2886218022914,X'000005990530726f6c6c6801050701017802037573746001080101090101811b04090101813c0101736801052301018109100b49100b2a0b17102c1f100e020261646801050d0101822b0b03020363617268010507010154030275646001090701015002046576657260010909010181250202686163010709010167120403646f776001090b0201010a0d030165680105090101826a03026f77600109090101810a020369636b6001090701014703026e6763010707010166030174680105090101820302036c6170680105090101813604027465600109090101813a02076d61727475726c6801050701012602036e6f776801050701015b02016f6001090901017c050302616b6001090701015303046d656f6e680105090101813403026e6768010509010182690504626972646801050f0101810c605f5703027265600109090101814f03047567687460010909010181510401726801050f0101810f605f57020470696b656801051b010181001d093e1d093d1d3c1d03056f7469666963010707010147020374617268010509010182130501746801050b0101813a0703026f706801050701015a04027265600109090101030d03047265616d6801050701017104036e6164600109030b020275626801050701011d04036c696d6001090701017d04036d697460010909010181590405736372696263010501020701011403070101140903657964630107090101203403046666657260010909010181150204776565746801050f0101810d605f5704026c6c6001090701016c0303696e656001090701013f01017468010509010159570201656301070b01017212050203686174630105010207010176030f0101811e60810103016560010301050101390101251a0809091105070a1205050d0508110d2a0b050a070a060705010701011603130101030e09613d645804016960010801010d01012d3a412e040701016105017260010801010b01014d2354040701015004056d73656c76600109090101815403016960010909010181560304726f617468010509010183060204697373756801050701015502016f600103010501010f010142581d211e011f01010c08050c0c0c08080808080810030f0101158128076e030472747572600109090101810802057265766f72600109030a0205756d626c7268010509010141050302726e680105090101820b020677697474657263010501020701013b030901013c040105756e6465726001090701012f03046675726c60010909010181070203706f6e6001090b010149812d02017363010707010164010376616e6301071302010109060d0d0c2e04086d6f727269736f6e630107190101100f0c0c08080808080e020565646465726801050701016902046964656f60010301050101090e0101200107010125030909010106030265776801050b0101814608030473696f6e600109090101810902036f6963630105010207010155030901018219010477616e746801050901018133030374636860010301050101070101300107010121030701010202016563010707010163030f6172657761726e65727265636f726468010509010183390301626801050701012e040373697463010707010141020368656e630105010207010162030b010182280b04027265680105090101826f03016f600109070101340208696c6c66756c6c69600109090101815f030573656d616e6001090701011c030174600109090101816f0401686001080101090101814e041b010163201d093e1d093d1d3c1d0502696e6001090701016d02036f726b68010507010162020472617468600109090101817103036f7465680105090101826b02027777600109090101060d0103796f75600103010501010b0101815e100107010160030b010182290b04017263010707010154050473656c666001090901018161040374756263010501020b01011a13240307010119040d15180e0c0b0e0c0e0b0c0c0b0b0d0c100c0b0b0e0c110c0e0e170e0d0c0b0c0d0a0b0c0d150d0e110b0c0b0c173714130f0b0e0d2c0e0c0f0c170e0e0e0a121a0e1d0d0e140e1a0a190a0c150c0a120e0b1c0b0c0e0d0c1e0a0e'); +INSERT INTO media_items_search_index_data VALUES(3023656976385,X'00000eba02303052010101316d01050701011f0101345201010161520117010401010f01017a14170f0c040b01014b82350202626c520103036f75745201020563726f737352010206646d6f6e69746901050701015703036f726e690105090101814d030476616e6369010507010141020765726f706c616e6d010533060101088101060c064e060c064d060c0645060c060804060502046761696e6d0105090101820e02046c62756d6d01050701011003016c520103037761696d01050b010181216002046d6173736d01050701016d030565726963616901050701010402016e69010507010174030561746f6d696901050701014f03016452011701040101110601011d63340d0d042501015e0e0a070e0d05520d05510d05490d050301746901050701012c020172690105090101811603046f756e64520103047469737452011b01050701016402047368656e6901050701014e03016b6a01050701015303047472616c690105070101710201745201170105090101816a0306747269627574520102047564696f6a0105090801010306066e6175746978520102047661696c6d01050701012302037761696d010509010182640101626901050701010902036162696d010509010182110302636b520103046c616e63520103026e646d01050701014d03047272656e6901050b050101812f0201656d0105090101822d0302656e690105070101590303666f72690104010107010167040b01018138070302737452010304747465726d01050901018135020269646901050b010181010503026b65520103056c6c696f6e6d01050701016e02046c616b65520103036f6f6469010507010152040b77696e796f75726d696e646a01050701015d03027565520102026d78520102036f726e6901050901018144020972656174686c6573736901050b07010181310401646901050701014803056f6f6b657252010402776e6a010509040101050608657965646769726c6a01050701015c020375726e6901050701012e03027369520103017452011701050701015b0201795201170101010301010d01011a0a8100010701010803070101090101636d01050701011b0206616461766572690105090101814103056c616d6974690105090101810d040569666f726e6d010507010152090269616d01050701015703016e52011b01050d010158572407030672656c657373690105090101817e020668616e6e656c520118010301020701011b03070101170303696c696d01050d0401010c221e0604706570706d01050d01013607070503036f6b656d01050901018278040272756a01050701015e030272696901050701011b0505737469616e6901050701011e02046c65616e69010509010181390305696e746f6e6d01050701016702066f6c6c6563746901050701011403016d52011701040101090101080d041101011a190607070804036d6f6e52010502756e5201040370656c690105090101811f0506726568656e73520103056e6669726d6d01050701011e040474726f6c690105090101811e0303756c646d0105130101825c060e0b100803037765726901050701016602067265617469765201080765636f6d6d6f6e5201060275726901050d010181661b0a0305697474657252010307756369666f726d690105090101814c0402697352010203757273690105090101813d0301746d01050901018304010264616a01050b010173120503016e52010401696d0105070101560302726b6d01050701015f0203656164690105090101814503036369646901050701013304056f6d706f736d0105090101814103046d656e74690105070101460303707468520103037669636a0105070101560201696901050701013703056361726c6f690105070101240301656d0105090101830c03066d696e697368690105070101770304726563745201170105070101210307736170706561726d01050b010181520704046461696e6901050701012a0404706c6169690105090101810b040474616e635201030376696e6901050701013a02016f6a01050701015f03016e52010406616c64736f6e6901050701011f0501745201020275676901050901018160030273746d0105090101820d010465616368690105090101812603037274686901050f01018135361b0a06026c696901050701014b030273696d01050b010182270b02036464696d0105070101680302656e690105070101560201696a0105090501010602046c746f6e6d01050701016b02046e6a6f695201020372696369010507010123020475726f706901050701010f02037665725201170105090101817202047869737469010507010179030570726573736901050701015a030574696e63746901050701013b020179690104010107010131040901018129010866616365626f6f6b6a010301020701012f0309010137040302696c690105090101811703026d656d01050701017b02036561726d0105090101815a04017469010503090208696572676f6c6c61520103036e616c690105070101440401646d0105090101812f02046c6f61746d01050b0101825f0602056f6c6c6f776a010301020701012c0307010129070266696a010507010134070269696a01050701013a070273696a01050701014c070274696a010507010140070277696a010507010146030172690101010301010d010181641a0b010701010403090101074a0203726f6d6d01050b01010e825b020375636b6d0105090101826d03057274686572520103037475726901050701017b0106676174686572690105090101816d0204656f72676d0105070101660301745201040f726863706f6e65686f746d696e75746d010507010128020369726c6a01030102090601010703090101820803027665690105090101813702056c6f62616c6d01050701017002046d61696c520102026f646901050b010129811c020472617665690105090101815d05036974696d01050b01018220060303656564690105090101817903026970690105090101811901036861646901050701015803026c6c6d01050701017903036e646c690105090101811c03037272695201030276656d01050901018158020365616469010509010181280301696d01050b01015c505f0301726d010509010182180401656d01050701012402036964656901050701016f03046768657269010509010181220301746d01050701015102026f746d0105110301010b09110c1e0301775201170105070101390406746f6d616e7552010203747470520117010101030101090101050d011701010f0f0c0c080808080803130101180f0c060707070204756d616e6901050d01013e81023c010169520117010401010d010132810608042101017d3108090712070a301606193a1f020166520102056d6167696e5201030370616c690105090101814804036f7274520102016e520117010401010f01014021620e12040f010181261f083d030463616e746901050701016b030c6469656d6572636873746f726901050701010704037563746d01050701017303057175697269520103037369646d0105090101821a040674616772616d52011801030102070101350309010132040502696c6901050901018173030474656e746901050d0401010c0d5d04016f6d01050b010174811a020372656e6901050701017502017352011b01051701014a3d1052105110491003016e52010201746d01052101012763103d071210330b171049100e01046a616e656d01050f01018110605f5703027a7a520102056572656d69520102036f686e6d01050701016c0302696e520102037573745201180103010207010174030d010182591b1001066b61726d69636901050901018157020669746368656e6d0105090101820601026c616a01052f01016803030303030303030309030303030303030303050301696d01050901018271030273746901050b010181126602046561726e52010606746f6d616e7552010402737452010306626f7769747a520103026674690105090101814702056963656e7352010301656901040101090101815a04090101827f03036768746901050701014503026b65690101010301010701012b010701017503110101651b605c055703026e6b520103047374656e6a01050701010b070279636a01050701012a0801646a010507010113030276656901050701013502026e6b6a0105170101110f0c0c080808080802036f6e675201050265726901050701015d03026f6b6d01050d010181251f08030272646d0105090101812b0301745201030276656d010509010181310204797269636d01050701017c01016d6d01050d0101820a160602086163726f636f736d6901050b08010181320304676e756d6901050701012603026b6552011b0105150101815007810a06171603036e676c6901050901018149040169520104046b696e64690105090101812d040375616c5201030274745201030178520103037a7a696d0105090101821502016552011b01051701018137671d29060e0b1603086c616e63686f6c696d010509010182100303726368690105090101020d030474686f6452010204696473746901050701016103036e75746d01050901011311030472726f726901040101090101810e040b010181470802036f72656a01050701012204057269736f6e6a0105130301010a060d0d0c2e0302737452010308746865726675636b6d01050b0101811f600302766552010202746252010204757369636901040101090d010118041b080101058101105210511049100401746d0105090101821602017952011b01053901018106060c06111f081c060c06110c34060c063413060c0608040601066e65636573736d0105070101600204696768746901050701016902016f69010401011101015c81081a0b0a0409010181590301746d0105090101827d0401656d0105130101825b0d10080a0802087963746170686f626901050701016a01046f6265696901050701015e02016652011701040101290301010b0d14161b0f130719060c112b14120b0a040f01016f0d811c0903046669636969010101030101030c010b0701010217030907010104070c616c6d75736963766964656f6d01050901018336020168690104010107010138040701015d02016e6d01051701011111823c0d10080a080301636901050904050a05190607090f0d0d260e0d050e0d0e0a0e270a0b080f0d0a0d0d0a0e0a0d0d0a0d06080b0f0b0b15060e0d060e080c1406060d140a090c110c060c1d0a100f0e0b0f10180f100d0b0b0e0e0e0f1907060d0a0e0e120c0a0b0e0911060d0b0d050a0b0d0c0f0d070c0a0e0b0f0f120d0e080c0a050f050c0c0e100b0d0c0b0b0d080c0d0f0d0e0e12190c0b0d080c0c0b0f150b0b0b0b0b1c0e0d090c100d0518150c0e080d0e0e0d0c0c0b0d070c0d0c0b0a0c0e0a100c0a2b102305090d071b0d150c090d190c100c0c1405171106090c061810101f0b0d080a060a0c09130c1e060d0b0a0b13070b0e0c050c0d0d130d140d050e0706050d14120d080d0d170c14061306061f0b250f0d170b10110d281c161112'); +INSERT INTO media_items_search_index_data VALUES(3023656976386,X'000008750101816b04306f7075690105070101270201725201170105070101360303646572520103016752010204746865725201170105090101812706037369646d0105070101530202757452010206766572636f6d6d01050b0101821f060202776e6d0105090101812801047061696e6d01051b010181021d093e1d093d1d3c1d03096e64656d6f6e69756d6901050901018110030672616469676d6901050701017605037369746901050701014c04016b520103057472656f6e520103047970616c5201020565707065726d01050d0501010d221e03057266656374690105090101812a02046c61677569010509010181580401696a01050701015805016e69010507010154030565617375726d01051501017f1d451d441d3c1d02046f696e74520103027365690105090101814a030377657269010509010181230204726f63656901050b010181020504036475636901050701011904056772657373690105090101812b02037573686d01050901018217010272656d01050b0101822a0b030361646952010401726d01050b01018145080304636b6f6e690105070101640301646d01050d0201010a221e040c686f746368696c69706570706d01050d01011c16830903046d656d626a01050701016104036f72736901050f010181631a0b0a03046e6f776e6d01050701014e03047075676e69010509010181420304776172645201020269646901050901018153030973696e676d657263686901050701011202036f636b6d01050901014c2c03026c6c6d01050701017802037573746901040101090101811b04090101813c0101736d01052301018109100b49100b2a0b17102c1f100e020261646d01050d0101822b0b0303026d65520102036361726d01050701015403027564690105070101500204657665726901050901018125020268616a010509010167120403646f776901050b0201010a0d0301656d0105090101826a03026f775201170105090101810a020369636b6901050701014703036d706c520103026e676a010507010166030372697552010301746d0105090101820302036c61706d0105090101813604027465690105090101813a02076d61727475726c6d01050701012602036e6f776d01050701015b02016f6901050901017c050302616b6901050701015303026d65520105026f6e6d0105090101813403026e6752011b010509010182690504626972646d01050f0101810c605f5703027265690105090101814f03047567687469010509010181510401726d01050f0101810f605f57020470696b656d01051b010181001d093e1d093d1d3c1d03056f746966696a01050701014702037461726d010509010182130501746d01050b0101813a0703026570520103026f706d01050701015a04027265690105090101030d03047265616d6d01050701017104036e6164690105030b020275626d01050701011d04036c696d6901050701017d04036d69746901050901018159040573637269626a0103010207010114030701011409036579646a010509010120340304666665726901050901018115030570706f727452010204776565746d01050f0101810d605f5704026c6c6901050701016c0303696e656901050701013f01017452011b010509010159570203616c6b52010201656a01050b0101721205020368616e52010401746a0103010207010176030f0101811e608101030165520117010101030101390101251a0809091105070a1205050d0508110d2a0b050a070a060705010701011603130101030e09613d645804016969010401010d01012d3a412e040701016105017269010401010b01014d2354040701015004056d73656c7669010509010181540301695201170105090101815604026e6752010304726f61746d01050901018306050375676852010203696d655201030370746f520103037373756d01050701015502016f5201170101010301010f010142581d211e011f01010c08050c0c0c08080808080810030f0101158128076e030472747572690105090101810802057265766f72690105030a030369616c52010205756d626c726d010509010141050302726e6d0105090101820b0304746f7269520102067769747465726a010301020701013b030901013c040105756e64657252011701050701012f03046675726c690105090101810703046c6f636b52010203706f6e6901050b010149812d0201736a0105070101640308656c6573737472695201010376616e6a01051302010109060d0d0c2e04086d6f727269736f6e6a0105190101100f0c0c08080808080e02016552010304646465726d010507010169020269615201030364656f520117010101030101090e0101200107010125030909010106030265776d01050b0101814608030473696f6e690105090101810902036f69636a010301020701015503090101821901027761520103026e7452011b0105090101813303037463686901010103010107010130010701012103070101020201656a010507010163030f6172657761726e65727265636f72646d010509010183390301626d01050701012e04037369746a0105070101410304696768745201020368656e6a0103010207010162030b010182280b0402726552011b0105090101826f0303696368520103016f6901050701013404026c6552010203696c6c5201050566756c6c69690105090101815f030573656d616e6901050701011c030174690105090101816f0401686901040101090101814e041b010163201d093e1d093d1d3c1d0502696e6901050701016d02036f726b6d010507010162020472617468690105090101817103036f74656d0105090101826b020277775201170105090101060d0103796f755201170101010301010b0101815e100107010160030b010182290b040172520118010507010154050473656c66690105090101816104037475626a010301020b01011a13240307010119080c0c0705100c06110c17130f0c050908110f0e0a0a15080c0d0f0c0f0d0d070c0d0d180d100d0e080c120d0b15180e060c0b0e0c0e0b0e0c070b070b0d0c100c0b0b060c0e110c0e0e170e0d0c060b0c0d0a0b0c0d150d0e09110b0c0d070c07153914130f0d060e0707070c2e0e0c070f0c0817100e080e0a0c121a050d061e0d0e14060e1a0a190a0c08150e070a06070f0e0b1c0b0c0e0d0e200c0e'); +INSERT INTO media_items_search_index_data VALUES(3161095929857,X'00000e7c02303053012001010105080101811e010a0101600506020130530121010606010161020138530121010606010172010131720102013353012101060601016402013853012101060601016c01013253012101060801016b05020135530121010606010175010133530121010608010171050101347301060e080101188107340201305301210106060101680101355301210106020202013453012101060601016f010161530101011a010401010101010301020a0101158100010a010109430e0202626c7301060601015d03036f757454011f010401020601014c020563726f7373730106060101200206646d6f6e69746e0103036f726e6e01030476616e6353011b010601060803010146020765726f706c616e720102046674657253012101060601012502046761696e720102046c62756d720103016c730106060101430302736f530101012001030103060101540303776169720102046d6173737201030565726963616e0102016e6e01030561746f6d696e01030164530101011a010401010101010301020601016801080a0101390301746e01020470706c6953012101060601012f020172530101011a0106010301030601013d03016d5401230103046f756e647301060601013f0304746973747201010106080101811f02047368656e6e0103016b6f0103047472616c6e010201746e0105010608010157170306747269627574730106080101811602047564696f6f0106066e61757469787301060a0101810f1402047661696c7201020377616972010101626e01020361626972010302636b54011f01040102080101812b03046c616e63730106080101360d03026e64720103047272656e6e0103037369635301210106080101141802016572010303636f6d530101012001030103060101490302656e6e010303666f726e01040103026e7454012301030273747301060601015a0304747465727201020269646e0103026b65730106080101814603056c6c696f6e720102046c616b65730106080101812703036f6f646e01040b77696e796f75726d696e646f0103027565730106080101810d02026d7853012001010105080101814201020b02036f6e755301210106060101730302726e6e010302746854012301020972656174686c6573736e010401646e0103056f6f6b6572730106080101810c0402776e6f010608657965646769726c6f01020375726e6e0103027369530101011f0101010301020801018104010601017a03017454011a010501040102060101390201796e0101010301010106100101810e100b090701016354011e01050102066164617665726e0103056c616d69746e01040569666f726e720109026961720103016e530101011e010101010103010206010177010801012e27030672656c6573736e01020668616e6e656c6f010301010106060101670303696c697201060470657070720103036f6b657201040272756f01030272696e010505737469616e6e0102046c65616e6e010305696e746f6e720102066f6c6c6563746e0103016d530101011a010401010101010301020a010173171c01080101503004036d6f6e73010608010181150502756e73010606010163040370656c6e0105036c6574540123010506726568656e737301060601015003056e6669726d7201040474696e755301210106060101220503726f6c53011b01060106060101480303756c647201030376657253012101060601011203037765726e0102067265617469767301060801018114080765636f6d6d6f6e7301060801018119060275726e0103056974746572730106080101812f0307756369666f726d6e0104026973730106080101813002037572736e010301747201010264616f0103016e730106080101812d04016972010302726b720102036561646e0103036369646e0104056f6d706f737201030364696353012101060601013403046d656e746e01030370746873010606010152030576656c6f70530121010606010145040269636f010201696e0103056361726c6f6e0103016572010304666665725401230103066d696e6973686e010304726563746e0105010606010144030773617070656172720104046461696e6e010404706c61696e01040474616e637301060806010130030376696e6e0102016f530101011b0105010301030601010203016e730106060101490406616c64736f6e6e01050174530101011f010101030102060101780106010157020275676e010302726553012101060601010c0302737472010104656163686e0103037274686e0106026c696e01030273697201020364646972010302656e6e010201696f0102046c746f6e720102046e6a6f697301060601014d02037269636e01020475726f706e0102037665726e010501060801010d4a020678657263697353012101060c0501011f244103036973746e010305706c61696e540123010404726573736e01030574696e63746e010201796e010401010866616365626f6f6b6f0103010302696c6e0103026d657201020365617272010401746e010208696572676f6c6c61530101011f0101010301020801018103010601017903036e616c6e0104016472010302766553012101060601011e02046c6f6174720102056f6c6c6f776f010301070266696f01070269696f01070273696f01070274696f01070277696f0103017253011b010101030102010602060203726f6d53011f010201060601012b020375636b72010305727468657254011f010401020601010903037475726e0101036761705301210106060101660304746865726e010204656f7267720103017473010606010102040f726863706f6e65686f746d696e75747201020369726c6f0103010302766553011b010601060601010602056c6f62616c720102046d61696c530101011f0101010301020801018107010601017d02026f646e010204726176656e010503697469720103036565646e01030269706e0101036861646e0103026c6c720103036e646c6e010303727269730106080101813303027665720102036561646e0103016972010301727201040165530101011e0102010301030801013c1202036964656e010302676854012301050265726e01030174720102026f705301010120010301030601016a030174720103017753011b0105010101051602010106367c050606060901060101160406746f6d616e7573010608010181510203747470530101011a0101010301010101010301020a0101702a0a010601014d0204756d616e6e01010169530101011a01040101010101030102080101124b01060101420201667301060601012a02056d6167696e7301060601010e030370616c6e0104036f72747301060601012602016e530101011a01040101010101030102100701010f35113b46010801013008030463616e746e01030c6469656d6572636873746f726e010403756374720103057175697269530101011f0101010301020801018105010601017b03037369647201040674616772616d530101011b01030101010101030102080101810101060101770502696c6e01030474656e746e0104016f72010402726f530121010606010162020372656e6e010201737201010106080101385a03016e73010606010131020174720101046a616e65720103027a7a730106080101812402056572656d69730106080101812602036f686e72010302696e7301060601016002037573746f0103010101060601013301066b61726d69636e01020669746368656e720101026c616f0103016972010302737453011b010601060601010f02046561726e530120010101050e0101052681200701060101180606746f6d616e75730106080101815204027374730106060101580306626f7769747a730106080101812e030266746e0102056963656e737301060c0101811108060301656e01040103036768746e0103026b656e010101030103026e6b530101011f0101010301020601017d010601015c03047374656e6f01070279636f010801646f01030374746c53012101060601010a030276656e0102016c5401230102026e6b6f0102076f636b646f776e53012101060601010d03026e67730106080501012f050265726e0103026f6b72010302726472010301745301200101010506010123010601013803027665720103017754012301020479726963720101016d720102086163726f636f736d6e010304676e756d6e0103026b65530101011e01010101010301020801011d44010601015503036e676c6e010401697301060601014604046b696e646e01040375616c530101011f0101010301021c04010108191127650506060606060110040101080a392418030473746572530121010606010128030274747301060801018132030178530101011f0101010301020801018102010601017803037a7a697201020165530101011e01010101010301020601017f010601015e03086c616e63686f6c69720103037263686e01030474686f64730106060101160204696473746e0103036e75747201030472726f726e01040102036f72656f0104057269736f6e6f0103027374730106080101252c0308746865726675636b7201030276657301060601013c0202746253012001010105080101813e0102090204757369636e010401040174720102017972010101060601016101066e656365737372010204696768746e0102016f54011a01040105010304726d616c5301210106060101310301747201040165720102087963746170686f626e0101046f6265696e0103036c696754012301020166530101011a010401010101010301020601011701080101152c0304666963696e0101010301070c616c6d75736963766964656f72010201686e01040102016e530101011e0102010301030601011b0301636e01020670706f736974540123010301756e010201726e0105010608010156210303646572730106080101810b030167730106080101811a0204746865726e0105010606010147060373696472010202757473010608010181290402726f5301210106060101760206766572636f6d72010202776e720101047061696e720103096e64656d6f6e69756d6e0104160c0c050c0c0d0c0d0e0c0a0c1f0b100e0a07120b0f08080a1107080905091c050f12070d100805080d10081108070507100e06080f05120609080b08060c090e070f0c130e06080d050f060c07191015090a0909061a0a1307080706060908090a1e0d0b07090f090f10070e071011060f0b0c0705060b05060707090e080c10060509050a0a0f0b08080e07120a0a17060d0608070606070605080d07080f14070b0809070e060607051f07050d080b060606060610100712070e08080a13090f091b06080707060706070d06070505130708060511051d1021081c0a0e070c210810071c07210608050d070d0a05080c0f070b100a0a06050f1a100b10061107070a180806050e060706120c06060613060708050c081b070a08290f0c1807190c070d08070a07090c0c0b130a050c0a080b0f05050c08091c0c100712050c050d0d0b0f070c0d0a0608'); +INSERT INTO media_items_search_index_data VALUES(3161095929858,X'000007750930706172616469676d6e0105037369746e0104016b530120010101050601012201080101370603057472656f6e530101011f0101010301020801016212010601014f05026f6e5301010120010301030601014b03047970616c530101011f0101010301020801017a06010801015906020565707065727201030572666563746e0102046c6167756e010401696f0105016e6e0103056561737572720102046f696e7473010606010137030273656e01040269745401230103037765726e01020672616374696353012101060601013503036f63656e0104036475636e010405677265737353011b010601060601012402037573687201010672617468657254012301020165720103036164697301060601010304036c6c695401230104017254011e0105010304636b6f6e6e010301647201040c686f746368696c6970657070720103046d656d626f0104036f72736e0103046e6f776e720103047075676e6e010304776172647301060601016b020269646e01040165530121010606010132030973696e676d657263686e0102036f636b720103026c6c720102037573746e010401010173720102026164720103026d657301060601016e02036361727201030275646e010204657665726e01020268616f010403646f776e01030165720103026f7753011b01050101010506010113010601011c020369636b6e0103036d706c7301060601011903026e676f0103037269757301060801018123030174720102046b61746553012101060601013a06047061726b53012101060601017002036c61707201040274656e0102076d61727475726c720102036e6f77720102016f6e010302616b6e0103026d65530120010101050601016a010601013e05026f6e720103026e67720101010608010181090504626972647201030272656e010304756768746e01040172720102077065637472756d540123010303696b65720103056f746966696f0102037461695401230104017272010501747201030265707301060c0901011a813803026f7053011f010201060601016d040272656e01030672616967687454012301040365616d7201050265745301210106080701016504036e61646e01030375666653012101060601012c02027562720104036c696d6e0104036d69746e010405736372696254011b010301050109036579646f010304666665726e01030570706f727473010606010165020477656574720104026c6c6e010303696e656e010101747201010106080101321a0203616b655401230103026c6b7301060601014b0201656f01030663686e69717554012301020368616e7301060601010a04017453011c01030102010606010120030165530101011a010101030101010101030102100101242c0d0f093f010c01010e07181904016954011a01040105010501726e01040104016d530121010606010119050473656c766e01040a7573656c65737374726954012301030169530101011a0105010101030102080101106e010801011a4304026e67730106060101270304726f617472010503756768530101011f0101010301020601017b010601015a0203696d657301060601016f030370746f73010608010181280303737375720102016f53011b0101010301010101010524030101040523071007200853050606060605010c010105141e130304727475726e0102057265766f726e01030369616c530101011f010101030102080101813a010208030179540123010205756d626c7272010302726e72010304746f7269730106080101480e02067769747465726f0103010105756e6465726e01050106080101811203046675726c6e0103046c6f636b730106060101690203706f6e6e0102017353011c01050106060101430308656c657373747269530101011f0101010301020a0101740e08010a010151101f010376616e6f0104086d6f727269736f6e6f01020165530120010101050601010c0106010127030464646572720102026961530101011f010101030102060101790106010158030364656f530101011a010101030101010101030102060101110106010111030265777201030473696f6e6e0102036f69636f01030102017354012301010277617301060601015c03026e7453011f0101010101050601012c010601010403037463686e010101030102016554011b010801030f6172657761726e65727265636f72647201030162720104037369746f010304696768747301060601013e02046865656c5401230104016e6f0103010402726572010101060601013403036963687301060801011b2c03016f6e0104026c6573010606010121030179540123010203696c6c530120010101050601011c0106010121050566756c6c696e01030573656d616e6e010301746e0104016854011a01040105010502696e6e0102036f726b720105036f757453012101060801010b780204726174686e0103036f7465720102027777530101011a010501010103010206010171010601014e0103796f75530101011a0101010301010101010301020e01010b0b0c0f4d010e0101031c0b092704017253011c010401010105080101350a01080101071e050473656c666e01040374756254011b0103010501040c07141c111c0909080505090d06080711070712070c050c0909080510080708080d060c0d07060905060b07060806070516070c060d050f0f07060b07050614060e080608050d07090905050e0f060c070e070e0607070f07080e0806070d090b050c0c10250b070c08101b0b08190c0d072b0809180709060e0c11080d070e22070c1308181f060809070b160b091305070d0a070d0d050b07150909050b06070f08071a271708'); +CREATE TABLE IF NOT EXISTS 'media_items_search_index_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID; +INSERT INTO media_items_search_index_idx VALUES(1,X'',2); +INSERT INTO media_items_search_index_idx VALUES(1,X'30646176',4); +INSERT INTO media_items_search_index_idx VALUES(1,X'306a65',6); +INSERT INTO media_items_search_index_idx VALUES(1,X'3073616d',8); +INSERT INTO media_items_search_index_idx VALUES(1,X'307765',10); +INSERT INTO media_items_search_index_idx VALUES(2,X'',2); +INSERT INTO media_items_search_index_idx VALUES(2,X'306769',4); +INSERT INTO media_items_search_index_idx VALUES(2,X'307332',6); +INSERT INTO media_items_search_index_idx VALUES(3,X'',2); +INSERT INTO media_items_search_index_idx VALUES(4,X'',2); +INSERT INTO media_items_search_index_idx VALUES(5,X'',2); +INSERT INTO media_items_search_index_idx VALUES(6,X'',2); +INSERT INTO media_items_search_index_idx VALUES(7,X'',2); +INSERT INTO media_items_search_index_idx VALUES(8,X'',2); +INSERT INTO media_items_search_index_idx VALUES(9,X'',2); +INSERT INTO media_items_search_index_idx VALUES(10,X'',2); +INSERT INTO media_items_search_index_idx VALUES(11,X'',2); +INSERT INTO media_items_search_index_idx VALUES(12,X'',2); +INSERT INTO media_items_search_index_idx VALUES(13,X'',2); +INSERT INTO media_items_search_index_idx VALUES(14,X'',2); +INSERT INTO media_items_search_index_idx VALUES(15,X'',2); +INSERT INTO media_items_search_index_idx VALUES(16,X'',2); +INSERT INTO media_items_search_index_idx VALUES(18,X'',2); +INSERT INTO media_items_search_index_idx VALUES(18,X'30746f72',4); +INSERT INTO media_items_search_index_idx VALUES(19,X'',2); +INSERT INTO media_items_search_index_idx VALUES(19,X'307265',4); +INSERT INTO media_items_search_index_idx VALUES(21,X'',2); +INSERT INTO media_items_search_index_idx VALUES(21,X'30726f6c',4); +INSERT INTO media_items_search_index_idx VALUES(22,X'',2); +INSERT INTO media_items_search_index_idx VALUES(22,X'306f70',4); +INSERT INTO media_items_search_index_idx VALUES(23,X'',2); +INSERT INTO media_items_search_index_idx VALUES(23,X'30706172',4); +CREATE TABLE IF NOT EXISTS 'media_items_search_index_content'(id INTEGER PRIMARY KEY, c0, c1); +CREATE TABLE IF NOT EXISTS 'media_items_search_index_docsize'(id INTEGER PRIMARY KEY, sz BLOB); +CREATE TABLE IF NOT EXISTS 'media_items_search_index_config'(k PRIMARY KEY, v) WITHOUT ROWID; +INSERT INTO media_items_search_index_config VALUES('version',4); +CREATE TABLE IF NOT EXISTS "settings" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT NOT NULL, "value" TEXT NOT NULL, "datatype" TEXT NOT NULL, "inserted_at" TEXT NOT NULL, "updated_at" TEXT NOT NULL); +INSERT INTO settings VALUES(1,'onboarding','true','boolean','2024-03-07T18:24:36','2024-03-11T22:41:28'); +INSERT INTO settings VALUES(2,'pro_enabled','false','boolean','2024-03-10T05:11:39','2024-03-11T21:40:51'); +DELETE FROM sqlite_sequence; +INSERT INTO sqlite_sequence VALUES('settings',2); +INSERT INTO sqlite_sequence VALUES('media_profiles',5); +INSERT INTO sqlite_sequence VALUES('sources',23); +INSERT INTO sqlite_sequence VALUES('oban_jobs',241); +INSERT INTO sqlite_sequence VALUES('tasks',183); +INSERT INTO sqlite_sequence VALUES('media_items',127); +INSERT INTO sqlite_sequence VALUES('media_metadata',50); +CREATE UNIQUE INDEX "media_profiles_name_index" ON "media_profiles" ("name"); +CREATE INDEX "sources_media_profile_id_index" ON "sources" ("media_profile_id"); +CREATE UNIQUE INDEX "sources_collection_id_media_profile_id_index" ON "sources" ("collection_id", "media_profile_id"); +CREATE INDEX "media_items_source_id_index" ON "media_items" ("source_id"); +CREATE UNIQUE INDEX "media_items_media_id_source_id_index" ON "media_items" ("media_id", "source_id"); +CREATE INDEX "oban_jobs_state_queue_priority_scheduled_at_id_index" ON "oban_jobs" ("state", "queue", "priority", "scheduled_at", "id"); +CREATE INDEX "tasks_job_id_index" ON "tasks" ("job_id"); +CREATE INDEX "tasks_source_id_index" ON "tasks" ("source_id"); +CREATE UNIQUE INDEX "media_metadata_media_item_id_index" ON "media_metadata" ("media_item_id"); +CREATE INDEX "tasks_media_item_id_index" ON "tasks" ("media_item_id"); +CREATE TRIGGER media_items_search_index_insert AFTER INSERT ON media_items BEGIN + INSERT INTO media_items_search_index( + rowid, + title, + description + ) + VALUES( + new.id, + new.title, + new.description + ); + END; +CREATE TRIGGER media_items_search_index_update AFTER UPDATE ON media_items BEGIN + UPDATE media_items_search_index SET + title = new.title, + description = new.description + WHERE + rowid = old.id; + END; +CREATE TRIGGER media_items_search_index_delete AFTER DELETE ON media_items BEGIN + DELETE FROM media_items_search_index WHERE rowid = old.id; + END; +CREATE UNIQUE INDEX "settings_name_index" ON "settings" ("name"); +PRAGMA writable_schema=OFF; diff --git a/lib/pinchflat/application.ex b/lib/pinchflat/application.ex index 6f838bc..7defa36 100644 --- a/lib/pinchflat/application.ex +++ b/lib/pinchflat/application.ex @@ -11,8 +11,9 @@ defmodule Pinchflat.Application do PinchflatWeb.Telemetry, Pinchflat.Repo, # Must be before startup tasks + Pinchflat.Boot.PreJobStartupTasks, {Oban, Application.fetch_env!(:pinchflat, Oban)}, - Pinchflat.StartupTasks, + Pinchflat.Boot.PostJobStartupTasks, {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/workers/data_backfill_worker.ex b/lib/pinchflat/boot/data_backfill_worker.ex similarity index 94% rename from lib/pinchflat/workers/data_backfill_worker.ex rename to lib/pinchflat/boot/data_backfill_worker.ex index 15a7041..6c863e3 100644 --- a/lib/pinchflat/workers/data_backfill_worker.ex +++ b/lib/pinchflat/boot/data_backfill_worker.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.Workers.DataBackfillWorker do +defmodule Pinchflat.Boot.DataBackfillWorker do @moduledoc false use Oban.Worker, @@ -28,7 +28,7 @@ defmodule Pinchflat.Workers.DataBackfillWorker do """ def cancel_pending_backfill_jobs do Oban.Job - |> where(worker: "Pinchflat.Workers.DataBackfillWorker") + |> where(worker: "Pinchflat.Boot.DataBackfillWorker") |> Oban.cancel_all_jobs() end diff --git a/lib/pinchflat/startup_tasks.ex b/lib/pinchflat/boot/post_job_startup_tasks.ex similarity index 81% rename from lib/pinchflat/startup_tasks.ex rename to lib/pinchflat/boot/post_job_startup_tasks.ex index 8e4be23..4d11159 100644 --- a/lib/pinchflat/startup_tasks.ex +++ b/lib/pinchflat/boot/post_job_startup_tasks.ex @@ -1,6 +1,7 @@ -defmodule Pinchflat.StartupTasks do +defmodule Pinchflat.Boot.PostJobStartupTasks do @moduledoc """ - This module is responsible for running startup tasks on app boot. + This module is responsible for running startup tasks on app boot + AFTER the job runner has initiallized. It's a GenServer because that plays REALLY nicely with the existing Phoenix supervision tree. @@ -11,8 +12,7 @@ defmodule Pinchflat.StartupTasks do import Ecto.Query, warn: false alias Pinchflat.Repo - alias Pinchflat.Settings - alias Pinchflat.Workers.DataBackfillWorker + alias Pinchflat.Boot.DataBackfillWorker def start_link(opts \\ []) do GenServer.start_link(__MODULE__, %{}, opts) @@ -29,17 +29,11 @@ defmodule Pinchflat.StartupTasks do """ @impl true def init(state) do - apply_default_settings() enqueue_backfill_worker() {:ok, state} end - defp apply_default_settings do - Settings.fetch!(:onboarding, true) - Settings.fetch!(:pro_enabled, false) - end - defp enqueue_backfill_worker do DataBackfillWorker.cancel_pending_backfill_jobs() diff --git a/lib/pinchflat/boot/pre_job_startup_tasks.ex b/lib/pinchflat/boot/pre_job_startup_tasks.ex new file mode 100644 index 0000000..73847b9 --- /dev/null +++ b/lib/pinchflat/boot/pre_job_startup_tasks.ex @@ -0,0 +1,73 @@ +defmodule Pinchflat.Boot.PreJobStartupTasks do + @moduledoc """ + This module is responsible for running startup tasks on app boot + BEFORE the job runner has initiallized. + + It's a GenServer because that plays REALLY nicely with the existing + Phoenix supervision tree. + """ + + # restart: :temporary means that this process will never be restarted (ie: will run once and then die) + use GenServer, restart: :temporary + import Ecto.Query, warn: false + require Logger + + alias Pinchflat.Repo + alias Pinchflat.Settings + + def start_link(opts \\ []) do + GenServer.start_link(__MODULE__, %{}, opts) + end + + @doc """ + Runs application startup tasks. + + Any code defined here will run every time the application starts. You must + make sure that the code is idempotent and safe to run multiple times. + + This is a good place to set up default settings, create initial records, stuff like that. + Should be fast - anything with the potential to be slow should be kicked off as a job instead. + """ + @impl true + def init(state) do + apply_default_settings() + rename_old_job_workers() + + {:ok, state} + end + + defp apply_default_settings do + Settings.fetch!(:onboarding, true) + Settings.fetch!(:pro_enabled, false) + end + + # As part of a large refactor, I ended up moving a bunch of workers around. This + # is a problem because the workers are stored in the database and the runner + # will try to run the OLD jobs. This is also why these tasks run before the job + # runner starts up. + # + # Can be removed after a few months (created: 2024-03-12) + defp rename_old_job_workers do + # [ [old_name, new_name], ...] + rename_map = [ + ["Pinchflat.Workers.MediaIndexingWorker", "Pinchflat.FastIndexing.MediaIndexingWorker"], + ["Pinchflat.Workers.MediaDownloadWorker", "Pinchflat.Downloading.MediaDownloadWorker"], + ["Pinchflat.Workers.FilesystemDataWorker", "Pinchflat.Filesystem.FilesystemDataWorker"], + ["Pinchflat.Workers.FastIndexingWorker", "Pinchflat.FastIndexing.FastIndexingWorker"], + ["Pinchflat.Workers.MediaCollectionIndexingWorker", "Pinchflat.SlowIndexing.MediaCollectionIndexingWorker"], + ["Pinchflat.Workers.DataBackfillWorker", "Pinchflat.Boot.DataBackfillWorker"] + ] + + jobs_renamed = + Enum.reduce(rename_map, 0, fn [old_name, new_name], acc -> + {count, _} = + Oban.Job + |> where(worker: ^old_name) + |> Repo.update_all(set: [worker: new_name]) + + acc + count + end) + + Logger.info("Renamed #{jobs_renamed} old job workers") + end +end diff --git a/lib/pinchflat/yt_dlp/download_option_builder.ex b/lib/pinchflat/downloading/download_option_builder.ex similarity index 97% rename from lib/pinchflat/yt_dlp/download_option_builder.ex rename to lib/pinchflat/downloading/download_option_builder.ex index 35f4aff..0bb25e2 100644 --- a/lib/pinchflat/yt_dlp/download_option_builder.ex +++ b/lib/pinchflat/downloading/download_option_builder.ex @@ -1,10 +1,10 @@ -defmodule Pinchflat.YtDlp.DownloadOptionBuilder do +defmodule Pinchflat.Downloading.DownloadOptionBuilder do @moduledoc """ Builds the options for yt-dlp to download media based on the given media profile. """ alias Pinchflat.Media.MediaItem - alias Pinchflat.Profiles.OutputPathBuilder + alias Pinchflat.Downloading.OutputPathBuilder @doc """ Builds the options for yt-dlp to download media based on the given media's profile. diff --git a/lib/pinchflat/downloading/downloading_helpers.ex b/lib/pinchflat/downloading/downloading_helpers.ex new file mode 100644 index 0000000..9217548 --- /dev/null +++ b/lib/pinchflat/downloading/downloading_helpers.ex @@ -0,0 +1,50 @@ +defmodule Pinchflat.Downloading.DownloadingHelpers do + @moduledoc """ + Methods for helping download media + + Many of these methods are made to be kickoff or be consumed by workers. + """ + + require Logger + + alias Pinchflat.Media + alias Pinchflat.Tasks + alias Pinchflat.Sources.Source + alias Pinchflat.Downloading.MediaDownloadWorker + + @doc """ + Starts tasks for downloading media for any of a sources _pending_ media items. + Jobs are not enqueued if the source is set to not download media. This will return :ok. + + 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. + + Returns :ok + """ + def enqueue_pending_download_tasks(%Source{download_media: true} = source) do + source + |> Media.list_pending_media_items_for() + |> Enum.each(fn media_item -> + %{id: media_item.id} + |> MediaDownloadWorker.new() + |> Tasks.create_job_with_task(media_item) + end) + end + + def enqueue_pending_download_tasks(%Source{download_media: false}) do + :ok + end + + @doc """ + Deletes ALL pending tasks for a source's media items. + + Returns :ok + """ + def dequeue_pending_download_tasks(%Source{} = source) do + source + |> Media.list_pending_media_items_for() + |> Enum.each(&Tasks.delete_pending_tasks_for/1) + end +end diff --git a/lib/pinchflat/workers/media_download_worker.ex b/lib/pinchflat/downloading/media_download_worker.ex similarity index 90% rename from lib/pinchflat/workers/media_download_worker.ex rename to lib/pinchflat/downloading/media_download_worker.ex index 2b99489..d41a8b3 100644 --- a/lib/pinchflat/workers/media_download_worker.ex +++ b/lib/pinchflat/downloading/media_download_worker.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.Workers.MediaDownloadWorker do +defmodule Pinchflat.Downloading.MediaDownloadWorker do @moduledoc false use Oban.Worker, @@ -9,8 +9,8 @@ defmodule Pinchflat.Workers.MediaDownloadWorker do alias Pinchflat.Repo alias Pinchflat.Media alias Pinchflat.Tasks - alias Pinchflat.MediaClient.MediaDownloader - alias Pinchflat.Workers.FilesystemDataWorker + alias Pinchflat.Downloading.MediaDownloader + alias Pinchflat.Filesystem.FilesystemDataWorker @impl Oban.Worker @doc """ diff --git a/lib/pinchflat/yt_dlp/media_downloader.ex b/lib/pinchflat/downloading/media_downloader.ex similarity index 92% rename from lib/pinchflat/yt_dlp/media_downloader.ex rename to lib/pinchflat/downloading/media_downloader.ex index 7202b1d..a3fa60f 100644 --- a/lib/pinchflat/yt_dlp/media_downloader.ex +++ b/lib/pinchflat/downloading/media_downloader.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.MediaClient.MediaDownloader do +defmodule Pinchflat.Downloading.MediaDownloader do @moduledoc """ This is the integration layer for actually downloading media. It takes into account the media profile's settings in order @@ -9,8 +9,8 @@ defmodule Pinchflat.MediaClient.MediaDownloader do alias Pinchflat.Media alias Pinchflat.Media.MediaItem - alias Pinchflat.YtDlp.Backend.Media, as: YtDlpMedia - alias Pinchflat.YtDlp.DownloadOptionBuilder, as: YtDlpDownloadOptionBuilder + alias Pinchflat.YtDlp.Media, as: YtDlpMedia + alias Pinchflat.Downloading.DownloadOptionBuilder, as: YtDlpDownloadOptionBuilder alias Pinchflat.Metadata.MetadataParser, as: YtDlpMetadataParser alias Pinchflat.Metadata.MetadataFileHelpers, as: YtDlpMetadataHelpers diff --git a/lib/pinchflat/rendered_string/base.ex b/lib/pinchflat/downloading/output_path/base.ex similarity index 92% rename from lib/pinchflat/rendered_string/base.ex rename to lib/pinchflat/downloading/output_path/base.ex index 549a676..79f1036 100644 --- a/lib/pinchflat/rendered_string/base.ex +++ b/lib/pinchflat/downloading/output_path/base.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.RenderedString.Base do +defmodule Pinchflat.Downloading.OutputPath.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 @@ -6,7 +6,7 @@ defmodule Pinchflat.RenderedString.Base do 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 + NOTE: this is effectively tested by the `Pinchflat.Downloading.OutputPath.Parser`'s tests """ defmacro __using__(_opts) do diff --git a/lib/pinchflat/rendered_string/parser.ex b/lib/pinchflat/downloading/output_path/parser.ex similarity index 92% rename from lib/pinchflat/rendered_string/parser.ex rename to lib/pinchflat/downloading/output_path/parser.ex index 103588d..35bfae3 100644 --- a/lib/pinchflat/rendered_string/parser.ex +++ b/lib/pinchflat/downloading/output_path/parser.ex @@ -1,11 +1,11 @@ -defmodule Pinchflat.RenderedString.Parser do +defmodule Pinchflat.Downloading.OutputPath.Parser do @moduledoc """ Parses liquid-ish-style strings into a rendered string Used for turning filepath templates into real filepaths """ - use Pinchflat.RenderedString.Base + use Pinchflat.Downloading.OutputPath.Base @doc """ Parses a string into a rendered string, using the provided variables. Optionally diff --git a/lib/pinchflat/profiles/output_path_builder.ex b/lib/pinchflat/downloading/output_path_builder.ex similarity index 93% rename from lib/pinchflat/profiles/output_path_builder.ex rename to lib/pinchflat/downloading/output_path_builder.ex index de0b6b9..8142990 100644 --- a/lib/pinchflat/profiles/output_path_builder.ex +++ b/lib/pinchflat/downloading/output_path_builder.ex @@ -1,9 +1,9 @@ -defmodule Pinchflat.Profiles.OutputPathBuilder do +defmodule Pinchflat.Downloading.OutputPathBuilder do @moduledoc """ Builds yt-dlp-friendly output paths for downloaded media """ - alias Pinchflat.RenderedString.Parser, as: TemplateParser + alias Pinchflat.Downloading.OutputPath.Parser, as: TemplateParser @doc """ Builds the actual final filepath from a given template. Optionally, you can pass in diff --git a/lib/pinchflat/fast_indexing/fast_indexing_helpers.ex b/lib/pinchflat/fast_indexing/fast_indexing_helpers.ex new file mode 100644 index 0000000..6355df7 --- /dev/null +++ b/lib/pinchflat/fast_indexing/fast_indexing_helpers.ex @@ -0,0 +1,94 @@ +defmodule Pinchflat.FastIndexing.FastIndexingHelpers do + @moduledoc """ + Methods for performing fast indexing tasks and managing the fast indexing process. + + Many of these methods are made to be kickoff or be consumed by workers. + """ + + alias Pinchflat.Media + alias Pinchflat.Tasks + alias Pinchflat.Sources.Source + alias Pinchflat.FastIndexing.YoutubeRss + alias Pinchflat.FastIndexing.FastIndexingWorker + alias Pinchflat.Downloading.MediaDownloadWorker + alias Pinchflat.FastIndexing.MediaIndexingWorker + + alias Pinchflat.YtDlp.Media, as: YtDlpMedia + + @doc """ + Starts tasks for running a fast indexing task for a source's media + regardless of the source's fast_index state. It's assumed the + caller will check for fast_index. + + This is used for running fast index tasks on update. On creation, the + fast index is enqueued after the slow index is complete. + + Returns {:ok, %Task{}}. + """ + def kickoff_fast_indexing_task(%Source{} = source) do + Tasks.delete_pending_tasks_for(source, "FastIndexingWorker") + + %{id: source.id} + # Schedule this one immediately, but future ones will be on an interval + |> FastIndexingWorker.new() + |> Tasks.create_job_with_task(source) + end + + @doc """ + Fetches new media IDs from a source's YouTube RSS feed and kicks off indexing tasks + for any new media items. See comments in `MediaIndexingWorker` for more info on the + order of operations and how this fits into the indexing process. + + Despite the similar name to `kickoff_fast_indexing_task`, this does work differently. + `kickoff_fast_indexing_task` starts a task that _calls_ this function whereas this + function starts individual indexing tasks for each new media item. I think it does + make sense grammatically, but I could see how that's confusing. + + Returns :ok + """ + def kickoff_indexing_tasks_from_youtube_rss_feed(%Source{} = source) do + {:ok, media_ids} = YoutubeRss.get_recent_media_ids_from_rss(source) + existing_media_items = Media.list_media_items_by_media_id_for(source, media_ids) + new_media_ids = media_ids -- Enum.map(existing_media_items, & &1.media_id) + + Enum.each(new_media_ids, fn media_id -> + url = "https://www.youtube.com/watch?v=#{media_id}" + + %{id: source.id, media_url: url} + |> MediaIndexingWorker.new() + |> Tasks.create_job_with_task(source) + end) + end + + @doc """ + Indexes a single media item for a source and enqueues a download job if the + media should be downloaded. This method creates the media item record so it's + the one-stop-shop for adding a media item (and possibly downloading it) just + by a URL and source. + + Returns {:ok, media_item} | {:error, any()} + """ + def index_and_enqueue_download_for_media_item(%Source{} = source, url) do + maybe_media_item = create_media_item_from_url(source, url) + + case maybe_media_item do + {:ok, media_item} -> + if source.download_media && Media.pending_download?(media_item) do + %{id: media_item.id} + |> MediaDownloadWorker.new() + |> Tasks.create_job_with_task(media_item) + end + + {:ok, media_item} + + err -> + err + end + end + + defp create_media_item_from_url(source, url) do + {:ok, media_attrs} = YtDlpMedia.get_media_attributes(url) + + Media.create_media_item_from_backend_attrs(source, media_attrs) + end +end diff --git a/lib/pinchflat/workers/fast_indexing_worker.ex b/lib/pinchflat/fast_indexing/fast_indexing_worker.ex similarity index 85% rename from lib/pinchflat/workers/fast_indexing_worker.ex rename to lib/pinchflat/fast_indexing/fast_indexing_worker.ex index 96ac85a..d0a0e9a 100644 --- a/lib/pinchflat/workers/fast_indexing_worker.ex +++ b/lib/pinchflat/fast_indexing/fast_indexing_worker.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.Workers.FastIndexingWorker do +defmodule Pinchflat.FastIndexing.FastIndexingWorker do @moduledoc false use Oban.Worker, @@ -10,7 +10,7 @@ defmodule Pinchflat.Workers.FastIndexingWorker do alias Pinchflat.Tasks alias Pinchflat.Sources alias Pinchflat.Sources.Source - alias Pinchflat.Tasks.SourceTasks + alias Pinchflat.FastIndexing.FastIndexingHelpers @impl Oban.Worker @doc """ @@ -24,7 +24,7 @@ defmodule Pinchflat.Workers.FastIndexingWorker do source = Sources.get_source!(source_id) if source.fast_index do - SourceTasks.kickoff_indexing_tasks_from_youtube_rss_feed(source) + FastIndexingHelpers.kickoff_indexing_tasks_from_youtube_rss_feed(source) reschedule_indexing(source) else diff --git a/lib/pinchflat/workers/media_indexing_worker.ex b/lib/pinchflat/fast_indexing/media_indexing_worker.ex similarity index 87% rename from lib/pinchflat/workers/media_indexing_worker.ex rename to lib/pinchflat/fast_indexing/media_indexing_worker.ex index 74222b9..1bcc9d3 100644 --- a/lib/pinchflat/workers/media_indexing_worker.ex +++ b/lib/pinchflat/fast_indexing/media_indexing_worker.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.Workers.MediaIndexingWorker do +defmodule Pinchflat.FastIndexing.MediaIndexingWorker do @moduledoc false use Oban.Worker, @@ -9,7 +9,7 @@ defmodule Pinchflat.Workers.MediaIndexingWorker do require Logger alias Pinchflat.Sources - alias Pinchflat.Tasks.MediaItemTasks + alias Pinchflat.FastIndexing.FastIndexingHelpers @impl Oban.Worker @doc """ @@ -23,7 +23,7 @@ defmodule Pinchflat.Workers.MediaIndexingWorker do and the media matches the profile's format preferences) Order of operations: - 1. SourceTasks.kickoff_indexing_tasks_from_youtube_rss_feed/1 (which is running + 1. FastIndexingHelpers.kickoff_indexing_tasks_from_youtube_rss_feed/1 (which is running in its own worker) periodically checks the YouTube RSS feed for new media 2. If new media is found, it enqueues a MediaIndexingWorker (this module) for each new media item @@ -40,7 +40,7 @@ defmodule Pinchflat.Workers.MediaIndexingWorker do def perform(%Oban.Job{args: %{"id" => source_id, "media_url" => media_url}}) do source = Sources.get_source!(source_id) - case MediaItemTasks.index_and_enqueue_download_for_media_item(source, media_url) do + case FastIndexingHelpers.index_and_enqueue_download_for_media_item(source, media_url) do {:ok, media_item} -> Logger.debug("Indexed and enqueued download for url: #{media_url} (media item: #{media_item.id})") diff --git a/lib/pinchflat/api/youtube_rss.ex b/lib/pinchflat/fast_indexing/youtube_rss.ex similarity index 97% rename from lib/pinchflat/api/youtube_rss.ex rename to lib/pinchflat/fast_indexing/youtube_rss.ex index 7eef959..5caaab8 100644 --- a/lib/pinchflat/api/youtube_rss.ex +++ b/lib/pinchflat/fast_indexing/youtube_rss.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.Api.YoutubeRss do +defmodule Pinchflat.FastIndexing.YoutubeRss do @moduledoc """ Methods for interacting with YouTube RSS feeds """ diff --git a/lib/pinchflat/workers/filesystem_data_worker.ex b/lib/pinchflat/filesystem/filesystem_data_worker.ex similarity index 76% rename from lib/pinchflat/workers/filesystem_data_worker.ex rename to lib/pinchflat/filesystem/filesystem_data_worker.ex index 137a2c6..0941a88 100644 --- a/lib/pinchflat/workers/filesystem_data_worker.ex +++ b/lib/pinchflat/filesystem/filesystem_data_worker.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.Workers.FilesystemDataWorker do +defmodule Pinchflat.Filesystem.FilesystemDataWorker do @moduledoc false use Oban.Worker, @@ -7,7 +7,7 @@ defmodule Pinchflat.Workers.FilesystemDataWorker do max_attempts: 1 alias Pinchflat.Media - alias Pinchflat.Tasks.MediaItemTasks + alias Pinchflat.Filesystem.FilesystemHelpers @impl Oban.Worker @doc """ @@ -18,7 +18,7 @@ defmodule Pinchflat.Workers.FilesystemDataWorker do def perform(%Oban.Job{args: %{"id" => media_item_id}}) do media_item = Media.get_media_item!(media_item_id) - MediaItemTasks.compute_and_save_media_filesize(media_item) + FilesystemHelpers.compute_and_save_media_filesize(media_item) # Don't retry on failure - if it didn't work immediately there's no # reason to believe it will work later. diff --git a/lib/pinchflat/utils/filesystem_utils.ex b/lib/pinchflat/filesystem/filesystem_helpers.ex similarity index 57% rename from lib/pinchflat/utils/filesystem_utils.ex rename to lib/pinchflat/filesystem/filesystem_helpers.ex index a2cfff3..7ec8975 100644 --- a/lib/pinchflat/utils/filesystem_utils.ex +++ b/lib/pinchflat/filesystem/filesystem_helpers.ex @@ -1,8 +1,8 @@ -defmodule Pinchflat.Utils.FilesystemUtils do +defmodule Pinchflat.Filesystem.FilesystemHelpers do @moduledoc """ Utility methods for working with the filesystem """ - + alias Pinchflat.Media alias Pinchflat.Utils.StringUtils @doc """ @@ -20,4 +20,19 @@ defmodule Pinchflat.Utils.FilesystemUtils do filepath end + + @doc """ + Fetches the file size of a media item and saves it to the database. + + Returns {:ok, media_item} | {:error, any()} + """ + def compute_and_save_media_filesize(media_item) do + case File.stat(media_item.media_filepath) do + {:ok, %{size: size}} -> + Media.update_media_item(media_item, %{media_size_bytes: size}) + + err -> + err + end + end end diff --git a/lib/pinchflat/media.ex b/lib/pinchflat/media/media.ex similarity index 99% rename from lib/pinchflat/media.ex rename to lib/pinchflat/media/media.ex index 28147b1..ae21988 100644 --- a/lib/pinchflat/media.ex +++ b/lib/pinchflat/media/media.ex @@ -9,7 +9,7 @@ defmodule Pinchflat.Media do alias Pinchflat.Tasks alias Pinchflat.Media.MediaItem alias Pinchflat.Sources.Source - alias Pinchflat.Media.MediaMetadata + alias Pinchflat.Metadata.MediaMetadata @doc """ Returns the list of media_items. diff --git a/lib/pinchflat/media/media_item.ex b/lib/pinchflat/media/media_item.ex index 6b07cac..ae2028e 100644 --- a/lib/pinchflat/media/media_item.ex +++ b/lib/pinchflat/media/media_item.ex @@ -8,8 +8,8 @@ defmodule Pinchflat.Media.MediaItem do alias Pinchflat.Tasks.Task alias Pinchflat.Sources.Source - alias Pinchflat.Media.MediaMetadata - alias Pinchflat.Media.MediaItemSearchIndex + alias Pinchflat.Metadata.MediaMetadata + alias Pinchflat.Media.MediaItemsSearchIndex @allowed_fields [ # these fields are captured on indexing (and again on download) @@ -64,7 +64,7 @@ defmodule Pinchflat.Media.MediaItem do belongs_to :source, Source has_one :metadata, MediaMetadata, on_replace: :update - has_one :media_items_search_index, MediaItemSearchIndex, foreign_key: :id + has_one :media_items_search_index, MediaItemsSearchIndex, foreign_key: :id has_many :tasks, Task diff --git a/lib/pinchflat/media/media_items_search_index.ex b/lib/pinchflat/media/media_items_search_index.ex index c55d787..623b5fb 100644 --- a/lib/pinchflat/media/media_items_search_index.ex +++ b/lib/pinchflat/media/media_items_search_index.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.Media.MediaItemSearchIndex do +defmodule Pinchflat.Media.MediaItemsSearchIndex do @moduledoc """ The MediaItem fts5 search index. Not made to be directly interacted with, but I figured it'd be better to have it in-app so it's not a mystery. diff --git a/lib/pinchflat/media/media_metadata.ex b/lib/pinchflat/metadata/media_metadata.ex similarity index 94% rename from lib/pinchflat/media/media_metadata.ex rename to lib/pinchflat/metadata/media_metadata.ex index 18c3ba2..5a0ef96 100644 --- a/lib/pinchflat/media/media_metadata.ex +++ b/lib/pinchflat/metadata/media_metadata.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.Media.MediaMetadata do +defmodule Pinchflat.Metadata.MediaMetadata do @moduledoc """ The MediaMetadata schema. diff --git a/lib/pinchflat/profiles.ex b/lib/pinchflat/profiles/profiles.ex similarity index 100% rename from lib/pinchflat/profiles.ex rename to lib/pinchflat/profiles/profiles.ex diff --git a/lib/pinchflat/settings.ex b/lib/pinchflat/settings/settings.ex similarity index 100% rename from lib/pinchflat/settings.ex rename to lib/pinchflat/settings/settings.ex diff --git a/lib/pinchflat/utils/filesystem_utils/file_follower_server.ex b/lib/pinchflat/slow_indexing/file_follower_server.ex similarity index 98% rename from lib/pinchflat/utils/filesystem_utils/file_follower_server.ex rename to lib/pinchflat/slow_indexing/file_follower_server.ex index f6987e4..0d5dde2 100644 --- a/lib/pinchflat/utils/filesystem_utils/file_follower_server.ex +++ b/lib/pinchflat/slow_indexing/file_follower_server.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.Utils.FilesystemUtils.FileFollowerServer do +defmodule Pinchflat.SlowIndexing.FileFollowerServer do @moduledoc """ A GenServer that watches a file for new lines and processes them as they come in. This is useful for tailing log files and other similar tasks. If there's no activity diff --git a/lib/pinchflat/workers/media_collection_indexing_worker.ex b/lib/pinchflat/slow_indexing/media_collection_indexing_worker.ex similarity index 90% rename from lib/pinchflat/workers/media_collection_indexing_worker.ex rename to lib/pinchflat/slow_indexing/media_collection_indexing_worker.ex index 3f7122e..46b2ef0 100644 --- a/lib/pinchflat/workers/media_collection_indexing_worker.ex +++ b/lib/pinchflat/slow_indexing/media_collection_indexing_worker.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.Workers.MediaCollectionIndexingWorker do +defmodule Pinchflat.SlowIndexing.MediaCollectionIndexingWorker do @moduledoc false use Oban.Worker, @@ -10,8 +10,8 @@ defmodule Pinchflat.Workers.MediaCollectionIndexingWorker do alias Pinchflat.Tasks alias Pinchflat.Sources alias Pinchflat.Sources.Source - alias Pinchflat.Tasks.SourceTasks - alias Pinchflat.Workers.FastIndexingWorker + alias Pinchflat.FastIndexing.FastIndexingWorker + alias Pinchflat.SlowIndexing.SlowIndexingHelpers @impl Oban.Worker @doc """ @@ -40,7 +40,7 @@ defmodule Pinchflat.Workers.MediaCollectionIndexingWorker do by the `download_media` field on the source as well as the profile's shorts/livestream behaviour. At this step we also attach a file reader to the `yt-dlp` output file so we can create media items as they come in - for a little speedup (see SourceTasks comments for more) + for a little speedup (see {Fast,Slow}IndexingHelpers comments for more) 4. If this job is meant to reschedule (ie: has an index frequency > 0), it reschedules itself. If not, it runs once and does not reschedule 5. If the source uses fast indexing, that job is kicked off as well. It @@ -56,8 +56,6 @@ defmodule Pinchflat.Workers.MediaCollectionIndexingWorker do 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" => source_id}}) do @@ -66,14 +64,14 @@ defmodule Pinchflat.Workers.MediaCollectionIndexingWorker do case {source.index_frequency_minutes, source.last_indexed_at} do {index_freq, _} when index_freq > 0 -> # If the indexing is on a schedule simply run indexing and reschedule - SourceTasks.index_and_enqueue_download_for_media_items(source) + SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) maybe_enqueue_fast_indexing_task(source) reschedule_indexing(source) {_, nil} -> # If the source has never been indexed, index it once # even if it's not meant to reschedule - SourceTasks.index_and_enqueue_download_for_media_items(source) + SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) :ok _ -> diff --git a/lib/pinchflat/tasks/source_tasks.ex b/lib/pinchflat/slow_indexing/slow_indexing_helpers.ex similarity index 55% rename from lib/pinchflat/tasks/source_tasks.ex rename to lib/pinchflat/slow_indexing/slow_indexing_helpers.ex index 86afb26..81e7784 100644 --- a/lib/pinchflat/tasks/source_tasks.ex +++ b/lib/pinchflat/slow_indexing/slow_indexing_helpers.ex @@ -1,9 +1,8 @@ -defmodule Pinchflat.Tasks.SourceTasks do +defmodule Pinchflat.SlowIndexing.SlowIndexingHelpers do @moduledoc """ - Contains methods used by OR used to create/manage tasks for sources. + Methods for performing slow indexing tasks and managing the indexing process. - Tasks/workers are meant to be thin wrappers so most of the actual work they - do is also defined here. Essentially, a one-stop-shop for source-related tasks/workers. + Many of these methods are made to be kickoff or be consumed by workers. """ require Logger @@ -12,16 +11,14 @@ defmodule Pinchflat.Tasks.SourceTasks do alias Pinchflat.Tasks alias Pinchflat.Sources alias Pinchflat.Sources.Source - alias Pinchflat.Api.YoutubeRss alias Pinchflat.Media.MediaItem - alias Pinchflat.Workers.FastIndexingWorker - alias Pinchflat.Workers.MediaDownloadWorker - alias Pinchflat.Workers.MediaIndexingWorker - alias Pinchflat.YtDlp.Backend.MediaCollection - alias Pinchflat.Workers.MediaCollectionIndexingWorker - alias Pinchflat.Utils.FilesystemUtils.FileFollowerServer + alias Pinchflat.YtDlp.MediaCollection + alias Pinchflat.Downloading.DownloadingHelpers + alias Pinchflat.SlowIndexing.FileFollowerServer + alias Pinchflat.Downloading.MediaDownloadWorker + alias Pinchflat.SlowIndexing.MediaCollectionIndexingWorker - alias Pinchflat.YtDlp.Backend.Media, as: YtDlpMedia + alias Pinchflat.YtDlp.Media, as: YtDlpMedia @doc """ Starts tasks for indexing a source's media regardless of the source's indexing @@ -40,46 +37,6 @@ defmodule Pinchflat.Tasks.SourceTasks do |> Tasks.create_job_with_task(source) end - @doc """ - Starts tasks for running a fast indexing task for a source's media - regardless of the source's fast_index state. It's assumed the - caller will check for fast_index. - - This is used for running fast index tasks on update. On creation, the - fast index is enqueued after the slow index is complete. - - Returns {:ok, %Task{}}. - """ - def kickoff_fast_indexing_task(%Source{} = source) do - Tasks.delete_pending_tasks_for(source, "FastIndexingWorker") - - %{id: source.id} - # Schedule this one immediately, but future ones will be on an interval - |> FastIndexingWorker.new() - |> Tasks.create_job_with_task(source) - end - - @doc """ - Fetches new media IDs from a source's YouTube RSS feed and kicks off indexing tasks - for any new media items. See comments in `MediaIndexingWorker` for more info on the - order of operations and how this fits into the indexing process. - - Returns :ok - """ - def kickoff_indexing_tasks_from_youtube_rss_feed(%Source{} = source) do - {:ok, media_ids} = YoutubeRss.get_recent_media_ids_from_rss(source) - existing_media_items = Media.list_media_items_by_media_id_for(source, media_ids) - new_media_ids = media_ids -- Enum.map(existing_media_items, & &1.media_id) - - Enum.each(new_media_ids, fn media_id -> - url = "https://www.youtube.com/watch?v=#{media_id}" - - %{id: source.id, media_url: url} - |> MediaIndexingWorker.new() - |> Tasks.create_job_with_task(source) - end) - end - @doc """ Given a media source, creates (indexes) the media by creating media_items for each media ID in the source. Afterward, kicks off a download task for each pending media @@ -105,50 +62,21 @@ defmodule Pinchflat.Tasks.SourceTasks do # See the method definition below for more info on how file watchers work # (important reading if you're not familiar with it) {:ok, media_attributes} = get_media_attributes_for_collection_and_setup_file_watcher(source) - result = Enum.map(media_attributes, fn media_attrs -> create_media_item_from_attributes(source, media_attrs) end) + + result = + Enum.map(media_attributes, fn media_attrs -> + case Media.create_media_item_from_backend_attrs(source, media_attrs) do + {:ok, media_item} -> media_item + {:error, changeset} -> changeset + end + end) Sources.update_source(source, %{last_indexed_at: DateTime.utc_now()}) - enqueue_pending_media_tasks(source) + DownloadingHelpers.enqueue_pending_download_tasks(source) result end - @doc """ - Starts tasks for downloading media for any of a sources _pending_ media items. - Jobs are not enqueued if the source is set to not download media. This will return :ok. - - 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. - - Returns :ok - """ - def enqueue_pending_media_tasks(%Source{download_media: true} = source) do - source - |> Media.list_pending_media_items_for() - |> Enum.each(fn media_item -> - %{id: media_item.id} - |> MediaDownloadWorker.new() - |> Tasks.create_job_with_task(media_item) - end) - end - - def enqueue_pending_media_tasks(%Source{download_media: false} = _source) do - :ok - end - - @doc """ - Deletes ALL pending tasks for a source's media items. - - Returns :ok - """ - def dequeue_pending_media_tasks(%Source{} = source) do - source - |> Media.list_pending_media_items_for() - |> Enum.each(&Tasks.delete_pending_tasks_for/1) - end - # The file follower is a GenServer that watches a file for new lines and # processes them. This works well, but we have to be resilliant to partially-written # lines (ie: you should gracefully fail if you can't parse a line). @@ -191,10 +119,8 @@ defmodule Pinchflat.Tasks.SourceTasks do end defp create_media_item_and_enqueue_download(source, media_attrs) do - maybe_media_item = create_media_item_from_attributes(source, media_attrs) - - case maybe_media_item do - %MediaItem{} = media_item -> + case Media.create_media_item_from_backend_attrs(source, media_attrs) do + {:ok, %MediaItem{} = media_item} -> if source.download_media && Media.pending_download?(media_item) do Logger.debug("FileFollowerServer Handler: Enqueuing download task for #{inspect(media_attrs)}") @@ -203,15 +129,8 @@ defmodule Pinchflat.Tasks.SourceTasks do |> Tasks.create_job_with_task(media_item) end - changeset -> + {:error, changeset} -> changeset end end - - defp create_media_item_from_attributes(source, media_attrs) do - case Media.create_media_item_from_backend_attrs(source, media_attrs) do - {:ok, media_item} -> media_item - {:error, changeset} -> changeset - end - end end diff --git a/lib/pinchflat/sources.ex b/lib/pinchflat/sources/sources.ex similarity index 93% rename from lib/pinchflat/sources.ex rename to lib/pinchflat/sources/sources.ex index dd53971..72cbfd6 100644 --- a/lib/pinchflat/sources.ex +++ b/lib/pinchflat/sources/sources.ex @@ -9,9 +9,11 @@ defmodule Pinchflat.Sources do alias Pinchflat.Media alias Pinchflat.Tasks alias Pinchflat.Sources.Source - alias Pinchflat.Tasks.SourceTasks alias Pinchflat.Profiles.MediaProfile - alias Pinchflat.YtDlp.Backend.MediaCollection + alias Pinchflat.YtDlp.MediaCollection + alias Pinchflat.Downloading.DownloadingHelpers + alias Pinchflat.FastIndexing.FastIndexingHelpers + alias Pinchflat.SlowIndexing.SlowIndexingHelpers @doc """ Returns the list of sources. Returns [%Source{}, ...] @@ -67,7 +69,7 @@ defmodule Pinchflat.Sources do media if the indexing frequency has been changed. Existing indexing tasks will be cancelled if the indexing frequency has been - changed (logic in `SourceTasks.kickoff_indexing_task`) + changed (logic in `SlowIndexingHelpers.kickoff_indexing_task`) Runs an initial `change_source` check to ensure most of the source is valid before making an expensive API call. Runs it through `Repo.update` even @@ -205,10 +207,10 @@ defmodule Pinchflat.Sources do defp maybe_handle_media_tasks(changeset, source) do case {changeset.data, changeset.changes} do {%{__meta__: %{state: :loaded}}, %{download_media: true}} -> - SourceTasks.enqueue_pending_media_tasks(source) + DownloadingHelpers.enqueue_pending_download_tasks(source) {%{__meta__: %{state: :loaded}}, %{download_media: false}} -> - SourceTasks.dequeue_pending_media_tasks(source) + DownloadingHelpers.dequeue_pending_download_tasks(source) _ -> :ok @@ -221,7 +223,7 @@ defmodule Pinchflat.Sources do case changeset.data do # If the changeset is new (not persisted), attempt indexing no matter what %{__meta__: %{state: :built}} -> - SourceTasks.kickoff_indexing_task(source) + SlowIndexingHelpers.kickoff_indexing_task(source) # If the record has been persisted, only run indexing if the # indexing frequency has been changed and is now greater than 0 @@ -236,7 +238,7 @@ defmodule Pinchflat.Sources do defp maybe_update_slow_indexing_task(changeset, source) do case changeset.changes do %{index_frequency_minutes: mins} when mins > 0 -> - SourceTasks.kickoff_indexing_task(source) + SlowIndexingHelpers.kickoff_indexing_task(source) %{index_frequency_minutes: _} -> Tasks.delete_pending_tasks_for(source, "FastIndexingWorker") @@ -251,7 +253,7 @@ defmodule Pinchflat.Sources do defp maybe_update_fast_indexing_task(changeset, source) do case changeset.changes do %{fast_index: true} -> - SourceTasks.kickoff_fast_indexing_task(source) + FastIndexingHelpers.kickoff_fast_indexing_task(source) %{fast_index: false} -> Tasks.delete_pending_tasks_for(source, "FastIndexingWorker") diff --git a/lib/pinchflat/tasks/media_item_tasks.ex b/lib/pinchflat/tasks/media_item_tasks.ex deleted file mode 100644 index afcb3d5..0000000 --- a/lib/pinchflat/tasks/media_item_tasks.ex +++ /dev/null @@ -1,61 +0,0 @@ -defmodule Pinchflat.Tasks.MediaItemTasks do - @moduledoc """ - Contains methods used by OR used to create/manage tasks for media items. - - Tasks/workers are meant to be thin wrappers so most of the actual work they - do is also defined here. Essentially, a one-stop-shop for media-related tasks/workers. - """ - alias Pinchflat.Media - alias Pinchflat.Tasks - alias Pinchflat.Sources.Source - alias Pinchflat.Workers.MediaDownloadWorker - - alias Pinchflat.YtDlp.Backend.Media, as: YtDlpMedia - - @doc """ - Fetches the file size of a media item and saves it to the database. - - Returns {:ok, media_item} | {:error, any()} - """ - def compute_and_save_media_filesize(media_item) do - case File.stat(media_item.media_filepath) do - {:ok, %{size: size}} -> - Media.update_media_item(media_item, %{media_size_bytes: size}) - - err -> - err - end - end - - @doc """ - Indexes a single media item for a source and enqueues a download job if the - media should be downloaded. This method creates the media item record so it's - the one-stop-shop for adding a media item (and possibly downloading it) just - by a URL and source. - - Returns {:ok, media_item} | {:error, any()} - """ - def index_and_enqueue_download_for_media_item(%Source{} = source, url) do - maybe_media_item = create_media_item_from_url(source, url) - - case maybe_media_item do - {:ok, media_item} -> - if source.download_media && Media.pending_download?(media_item) do - %{id: media_item.id} - |> MediaDownloadWorker.new() - |> Tasks.create_job_with_task(media_item) - end - - {:ok, media_item} - - err -> - err - end - end - - defp create_media_item_from_url(source, url) do - {:ok, media_attrs} = YtDlpMedia.get_media_attributes(url) - - Media.create_media_item_from_backend_attrs(source, media_attrs) - end -end diff --git a/lib/pinchflat/tasks.ex b/lib/pinchflat/tasks/tasks.ex similarity index 100% rename from lib/pinchflat/tasks.ex rename to lib/pinchflat/tasks/tasks.ex diff --git a/lib/pinchflat/yt_dlp/backend/backend_command_runner.ex b/lib/pinchflat/yt_dlp/backend_command_runner.ex similarity index 87% rename from lib/pinchflat/yt_dlp/backend/backend_command_runner.ex rename to lib/pinchflat/yt_dlp/backend_command_runner.ex index e0f708a..fef612c 100644 --- a/lib/pinchflat/yt_dlp/backend/backend_command_runner.ex +++ b/lib/pinchflat/yt_dlp/backend_command_runner.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.YtDlp.Backend.BackendCommandRunner do +defmodule Pinchflat.YtDlp.BackendCommandRunner do @moduledoc """ A behaviour for running CLI commands against a downloader backend (yt-dlp). diff --git a/lib/pinchflat/yt_dlp/backend/command_runner.ex b/lib/pinchflat/yt_dlp/command_runner.ex similarity index 94% rename from lib/pinchflat/yt_dlp/backend/command_runner.ex rename to lib/pinchflat/yt_dlp/command_runner.ex index 765aaf8..925e5be 100644 --- a/lib/pinchflat/yt_dlp/backend/command_runner.ex +++ b/lib/pinchflat/yt_dlp/command_runner.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.YtDlp.Backend.CommandRunner do +defmodule Pinchflat.YtDlp.CommandRunner do @moduledoc """ Runs yt-dlp commands using the `System.cmd/3` function """ @@ -6,8 +6,8 @@ defmodule Pinchflat.YtDlp.Backend.CommandRunner do require Logger alias Pinchflat.Utils.StringUtils - alias Pinchflat.Utils.FilesystemUtils, as: FSUtils - alias Pinchflat.YtDlp.Backend.BackendCommandRunner + alias Pinchflat.Filesystem.FilesystemHelpers, as: FSUtils + alias Pinchflat.YtDlp.BackendCommandRunner @behaviour BackendCommandRunner diff --git a/lib/pinchflat/yt_dlp/backend/media.ex b/lib/pinchflat/yt_dlp/media.ex similarity index 98% rename from lib/pinchflat/yt_dlp/backend/media.ex rename to lib/pinchflat/yt_dlp/media.ex index 09ad719..34c9276 100644 --- a/lib/pinchflat/yt_dlp/backend/media.ex +++ b/lib/pinchflat/yt_dlp/media.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.YtDlp.Backend.Media do +defmodule Pinchflat.YtDlp.Media do @moduledoc """ Contains utilities for working with singular pieces of media """ diff --git a/lib/pinchflat/yt_dlp/backend/media_collection.ex b/lib/pinchflat/yt_dlp/media_collection.ex similarity index 91% rename from lib/pinchflat/yt_dlp/backend/media_collection.ex rename to lib/pinchflat/yt_dlp/media_collection.ex index ff8e044..57a5450 100644 --- a/lib/pinchflat/yt_dlp/backend/media_collection.ex +++ b/lib/pinchflat/yt_dlp/media_collection.ex @@ -1,4 +1,4 @@ -defmodule Pinchflat.YtDlp.Backend.MediaCollection do +defmodule Pinchflat.YtDlp.MediaCollection do @moduledoc """ Contains utilities for working with collections of media (aka: a source [ie: channels, playlists]). @@ -7,8 +7,8 @@ defmodule Pinchflat.YtDlp.Backend.MediaCollection do require Logger alias Pinchflat.Utils.FunctionUtils - alias Pinchflat.Utils.FilesystemUtils - alias Pinchflat.YtDlp.Backend.Media, as: YtDlpMedia + alias Pinchflat.Filesystem.FilesystemHelpers + alias Pinchflat.YtDlp.Media, as: YtDlpMedia @doc """ Returns a list of maps representing the media in the collection. @@ -24,7 +24,7 @@ defmodule Pinchflat.YtDlp.Backend.MediaCollection do runner = Application.get_env(:pinchflat, :yt_dlp_runner) command_opts = [:simulate, :skip_download] output_template = YtDlpMedia.indexing_output_template() - output_filepath = FilesystemUtils.generate_metadata_tmpfile(:json) + output_filepath = FilesystemHelpers.generate_metadata_tmpfile(:json) file_listener_handler = Keyword.get(addl_opts, :file_listener_handler, false) if file_listener_handler do diff --git a/mix.exs b/mix.exs index c5cada2..837ce87 100644 --- a/mix.exs +++ b/mix.exs @@ -59,6 +59,7 @@ defmodule Pinchflat.MixProject do {:nimble_parsec, "~> 1.4"}, {:mox, "~> 1.0", only: :test}, {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, + {:credo_naming, "~> 2.1", only: [:dev, :test], runtime: false}, {:ex_check, "~> 0.14.0", only: [:dev, :test], runtime: false}, {:faker, "~> 0.17", only: :test}, {:sobelow, "~> 0.13", only: [:dev, :test], runtime: false} diff --git a/mix.lock b/mix.lock index e4f4777..5599358 100644 --- a/mix.lock +++ b/mix.lock @@ -6,6 +6,7 @@ "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, "cowlib": {:hex, :cowlib, "2.12.1", "a9fa9a625f1d2025fe6b462cb865881329b5caff8f1854d1cbc9f9533f00e1e1", [:make, :rebar3], [], "hexpm", "163b73f6367a7341b33c794c4e88e7dbfe6498ac42dcd69ef44c5bc5507c8db0"}, "credo": {:hex, :credo, "1.7.3", "05bb11eaf2f2b8db370ecaa6a6bda2ec49b2acd5e0418bc106b73b07128c0436", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "35ea675a094c934c22fb1dca3696f3c31f2728ae6ef5a53b5d648c11180a4535"}, + "credo_naming": {:hex, :credo_naming, "2.1.0", "d44ad58890d4db552e141ce64756a74ac1573665af766d1ac64931aa90d47744", [:make, :mix], [{:credo, "~> 1.6", [hex: :credo, repo: "hexpm", optional: false]}], "hexpm", "830e23b3fba972e2fccec49c0c089fe78c1e64bc16782a2682d78082351a2909"}, "db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"}, "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, "dns_cluster": {:hex, :dns_cluster, "0.1.2", "3eb5be824c7888dadf9781018e1a5f1d3d1113b333c50bce90fb1b83df1015f2", [:mix], [], "hexpm", "7494272040f847637bbdb01bcdf4b871e82daf09b813e7d3cb3b84f112c6f2f8"}, diff --git a/test/pinchflat/workers/data_backfill_worker_test.exs b/test/pinchflat/boot/data_backfill_worker_test.exs similarity index 92% rename from test/pinchflat/workers/data_backfill_worker_test.exs rename to test/pinchflat/boot/data_backfill_worker_test.exs index 856bfb6..f08872c 100644 --- a/test/pinchflat/workers/data_backfill_worker_test.exs +++ b/test/pinchflat/boot/data_backfill_worker_test.exs @@ -1,10 +1,10 @@ -defmodule Pinchflat.Workers.DataBackfillWorkerTest do +defmodule Pinchflat.Boot.DataBackfillWorkerTest do use Pinchflat.DataCase import Pinchflat.MediaFixtures - alias Pinchflat.Workers.DataBackfillWorker - alias Pinchflat.Workers.FilesystemDataWorker + alias Pinchflat.Boot.DataBackfillWorker + alias Pinchflat.Filesystem.FilesystemDataWorker describe "cancel_pending_backfill_jobs/0" do test "cancels all pending backfill jobs" do diff --git a/test/pinchflat/boot/pre_job_startup_tasks_test.exs b/test/pinchflat/boot/pre_job_startup_tasks_test.exs new file mode 100644 index 0000000..0c41c24 --- /dev/null +++ b/test/pinchflat/boot/pre_job_startup_tasks_test.exs @@ -0,0 +1,25 @@ +defmodule Pinchflat.Boot.PreJobStartupTasksTest do + use Pinchflat.DataCase + + alias Pinchflat.Settings + alias Pinchflat.Settings.Setting + alias Pinchflat.Boot.PreJobStartupTasks + + describe "apply_default_settings" do + setup do + Repo.delete_all(Setting) + + :ok + end + + test "sets default settings" do + assert_raise Ecto.NoResultsError, fn -> Settings.get!(:onboarding) end + assert_raise Ecto.NoResultsError, fn -> Settings.get!(:pro_enabled) end + + PreJobStartupTasks.start_link() + + assert Settings.get!(:onboarding) + refute Settings.get!(:pro_enabled) + end + end +end diff --git a/test/pinchflat/yt_dlp/download_option_builder_test.exs b/test/pinchflat/downloading/download_option_builder_test.exs similarity index 98% rename from test/pinchflat/yt_dlp/download_option_builder_test.exs rename to test/pinchflat/downloading/download_option_builder_test.exs index 9896b5a..8d2cc46 100644 --- a/test/pinchflat/yt_dlp/download_option_builder_test.exs +++ b/test/pinchflat/downloading/download_option_builder_test.exs @@ -1,11 +1,11 @@ -defmodule Pinchflat.YtDlp.DownloadOptionBuilderTest do +defmodule Pinchflat.Downloading.DownloadOptionBuilderTest do use Pinchflat.DataCase import Pinchflat.MediaFixtures import Pinchflat.ProfilesFixtures import Pinchflat.SourcesFixtures alias Pinchflat.Profiles - alias Pinchflat.YtDlp.DownloadOptionBuilder + alias Pinchflat.Downloading.DownloadOptionBuilder setup do media_profile = media_profile_fixture(%{output_path_template: "{{ title }}.%(ext)s"}) diff --git a/test/pinchflat/downloading/downloading_helpers_test.exs b/test/pinchflat/downloading/downloading_helpers_test.exs new file mode 100644 index 0000000..f2af81f --- /dev/null +++ b/test/pinchflat/downloading/downloading_helpers_test.exs @@ -0,0 +1,75 @@ +defmodule Pinchflat.Downloading.DownloadingHelpersTest do + use Pinchflat.DataCase + + import Mox + import Pinchflat.MediaFixtures + import Pinchflat.SourcesFixtures + + alias Pinchflat.Tasks + alias Pinchflat.Downloading.DownloadingHelpers + alias Pinchflat.Downloading.MediaDownloadWorker + + setup :verify_on_exit! + + describe "enqueue_pending_download_tasks/1" do + test "it enqueues a job for each pending media item" do + source = source_fixture() + media_item = media_item_fixture(source_id: source.id, media_filepath: nil) + + assert :ok = DownloadingHelpers.enqueue_pending_download_tasks(source) + + assert_enqueued(worker: MediaDownloadWorker, args: %{"id" => media_item.id}) + end + + test "it does not enqueue a job for media items with a filepath" do + source = source_fixture() + _media_item = media_item_fixture(source_id: source.id, media_filepath: "some/filepath.mp4") + + assert :ok = DownloadingHelpers.enqueue_pending_download_tasks(source) + + refute_enqueued(worker: MediaDownloadWorker) + end + + test "it attaches a task to each enqueued job" do + source = source_fixture() + media_item = media_item_fixture(source_id: source.id, media_filepath: nil) + + assert [] = Tasks.list_tasks_for(:media_item_id, media_item.id) + + assert :ok = DownloadingHelpers.enqueue_pending_download_tasks(source) + + assert [_] = Tasks.list_tasks_for(:media_item_id, media_item.id) + end + + test "it does not create a job if the source is set to not download" do + source = source_fixture(download_media: false) + + assert :ok = DownloadingHelpers.enqueue_pending_download_tasks(source) + + refute_enqueued(worker: MediaDownloadWorker) + end + + test "it does not attach tasks if the source is set to not download" do + source = source_fixture(download_media: false) + media_item = media_item_fixture(source_id: source.id, media_filepath: nil) + + assert :ok = DownloadingHelpers.enqueue_pending_download_tasks(source) + assert [] = Tasks.list_tasks_for(:media_item_id, media_item.id) + end + end + + describe "dequeue_pending_download_tasks/1" do + test "it deletes all pending tasks for a source's media items" do + source = source_fixture() + media_item = media_item_fixture(source_id: source.id, media_filepath: nil) + + DownloadingHelpers.enqueue_pending_download_tasks(source) + assert_enqueued(worker: MediaDownloadWorker, args: %{"id" => media_item.id}) + + assert :ok = DownloadingHelpers.dequeue_pending_download_tasks(source) + + refute_enqueued(worker: MediaDownloadWorker) + assert [] = Tasks.list_tasks_for(:media_item_id, media_item.id) + end + end +end diff --git a/test/pinchflat/workers/media_download_worker_test.exs b/test/pinchflat/downloading/media_download_worker_test.exs similarity index 94% rename from test/pinchflat/workers/media_download_worker_test.exs rename to test/pinchflat/downloading/media_download_worker_test.exs index 88fc001..0023419 100644 --- a/test/pinchflat/workers/media_download_worker_test.exs +++ b/test/pinchflat/downloading/media_download_worker_test.exs @@ -1,12 +1,12 @@ -defmodule Pinchflat.Workers.MediaDownloadWorkerTest do +defmodule Pinchflat.Downloading.MediaDownloadWorkerTest do use Pinchflat.DataCase import Mox import Pinchflat.MediaFixtures alias Pinchflat.Sources - alias Pinchflat.Workers.MediaDownloadWorker - alias Pinchflat.Workers.FilesystemDataWorker + alias Pinchflat.Downloading.MediaDownloadWorker + alias Pinchflat.Filesystem.FilesystemDataWorker setup :verify_on_exit! diff --git a/test/pinchflat/yt_dlp/media_downloader_test.exs b/test/pinchflat/downloading/media_downloader_test.exs similarity index 97% rename from test/pinchflat/yt_dlp/media_downloader_test.exs rename to test/pinchflat/downloading/media_downloader_test.exs index bd2c7ba..2b3d8bc 100644 --- a/test/pinchflat/yt_dlp/media_downloader_test.exs +++ b/test/pinchflat/downloading/media_downloader_test.exs @@ -1,9 +1,9 @@ -defmodule Pinchflat.MediaClient.MediaDownloaderTest do +defmodule Pinchflat.Downloading.MediaDownloaderTest do use Pinchflat.DataCase import Mox import Pinchflat.MediaFixtures - alias Pinchflat.MediaClient.MediaDownloader + alias Pinchflat.Downloading.MediaDownloader setup :verify_on_exit! diff --git a/test/pinchflat/rendered_string/parser_test.exs b/test/pinchflat/downloading/output_path/parser_test.exs similarity index 93% rename from test/pinchflat/rendered_string/parser_test.exs rename to test/pinchflat/downloading/output_path/parser_test.exs index 37e70db..44b27b9 100644 --- a/test/pinchflat/rendered_string/parser_test.exs +++ b/test/pinchflat/downloading/output_path/parser_test.exs @@ -1,7 +1,7 @@ -defmodule Pinchflat.RenderedString.ParserTest do +defmodule Pinchflat.Downloading.OutputPath.ParserTest do use ExUnit.Case, async: true - alias Pinchflat.RenderedString.Parser + alias Pinchflat.Downloading.OutputPath.Parser describe "parse/3" do test "it returns the rendered string when the string is valid" do diff --git a/test/profiles/output_path_builder_test.exs b/test/pinchflat/downloading/output_path_builder_test.exs similarity index 89% rename from test/profiles/output_path_builder_test.exs rename to test/pinchflat/downloading/output_path_builder_test.exs index d44982d..57051f6 100644 --- a/test/profiles/output_path_builder_test.exs +++ b/test/pinchflat/downloading/output_path_builder_test.exs @@ -1,7 +1,7 @@ -defmodule Pinchflat.Profiles.OutputPathBuilderTest do +defmodule Pinchflat.Downloading.OutputPathBuilderTest do use Pinchflat.DataCase - alias Pinchflat.Profiles.OutputPathBuilder + alias Pinchflat.Downloading.OutputPathBuilder describe "build/2" do test "it expands 'standard' curly brace variables in the template" do diff --git a/test/pinchflat/fast_indexing/fast_indexing_helpers_test.exs b/test/pinchflat/fast_indexing/fast_indexing_helpers_test.exs new file mode 100644 index 0000000..6aa078f --- /dev/null +++ b/test/pinchflat/fast_indexing/fast_indexing_helpers_test.exs @@ -0,0 +1,142 @@ +defmodule Pinchflat.FastIndexing.FastIndexingHelpersTest do + use Pinchflat.DataCase + + import Mox + import Pinchflat.TasksFixtures + import Pinchflat.MediaFixtures + import Pinchflat.SourcesFixtures + import Pinchflat.ProfilesFixtures + + alias Pinchflat.Tasks + alias Pinchflat.Tasks.Task + alias Pinchflat.Media.MediaItem + alias Pinchflat.Downloading.MediaDownloadWorker + alias Pinchflat.FastIndexing.MediaIndexingWorker + alias Pinchflat.FastIndexing.FastIndexingHelpers + alias Pinchflat.FastIndexing.FastIndexingWorker + + setup :verify_on_exit! + + @media_url "https://www.youtube.com/watch?v=test_1" + + describe "kickoff_fast_indexing_task/1" do + test "it schedules a job" do + source = source_fixture() + + assert {:ok, _} = FastIndexingHelpers.kickoff_fast_indexing_task(source) + + assert_enqueued(worker: FastIndexingWorker, args: %{"id" => source.id}) + end + + test "it creates and attaches a task" do + source = source_fixture() + + assert {:ok, %Task{} = task} = FastIndexingHelpers.kickoff_fast_indexing_task(source) + + assert task.source_id == source.id + end + + test "it deletes any fast indexing tasks for the source" do + source = source_fixture() + {:ok, job} = Oban.insert(FastIndexingWorker.new(%{"id" => source.id})) + task = task_fixture(source_id: source.id, job_id: job.id) + + assert {:ok, _} = FastIndexingHelpers.kickoff_fast_indexing_task(source) + + assert_raise Ecto.NoResultsError, fn -> Repo.reload!(task) end + end + end + + describe "kickoff_indexing_tasks_from_youtube_rss_feed/1" do + setup do + {:ok, [source: source_fixture()]} + end + + test "enqueues a new worker for each new media_id in the source's RSS feed", %{source: source} do + expect(HTTPClientMock, :get, fn _url -> {:ok, "test_1"} end) + + assert :ok = FastIndexingHelpers.kickoff_indexing_tasks_from_youtube_rss_feed(source) + + assert [worker] = all_enqueued(worker: MediaIndexingWorker) + assert worker.args["id"] == source.id + assert worker.args["media_url"] == "https://www.youtube.com/watch?v=test_1" + end + + test "does not enqueue a new worker for the source's media IDs we already know about", %{source: source} do + expect(HTTPClientMock, :get, fn _url -> {:ok, "test_1"} end) + media_item_fixture(source_id: source.id, media_id: "test_1") + + assert :ok = FastIndexingHelpers.kickoff_indexing_tasks_from_youtube_rss_feed(source) + + refute_enqueued(worker: MediaIndexingWorker) + end + end + + describe "index_and_enqueue_download_for_media_item/2" do + setup do + stub(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + {:ok, media_attributes_return_fixture()} + end) + + {:ok, [source: source_fixture()]} + end + + test "creates a new media item based on the URL", %{source: source} do + assert Repo.aggregate(MediaItem, :count) == 0 + assert {:ok, _} = FastIndexingHelpers.index_and_enqueue_download_for_media_item(source, @media_url) + assert Repo.aggregate(MediaItem, :count) == 1 + end + + test "won't duplicate media_items based on media_id and source", %{source: source} do + assert {:ok, mi_1} = FastIndexingHelpers.index_and_enqueue_download_for_media_item(source, @media_url) + assert {:ok, mi_2} = FastIndexingHelpers.index_and_enqueue_download_for_media_item(source, @media_url) + + assert Repo.aggregate(MediaItem, :count) == 1 + assert mi_1.id == mi_2.id + end + + test "enqueues a download job", %{source: source} do + assert {:ok, media_item} = FastIndexingHelpers.index_and_enqueue_download_for_media_item(source, @media_url) + + assert_enqueued(worker: MediaDownloadWorker, args: %{"id" => media_item.id}) + end + + test "creates a download task record", %{source: source} do + assert {:ok, media_item} = FastIndexingHelpers.index_and_enqueue_download_for_media_item(source, @media_url) + + assert [_] = Tasks.list_tasks_for(:media_item_id, media_item.id, "MediaDownloadWorker") + end + + test "does not enqueue a download job if the source does not allow it" do + source = source_fixture(%{download_media: false}) + + assert {:ok, _} = FastIndexingHelpers.index_and_enqueue_download_for_media_item(source, @media_url) + + refute_enqueued(worker: MediaDownloadWorker) + end + + test "does not enqueue a download job if the media item does not match the format rules" do + profile = media_profile_fixture(%{shorts_behaviour: :exclude}) + source = source_fixture(%{media_profile_id: profile.id}) + + stub(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + output = + Phoenix.json_library().encode!(%{ + id: "video2", + title: "Video 2", + webpage_url: "https://example.com/shorts/video2", + was_live: true, + description: "desc2", + aspect_ratio: 1.67, + duration: 345.67, + upload_date: "20210101" + }) + + {:ok, output} + end) + + assert {:ok, _media_item} = FastIndexingHelpers.index_and_enqueue_download_for_media_item(source, @media_url) + refute_enqueued(worker: MediaDownloadWorker) + end + end +end diff --git a/test/pinchflat/workers/fast_indexing_worker_test.exs b/test/pinchflat/fast_indexing/fast_indexing_worker_test.exs similarity index 92% rename from test/pinchflat/workers/fast_indexing_worker_test.exs rename to test/pinchflat/fast_indexing/fast_indexing_worker_test.exs index 701b827..5108865 100644 --- a/test/pinchflat/workers/fast_indexing_worker_test.exs +++ b/test/pinchflat/fast_indexing/fast_indexing_worker_test.exs @@ -1,11 +1,11 @@ -defmodule Pinchflat.Workers.FastIndexingWorkerTest do +defmodule Pinchflat.FastIndexing.FastIndexingWorkerTest do use Pinchflat.DataCase import Mox import Pinchflat.SourcesFixtures alias Pinchflat.Sources.Source - alias Pinchflat.Workers.FastIndexingWorker + alias Pinchflat.FastIndexing.FastIndexingWorker setup :verify_on_exit! diff --git a/test/pinchflat/workers/media_indexing_worker_test.exs b/test/pinchflat/fast_indexing/media_indexing_worker_test.exs similarity index 87% rename from test/pinchflat/workers/media_indexing_worker_test.exs rename to test/pinchflat/fast_indexing/media_indexing_worker_test.exs index 9db9b19..96cc932 100644 --- a/test/pinchflat/workers/media_indexing_worker_test.exs +++ b/test/pinchflat/fast_indexing/media_indexing_worker_test.exs @@ -1,4 +1,4 @@ -defmodule Pinchflat.Workers.MediaIndexingWorkerTest do +defmodule Pinchflat.FastIndexing.MediaIndexingWorkerTest do use Pinchflat.DataCase import Mox @@ -6,8 +6,8 @@ defmodule Pinchflat.Workers.MediaIndexingWorkerTest do import Pinchflat.SourcesFixtures alias Pinchflat.Media.MediaItem - alias Pinchflat.Workers.MediaIndexingWorker - alias Pinchflat.Workers.MediaDownloadWorker + alias Pinchflat.FastIndexing.MediaIndexingWorker + alias Pinchflat.Downloading.MediaDownloadWorker @media_url "https://www.youtube.com/watch?v=1234567890" diff --git a/test/pinchflat/api/youtube_rss_test.exs b/test/pinchflat/fast_indexing/youtube_rss_test.exs similarity index 96% rename from test/pinchflat/api/youtube_rss_test.exs rename to test/pinchflat/fast_indexing/youtube_rss_test.exs index 34c386c..811b0ab 100644 --- a/test/pinchflat/api/youtube_rss_test.exs +++ b/test/pinchflat/fast_indexing/youtube_rss_test.exs @@ -1,9 +1,9 @@ -defmodule Pinchflat.Api.YoutubeRssTest do +defmodule Pinchflat.FastIndexing.YoutubeRssTest do use Pinchflat.DataCase import Mox import Pinchflat.SourcesFixtures - alias Pinchflat.Api.YoutubeRss + alias Pinchflat.FastIndexing.YoutubeRss setup :verify_on_exit! diff --git a/test/pinchflat/workers/filesystem_data_worker_test.exs b/test/pinchflat/filesystem/filesystem_data_worker_test.exs similarity index 77% rename from test/pinchflat/workers/filesystem_data_worker_test.exs rename to test/pinchflat/filesystem/filesystem_data_worker_test.exs index 44b0afd..7a50508 100644 --- a/test/pinchflat/workers/filesystem_data_worker_test.exs +++ b/test/pinchflat/filesystem/filesystem_data_worker_test.exs @@ -1,9 +1,9 @@ -defmodule Pinchflat.Workers.FilesystemDataWorkerTest do +defmodule Pinchflat.Filesystem.FilesystemDataWorkerTest do use Pinchflat.DataCase import Pinchflat.MediaFixtures - alias Pinchflat.Workers.FilesystemDataWorker + alias Pinchflat.Filesystem.FilesystemDataWorker describe "perform/1" do test "Computes and stores the media file size" do diff --git a/test/pinchflat/filesystem/filesystem_helpers_test.exs b/test/pinchflat/filesystem/filesystem_helpers_test.exs new file mode 100644 index 0000000..da2dd8f --- /dev/null +++ b/test/pinchflat/filesystem/filesystem_helpers_test.exs @@ -0,0 +1,36 @@ +defmodule Pinchflat.Filesystem.FilesystemHelpersTest do + use Pinchflat.DataCase + + import Pinchflat.MediaFixtures + + alias Pinchflat.Filesystem.FilesystemHelpers + + describe "generate_metadata_tmpfile/1" do + test "creates a tmpfile and returns its path" do + res = FilesystemHelpers.generate_metadata_tmpfile(:json) + + assert String.ends_with?(res, ".json") + assert File.exists?(res) + + File.rm!(res) + end + end + + describe "compute_and_save_media_filesize/1" do + test "updates the media item with the file size" do + media_item = media_item_with_attachments() + + refute media_item.media_size_bytes + + assert {:ok, media_item} = FilesystemHelpers.compute_and_save_media_filesize(media_item) + + assert Repo.reload!(media_item).media_size_bytes + end + + test "returns the error if operation fails" do + media_item = media_item_fixture(%{media_filepath: "/nonexistent/file.mkv"}) + + assert {:error, _} = FilesystemHelpers.compute_and_save_media_filesize(media_item) + end + end +end diff --git a/test/pinchflat/media_test.exs b/test/pinchflat/media_test.exs index 1437178..a91e8b1 100644 --- a/test/pinchflat/media_test.exs +++ b/test/pinchflat/media_test.exs @@ -11,7 +11,7 @@ defmodule Pinchflat.MediaTest do alias Pinchflat.Media.MediaItem alias Pinchflat.Metadata.MetadataFileHelpers - alias Pinchflat.YtDlp.Backend.Media, as: YtDlpMedia + alias Pinchflat.YtDlp.Media, as: YtDlpMedia setup :verify_on_exit! diff --git a/test/pinchflat/metadata/metadata_parser_test.exs b/test/pinchflat/metadata/metadata_parser_test.exs index e48c1b4..a18444e 100644 --- a/test/pinchflat/metadata/metadata_parser_test.exs +++ b/test/pinchflat/metadata/metadata_parser_test.exs @@ -1,4 +1,4 @@ -defmodule Pinchflat.YtDlp.Backend.MediaParserTest do +defmodule Pinchflat.Metadata.MetadataParserTest do use Pinchflat.DataCase alias Pinchflat.Metadata.MetadataParser, as: Parser diff --git a/test/pinchflat/utils/filesystem_utils/file_follower_server_test.exs b/test/pinchflat/slow_indexing/file_follower_server_test.exs similarity index 84% rename from test/pinchflat/utils/filesystem_utils/file_follower_server_test.exs rename to test/pinchflat/slow_indexing/file_follower_server_test.exs index 34cb671..52104fe 100644 --- a/test/pinchflat/utils/filesystem_utils/file_follower_server_test.exs +++ b/test/pinchflat/slow_indexing/file_follower_server_test.exs @@ -1,12 +1,12 @@ -defmodule Pinchflat.Utils.FilesystemUtils.FileFollowerServerTest do +defmodule Pinchflat.SlowIndexing.FileFollowerServerTest do use ExUnit.Case, async: true - alias alias Pinchflat.Utils.FilesystemUtils - alias Pinchflat.Utils.FilesystemUtils.FileFollowerServer + alias alias Pinchflat.Filesystem.FilesystemHelpers + alias Pinchflat.SlowIndexing.FileFollowerServer setup do {:ok, pid} = FileFollowerServer.start_link() - tmpfile = FilesystemUtils.generate_metadata_tmpfile(:txt) + tmpfile = FilesystemHelpers.generate_metadata_tmpfile(:txt) {:ok, %{pid: pid, tmpfile: tmpfile}} end diff --git a/test/pinchflat/workers/media_collection_indexing_worker_test.exs b/test/pinchflat/slow_indexing/media_collection_indexing_worker_test.exs similarity index 96% rename from test/pinchflat/workers/media_collection_indexing_worker_test.exs rename to test/pinchflat/slow_indexing/media_collection_indexing_worker_test.exs index 4d3c5b7..9d1f1ce 100644 --- a/test/pinchflat/workers/media_collection_indexing_worker_test.exs +++ b/test/pinchflat/slow_indexing/media_collection_indexing_worker_test.exs @@ -1,4 +1,4 @@ -defmodule Pinchflat.Workers.MediaCollectionIndexingWorkerTest do +defmodule Pinchflat.SlowIndexing.MediaCollectionIndexingWorkerTest do use Pinchflat.DataCase import Mox @@ -8,9 +8,9 @@ defmodule Pinchflat.Workers.MediaCollectionIndexingWorkerTest do alias Pinchflat.Tasks alias Pinchflat.Sources.Source - alias Pinchflat.Workers.FastIndexingWorker - alias Pinchflat.Workers.MediaDownloadWorker - alias Pinchflat.Workers.MediaCollectionIndexingWorker + alias Pinchflat.FastIndexing.FastIndexingWorker + alias Pinchflat.Downloading.MediaDownloadWorker + alias Pinchflat.SlowIndexing.MediaCollectionIndexingWorker setup :verify_on_exit! diff --git a/test/pinchflat/tasks/source_tasks_test.exs b/test/pinchflat/slow_indexing/slow_indexing_helpers_test.exs similarity index 59% rename from test/pinchflat/tasks/source_tasks_test.exs rename to test/pinchflat/slow_indexing/slow_indexing_helpers_test.exs index 94bc32a..6d385a5 100644 --- a/test/pinchflat/tasks/source_tasks_test.exs +++ b/test/pinchflat/slow_indexing/slow_indexing_helpers_test.exs @@ -1,4 +1,4 @@ -defmodule Pinchflat.Tasks.SourceTasksTest do +defmodule Pinchflat.SlowIndexing.SlowIndexingHelpersTest do use Pinchflat.DataCase import Mox @@ -9,12 +9,12 @@ defmodule Pinchflat.Tasks.SourceTasksTest do alias Pinchflat.Tasks alias Pinchflat.Tasks.Task - alias Pinchflat.Tasks.SourceTasks alias Pinchflat.Media.MediaItem - alias Pinchflat.Workers.FastIndexingWorker - alias Pinchflat.Workers.MediaDownloadWorker - alias Pinchflat.Workers.MediaIndexingWorker - alias Pinchflat.Workers.MediaCollectionIndexingWorker + alias Pinchflat.FastIndexing.FastIndexingWorker + alias Pinchflat.Downloading.MediaDownloadWorker + alias Pinchflat.FastIndexing.MediaIndexingWorker + alias Pinchflat.SlowIndexing.SlowIndexingHelpers + alias Pinchflat.SlowIndexing.MediaCollectionIndexingWorker setup :verify_on_exit! @@ -22,7 +22,7 @@ defmodule Pinchflat.Tasks.SourceTasksTest do test "it schedules a job" do source = source_fixture(index_frequency_minutes: 1) - assert {:ok, _} = SourceTasks.kickoff_indexing_task(source) + assert {:ok, _} = SlowIndexingHelpers.kickoff_indexing_task(source) assert_enqueued(worker: MediaCollectionIndexingWorker, args: %{"id" => source.id}) end @@ -30,7 +30,7 @@ defmodule Pinchflat.Tasks.SourceTasksTest do test "it creates and attaches a task" do source = source_fixture(index_frequency_minutes: 1) - assert {:ok, %Task{} = task} = SourceTasks.kickoff_indexing_task(source) + assert {:ok, %Task{} = task} = SlowIndexingHelpers.kickoff_indexing_task(source) assert task.source_id == source.id end @@ -40,7 +40,7 @@ defmodule Pinchflat.Tasks.SourceTasksTest do {:ok, job} = Oban.insert(MediaCollectionIndexingWorker.new(%{"id" => source.id})) task = task_fixture(source_id: source.id, job_id: job.id) - assert {:ok, _} = SourceTasks.kickoff_indexing_task(source) + assert {:ok, _} = SlowIndexingHelpers.kickoff_indexing_task(source) assert_raise Ecto.NoResultsError, fn -> Repo.reload!(task) end end @@ -50,7 +50,7 @@ defmodule Pinchflat.Tasks.SourceTasksTest do {:ok, job} = Oban.insert(MediaIndexingWorker.new(%{"id" => source.id})) task = task_fixture(source_id: source.id, job_id: job.id) - assert {:ok, _} = SourceTasks.kickoff_indexing_task(source) + assert {:ok, _} = SlowIndexingHelpers.kickoff_indexing_task(source) assert_raise Ecto.NoResultsError, fn -> Repo.reload!(task) end end @@ -60,65 +60,12 @@ defmodule Pinchflat.Tasks.SourceTasksTest do {:ok, job} = Oban.insert(FastIndexingWorker.new(%{"id" => source.id})) task = task_fixture(source_id: source.id, job_id: job.id) - assert {:ok, _} = SourceTasks.kickoff_indexing_task(source) + assert {:ok, _} = SlowIndexingHelpers.kickoff_indexing_task(source) assert_raise Ecto.NoResultsError, fn -> Repo.reload!(task) end end end - describe "kickoff_fast_indexing_task/1" do - test "it schedules a job" do - source = source_fixture() - - assert {:ok, _} = SourceTasks.kickoff_fast_indexing_task(source) - - assert_enqueued(worker: FastIndexingWorker, args: %{"id" => source.id}) - end - - test "it creates and attaches a task" do - source = source_fixture() - - assert {:ok, %Task{} = task} = SourceTasks.kickoff_fast_indexing_task(source) - - assert task.source_id == source.id - end - - test "it deletes any fast indexing tasks for the source" do - source = source_fixture() - {:ok, job} = Oban.insert(FastIndexingWorker.new(%{"id" => source.id})) - task = task_fixture(source_id: source.id, job_id: job.id) - - assert {:ok, _} = SourceTasks.kickoff_fast_indexing_task(source) - - assert_raise Ecto.NoResultsError, fn -> Repo.reload!(task) end - end - end - - describe "kickoff_indexing_tasks_from_youtube_rss_feed/1" do - setup do - {:ok, [source: source_fixture()]} - end - - test "enqueues a new worker for each new media_id in the source's RSS feed", %{source: source} do - expect(HTTPClientMock, :get, fn _url -> {:ok, "test_1"} end) - - assert :ok = SourceTasks.kickoff_indexing_tasks_from_youtube_rss_feed(source) - - assert [worker] = all_enqueued(worker: MediaIndexingWorker) - assert worker.args["id"] == source.id - assert worker.args["media_url"] == "https://www.youtube.com/watch?v=test_1" - end - - test "does not enqueue a new worker for the source's media IDs we already know about", %{source: source} do - expect(HTTPClientMock, :get, fn _url -> {:ok, "test_1"} end) - media_item_fixture(source_id: source.id, media_id: "test_1") - - assert :ok = SourceTasks.kickoff_indexing_tasks_from_youtube_rss_feed(source) - - refute_enqueued(worker: MediaIndexingWorker) - end - end - describe "index_and_enqueue_download_for_media_items/1" do setup do stub(YtDlpRunnerMock, :run, fn _url, _opts, _ot, _addl_opts -> @@ -129,7 +76,7 @@ defmodule Pinchflat.Tasks.SourceTasksTest do end test "it creates a media_item record for each media ID returned", %{source: source} do - assert media_items = SourceTasks.index_and_enqueue_download_for_media_items(source) + assert media_items = SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) assert Enum.count(media_items) == 3 assert ["video1", "video2", "video3"] == Enum.map(media_items, & &1.media_id) @@ -141,15 +88,15 @@ defmodule Pinchflat.Tasks.SourceTasksTest do test "it attaches all media_items to the given source", %{source: source} do source_id = source.id - assert media_items = SourceTasks.index_and_enqueue_download_for_media_items(source) + assert media_items = SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) assert Enum.count(media_items) == 3 assert Enum.all?(media_items, fn %MediaItem{source_id: ^source_id} -> true end) end test "it won't duplicate media_items based on media_id and source", %{source: source} do - _first_run = SourceTasks.index_and_enqueue_download_for_media_items(source) - _duplicate_run = SourceTasks.index_and_enqueue_download_for_media_items(source) + _first_run = SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) + _duplicate_run = SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) media_items = Repo.preload(source, :media_items).media_items assert Enum.count(media_items) == 3 @@ -158,8 +105,8 @@ defmodule Pinchflat.Tasks.SourceTasksTest do test "it can duplicate media_ids for different sources", %{source: source} do other_source = source_fixture() - media_items = SourceTasks.index_and_enqueue_download_for_media_items(source) - media_items_other_source = SourceTasks.index_and_enqueue_download_for_media_items(other_source) + media_items = SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) + media_items_other_source = SlowIndexingHelpers.index_and_enqueue_download_for_media_items(other_source) assert Enum.count(media_items) == 3 assert Enum.count(media_items_other_source) == 3 @@ -169,8 +116,8 @@ defmodule Pinchflat.Tasks.SourceTasksTest do end test "it returns a list of media_items", %{source: source} do - first_run = SourceTasks.index_and_enqueue_download_for_media_items(source) - duplicate_run = SourceTasks.index_and_enqueue_download_for_media_items(source) + first_run = SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) + duplicate_run = SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) first_ids = Enum.map(first_run, & &1.id) duplicate_ids = Enum.map(duplicate_run, & &1.id) @@ -181,7 +128,7 @@ defmodule Pinchflat.Tasks.SourceTasksTest do test "it updates the source's last_indexed_at field", %{source: source} do assert source.last_indexed_at == nil - SourceTasks.index_and_enqueue_download_for_media_items(source) + SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) source = Repo.reload!(source) assert DateTime.diff(DateTime.utc_now(), source.last_indexed_at) < 2 @@ -191,7 +138,7 @@ defmodule Pinchflat.Tasks.SourceTasksTest do source = source_fixture() media_item = media_item_fixture(source_id: source.id, media_filepath: nil) - SourceTasks.index_and_enqueue_download_for_media_items(source) + SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) assert_enqueued(worker: MediaDownloadWorker, args: %{"id" => media_item.id}) end @@ -200,7 +147,7 @@ defmodule Pinchflat.Tasks.SourceTasksTest do source = source_fixture(download_media: false) media_item = media_item_fixture(source_id: source.id, media_filepath: nil) - SourceTasks.index_and_enqueue_download_for_media_items(source) + SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) assert [] = Tasks.list_tasks_for(:media_item_id, media_item.id) end @@ -226,7 +173,7 @@ defmodule Pinchflat.Tasks.SourceTasksTest do end) assert Repo.aggregate(MediaItem, :count, :id) == 0 - SourceTasks.index_and_enqueue_download_for_media_items(source) + SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) assert Repo.aggregate(MediaItem, :count, :id) == 3 end @@ -245,7 +192,7 @@ defmodule Pinchflat.Tasks.SourceTasksTest do end) refute_enqueued(worker: MediaDownloadWorker) - SourceTasks.index_and_enqueue_download_for_media_items(source) + SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) assert_enqueued(worker: MediaDownloadWorker) end @@ -264,7 +211,7 @@ defmodule Pinchflat.Tasks.SourceTasksTest do {:ok, ""} end) - SourceTasks.index_and_enqueue_download_for_media_items(source) + SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) refute_enqueued(worker: MediaDownloadWorker) end @@ -297,7 +244,7 @@ defmodule Pinchflat.Tasks.SourceTasksTest do {:ok, ""} end) - SourceTasks.index_and_enqueue_download_for_media_items(source) + SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) refute_enqueued(worker: MediaDownloadWorker) end @@ -315,71 +262,9 @@ defmodule Pinchflat.Tasks.SourceTasksTest do {:ok, source_attributes_return_fixture()} end) - SourceTasks.index_and_enqueue_download_for_media_items(source) + SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source) assert Repo.aggregate(MediaItem, :count, :id) == 3 assert [_, _, _] = all_enqueued(worker: MediaDownloadWorker) end end - - describe "enqueue_pending_media_tasks/1" do - test "it enqueues a job for each pending media item" do - source = source_fixture() - media_item = media_item_fixture(source_id: source.id, media_filepath: nil) - - assert :ok = SourceTasks.enqueue_pending_media_tasks(source) - - assert_enqueued(worker: MediaDownloadWorker, args: %{"id" => media_item.id}) - end - - test "it does not enqueue a job for media items with a filepath" do - source = source_fixture() - _media_item = media_item_fixture(source_id: source.id, media_filepath: "some/filepath.mp4") - - assert :ok = SourceTasks.enqueue_pending_media_tasks(source) - - refute_enqueued(worker: MediaDownloadWorker) - end - - test "it attaches a task to each enqueued job" do - source = source_fixture() - media_item = media_item_fixture(source_id: source.id, media_filepath: nil) - - assert [] = Tasks.list_tasks_for(:media_item_id, media_item.id) - - assert :ok = SourceTasks.enqueue_pending_media_tasks(source) - - assert [_] = Tasks.list_tasks_for(:media_item_id, media_item.id) - end - - test "it does not create a job if the source is set to not download" do - source = source_fixture(download_media: false) - - assert :ok = SourceTasks.enqueue_pending_media_tasks(source) - - refute_enqueued(worker: MediaDownloadWorker) - end - - test "it does not attach tasks if the source is set to not download" do - source = source_fixture(download_media: false) - media_item = media_item_fixture(source_id: source.id, media_filepath: nil) - - assert :ok = SourceTasks.enqueue_pending_media_tasks(source) - assert [] = Tasks.list_tasks_for(:media_item_id, media_item.id) - end - end - - describe "dequeue_pending_media_tasks/1" do - test "it deletes all pending tasks for a source's media items" do - source = source_fixture() - media_item = media_item_fixture(source_id: source.id, media_filepath: nil) - - SourceTasks.enqueue_pending_media_tasks(source) - assert_enqueued(worker: MediaDownloadWorker, args: %{"id" => media_item.id}) - - assert :ok = SourceTasks.dequeue_pending_media_tasks(source) - - refute_enqueued(worker: MediaDownloadWorker) - assert [] = Tasks.list_tasks_for(:media_item_id, media_item.id) - end - end end diff --git a/test/pinchflat/sources_test.exs b/test/pinchflat/sources_test.exs index 6841e27..406265c 100644 --- a/test/pinchflat/sources_test.exs +++ b/test/pinchflat/sources_test.exs @@ -7,12 +7,12 @@ defmodule Pinchflat.SourcesTest do import Pinchflat.SourcesFixtures alias Pinchflat.Sources - alias Pinchflat.Tasks.SourceTasks alias Pinchflat.Sources.Source - alias Pinchflat.Workers.FastIndexingWorker - alias Pinchflat.Workers.MediaDownloadWorker - alias Pinchflat.Workers.MediaIndexingWorker - alias Pinchflat.Workers.MediaCollectionIndexingWorker + alias Pinchflat.Downloading.DownloadingHelpers + alias Pinchflat.FastIndexing.FastIndexingWorker + alias Pinchflat.Downloading.MediaDownloadWorker + alias Pinchflat.FastIndexing.MediaIndexingWorker + alias Pinchflat.SlowIndexing.MediaCollectionIndexingWorker @invalid_source_attrs %{name: nil, collection_id: nil} @@ -331,7 +331,7 @@ defmodule Pinchflat.SourcesTest do source = source_fixture(download_media: true) media_item = media_item_fixture(source_id: source.id, media_filepath: nil) update_attrs = %{download_media: false} - SourceTasks.enqueue_pending_media_tasks(source) + DownloadingHelpers.enqueue_pending_download_tasks(source) assert_enqueued(worker: MediaDownloadWorker, args: %{"id" => media_item.id}) assert {:ok, %Source{}} = Sources.update_source(source, update_attrs) diff --git a/test/pinchflat/startup_tasks_test.exs b/test/pinchflat/startup_tasks_test.exs deleted file mode 100644 index ef06d0a..0000000 --- a/test/pinchflat/startup_tasks_test.exs +++ /dev/null @@ -1,16 +0,0 @@ -defmodule Pinchflat.StartupTasksTest do - use Pinchflat.DataCase - - alias Pinchflat.Settings - - # Since this runs on app boot (even in the test env), - # any actions in the `init/1` function will already have - # run. So we can only test the side effects of those actions, - # rather than the actions themselves. - - describe "apply_default_settings" do - test "sets default settings" do - assert Settings.get!(:onboarding) == true - end - end -end diff --git a/test/pinchflat/tasks/media_items_tasks_test.exs b/test/pinchflat/tasks/media_items_tasks_test.exs deleted file mode 100644 index 80fcbbd..0000000 --- a/test/pinchflat/tasks/media_items_tasks_test.exs +++ /dev/null @@ -1,103 +0,0 @@ -defmodule Pinchflat.Tasks.MediaItemTasksTest do - use Pinchflat.DataCase - - import Mox - import Pinchflat.MediaFixtures - import Pinchflat.SourcesFixtures - import Pinchflat.ProfilesFixtures - - alias Pinchflat.Tasks - alias Pinchflat.Media.MediaItem - alias Pinchflat.Tasks.MediaItemTasks - alias Pinchflat.Workers.MediaDownloadWorker - - setup :verify_on_exit! - - @media_url "https://www.youtube.com/watch?v=1234" - - describe "compute_and_save_media_filesize/1" do - test "updates the media item with the file size" do - media_item = media_item_with_attachments() - - refute media_item.media_size_bytes - - assert {:ok, media_item} = MediaItemTasks.compute_and_save_media_filesize(media_item) - - assert Repo.reload!(media_item).media_size_bytes - end - - test "returns the error if operation fails" do - media_item = media_item_fixture(%{media_filepath: "/nonexistent/file.mkv"}) - - assert {:error, _} = MediaItemTasks.compute_and_save_media_filesize(media_item) - end - end - - describe "index_and_enqueue_download_for_media_item/2" do - setup do - stub(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> - {:ok, media_attributes_return_fixture()} - end) - - {:ok, [source: source_fixture()]} - end - - test "creates a new media item based on the URL", %{source: source} do - assert Repo.aggregate(MediaItem, :count) == 0 - assert {:ok, _} = MediaItemTasks.index_and_enqueue_download_for_media_item(source, @media_url) - assert Repo.aggregate(MediaItem, :count) == 1 - end - - test "won't duplicate media_items based on media_id and source", %{source: source} do - assert {:ok, mi_1} = MediaItemTasks.index_and_enqueue_download_for_media_item(source, @media_url) - assert {:ok, mi_2} = MediaItemTasks.index_and_enqueue_download_for_media_item(source, @media_url) - - assert Repo.aggregate(MediaItem, :count) == 1 - assert mi_1.id == mi_2.id - end - - test "enqueues a download job", %{source: source} do - assert {:ok, media_item} = MediaItemTasks.index_and_enqueue_download_for_media_item(source, @media_url) - - assert_enqueued(worker: MediaDownloadWorker, args: %{"id" => media_item.id}) - end - - test "creates a download task record", %{source: source} do - assert {:ok, media_item} = MediaItemTasks.index_and_enqueue_download_for_media_item(source, @media_url) - - assert [_] = Tasks.list_tasks_for(:media_item_id, media_item.id, "MediaDownloadWorker") - end - - test "does not enqueue a download job if the source does not allow it" do - source = source_fixture(%{download_media: false}) - - assert {:ok, _} = MediaItemTasks.index_and_enqueue_download_for_media_item(source, @media_url) - - refute_enqueued(worker: MediaDownloadWorker) - end - - test "does not enqueue a download job if the media item does not match the format rules" do - profile = media_profile_fixture(%{shorts_behaviour: :exclude}) - source = source_fixture(%{media_profile_id: profile.id}) - - stub(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> - output = - Phoenix.json_library().encode!(%{ - id: "video2", - title: "Video 2", - webpage_url: "https://example.com/shorts/video2", - was_live: true, - description: "desc2", - aspect_ratio: 1.67, - duration: 345.67, - upload_date: "20210101" - }) - - {:ok, output} - end) - - assert {:ok, _media_item} = MediaItemTasks.index_and_enqueue_download_for_media_item(source, @media_url) - refute_enqueued(worker: MediaDownloadWorker) - end - end -end diff --git a/test/pinchflat/utils/filesystem_utils_test.exs b/test/pinchflat/utils/filesystem_utils_test.exs deleted file mode 100644 index 709d2fd..0000000 --- a/test/pinchflat/utils/filesystem_utils_test.exs +++ /dev/null @@ -1,16 +0,0 @@ -defmodule Pinchflat.Utils.FilesystemUtilsTest do - use ExUnit.Case, async: true - - alias Pinchflat.Utils.FilesystemUtils - - describe "generate_metadata_tmpfile/1" do - test "creates a tmpfile and returns its path" do - res = FilesystemUtils.generate_metadata_tmpfile(:json) - - assert String.ends_with?(res, ".json") - assert File.exists?(res) - - File.rm!(res) - end - end -end diff --git a/test/pinchflat/yt_dlp/backend/command_runner_test.exs b/test/pinchflat/yt_dlp/command_runner_test.exs similarity index 95% rename from test/pinchflat/yt_dlp/backend/command_runner_test.exs rename to test/pinchflat/yt_dlp/command_runner_test.exs index e21a169..0ba111e 100644 --- a/test/pinchflat/yt_dlp/backend/command_runner_test.exs +++ b/test/pinchflat/yt_dlp/command_runner_test.exs @@ -1,7 +1,7 @@ -defmodule Pinchflat.YtDlp.Backend.CommandRunnerTest do +defmodule Pinchflat.YtDlp.CommandRunnerTest do use ExUnit.Case, async: true - alias Pinchflat.YtDlp.Backend.CommandRunner, as: Runner + alias Pinchflat.YtDlp.CommandRunner, as: Runner @original_executable Application.compile_env(:pinchflat, :yt_dlp_executable) @media_url "https://www.youtube.com/watch?v=-LHXuyzpex0" diff --git a/test/pinchflat/yt_dlp/backend/media_collection_test.exs b/test/pinchflat/yt_dlp/media_collection_test.exs similarity index 96% rename from test/pinchflat/yt_dlp/backend/media_collection_test.exs rename to test/pinchflat/yt_dlp/media_collection_test.exs index 1e5805d..190bec6 100644 --- a/test/pinchflat/yt_dlp/backend/media_collection_test.exs +++ b/test/pinchflat/yt_dlp/media_collection_test.exs @@ -1,10 +1,10 @@ -defmodule Pinchflat.YtDlp.Backend.MediaCollectionTest do +defmodule Pinchflat.YtDlp.MediaCollectionTest do use Pinchflat.DataCase import Mox import Pinchflat.SourcesFixtures - alias Pinchflat.YtDlp.Backend.Media - alias Pinchflat.YtDlp.Backend.MediaCollection + alias Pinchflat.YtDlp.Media + alias Pinchflat.YtDlp.MediaCollection @channel_url "https://www.youtube.com/c/TheUselessTrials" diff --git a/test/pinchflat/yt_dlp/backend/media_test.exs b/test/pinchflat/yt_dlp/media_test.exs similarity index 98% rename from test/pinchflat/yt_dlp/backend/media_test.exs rename to test/pinchflat/yt_dlp/media_test.exs index 02d4043..6484e8b 100644 --- a/test/pinchflat/yt_dlp/backend/media_test.exs +++ b/test/pinchflat/yt_dlp/media_test.exs @@ -1,9 +1,9 @@ -defmodule Pinchflat.YtDlp.Backend.MediaTest do +defmodule Pinchflat.YtDlp.MediaTest do use Pinchflat.DataCase import Mox import Pinchflat.MediaFixtures - alias Pinchflat.YtDlp.Backend.Media + alias Pinchflat.YtDlp.Media @media_url "https://www.youtube.com/watch?v=TiZPUDkDYbk" diff --git a/test/test_helper.exs b/test/test_helper.exs index 203b352..887534c 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1,4 +1,4 @@ -Mox.defmock(YtDlpRunnerMock, for: Pinchflat.YtDlp.Backend.BackendCommandRunner) +Mox.defmock(YtDlpRunnerMock, for: Pinchflat.YtDlp.BackendCommandRunner) Application.put_env(:pinchflat, :yt_dlp_runner, YtDlpRunnerMock) Mox.defmock(HTTPClientMock, for: Pinchflat.HTTP.HTTPBehaviour)