Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f6d8e15670 | ||
|
|
2906ff1b30 | ||
|
|
0582a7bfd5 | ||
|
|
3db2e8190f | ||
|
|
087c9c2d0f | ||
|
|
c046abf36f | ||
|
|
70dd95211f | ||
|
|
8491f8b317 | ||
|
|
d0cb782082 | ||
|
|
7a7e8080cd | ||
|
|
fbe21cb304 | ||
|
|
0f3329e97d | ||
|
|
25eb772896 | ||
|
|
cf59bf99cd | ||
|
|
47e96e3780 | ||
|
|
a7af6a9125 | ||
|
|
8f9d18dc71 |
No files matched your search
@@ -128,7 +128,7 @@
|
|||||||
{Credo.Check.Refactor.MatchInCondition, []},
|
{Credo.Check.Refactor.MatchInCondition, []},
|
||||||
{Credo.Check.Refactor.NegatedConditionsInUnless, []},
|
{Credo.Check.Refactor.NegatedConditionsInUnless, []},
|
||||||
{Credo.Check.Refactor.NegatedConditionsWithElse, []},
|
{Credo.Check.Refactor.NegatedConditionsWithElse, []},
|
||||||
{Credo.Check.Refactor.Nesting, []},
|
{Credo.Check.Refactor.Nesting, [max_nesting: 4]},
|
||||||
{Credo.Check.Refactor.RedundantWithClauseResult, []},
|
{Credo.Check.Refactor.RedundantWithClauseResult, []},
|
||||||
{Credo.Check.Refactor.RejectReject, []},
|
{Credo.Check.Refactor.RejectReject, []},
|
||||||
{Credo.Check.Refactor.UnlessWithElse, []},
|
{Credo.Check.Refactor.UnlessWithElse, []},
|
||||||
|
|||||||
@@ -1,7 +1,27 @@
|
|||||||
# Pinchflat (Alpha)
|
<p align="center">
|
||||||
|
<img
|
||||||
|
src="priv/static/images/originals/logo-white-wordmark-with-background.png"
|
||||||
|
alt="Pinchflat Logo by @hernandito"
|
||||||
|
width="700"
|
||||||
|
/>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<sup>
|
||||||
|
<em>logo by <a href="https://github.com/hernandito" target="_blank">@hernandito</a></em>
|
||||||
|
</sup>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
# Your next YouTube media manager
|
||||||
|
|
||||||
|
## Disclaimer
|
||||||
|
|
||||||
This is alpha software and anything can break at any time. I make not guarantees about the stability of this software, forward-compatibility of updates, or integrity (both related to and independent of Pinchflat). Essentially, use at your own risk and expect there will be rough edges.
|
This is alpha software and anything can break at any time. I make not guarantees about the stability of this software, forward-compatibility of updates, or integrity (both related to and independent of Pinchflat). Essentially, use at your own risk and expect there will be rough edges.
|
||||||
|
|
||||||
|
## EFF Donation Receipts
|
||||||
|
|
||||||
|
A portion of all donations to Pinchflat will be donated to the Electronic Frontier Foundation. [See here](https://github.com/kieraneglin/pinchflat/wiki/EFF-Donation-Receipts) for a list of donation receipts.
|
||||||
|
|
||||||
## What is Pinchflat?
|
## What is Pinchflat?
|
||||||
|
|
||||||
TODO: expand on this.
|
TODO: expand on this.
|
||||||
|
|||||||
@@ -48,7 +48,8 @@ config :pinchflat, Oban,
|
|||||||
media_indexing: 2,
|
media_indexing: 2,
|
||||||
media_collection_indexing: 2,
|
media_collection_indexing: 2,
|
||||||
media_fetching: 2,
|
media_fetching: 2,
|
||||||
media_local_metadata: 8
|
local_metadata: 8,
|
||||||
|
remote_metadata: 4
|
||||||
]
|
]
|
||||||
|
|
||||||
# Configures the mailer
|
# Configures the mailer
|
||||||
|
|||||||
@@ -25,6 +25,21 @@ config :pinchflat,
|
|||||||
basic_auth_username: System.get_env("BASIC_AUTH_USERNAME"),
|
basic_auth_username: System.get_env("BASIC_AUTH_USERNAME"),
|
||||||
basic_auth_password: System.get_env("BASIC_AUTH_PASSWORD")
|
basic_auth_password: System.get_env("BASIC_AUTH_PASSWORD")
|
||||||
|
|
||||||
|
arch_string = to_string(:erlang.system_info(:system_architecture))
|
||||||
|
|
||||||
|
system_arch =
|
||||||
|
cond do
|
||||||
|
String.contains?(arch_string, "arm") -> "arm"
|
||||||
|
String.contains?(arch_string, "aarch") -> "arm"
|
||||||
|
String.contains?(arch_string, "x86") -> "x86"
|
||||||
|
true -> "unknown"
|
||||||
|
end
|
||||||
|
|
||||||
|
config :pinchflat, Pinchflat.Repo,
|
||||||
|
load_extensions: [
|
||||||
|
Path.join([:code.priv_dir(:pinchflat), "repo", "extensions", "sqlean-linux-#{system_arch}", "sqlean"])
|
||||||
|
]
|
||||||
|
|
||||||
if config_env() == :prod do
|
if config_env() == :prod do
|
||||||
config_path =
|
config_path =
|
||||||
System.get_env("CONFIG_PATH") ||
|
System.get_env("CONFIG_PATH") ||
|
||||||
|
|||||||
@@ -1,401 +0,0 @@
|
|||||||
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'00000f0b0230300c0901018150010d0101814b0707010a0101826b060f090101811e010b01016005060201300c090101815101090101814c01080101826c10070101610201330d0b0101815a0a0201381e070101720201390d09010181710101310a0901018221020d01018154813e010d0101814a1106010e01018208630d06200308010701012e0703080201310c090101815d0109010181790108010182750201320e0a010181397c0201331e070101640201350a09010181400204363936350c09010182250201381e0701016c02047a6673653207010142060679706d6b616b3307010141010701013e010901018168010901018124010901018123010701014e010701014d0106010155010601014f0101320a0901018119030d010181610806110901016b0511090901010306070101080203080201300e0a01018270110302323130070101030201351e070101750201380c090101815a0201390d09010181510101330d0b0101817006010a0101827e081009010171051209080101060803090201300d090101815e020236300c0b010181174c02036267710c090101817d0206636a646c74660c0901018237020666626f6e38380e080101821b03056666696f670c090101826503056b62656d6b0c090101824e02056c6b6c61660c0901018244010901018110030573786c70610e0801018223030574636173390e080101824102066d736179636e0d090101811f02056f686877670c090101825d0404717863390d090101811703056a68736b770d090101810403056e65326f6b0c090101823e01090101810a0206706e6b6174670e0801018214020671386c6773610c090101822f0206726a6b6675720e080101822a0206746e66706e630e080101823103056f676975370e080101820d0205766c3166630c09010182550101340d0b0101817806100f0801011881073414030c0803080201301e070101680201310d09010181680201330d09010181560201360c090101815e0201370c090101815501090101817d0201380e0801018279020639643174376f0e0801018237020a6a30786675797a316e7735090101820e03070101740107010173010601017b01060101750101351e030214030a0802080201320d09010181750201341e0701016f0201360d090101816c0201370e0801018305020a6a717475677a777772670e0801018143020f6b696d65717969666764706279637a0e08010181260101360c0901018159270308080207010137340308010138350308020a7a79677171756c38766d35090101820001090101813c01090101813b01070101660107010165010601016d01060101670101610a170101090c4c155112152917020b0101827a150115010106190b2815571508011401010b2810316b156b150f0b0101158100010b010109430e010f0101150515160e0f0701010f010701011002070101120107010104030b0101150f4f010701014301070101420306010106021061726f6e7269646573686179657331350a090101813d0202626c1d0701015d190701014d010701014c03036f75741d0701014c0207010108020563636573730a0901018153030701015001080101815b04076f6d706c6973683507010125030468696576350701012d0304726f73731d0701012003047475616c2f070101050204646170740d07010129030476616e630d0b01011f815d1109030101460204667465721e0701012502026c6c0e080101743d0f07010143180701014d010701011f010701011e030370696e0e08010182050302736f0e08010181291007010154010701014903037761690a0701017d02016d35070101680302617a35090101810003027a6e0e080101823502016e0a090501012e02090101821a290701012a0301640a130101052404270b810302170101042917121a11301315010b0101240d2801140101280f2d0c0f6b81230f0701016801090a0101390109010104360f0901013f09030701010b02070101040211010129192120281c01090101230e010b0101061e0e0109050101070107010104010601010c0106010107030367656c370701010e0301690a0b010118816602090101827101090101812b010801018246020470706c690a0901012b3e03090101817e110701012f0405726f6163680d070101200201720a07010134020d01011e812f1d01070101090106010173100701013d010f070101070c2d3c170901014c09010901014b09030464656e740e080101821d03016d1f090101201303046f756e640a090101810e130701013f0304746973741d090101811f0201730a07010143020901018163010901013f04010a01010a6505210701010d06070101140201740a090101810f13090101571719070101290107010128030574656d70740c07010149040572696275741d0901018116020a7564696f6e61757469781d0b0101810f1402047661696c2e0701011a010901011d0d0107010117010701011d010701010d010701010c010701010902070101130107010112010701011201070101110106010119010601011302037761690c0901018119010162310309020361636b0d0f070101023081240108010181070f090101812b020d040101026b0a050573746f726936070101060508776865656c686f700d090101820503046c616e630c0901017f2e01090101815f10090101360d0301720c090101823303037369630c090101815802060101191009010114180201650a090101086e020b010181720b0107010135011401012e1d3c0b090a0a21260701014c0113010181780909090909010b0101813409010d010181330909010d01015e090909010f01015d0909090901100101650909090909011201015f0909090909090304636175730c0901011b0904026f6d0a090101814e030701014b0108010181561007010149010701013e03016535030504016e36070101270107010126030367696e2e0701010406016e0e0801018312030468696e640a0901018155030701015201080101815d03026e741f07010130030273740c090101814702060101640f0701015a0304747465720d0701012d020269670b02062a0701011603026b650a0d010181143162020b0101822776010f010108353d632d011401010d281d7c3c0981040f090101814605036c69660c09010183200501720a090101822902090101832301090101820a0108010183110504736b696c0a090101822602090101831e01090101820701080101830e0301740c170101822d0a09080c090a0a0111010181020808090a01140101820b09090a09091202096c61636b6c6162656c0e080101821604026b651d0901018127030369747a320701010206016f300701010803036f6f64350901018121030275651d090101810d02026d781d0901018Line truncated
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(137438953474,X'00000f1f0a0730646176786a710a090101811e0204656369640c0701012403036469631e07010134030566747261700d090101811201080101822c03036974690a090101811f020b0101823011010b01017f0e08010e0101821511091103037074681d07010152030673637269707435090101810e03047461696c0c090101815b030576656c6f701e0701014502026964360701010a04016e0c070101300304666665720d090101814f120b0a01013d3e0304726563741d070101440404747061770c0901018251030573636f72640a0b0101817304020b0101820905010901017004010a0101817b040603756e740a0901018141040474616e631d090601013002016f0c0b010107242e020601013a100701010201070101690f070101150107010118010701011201070101180107010108010701010701070101040307010109010701010a0107010107010601010f010601010a03066d696e696f6e0a090101813602090101822a010701017901080101820f03016e0e0a03010103570f07010149040261741d070101780107010157010701014c0401650c0701015d020601012f0302776e0a0701013c0209010181430107010143020472696c6c0e0601017804077665747261696e0a090101812f02037572651e0701010c0101650e080101820723030602036173690d0d030101815b0a0106010138050265720d0701010a060273740d0701011805026c690a07010177020569746865720c090101813c02056b6a3964710a090101812d02016c2f0701013501070101300107010137010701012601070101250107010122010901018149010901018105010901018104010701012f010701012e0106010136010601013002026e64350701013604066c6573736c69360701015e010701015d04016f0c090101816f03046572676939030503036a6f691d0701014d180b01018118210107010168010701016703046f7567680c0b0101811e0b020601015c200701014b03037465720d0701013e040269720a0701011f02057069736f642e0307010b080101022d010f070101051d0a0c01110b010105240a0c0b0111090101160a0c0b0b0113070101150a0c0b0b0b0115070101120a0c0b0b0b0b01210701010c81370d0c0c0c0c0909090909011b0701012e46040b0d0c0c0c0c09011d0701012d46040b0d0c0c0c0c0909011d0801011c040b0d0c0c0c0c090909011f0701011b040b0d0c0c0c0c09090909012007010123040b0d0c0c0c0c090909090901220601011d040b0d0c0c0c0c09090909090902037665721d0901010d4a180901011f6b0501690a09010181480209010181340107010137010a01014f1b6705037974680c0701010f2707010113020178300701010a080304030565726369731e0d0501011f2441030369737439070101030304706563743607010139010701013804046c61696e1f090101394404047265737335070101640101663507010144020361696c0c0701014e03046d696c692e030503017235090101810402056573746976320307020a69627575756e776d39670e080101810d03076572676f6c6c611d09010181030107010179010701015b0305667465656e0c090101814403036775720a0701011103036e616c0c0b0401013c49280309010901010206010701013f010701013e0401640c0701017d02060101130303727374350701011e050601010a030276651e0701011e1507010143010701014001090101816b01090101812701090101812601070101510107010150010601015801080101523603027a7a3b06010102020a6b6961656774626e706d0e080101811402036c61740a090101224102096e6d70747476326b7a0c090101820e02046f6375730c0701017b03046c6c6f770c0901018311290701011103026f740a0b010181050903070101420301720a090101813e020901016e4612030610090101201f0107010123010701011d010701012301070101130107010112010701010f01110101260a30500606010d01010d15192a010d01010c15192a010701010d010701010a01080101080c010601010d0404776172640a0b01018106070305756e6461740c0901018153040172320701013b010701013a0107010137010b010181613901090101811d01090101811c01070101470107010146010801014e390108010148390301780c0b010182500a0203726f6d1e0701012b04026e740c15060101021c4835103523020601017e0603686f700c090101831a0203756c6c0c0701017929070101230501690c07010176030572746865721d070101090207010154010467616d650d070101390301701e070101660302737536090101814801090101814e050467756d6138090101810301090101810901080101811801080101811902036561720c09010182460301740a0b0101814212020f01013d10115172010701014f010a01018147150f07010102110701010a080701014f010701014e03060101030201670a090101817602090101820d010701017301080101817e020969726c667269656e64300701010b04016f0c0901018248030276650c090101811d120701010602036c6164350701017603036f76650c090101824f02046d61696c1d0901018107010701017d010701016602016f0c0901010b4a01070101150301653b0601010303026f640e0801018306030370726f0e08010182320301740c090101810b0204726561740a090101820a02090101827b010901018135010a01018254360402656e380701010e0305696d6f697237070101050401700c090101824001090101810c01080101822603046f756e640a09010123410202756931070101250507010104010168310305020a327a6d766164657a6638330701014a010701014701090101817201090101812e01090101812d01070101580107010157010601015f0106010159020261640c0901014d1429090101811e03026c660c0701014703036e64690d0701014805056c656261720d0901018100010c01018217240603047070656e2e09010116310107010119010701011301070101190107010109010701010801070101050107010138010701010b010701010a010701010b01070101080106010110010601010b050169300701010206070101550107010154030272640c070101202a070101280107010127040272691d0901018133040476657374320305030276653007010104050b0101810607010701012601070101250301790a0901018135020901018229010701017801080101820e0408657362696379636c0a0901018139030701017c0204656172740c0701014803056c6c7576612e0902010117010b0201011a0d01090201011401090201011a01090201010a010902010109010902010106010b0201018133010b020101100a0Line truncated
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(137438953475,X'00000f1007306a656e736f6e0a0f0101811b090a09030472656d691d090101812602026f620c0701015c0302696e0a0b0101816310020901018205010901016010010a0101816b100f07010160020575726173730d0901018172030273740c0901016a4811070101331907010154010701015302057a307278710a090101812501036b65690e06010111020269643a0601011403026e673507010145020a6a79377432347268673035090101821c05080101810901080101810302036e65650c090101825603026f770c070101110204706e7772310701014101070101300606673236386671300701013a030701012f010701012c01090101815401090101811001090101810f010701013a01070101390106010141010601013b020f7774663772633534703075686577360e080101810601056c61626f7235090101811a010701016a010701016903026e642f090601011503027267390701010c030273741e0701010f02036561643a060101050402726e0a090901010d020b0501014154010b0601010c11010a01012c810e0f0f0101052681200701070101180606746f6d616e751d0901018152040273741d070101580306626f7769747a1d090101812e030264670a0b0101042f4201020702056963656e731d0d0101811108060302666531070101100401740e0a010181000b03026b65360701010503026e6b0a090101817f02090101827401090101812e0108010182490f0701017d010701015c0107010151030374746c0d090101814e110701010a030276650e0601015a05037769720c090101826102016c0a0b01013a1a23030901011422120701013602016f370701010d0302636b0c090101812d0504646f776e1e0701010d03026e671d090501012f03016f2f0d0403010113030301740e08010182720f0701012301070101380302766535090101811c010701016c010701016b0301771f0901011d550201790c170101822e0a09080c090a0a0111010181030808090a01140101820c09090a09091203097531797364756c77613b080101810a01016d0c0701010a2207010108010701010b0609010142340205616368696e0c09010182200302696e0a0701014a03026b650c07010119110901011d440107010155010701014a03016e31070101150401690c0701016602060101220f07010146040375616c0c090101821f010b01012e8154101d04010108191127650506060606060111040101080a392418010f02010105165804030372696e0a09010181160408010182040304737465721e07010128030274741d0901018132050265720c090101813b0301781d09010181020107010178010701015a040278690c090101823801090101810501080101821c0201650a0901018205021101014f228124810302080101824f0f0701017f010701015e01070101570303616e74350701010f0602696d3607010164010701016303046d6265720a0901018150030701014d01080101815803037263680a090101816c020b010182006a01090101693b0108010181742007010119010901011c0d0107010116010701011c010701010c010701010b0107010108020701011201070101110107010111010701011001060101180106010112030474686f641d070101160207696c6573746f6e350701011a04016b3b060101060301700c090101824a03057373696f6e3a0601010702036f64650d090101817303046e6461690a090101814904080101814e03026f6e320306030272650a0901018159030901011e3a01080101816127090101813e010b0101352716010b010134271601070101180107010117010601011f0106010119030273740e060101550f090101252c030474696f6e0a0901015f090306756e7461696e0d07010107010e01010c281d8136090362696b0a090101822402090101831d01090101820301080101830c030276651d0701013c030378786938070101020206010102020274620a0b0b0101822202090101821b010901018201010c0601010683060f090101813e0103090403696b650d090101820401080101831304046c6966650c090101831f01090101820601080101830d03056e62696b650a090101822502037563682e0701013c07070101520304726465722e0304030373696334070101100201790a0901018113020f0101368112625f01090101754a010a010182005e0f07010161030473656c660c0701012d01046e616b652e0701012102036565640c0701013202080501010505016c390701010d030a696768626f72686f6f640e060101440301770c0b010137815202080101813a280701012d010701012c0405736c6574740e0801018154030278742e070101500203696e650a090101812704026a610c090101821c02056b7764626d0e080101811c02016f1f0701015316090101810c0304726d616c1e070101310301740c0701011a030177350701014e010701015b010701015a01056f626c69671f070101550305737461636c0a0b0101061518020663746176696137070101020201660a090101817d020f0101468101812f010901013a7401100101231d091381730f0701011701090101152c010701011412090101060d0411010118064f0a2c21010901013c31010901013b31030366657235090101811102046c61686e310701012e010701011d0606726c636773342e0701012f0207010127030701011c0107010119020701017b010701017a01070101250107010124010601012c010601012603016431090101141202016e0a0d01012141811d020f01017c81186025010d010105812747010a0101518176100701011b010701010a0f0b0101033121010901010f2d01090101291601090101301f010901011f28010901011e31010901011b3701110101048134080843010b01012b5543010d01012a554309010b0101284310010b0101274317010a01012f431e010a010129432502026f683803060301703b0204020670706f7369740a090101810415070101130201720a090101301202090101821e1109010156211207010137010701013b010701014b0107010143010701014b010701014e02090101813d0109010181430107010175010701017b01080101810a01080101810b03036465720e08010181330f090101810b0301671d090101811a03046967696e2e07010127070701010e0204746865720c09010181081107010147180b0101810d0401070101710107010170010701011b010701011a0106010122010601011c02027572350701011d0107010170010701016f010701011a01070101190106010121010601011b0301740a0b01011281760408010182500f0901018129110901010e19080701015101070101500402726f1e0701017602037665720a0303020701013e020c01011f1e82492Line truncated
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(137438953476,X'00000f2f053073616d650a07010164130701016e020463656e650a0901018157030701015401080101815f03036f6f700a0701015003090101816a02056561736f6e2e070101020307010108040f0101032081160801090101192f01090101182f070374776f36090101814b01090101815101090101810601090101810c01080101811b01080101811c0301652e0701014c0407010103030901017a0a02030404036b65723303050305676d656e740c070101640304727665720c090101820a03057373696f6e0c0701017a020601014103037475700a0901018115020901018228010901017763010801018203030376656e35090101817c0109010181380109010181370107010162010701016101060101690106010163020468617265350701015605066b726f626f742e0701011c010901011f0d0107010119010701011f010701010f010701010e010701010b0207010115010701011401070101140107010113010601011b01060101150308656e616e6967616e3a06010115030469747469310701011303026f650c090101825e0109010181180401770e0601017a0f07010113010701011c10070101440201690e12010181050b090b0921030264650c090101823202080101823c03036d706c1d0701011903026e63350901018109050265723509010181130402676c0d0701013803037269751d09010181230301783407010149010901018175010901018131010901018130010701015b010701015a0106010162010601015c02026a760a0f0101811c090a0902046b6174651e0701013a06047061726b1e070101700303696c6c0a0d0c01010b4c26030701012b010c01011e0b513d02036c6f770e0601012502016f0c090101655a020a0101218115200701013b070901014334010701010203026d651d0701016a010701013e050374696d0a0701014603026e671d090101810903026f6e2e070101530807010136010701013503037572630c090101824902077065637472756d1f07010116040265640e0601012604026e640c09010181260501740c070101780304696e646c350701016b03026f740e0801018303220701010f030472696e6730030403087578786e756c3075350901018207020901018142010701016d010701016c0106010174010601016e020372616d0a090101812e02037461691f09010109140501720e080101827d04026e640a0701014c0401723703050501740a0701017e02090101810401090101816d030365616c300701010c07070101030401701d0d0901011a81380303696c6c350701013c03036f6c612f070101080401701e0701016d03067261696768741f0701011f04036565741e09070101650404696b6572390701010204036f6e670a090101810a03047564696f3507010130040266661e0701012c020275620a090101821f02090101830e010901018148010801018267040573637269620a090101821002090101830101090101813b01080101825a110701015c080270740e080101815505047461636b0a090101814c03037065720a0b0101816a2b020b0101817e6a01090101673b01080101817206037269640a0d0101813b1226020b010182036a010b01016c1429010a01018151280904657274760a0901018169020d01018218810301070101660108010181710404706f72740a090101820d02090101827e0109010181380108010182570f070101651109010130120107010138010701013c010701014c0107010144010701014c010701014f02090101615f0109010160660107010176010701017c01080101810b01080101810c04067261637573680e0801018225030272652e070101140107010117010701011101070101170107010107010701010601070101030207010109010701010801070101090107010106010601010e01060101090404707269730a0701017504057669766f722e0701011202047765617435090101812202097a6e6d7274756f76610c09010181730101740c110101280b3d082c1f020a04010104570f090101321a1809010133320203616b651f0701012a0f0701010d03026c6b1d0701014b16070101030210646b3868637435787338766c627472340a0b010181613e02090101830c010901015e6a010a010181697e0204656163680c0701010d04016d350701016c040172350901018124030563686e6963350701012c070271750a090101202402090101815c010901018177010a01012981141107010125020368616e0d0701010d100701010a05016b2e0901013912070f01015a3c160606010901011d41010901011c410401740a090101632602110101250b550b220f010701013c010601012a1007010120170b0101310b650301650a1301011e2155481e1e06021f0101182c1b250b08090f33170f147b011102010117152b1e4c011c01010f0b0e1a1813140936301e600f110101242c0d0f093f010d01010e071819010f0801010b0616560f0b010106222b030b010103060a010304031101011918300f0f43010f040101211e2505010f0101041e1e250503060101090404617465723a060101130401690c090101814a0206010136110701013b050172350701017b04016d0a0701015a020b010108240b010701011c110701011904016e0a0901012a300307010125280901018110040272650d07010149040273650a090101817e02090101827301090101812d010801018248280701012c010701012b040a7573656c6573737472690c0701016113070101620301690a0f0a010137438111020d01011224810d010901011135010c0101614c81280f090101106e010901011a4301090101331f0f07010143070f01010b1e323d090107010169010701016804026e670c09010181091107010127110701011301070101160107010110010701011601070101060107010105010701010201070101350107010108010701010701070101080107010105010601010d010601010805016b0d0701010f03036f73653607010138010701013703037265650c090101814e250701014301070101320107010131010701012e010b010181573c010901018113010901018112010701013d010901013c3c01080101443c010801013e3c0403696c6c350701014604046f7567680d07010116100701017b010701015a010701014f0307756d626e61696c36090101814601090101814c010701017e0109010181040108010181130108010181140203696d650a0901018112020b010167430f02060101200f0701016f1d0601010b0301700c09010181480402746f1d0901018128030272650c090101823a01090101810601080101821f02016f0a1b0801010c0b1a421157052e0e0701020301210101060831110c072e0f105081090a07011d0501010b110909062405600a07450Line truncated
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(137438953477,X'000a04c71a0b0c0b0b0b34110101170b0c0b0b0b01130101812f1a0d0c0c0c011301016f0c0c0d0c0c0c011301016e0c0c0d0c0c0c01130101190c0c0d0c0c0c01130101180c0c0d0c0c0c01120101200c0c0d0c0c0c011201011a0c0c0d0c0c0c033077650a0b01010f2c1a0307010113010801012b50110701016a0f07010147070b0101470e3401110101251d0d09061101110101241d0d0906110304696768741d0701013e03046c636f6d310701010204016c0d0701014003026e740c090101813103027265350701016e0305737465726e3903040304787862630c090101817c02036861740e080101826d270701013d050265760c07010156030365656c0a0901018128030f08010103308124010801017f0b110901010d1c06036261730e08010181180601690a0b01014d815d04016e0a09010132392407010105010701010701070101070107010109040272651d0701013403036963680e080101812d0f0901011b2c03016f350701016d04026c651d070101210301791f0d0601013a300f0203696c6c1d0701011c01070101211807010148010701014703016e0d07010136030274680a090101810202090101821001090101816e120b01011e1325160701015805036f75740a07010117040601013002036f726b350701017c010701012a010701012905036f75741e0901010b7804026c6435070101780303756c640d070101450106010148020277770a0f0101815c0c0a2c02110101820215571f11010f0101590c0a3b1f011001018150160c0a6c0f07010171010701014e01090101431d0f0901012a0d01090101300f010d0101220b0c0d010f0101290b0c0b0d01110101180b0c0b0b0d01130101170b0c0b0b0b0d01130101140b0c0b0b0b130111010181440d0c0c0c01130101760c0d0c0c0c1b01130101750c0d0c0c0c2201130101200c0d0c0c0c29011301011f0c0d0c0c0c3001120101270c0d0c0c0c3701120101210c0d0c0c0c3e010679327135726e0a09010181340203346e610e080101811702036561720c0d01011621050f02026f750a1101011a1b390a8109020b01010e8262010d01010e270c6d01120201010281271081100f0f01010b0b0c0f4d010f0101031c0b0927010b01011a11200f0d01013a090b05071301014c0f043c16060601110101031d1827060c010f01011d1827060c0401720a0f0101255c06083f040c01011d287d0f0f090101350a01090101071e040274750c0b010181710b0212010181020b090a0a21260701014b0113010181770909090909010b0101813309010d010181320909010d01015d090909010f01015c0909090901100101640909090909011201015e0909090909090601620a0d0101815d3a06020b0101830406010b01015a6606010c010181657a06110701015f0f0701012b0107010131010b0101230b0c010d01012a0b0c0b010f0101190b0c0b0b01110101180b0c0b0b0b01110101150b0c0b0b0b0111010181450d0c0c0c01110101770c0d0c0c0c01110101760c0d0c0c0c01110101210c0d0c0c0c01110101200c0d0c0c0c01100101280c0d0c0c0c01100101220c0d0c0c0c020a7865726c697362787871340701014d010901018179010901018135010901018134010701015f010701015e0106010166010601016001047a6f6e650a090101811802027a370e0801018145613b0b0b080a090a0c1009200b0a1d091108090b1908220f140b090f81430e0b0d67205b8122370c');
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(274877906945,X'00000eab0230300c01010101010f0101012d01010106090101811e010b01016005060201300c010101010110012e0107070101610201330d010201381e012e0107070101720201390d010101310a010201010101012001010107010201310c01010101010201320e010201331e012e0107070101640201350a010204363936350c010201381e012e01070701016c02047a6673653201060679706d6b616b3301010101010101010101010101010101010f010101320a01030111011101060102011501070901016b050201300e010302323130010201351e012e0107070101750201380c010201390d010101330d01010110011201080114010709010171050201300d01020236300c0102036267710c010206636a646c74660c01020666626f6e38380e0103056666696f670c0103056b62656d6b0c0102056c6b6c61660c010101030573786c70610e01030574636173390e0102066d736179636e0d0102056f686877670c010404717863390d0103056a68736b770d0103056e65326f6b0c0101010206706e6b6174670e01020671386c6773610c010206726a6b6675720e010206746e66706e630e0103056f676975370e010205766c3166630c010101340d011001140108011201070f080101188107340201301e012e0107070101680201310d010201330d010201360c010201370c0101010201380e01020639643174376f0e01020a6a30786675797a316e77350103010101010101010f010101351e011401080112010703020201320d010201341e012e01070701016f0201360d010201370e01020a6a717475677a777772670e01020f6b696d65717969666764706279637a0e010101360c0127010801010137340116010101383501020a7a79677171756c38766d35010101010101010101010101010f010101610a010201010101010f01010101010f0101010201010103010101010103011001010101010101050b0101158100010b010109430e010f0101150515160e021061726f6e7269646573686179657331350a010202626c1d01190101011401070701015d03036f75741d0102012c010201050701014c0207010108020563636573730a010301010104076f6d706c697368350103046869657635010304726f73731d012e01070701012003047475616c2f010204646170740d01030476616e630d0111012e010709030101460204667465721e012e01070701012502026c6c0e010f0118010101010114010707010143030370696e0e010302736f0e01100101012d0101010607010154010701014903037761690a0102016d35010302617a350103027a6e0e0102016e0a01020129010301640a010201010101010f01010101010f010301020102010101010101010101010101010f01010101010101050701016801090a010139010901010436030367656c37010301690a01020101010101020470706c690a01030111012e01070701012f0405726f6163680d010201720a01020101010101100101011701010115010101060701013d010f070101070c2d3c030464656e740e0103016d1f012e0107090101201303046f756e640a0113012e01070701013f0304746973741d012e0107090101811f0201730a01020101010101210106010201740a011301190101011401070901015717030574656d70740c01040572696275741d012e01070901018116020a7564696f6e61757469781d012e01070b0101810f1402047661696c2e010101010101010101010101010201010101010101010101010f0102037761690c010101623101020361636b0d0101010f0102012c01020105090101812b020d040101026b0a050573746f726936010508776865656c686f700d0103046c616e630c01010110012e0107090101360d0301720c0103037369630c01020110012e010709010114180201650a01020101010101260101010101010101010101010101010f010304636175730c0104026f6d0a0103010101100101012d0101010607010149010701013e030165350104016e36010101030367696e2e0106016e0e01030468696e640a010301010103026e741f012e010707010130030273740c0102010f012e01070701015a0304747465720d01020269670b012a0103026b650a010201010101010f012e0107090101814605036c69660c010501720a010201010101010504736b696c0a010201010101010301740c010101010102096c61636b6c6162656c0e0104026b651d012e01070901018127030369747a320106016f300103036f6f643501030275651d012e0107090101810d02026d781d0101012d01010106090101814201030b02086f647967756172642f0103026e751e012e010707010173030273732e0101010101010101010101010101010101010101010101010101010f01030274680a0115012e010707010106020f7172336961777264726678666e617a0e01020472616b650a01020101010101030365616b0a010303696e6735010101010103036f6b650c0106016e0c01240104046f6b65721d012e0107090101810c020275690a010201010101012d0104026c640a010401030273691d01010101012c0101010101050901018104010701017a01070101630301740a01020102010f010201160101010101140102010507010139020b01010e154f0201791d011901010101010101010101010f01010107110101810e100b09070101631f0112011c0107070101610203616c6c0a0103046d7065723a0103016e0a0104010f01010101011601010101011401010101010507010177010901012e27010701014804036e6f742e01080101010205656c6562723501020668616e6e656c0a010201010101010f011801160107070101670404707465720e010404726163743301030365636b2e01040372756231010307696c64686f6f64380102046972636c3501050175360102046c6173683101030369636b0a0102010101010103036f73650e010402776e2f010c010f0102026f6d0a010201010101010f01010101010f0101010101010101010101010101010101010101010101010101010f01010101010101050b010173171c010901015030010b0101451d090401650a0103012101070104026963390104036d69740c0105026f6e1d012e010709010181150502756e1d012e0107070101630404706c65741f0116011801070701011205026f6e0a010506726568656e731d012e01070701015003056e636570740c01010104036669640a010602726d0a01020101010101050275732e010404736973740e01040474696e750d010101100118010101150107070101220503726f6c0a01030111012e010707010148040476696e630c010304756c646e0c01040272730e0103037665721e012e01070701011202067265617469761d012e0107090Line truncated
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(274877906946,X'00000ec40b306769726c667269656e64300104016f0c01030276650c0112012e01070701010602036c6164350103036f76650c0102046d61696c1d01010101012c0101010101050901018107010701017d010701016602016f0c0101010301653b0103026f640e01030370726f0e010301740c010204726561740a010201010101010402656e38010305696d6f697237010401700c010101010103046f756e640a0102027569310105010101683101020a327a6d766164657a66383301010101010101010101010101010101010f010201614a010301640c01290103026c660c0103036e64690d0105056c656261720d01010103047070656e2e0101010101010101010101010101010101010101010101010101010f01050169300106010101030272640c012a010101040272691d012e0107090101813304047665737432010302766530010501010101010301790a010201010101010408657362696379636c0a0103010204656172740c0103056c6c7576612e0101010101010101010101010101010101010101010101010101010f010804626f73732e0101010101010101010101010101010101010101010101010101010f010c0b66696e616c65706172743134010c07736561736f6e3135011201323601010101010101010101010f0104036d65740c010401700a01020102012001030272650c01020110010101100106010101010115010101060901013c12010701014104036f69632e0102016930010801030267680c01020111012e01070901012d42030272652e01010102036f6d6538010404696369642e010301700c0101010101100101012d010101060701016a010f0501010327460a040165360101010303726e69300104017332010301770a010101010102010f010101170116010101061702010106367c050606060901070101160406746f6d616e751d012e01070901018151020a716d7769716a727874710e0102037474700a010201010101010f01010101010f0101010101010101010101010101010101010101010101010101010f01010101010101050b0101702a0a010701014d01090101421d0101690c011101010101010f010101060116010101010105090101124b0107010142010701013502046465616c0e010201660a010201010101010f012e01070701012a0201693601010102036b6f6e0c0102056d6167696e1d012e01070701010e030170310104036f72741d012e0107070101260403726f760e0102016e0a010201010101010f01010101010f0108010101130101010101010105110701010f35113b46010901013008010b0101170d120303626f780a01040103046372656435010302646935010504766964750a01040575737472690a01030571756972691d01010101012c0101010101050901018105010701017b010701016403077374616772616d0a010201010101010f01010101012c01010101010509010181010107010177010701015906046e746c690c010302746f0a0102012901010101010402726f1e012e01070701016202016f0a010201730a0104010f011201060101010101140107090101385a03016e1d012e0107070101310302737536010201740a01020101010101270101010101010b6a3162666f37766c69773435010401010101010f010203617a7a1d012e010709010181240205656e736f6e0a01030472656d691d012e0107090101812602026f620c010302696e0a010201010101010f012e010707010160020575726173730d01030273740c011101190101011401070701013302057a307278710a0101036b65690e01020269643a0103026e673501020a6a7937743234726867303501050101010f0102036e65650c0103026f770c010204706e777231010101060667323638667130010301010101010101010101010101010101010f01020f7774663772633534703075686577360e0101056c61626f7235010101010103026e642f01030272673901030273741e012e01070701010f02036561643a010402726e0a010201010101010f0101012d010101060f0101052681200701070101180606746f6d616e751d012e01070901018152040273741d012e0107070101580306626f7769747a1d012e0107090101812e030264670a01010102056963656e731d012e01070d0101811108060302666531010401740e0103026b65360103026e6b0a010201010101010f01010101012c0101010101050701017d010701015c0107010151030374746c0d0111012e01070701010a030276650e0105037769720c0102016c0a01030112012e01070701013602016f37010302636b0c010504646f776e1e012e01070701010d03026e671d012e0107090501012f03016f2f010301740e010f0101012d01010106070101230107010138030276653501010101010301771f012e01070901011d550201790c010101010103097531797364756c77613b010f0101016d0c012201010106010205616368696e0c010306676e696669634a010302696e0a0103026b650c011101010101012c0101010101050901011d440107010155010701014a03046d6d6f6e4a0103016e31010401690c0102010f012e010707010146040375616c0c0101011001010101012c0101010101051d04010108191127650506060606060111040101080a392418010f02010105165804030372696e0a0104010304737465721e012e010707010128030274741d012e01070901018132050265720c010301781d01010101012c01010101010509010181020107010178010701015a040278690c01010101010201650a01020102010f01010101012c0101010101050701017f010701015e01070101570303616e7435010602696d3601010103046d6265720a010301010103037263680a0102010101010120010101010101010101010101010201010101010101010101010f01030474686f641d012e010707010116020269644a0103066c6573746f6e350104016b3b010301700c0103057373696f6e3a0102036f64650d0103046e6461690a01040103026f6e3201030272650a010301010127010101010101010101010101010f01030273740e010f012e0107090101252c030474696f6e0a010306756e7461696e0d010101090362696b0a01020101010101030276651d012e01070701013c030378786938010201020274620a010201010101010f0101012d01010106090101813e0103090403696b650d01010104046c6966650c010101010103056e62696b650a0102037563682e0107010304726465722e010303736963340116010201790a010201010101010f012e010707010161030473656c660c0101046e616b652e0102036565640c01020105016c3901030a696768626f72686f6f640e010301770c010201280101010405736c6Line truncated
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(274877906947,X'00040c2f370101010101010101010f010330733235010101010101010101010101010f01020b39616f6969687177686c780e01020261643b0103026d650a0113012e01070701016e020463656e650a010301010103036f6f700a01030102056561736f6e2e0103010401010101011301070374776f3601010101010101010101010f010301652e0104010301020104036b657233010305676d656e740c010304727665720c0103057373696f6e0c01020103037475700a01020101010101030376656e35010101010101010101010101010f01020468617265350105066b726f626f742e010101010101010101010101010201010101010101010101010f010308656e616e6967616e3a01030469747469310103026f650c0101010401770e010f01010110011d0101010607010113010701011c0201690e01030264650c01020103036d706c1d012e01070701011903026e6335010502657235010402676c0d0103037269751d012e01070901018123030178340101010101010101010101010101010f0102026a760a0102046b6174651e012e01070701013a06047061726b1e012e0107070101700303696c6c0a010301010102036c6f770e0102016f0c01020120010701010103026d651d0101012d010101060701016a010701013e050374696d0a0103026e671d012e0107090101810903026f6e2e010801010103037572630c01020670656369616c4a0105047472756d1f012e010707010116040265640e0104026e640c010501740c010304696e646c350103026f740e012201030472696e67300103087578786e756c30753501020101010101010101010f01020372616d0a0102037461691f012e010709010109140501720e0104026e640a0104017237010501740a0102010101030365616c300107010401701d012e01070d0901011a81380303696c6c350103036f6c612f010401701e012e01070701016d03067261696768741f012e01070701011f04036565741e012e010709070101650404696b6572390104036f6e670a0103047564696f3501040266661e012e01070701012c020275620a01020101010101040573637269620a0102010101010111012e01070701015c080270740e0105047461636b0a0103037065720a0102010101010106037269640a010201010101010904657274760a010201010101010404706f72740a010201010101010f0111010101010101010101010101010201010101010101010101010f010101070701016504067261637573680e01030272652e010101010101010101010101010201010101010101010101010f010404707269730a0104057669766f722e01020477656174350102097a6e6d7274756f76610c010101740c0102010f011801160107090101321a0203616b651f010f011f01070701012a03026c6b1d0116011801070701014b0210646b3868637435787338766c627472340a010201010101010204656163680c0104016d35010401723501030563686e69633501070271750a0102010101010111012e010707010125020368616e0d0110012e01070701010a05016b2e010701010101010401740a0102010101010110011701170107070101200301650a010201010101010f01010101010f0103010101030101010101030111010101010105110101242c0d0f093f010d01010e071819010f0801010b0616560404617465723a010401690c01020111012e01070701013b050172350104016d0a010201010111012e01070701011904016e0a0103012801040272650d01040273650a0102010101010128010101040a7573656c6573737472690c0113012e0107070101620301690a010201010101010f01010101010f01070101010101130101010101010105090101106e010901011a4301090101331f04026e670c011101110101010101010101010101010101010101010101010101010101010f010101070701012705016b0d0103036f73653601010103037265650c01250101010101010101010101010101010101010101010f010403696c6c350104046f7567680d011001010101012c0101010101050701017b010701015a010701014f0307756d626e61696c3601010101010101010101010f010203696d650a01020102010f011d011101070701016f0301700c010402746f1d012e01070901018128030272650c010101010102016f0a0101010101010101010f0101011001010106010101010103010101100101010625030101040523071007200853050606060605010d010105141e130304676574680a0103016f0d0104016b0c0102047261696c0e0104056e736665720a01030369616c0c0102010f01010101012c010101010105090101813a0103080109010124580402636b0c0102010401702f01030375746833010301790c0113012e010707010137020a746174617a73707171770e01020575746f72690c0111012e0107090101480e0201760a0102010101010102047765616b0c0104036e74690c010304697463680c01050374657238010101010101010f0103016f0a01020101012301010101010101010101010101010101010101010101010f0101017531010203637a6e0a0102010101010102046e6465721d012e0107090101811206057374616e6435010101010103066578706563740a01030568617070693a0103046c6f636b1d012e010707010169030374696c0c012a0101010201700a010101030127010202726c0e010201730a0104011001100101011d0107070101430305656c6573730c0108037472691d01010101012c0101010101050b0101740e08010b010151101f010b010146140f020a7967616d7877347465690e010101762e0101010101010101010101010101010101010101010101010101010f010201650a01130101012d010101060701010c01070101270302726935011501040473696f6e0d01020269611d01010101012c010101010105070101790107010158010701014d030364656f0a010201010101010f01010101012c010101010105070101110107010111010701013403037369743801030d7669656e6e656d656472616e6f2e010101010101010101010101010201010101010101010101010f0104067a6965706f702e010101010101010101010101010201010101010101010101010f010201730e0111012e01070903010172020f76667a366b747134726a32336d64610e01010277610c01110118011601070701015c0306636b6965737431010301690a0102010101010104017435010101010103026e741d01010117010101010101010101010101010f0101010101060701012c01070101040302726e2e010101010101010101010101010201010101010101010101010f010302736e0c01290103037463680c01020120010101010101010Line truncated
|
|
||||||
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'00000f0e0230615b010101010101010101010f01017a14170f0c0206646d6f6e69745b010101010101010101010701015703036f726e5b01010101010101010101090101814d030476616e635b010101010101010101010701014102066d65726963615b010101010101010101010701010402016e5b0101010101010101010107010174030561746f6d695b010101010101010101010701014f0301645b01010101010101010101110601011d63340d0d0301745b010101010101010101010701012c0201725b01010101010101010101090101811602047368656e5b010101010101010101010701014e03016b630701015303047472616c5b01010101010101010101070101710201745b01010101010101010101090101816a02047564696f6309080101030101625b01010101010101010101070101090205617272656e5b010101010101010101010b050101812f020365656e5b01010101010101010101070101590303666f725b0101010101010101010107010167020269645b010101010101010101010b010181010502046c6f6f645b0101010101010101010107010152040b77696e796f75726d696e64630701015d02036f726e5b010101010101010101010901018144020972656174686c6573735b010101010101010101010b07010181310401645b010101010101010101010701014803036f776e6309040101050608657965646769726c630701015c020375726e5b010101010101010101010701012e0301745b010101010101010101010701015b0201795b010101010101010101010d01011a0a810003070101080107636164617665725b01010101010101010101090101814103056c616d69745b01010101010101010101090101810d030672656c6573735b01010101010101010101090101817e020668616e6e656c630701011b03036f7275630701015e030272695b010101010101010101010701011b0505737469616e5b010101010101010101010701011e02046c65616e5b01010101010101010101090101813902066f6c6c6563745b010101010101010101010701011403016d5b01010101010101010101090101080d040370656c5b01010101010101010101090101811f03056e74726f6c5b01010101010101010101090101811e03037765725b010101010101010101010701016602067265617475725b010101010101010101010d010181661b0a0307756369666f726d5b01010101010101010101090101814c02037572735b01010101010101010101090101813d01026461630b010173120502036561645b01010101010101010101090101814503036369645b010101010101010101010701013303046d656e745b0101010101010101010107010146030376696363070101560201695b010101010101010101010701013703056361726c6f5b010101010101010101010701012403066d696e6973685b01010101010101010101070101770304726563745b01010101010101010101070101210305736461696e5b010101010101010101010701012a0404706c61695b01010101010101010101090101810b030376696e5b010101010101010101010701013a02016f630701015f03076e616c64736f6e5b010101010101010101010701011f020275675b0101010101010101010109010181600104656163685b01010101010101010101090101812603037274685b010101010101010101010f01018135361b0a06026c695b010101010101010101010701014b020364656e5b010101010101010101010701015602016963090501010602037269635b0101010101010101010107010123020475726f705b010101010101010101010701010f02037665725b0101010101010101010109010181720204786973745b0101010101010101010107010179030570726573735b010101010101010101010701015a030574696e63745b010101010101010101010701013b0201795b0101010101010101010107010131010866616365626f6f6b630701012f0302696c5b01010101010101010101090101811702036561745b0101010101010101010103090204696e616c5b010101010101010101010701014402056f6c6c6f77630701012c07026669630701013407026969630701013a07027369630701014c0702746963070101400702776963070101460301725b010101010101010101010d010181641a0b03070101040204757475725b010101010101010101010701017b01066761746865725b01010101010101010101090101816d020369726c630906010107030276655b01010101010101010101090101813702026f645b010101010101010101010b010129811c0204726176655b01010101010101010101090101815d03036565645b010101010101010101010901018179030269705b01010101010101010101090101811901036861645b010101010101010101010701015803036e646c5b01010101010101010101090101811c02036561645b01010101010101010101090101812802036964655b010101010101010101010701016f0304676865725b01010101010101010101090101812202026f775b010101010101010101010701013902037474705b01010101010101010101090101050d031701010f0f0c0c08080808080204756d616e5b010101010101010101010d01013e81023c0101695b010101010101010101010d01013281060802046d70616c5b01010101010101010101090101814802016e5b010101010101010101010f01014021620e12030463616e745b010101010101010101010701016b030c6469656d6572636873746f725b010101010101010101010701010703077374616772616d63070101350502696c5b010101010101010101010901018173030474656e745b010101010101010101010d0401010c0d5d020372656e5b010101010101010101010701017501046a757374630701017401066b61726d69635b01010101010101010101090101815701026c61632f0101680303030303030303030903030303030303030305030273745b010101010101010101010b010181126602036566745b010101010101010101010901018147020269655b01010101010101010101090101815a03036768745b010101010101010101010701014503026b655b010101010101010101010701012b030701017503047374656e630701010b07027963630701012a0801646307010113030276655b010101010101010101010701013502026e6b63170101110f0c0c080808080802056f6e6765725b010101010101010101010701015d01096d6163726f636f736d5b010101010101010101010b08010181320304676e756d5b010101010101010101010701012603036e676c5b01010101010101010101090101Line truncated
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(2473901162498,X'0000020c0730746f727475725b01010101010101010101090101810802057265766f725b01010101010101010101030a0206776974746572630701013b0105756e6465725b010101010101010101010701012f03046675726c5b0101010101010101010109010181070203706f6e5b010101010101010101010b010149812d0201736307010164010376616e631302010109060d0d0c2e04086d6f727269736f6e63190101100f0c0c08080808080e02046964656f5b01010101010101010101090e0101200307010125030473696f6e5b01010101010101010101090101810902036f69636307010155010577617463685b0101010101010101010107010130030701012102016563070101630304627369746307010141020368656e630701016203016f5b01010101010101010101070101340208696c6c66756c6c695b01010101010101010101090101815f030573656d616e5b010101010101010101010701011c0301745b01010101010101010101090101816f0401685b01010101010101010101090101814e0502696e5b010101010101010101010701016d0204726174685b010101010101010101010901018171020277775b01010101010101010101090101060d0103796f755b010101010101010101010b0101815e1003070101600401726307010154050473656c665b0101010101010101010109010181610403747562630b01011a13240418140d1616160810181b160a1b080b0a121a1613131316141b0816');
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(2611340115969,X'00000ed302303052090101811e010b010160050602013053070101610201385307010172010231335307010164020138530701016c010132530901016b050201355307010175010133530901017105010134520f080101188107340201305307010168010135530302020134530701016f010161520b0101158100010b010109430e010f0101150515160e05010101010e01017a14170f0c0202626c520701015d03036f7574520701014c0207010108020563726f737352070101200206646d6f6e697459010101010601015703036f726e5901010101080101814d030476616e63530903010146060101010106010141020466746572530701012502026c6c52070101430302736f5307010154010701014902066d657269636159010101010601010402016e590101010106010174030561746f6d6959010101010601014f030164520701016801090a0101390109010104360501010101100601011d63340d0d03017459010101010601012c020470706c69530701012f020172530701013d010f070101070c2d3c0501010101080101811603016d54090101201303046f756e64520701013f03047469737452090101811f02047368656e59010101010601014e03047472616c5901010101060101710201745209010157170701010101080101816a0306747269627574520901018116020a7564696f6e6175746978520b0101810f14010162590101010106010109020361636b52090101812b020d040101026b0a03046c616e6352090101360d03047272656e59010101010a050101812f0303736963530901011418020465636f6d5307010149010701013e0302656e5901010101060101590303666f7259010101010601016703026e74540701013003027374520701015a0202696459010101010a010181010503026b6552090101814602046c616b6552090101812703036f6f645901010101060101520302756552090101810d02026d7852090101814201030b02036f6e7553070101730302726e59010101010801018144030274685407010106020972656174686c65737359010101010a070101813104016459010101010601014803056f6f6b657252090101810c020375726e59010101010601012e03027369520901018104010701017a01070101630301745207010139020b01010e154f05010101010601015b02017952110101810e100b090707010101010c01011a0a8100010163540701016102066164617665725901010101080101814103056c616d69745901010101080101810d03016e5207010177010901012e270107010148030672656c6573735901010101080101817e020668616e6e656c52070101670302726959010101010601011b0505737469616e59010101010601011e02046c65616e5901010101080101813902066f6c6c65637459010101010601011403016d520b010173171c010901015030010b0101451d090501010101080101080d04036d6f6e5209010181150502756e5207010163040370656c5901010101080101811f05036c657454070101120506726568656e73520701015003056e74696e7553070101220503726f6c53070101480601010101080101811e0303766572530701011203037765725901010101060101660206726561746976520901018114080765636f6d6d6f6e5209010181190602757259010101010c010181661b0a0305697474657252090101812f0307756369666f726d5901010101080101814c0402697352090101813002037572735901010101080101813d010364616e52090101812d02036561645901010101080101814503036369645901010101060101330303646963530701013403046d656e7459010101010601014603037074685207010152030576656c6f70530701014502016959010101010601013703056361726c6f590101010106010124030466666572540b0a01013d3e03066d696e69736859010101010601017703047265637452070101440701010101060101210305736461696e59010101010601012a0404706c61695901010101080101810b040474616e63520906010130030376696e59010101010601013a02016f5307010102010701016903016e52070101490406616c64736f6e59010101010601011f05017452070101780107010157010701014c020275675901010101080101816003027265530701010c01046561636859010101010801018126030372746859010101010e01018135361b0a06026c6959010101010601014b020364656e59010101010601015602046e6a6f69520701014d0203726963590101010106010123020475726f7059010101010601010f0203766572520901010d4a070101010108010181720206786572636973530d0501011f244103036973745901010101060101790305706c61696e54090101394404047265737359010101010601015a030574696e637459010101010601013b02017959010101010601013101046661696c590101010108010181170203656174590101010102090208696572676f6c6c615209010181030107010179010701015b03036e616c59010101010601014403027665530701011e02026f7253030606010101010c010181641a0b0203726f6d530701012b020675727468657252070101090207010154030374757259010101010601017b010367617053070101660304746865725901010101080101816d020265745207010102020369766553070101060601010101080101813702046d61696c520901018107010701017d010701016602026f6459010101010a010129811c0204726176655901010101080101815d0303656564590101010108010181790302697059010101010801018119010368616459010101010601015803036e646c5901010101080101811c030372726952090101813302036561645901010101080101812803027265530901013c120107010141020369646559010101010601016f03026768540901012d42050265725901010101080101812202026f70530701016a010f0501010327460a030177521702010106367c050606060901070101160601010101060101390406746f6d616e755209010181510203747470520b0101702a0a010701014d01090101421d0501010101080101050d0204756d616e59010101010c01013e81023c01016952090101124b0107010142010701013505010101010c010132810608020166520701012a02056d6167696e520701010e030370616c5901010101080101814804036f7274520701012602016e52110701010f35113b46010901013008010b0101170d1205010101010e01014021620e12030463616e7459010101010601016b030c6469656d6572636873746f725901010101060101070305717569726952090101810501070101Line truncated
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(2611340115970,X'000006052c06307265616469520701010304036c6c69540701011c040172540901010c1c0304636b6f6e59010101010601016403046d6f727359010101010e010181631a0b0a03047075676e59010101010801018142030477617264520701016b02026964590101010108010181530401655307010132030973696e676d6572636859010101010601011202037573745901010101080101811b010473616d65520701016e02036375645901010101060101500204657665725901010101080101812502056861646f7759010101010a0201010a0d03026f775207010113010701011c0601010101080101810a020369636b59010101010601014703036d706c5207010119030372697552090101812302046b617465530701013a06047061726b530701017002046c6174655901010101080101813a02016f59010101010801017c050302616b59010101010601015303026d65520701016a010701013e03026e67520901018109030272655901010101080101814f0304756768745901010101080101815102077065637472756d5407010116020374616954090101091403026570520d0901011a813803026f70530701016d040272655901010101080101030d0306726169676874540701011f040365657453090701016504036e61645901010101020b0303756666530701012c020575626c696d59010101010601017d04036d69745901010101080101815904057363726962540701015c03046666657259010101010801018115030570706f72745207010165020477656c6c59010101010601016c0303696e6559010101010601013f01017452090101321a0203616b65540701012a03026c6b520701014b02076563686e6971755407010125020368616e520701010a040174530701012003016552110101242c0d0f093f010d01010e071819010f0801010b0616560501010101380101251a0809091105070a1205050d0508110d2a0b050a070a060705040169540701013b05010101010c01012d3a412e05017259010101010a01014d235404016d5307010119050473656c7659010101010801018154040a7573656c657373747269540701016203016952090101106e010901011a4301090101331f0501010101080101815604026e6752070101270305726f756768520701017b010701015a010701014f0203696d65520701016f030370746f52090101812802016f5225030101040523071007200853050606060605010d010105141e1306010101010e010142581d211e0304727475725901010101080101810802057265766f725901010101020a030369616c52090101813a0103080109010124580301795407010137020575746f726952090101480e0105756e64657252090101811207010101010601012f03046675726c5901010101080101810703046c6f636b52070101690203706f6e59010101010a010149812d02017353070101430308656c657373747269520b0101740e08010b010151101f010b010146140f01027665520701010c01070101270202696152070101790107010158010701014d030364656f5207010111010701011101070101340501010101080e010120030473696f6e5901010101080101810902017354090301017201027761520701015c03026e74520701012c01070101040303746368590101010106010130020165540701016a030469676874520701013e02046865656c540901010d1c0402726552070101340303696368520901011b2c03016f59010101010601013404026c655207010121030179540d0601013a300f0203696c6c520701011c0107010121050566756c6c695901010101080101815f030573656d616e59010101010601011c0301745901010101080101816f040168540b01011e13250501010101080101814e0502696e59010101010601016d02066f726b6f7574530901010b7802047261746859010101010801018171020277775207010171010701014e01090101431d0501010101080101060d0103796f75520f01010b0b0c0f4d010f0101031c0b0927010b01011a112005010101010a0101815e1004017252090101350a01090101071e050473656c66590101010108010181610403747562540701015f050c0a090f13100b0e08140f0b0e1012180e0a0b0b0b100d0d0e0a0e100e0b0c090e0d0b0c0a100f0c100c0f0e090a090e0a0840140e0810111f09160a0b2c100e14080d16100b10081f0e131e1009090e0e080b0c090b0c090b0f11100d140d0e101e290f10');
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(2886218022913,X'00000ed20230316801050701011f01016160010801010f01017a14170f0c040b01014b82350206646d6f6e69746001090701015703036f726e600109090101814d030476616e6360010907010141020765726f706c616e68010533060101088101060c064e060c064d060c0645060c060804060502046761696e680105090101820e02046c62756d6801050701011003037761696801050b010181216002046d6173736801050701016d030565726963616001090701010402016e60010907010174030561746f6d696001090701014f0301646001080101110601011d63340d0d042501015e0e0a070e0d05520d05510d05490d050301746001090701012c02017260010909010181160304746973746801050701016402047368656e6001090701014e03016b6301070701015303047472616c60010907010171020174600109090101816a02047564696f630107090801010302047661696c6801050701012302037761696801050901018264010162600109070101090203616269680105090101821103026e646801050701014d03047272656e6001090b050101812f020165680105090101822d0302656e600109070101590303666f72600108010107010167040b01018138070304747465726801050901018135020269646001090b010181010503056c6c696f6e6801050701016e02046c6f6f6460010907010152040b77696e796f75726d696e646301070701015d02036f726e6001090901018144020972656174686c6573736001090b07010181310401646001090701014803036f776e63010709040101050608657965646769726c6301070701015c020375726e6001090701012e0301746001090701015b020179600103010501010d01011a0a8100010701010803070101090101636801050701011b0206616461766572600109090101814103056c616d6974600109090101810d040569666f726e68010507010152090269616801050701015703016e6801050d010158572407030672656c657373600109090101817e020668616e6e656c63010501020701011b03070101170303696c696801050d0401010c221e0604706570706801050d01013607070503036f6b656801050901018278040272756301070701015e030272696001090701011b0505737469616e6001090701011e02046c65616e60010909010181390305696e746f6e6801050701016702066f6c6c6563746001090701011403016d6001080101090101080d041101011a1906070708040370656c600109090101811f03056e6669726d6801050701011e040474726f6c600109090101811e0303756c64680105130101825c060e0b100803037765726001090701016602067265617475726001090d010181661b0a0307756369666f726d600109090101814c0203757273600109090101813d0301746801050901018304010264616301070b010173120503026e69680105070101560302726b6801050701015f0203656164600109090101814503036369646001090701013304056f6d706f73680105090101814103046d656e74600109070101460303766963630107070101560201696001090701013703056361726c6f60010907010124030165680105090101830c03066d696e69736860010907010177030472656374600109070101210307736170706561726801050b010181520704046461696e6001090701012a0404706c6169600109090101810b030376696e6001090701013a02016f6301070701015f03076e616c64736f6e6001090701011f02027567600109090101816003027374680105090101820d010465616368600109090101812603037274686001090f01018135361b0a06026c696001090701014b030273696801050b010182270b0203646469680105070101680302656e60010907010156020169630107090501010602046c746f6e6801050701016b020372696360010907010123020475726f706001090701010f0203766572600109090101817202047869737460010907010179030570726573736001090701015a030574696e63746001090701013b020179600108010107010131040901018129010866616365626f6f6b63010501020701012f0309010137040302696c600109090101811703026d656801050701017b0203656172680105090101815a04017460010903090204696e616c60010907010144040164680105090101812f02046c6f61746801050b0101825f0602056f6c6c6f7763010501020701012c03070101290702666963010707010134070269696301070701013a070273696301070701014c07027469630107070101400702776963010707010146030172600103010501010d010181641a0b010701010403090101074a0203726f6d6801050b01010e825b020375636b680105090101826d03037475726001090701017b0106676174686572600109090101816d0204656f726768010507010166031074726863706f6e65686f746d696e757468010507010128020369726c6301050102090601010703090101820803027665600109090101813702056c6f62616c6801050701017002026f646001090b010129811c020472617665600109090101815d05036974696801050b01018220060303656564600109090101817903026970600109090101811901036861646001090701015803026c6c6801050701017903036e646c600109090101811c030276656801050901018158020365616460010909010181280301696801050b01015c505f03017268010509010182180401656801050701012402036964656001090701016f03046768657260010909010181220301746801050701015102026f74680105110301010b09110c1e03017760010907010139020374747060010301050101090101050d011701010f0f0c0c080808080803130101180f0c060707070204756d616e6001090d01013e81023c01016960010801010d010132810608042101017d3108090712070a301606193a1f02046d70616c600109090101814802016e60010801010f01014021620e12040f010181261f083d030463616e746001090701016b030c6469656d6572636873746f72600109070101070403756374680105070101730303736964680105090101821a040674616772616d6301050102070101350309010132040502696c6001090901018173030474656e746001090d0401010c0d5d04016f6801050b010174811a020372656e600109070101750201736801051701014a3d105210511049100201746801052101012763103d071210330b171049100e01046a616e656801050f01018110605f5702036f686e6801050701016c0203757374630105010207010174030d010182591b1001066b61726d6963600109090101815702066974636865Line truncated
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(2886218022914,X'000005990530726f6c6c6801050701017802037573746001080101090101811b04090101813c0101736801052301018109100b49100b2a0b17102c1f100e020261646801050d0101822b0b03020363617268010507010154030275646001090701015002046576657260010909010181250202686163010709010167120403646f776001090b0201010a0d030165680105090101826a03026f77600109090101810a020369636b6001090701014703026e6763010707010166030174680105090101820302036c6170680105090101813604027465600109090101813a02076d61727475726c6801050701012602036e6f776801050701015b02016f6001090901017c050302616b6001090701015303046d656f6e680105090101813403026e6768010509010182690504626972646801050f0101810c605f5703027265600109090101814f03047567687460010909010181510401726801050f0101810f605f57020470696b656801051b010181001d093e1d093d1d3c1d03056f7469666963010707010147020374617268010509010182130501746801050b0101813a0703026f706801050701015a04027265600109090101030d03047265616d6801050701017104036e6164600109030b020275626801050701011d04036c696d6001090701017d04036d697460010909010181590405736372696263010501020701011403070101140903657964630107090101203403046666657260010909010181150204776565746801050f0101810d605f5704026c6c6001090701016c0303696e656001090701013f01017468010509010159570201656301070b01017212050203686174630105010207010176030f0101811e60810103016560010301050101390101251a0809091105070a1205050d0508110d2a0b050a070a060705010701011603130101030e09613d645804016960010801010d01012d3a412e040701016105017260010801010b01014d2354040701015004056d73656c76600109090101815403016960010909010181560304726f617468010509010183060204697373756801050701015502016f600103010501010f010142581d211e011f01010c08050c0c0c08080808080810030f0101158128076e030472747572600109090101810802057265766f72600109030a0205756d626c7268010509010141050302726e680105090101820b020677697474657263010501020701013b030901013c040105756e6465726001090701012f03046675726c60010909010181070203706f6e6001090b010149812d02017363010707010164010376616e6301071302010109060d0d0c2e04086d6f727269736f6e630107190101100f0c0c08080808080e020565646465726801050701016902046964656f60010301050101090e0101200107010125030909010106030265776801050b0101814608030473696f6e600109090101810902036f6963630105010207010155030901018219010477616e746801050901018133030374636860010301050101070101300107010121030701010202016563010707010163030f6172657761726e65727265636f726468010509010183390301626801050701012e040373697463010707010141020368656e630105010207010162030b010182280b04027265680105090101826f03016f600109070101340208696c6c66756c6c69600109090101815f030573656d616e6001090701011c030174600109090101816f0401686001080101090101814e041b010163201d093e1d093d1d3c1d0502696e6001090701016d02036f726b68010507010162020472617468600109090101817103036f7465680105090101826b02027777600109090101060d0103796f75600103010501010b0101815e100107010160030b010182290b04017263010707010154050473656c666001090901018161040374756263010501020b01011a13240307010119040d15180e0c0b0e0c0e0b0c0c0b0b0d0c100c0b0b0e0c110c0e0e170e0d0c0b0c0d0a0b0c0d150d0e110b0c0b0c173714130f0b0e0d2c0e0c0f0c170e0e0e0a121a0e1d0d0e140e1a0a190a0c150c0a120e0b1c0b0c0e0d0c1e0a0e');
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(3023656976385,X'00000eba02303052010101316d01050701011f0101345201010161520117010401010f01017a14170f0c040b01014b82350202626c520103036f75745201020563726f737352010206646d6f6e69746901050701015703036f726e690105090101814d030476616e6369010507010141020765726f706c616e6d010533060101088101060c064e060c064d060c0645060c060804060502046761696e6d0105090101820e02046c62756d6d01050701011003016c520103037761696d01050b010181216002046d6173736d01050701016d030565726963616901050701010402016e69010507010174030561746f6d696901050701014f03016452011701040101110601011d63340d0d042501015e0e0a070e0d05520d05510d05490d050301746901050701012c020172690105090101811603046f756e64520103047469737452011b01050701016402047368656e6901050701014e03016b6a01050701015303047472616c690105070101710201745201170105090101816a0306747269627574520102047564696f6a0105090801010306066e6175746978520102047661696c6d01050701012302037761696d010509010182640101626901050701010902036162696d010509010182110302636b520103046c616e63520103026e646d01050701014d03047272656e6901050b050101812f0201656d0105090101822d0302656e690105070101590303666f72690104010107010167040b01018138070302737452010304747465726d01050901018135020269646901050b010181010503026b65520103056c6c696f6e6d01050701016e02046c616b65520103036f6f6469010507010152040b77696e796f75726d696e646a01050701015d03027565520102026d78520102036f726e6901050901018144020972656174686c6573736901050b07010181310401646901050701014803056f6f6b657252010402776e6a010509040101050608657965646769726c6a01050701015c020375726e6901050701012e03027369520103017452011701050701015b0201795201170101010301010d01011a0a8100010701010803070101090101636d01050701011b0206616461766572690105090101814103056c616d6974690105090101810d040569666f726e6d010507010152090269616d01050701015703016e52011b01050d010158572407030672656c657373690105090101817e020668616e6e656c520118010301020701011b03070101170303696c696d01050d0401010c221e0604706570706d01050d01013607070503036f6b656d01050901018278040272756a01050701015e030272696901050701011b0505737469616e6901050701011e02046c65616e69010509010181390305696e746f6e6d01050701016702066f6c6c6563746901050701011403016d52011701040101090101080d041101011a190607070804036d6f6e52010502756e5201040370656c690105090101811f0506726568656e73520103056e6669726d6d01050701011e040474726f6c690105090101811e0303756c646d0105130101825c060e0b100803037765726901050701016602067265617469765201080765636f6d6d6f6e5201060275726901050d010181661b0a0305697474657252010307756369666f726d690105090101814c0402697352010203757273690105090101813d0301746d01050901018304010264616a01050b010173120503016e52010401696d0105070101560302726b6d01050701015f0203656164690105090101814503036369646901050701013304056f6d706f736d0105090101814103046d656e74690105070101460303707468520103037669636a0105070101560201696901050701013703056361726c6f690105070101240301656d0105090101830c03066d696e697368690105070101770304726563745201170105070101210307736170706561726d01050b010181520704046461696e6901050701012a0404706c6169690105090101810b040474616e635201030376696e6901050701013a02016f6a01050701015f03016e52010406616c64736f6e6901050701011f0501745201020275676901050901018160030273746d0105090101820d010465616368690105090101812603037274686901050f01018135361b0a06026c696901050701014b030273696d01050b010182270b02036464696d0105070101680302656e690105070101560201696a0105090501010602046c746f6e6d01050701016b02046e6a6f695201020372696369010507010123020475726f706901050701010f02037665725201170105090101817202047869737469010507010179030570726573736901050701015a030574696e63746901050701013b020179690104010107010131040901018129010866616365626f6f6b6a010301020701012f0309010137040302696c690105090101811703026d656d01050701017b02036561726d0105090101815a04017469010503090208696572676f6c6c61520103036e616c690105070101440401646d0105090101812f02046c6f61746d01050b0101825f0602056f6c6c6f776a010301020701012c0307010129070266696a010507010134070269696a01050701013a070273696a01050701014c070274696a010507010140070277696a010507010146030172690101010301010d010181641a0b010701010403090101074a0203726f6d6d01050b01010e825b020375636b6d0105090101826d03057274686572520103037475726901050701017b0106676174686572690105090101816d0204656f72676d0105070101660301745201040f726863706f6e65686f746d696e75746d010507010128020369726c6a01030102090601010703090101820803027665690105090101813702056c6f62616c6d01050701017002046d61696c520102026f646901050b010129811c020472617665690105090101815d05036974696d01050b01018220060303656564690105090101817903026970690105090101811901036861646901050701015803026c6c6d01050701017903036e646c690105090101811c03037272695201030276656d01050901018158020365616469010509010181280301696d01050b01015c505f0301726d010509010182180401656d01050701012402036964656901050701016f03046768657269010509010181220301746d01050701015102026f746d0105110301010b09110c1e0301775201170105070101390406746f6d616e7552010203747470520117010101030101090101050d011701010f0f0c0c080808080803130101180f0c060707070204756d616e6901050d01013e81023c010169520117010401010d010132810608042101017d3108090712070a3016Line truncated
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(3023656976386,X'000008750101816b04306f7075690105070101270201725201170105070101360303646572520103016752010204746865725201170105090101812706037369646d0105070101530202757452010206766572636f6d6d01050b0101821f060202776e6d0105090101812801047061696e6d01051b010181021d093e1d093d1d3c1d03096e64656d6f6e69756d6901050901018110030672616469676d6901050701017605037369746901050701014c04016b520103057472656f6e520103047970616c5201020565707065726d01050d0501010d221e03057266656374690105090101812a02046c61677569010509010181580401696a01050701015805016e69010507010154030565617375726d01051501017f1d451d441d3c1d02046f696e74520103027365690105090101814a030377657269010509010181230204726f63656901050b010181020504036475636901050701011904056772657373690105090101812b02037573686d01050901018217010272656d01050b0101822a0b030361646952010401726d01050b01018145080304636b6f6e690105070101640301646d01050d0201010a221e040c686f746368696c69706570706d01050d01011c16830903046d656d626a01050701016104036f72736901050f010181631a0b0a03046e6f776e6d01050701014e03047075676e69010509010181420304776172645201020269646901050901018153030973696e676d657263686901050701011202036f636b6d01050901014c2c03026c6c6d01050701017802037573746901040101090101811b04090101813c0101736d01052301018109100b49100b2a0b17102c1f100e020261646d01050d0101822b0b0303026d65520102036361726d01050701015403027564690105070101500204657665726901050901018125020268616a010509010167120403646f776901050b0201010a0d0301656d0105090101826a03026f775201170105090101810a020369636b6901050701014703036d706c520103026e676a010507010166030372697552010301746d0105090101820302036c61706d0105090101813604027465690105090101813a02076d61727475726c6d01050701012602036e6f776d01050701015b02016f6901050901017c050302616b6901050701015303026d65520105026f6e6d0105090101813403026e6752011b010509010182690504626972646d01050f0101810c605f5703027265690105090101814f03047567687469010509010181510401726d01050f0101810f605f57020470696b656d01051b010181001d093e1d093d1d3c1d03056f746966696a01050701014702037461726d010509010182130501746d01050b0101813a0703026570520103026f706d01050701015a04027265690105090101030d03047265616d6d01050701017104036e6164690105030b020275626d01050701011d04036c696d6901050701017d04036d69746901050901018159040573637269626a0103010207010114030701011409036579646a010509010120340304666665726901050901018115030570706f727452010204776565746d01050f0101810d605f5704026c6c6901050701016c0303696e656901050701013f01017452011b010509010159570203616c6b52010201656a01050b0101721205020368616e52010401746a0103010207010176030f0101811e608101030165520117010101030101390101251a0809091105070a1205050d0508110d2a0b050a070a060705010701011603130101030e09613d645804016969010401010d01012d3a412e040701016105017269010401010b01014d2354040701015004056d73656c7669010509010181540301695201170105090101815604026e6752010304726f61746d01050901018306050375676852010203696d655201030370746f520103037373756d01050701015502016f5201170101010301010f010142581d211e011f01010c08050c0c0c08080808080810030f0101158128076e030472747572690105090101810802057265766f72690105030a030369616c52010205756d626c726d010509010141050302726e6d0105090101820b0304746f7269520102067769747465726a010301020701013b030901013c040105756e64657252011701050701012f03046675726c690105090101810703046c6f636b52010203706f6e6901050b010149812d0201736a0105070101640308656c6573737472695201010376616e6a01051302010109060d0d0c2e04086d6f727269736f6e6a0105190101100f0c0c08080808080e02016552010304646465726d010507010169020269615201030364656f520117010101030101090e0101200107010125030909010106030265776d01050b0101814608030473696f6e690105090101810902036f69636a010301020701015503090101821901027761520103026e7452011b0105090101813303037463686901010103010107010130010701012103070101020201656a010507010163030f6172657761726e65727265636f72646d010509010183390301626d01050701012e04037369746a0105070101410304696768745201020368656e6a0103010207010162030b010182280b0402726552011b0105090101826f0303696368520103016f6901050701013404026c6552010203696c6c5201050566756c6c69690105090101815f030573656d616e6901050701011c030174690105090101816f0401686901040101090101814e041b010163201d093e1d093d1d3c1d0502696e6901050701016d02036f726b6d010507010162020472617468690105090101817103036f74656d0105090101826b020277775201170105090101060d0103796f755201170101010301010b0101815e100107010160030b010182290b040172520118010507010154050473656c66690105090101816104037475626a010301020b01011a13240307010119080c0c0705100c06110c17130f0c050908110f0e0a0a15080c0d0f0c0f0d0d070c0d0d180d100d0e080c120d0b15180e060c0b0e0c0e0b0e0c070b070b0d0c100c0b0b060c0e110c0e0e170e0d0c060b0c0d0a0b0c0d150d0e09110b0c0d070c07153914130f0d060e0707070c2e0e0c070f0c0817100e080e0a0c121a050d061e0d0e14060e1a0a190a0c08150e070a06070f0e0b1c0b0c0e0d0e200c0e');
|
|
||||||
INSERT INTO media_items_search_index_data VALUES(3161095929857,X'00000e7c02303053012001010105080101811e010a0101600506020130530121010606010161020138530121010606010172010131720102013353012101060601016402013853012101060601016c01013253012101060801016b05020135530121010606010175010133530121010608010171050101347301060e080101188107340201305301210106060101680101355301210106020202013453012101060601016f010161530101011a010401010101010301020a0101158100010a010109430e0202626c7301060601015d03036f757454011f010401020601014c020563726f7373730106060101200206646d6f6e69746e0103036f726e6e01030476616e6353011b010601060803010146020765726f706c616e720102046674657253012101060601012502046761696e720102046c62756d720103016c730106060101430302736f530101012001030103060101540303776169720102046d6173737201030565726963616e0102016e6e01030561746f6d696e01030164530101011a010401010101010301020601016801080a0101390301746e01020470706c6953012101060601012f020172530101011a0106010301030601013d03016d5401230103046f756e647301060601013f0304746973747201010106080101811f02047368656e6e0103016b6f0103047472616c6e010201746e0105010608010157170306747269627574730106080101811602047564696f6f0106066e61757469787301060a0101810f1402047661696c7201020377616972010101626e01020361626972010302636b54011f01040102080101812b03046c616e63730106080101360d03026e64720103047272656e6e0103037369635301210106080101141802016572010303636f6d530101012001030103060101490302656e6e010303666f726e01040103026e7454012301030273747301060601015a0304747465727201020269646e0103026b65730106080101814603056c6c696f6e720102046c616b65730106080101812703036f6f646e01040b77696e796f75726d696e646f0103027565730106080101810d02026d7853012001010105080101814201020b02036f6e755301210106060101730302726e6e010302746854012301020972656174686c6573736e010401646e0103056f6f6b6572730106080101810c0402776e6f010608657965646769726c6f01020375726e6e0103027369530101011f0101010301020801018104010601017a03017454011a010501040102060101390201796e0101010301010106100101810e100b090701016354011e01050102066164617665726e0103056c616d69746e01040569666f726e720109026961720103016e530101011e010101010103010206010177010801012e27030672656c6573736e01020668616e6e656c6f010301010106060101670303696c697201060470657070720103036f6b657201040272756f01030272696e010505737469616e6e0102046c65616e6e010305696e746f6e720102066f6c6c6563746e0103016d530101011a010401010101010301020a010173171c01080101503004036d6f6e73010608010181150502756e73010606010163040370656c6e0105036c6574540123010506726568656e737301060601015003056e6669726d7201040474696e755301210106060101220503726f6c53011b01060106060101480303756c647201030376657253012101060601011203037765726e0102067265617469767301060801018114080765636f6d6d6f6e7301060801018119060275726e0103056974746572730106080101812f0307756369666f726d6e0104026973730106080101813002037572736e010301747201010264616f0103016e730106080101812d04016972010302726b720102036561646e0103036369646e0104056f6d706f737201030364696353012101060601013403046d656e746e01030370746873010606010152030576656c6f70530121010606010145040269636f010201696e0103056361726c6f6e0103016572010304666665725401230103066d696e6973686e010304726563746e0105010606010144030773617070656172720104046461696e6e010404706c61696e01040474616e637301060806010130030376696e6e0102016f530101011b0105010301030601010203016e730106060101490406616c64736f6e6e01050174530101011f010101030102060101780106010157020275676e010302726553012101060601010c0302737472010104656163686e0103037274686e0106026c696e01030273697201020364646972010302656e6e010201696f0102046c746f6e720102046e6a6f697301060601014d02037269636e01020475726f706e0102037665726e010501060801010d4a020678657263697353012101060c0501011f244103036973746e010305706c61696e540123010404726573736e01030574696e63746e010201796e010401010866616365626f6f6b6f0103010302696c6e0103026d657201020365617272010401746e010208696572676f6c6c61530101011f0101010301020801018103010601017903036e616c6e0104016472010302766553012101060601011e02046c6f6174720102056f6c6c6f776f010301070266696f01070269696f01070273696f01070274696f01070277696f0103017253011b010101030102010602060203726f6d53011f010201060601012b020375636b72010305727468657254011f010401020601010903037475726e0101036761705301210106060101660304746865726e010204656f7267720103017473010606010102040f726863706f6e65686f746d696e75747201020369726c6f0103010302766553011b010601060601010602056c6f62616c720102046d61696c530101011f0101010301020801018107010601017d02026f646e010204726176656e010503697469720103036565646e01030269706e0101036861646e0103026c6c720103036e646c6e010303727269730106080101813303027665720102036561646e0103016972010301727201040165530101011e0102010301030801013c1202036964656e010302676854012301050265726e01030174720102026f705301010120010301030601016a030174720103017753011b0105010101051602010106367c050606060901060101160406746f6d616e7573010608010181510203747470530101011a0101010301010101010301020a0101702a0a010601014d0204756d616e6e01010169530101011a01040101010101030102080101124b01060101420201667301060601012a02056d6167696e7301060601010e030370616c6e0104036f72747301060601012602016e530101011a01040101010101Line truncated
|
|
||||||
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;
|
|
||||||
@@ -2,7 +2,7 @@ defmodule Pinchflat.Boot.DataBackfillWorker do
|
|||||||
@moduledoc false
|
@moduledoc false
|
||||||
|
|
||||||
use Oban.Worker,
|
use Oban.Worker,
|
||||||
queue: :media_local_metadata,
|
queue: :local_metadata,
|
||||||
unique: [period: :infinity, states: [:available, :scheduled, :retryable]],
|
unique: [period: :infinity, states: [:available, :scheduled, :retryable]],
|
||||||
tags: ["media_item", "media_metadata", "local_metadata", "data_backfill"]
|
tags: ["media_item", "media_metadata", "local_metadata", "data_backfill"]
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ defmodule Pinchflat.Boot.PreJobStartupTasks do
|
|||||||
|
|
||||||
alias Pinchflat.Repo
|
alias Pinchflat.Repo
|
||||||
alias Pinchflat.Settings
|
alias Pinchflat.Settings
|
||||||
|
alias Pinchflat.Filesystem.FilesystemHelpers
|
||||||
|
|
||||||
def start_link(opts \\ []) do
|
def start_link(opts \\ []) do
|
||||||
GenServer.start_link(__MODULE__, %{}, opts)
|
GenServer.start_link(__MODULE__, %{}, opts)
|
||||||
@@ -31,6 +32,7 @@ defmodule Pinchflat.Boot.PreJobStartupTasks do
|
|||||||
@impl true
|
@impl true
|
||||||
def init(state) do
|
def init(state) do
|
||||||
apply_default_settings()
|
apply_default_settings()
|
||||||
|
ensure_directories_are_writeable()
|
||||||
rename_old_job_workers()
|
rename_old_job_workers()
|
||||||
|
|
||||||
{:ok, state}
|
{:ok, state}
|
||||||
@@ -41,6 +43,21 @@ defmodule Pinchflat.Boot.PreJobStartupTasks do
|
|||||||
Settings.fetch!(:pro_enabled, false)
|
Settings.fetch!(:pro_enabled, false)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp ensure_directories_are_writeable do
|
||||||
|
directories = [
|
||||||
|
Application.get_env(:pinchflat, :media_directory),
|
||||||
|
Application.get_env(:pinchflat, :tmpfile_directory),
|
||||||
|
Application.get_env(:pinchflat, :metadata_directory)
|
||||||
|
]
|
||||||
|
|
||||||
|
Enum.each(directories, fn dir ->
|
||||||
|
file = Path.join([dir, ".keep"])
|
||||||
|
|
||||||
|
# This will fail if the directory is not writeable, stopping boot
|
||||||
|
FilesystemHelpers.write_p!(file, "")
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
# As part of a large refactor, I ended up moving a bunch of workers around. This
|
# 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
|
# 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
|
# will try to run the OLD jobs. This is also why these tasks run before the job
|
||||||
@@ -52,7 +69,6 @@ defmodule Pinchflat.Boot.PreJobStartupTasks do
|
|||||||
rename_map = [
|
rename_map = [
|
||||||
["Pinchflat.Workers.MediaIndexingWorker", "Pinchflat.FastIndexing.MediaIndexingWorker"],
|
["Pinchflat.Workers.MediaIndexingWorker", "Pinchflat.FastIndexing.MediaIndexingWorker"],
|
||||||
["Pinchflat.Workers.MediaDownloadWorker", "Pinchflat.Downloading.MediaDownloadWorker"],
|
["Pinchflat.Workers.MediaDownloadWorker", "Pinchflat.Downloading.MediaDownloadWorker"],
|
||||||
["Pinchflat.Workers.FilesystemDataWorker", "Pinchflat.Filesystem.FilesystemDataWorker"],
|
|
||||||
["Pinchflat.Workers.FastIndexingWorker", "Pinchflat.FastIndexing.FastIndexingWorker"],
|
["Pinchflat.Workers.FastIndexingWorker", "Pinchflat.FastIndexing.FastIndexingWorker"],
|
||||||
["Pinchflat.Workers.MediaCollectionIndexingWorker", "Pinchflat.SlowIndexing.MediaCollectionIndexingWorker"],
|
["Pinchflat.Workers.MediaCollectionIndexingWorker", "Pinchflat.SlowIndexing.MediaCollectionIndexingWorker"],
|
||||||
["Pinchflat.Workers.DataBackfillWorker", "Pinchflat.Boot.DataBackfillWorker"]
|
["Pinchflat.Workers.DataBackfillWorker", "Pinchflat.Boot.DataBackfillWorker"]
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilder do
|
|||||||
Builds the options for yt-dlp to download media based on the given media profile.
|
Builds the options for yt-dlp to download media based on the given media profile.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
alias Pinchflat.Sources.Source
|
||||||
alias Pinchflat.Media.MediaItem
|
alias Pinchflat.Media.MediaItem
|
||||||
alias Pinchflat.Downloading.OutputPathBuilder
|
alias Pinchflat.Downloading.OutputPathBuilder
|
||||||
|
|
||||||
@@ -18,7 +19,7 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilder do
|
|||||||
built_options =
|
built_options =
|
||||||
default_options() ++
|
default_options() ++
|
||||||
subtitle_options(media_profile) ++
|
subtitle_options(media_profile) ++
|
||||||
thumbnail_options(media_profile) ++
|
thumbnail_options(media_item_with_preloads) ++
|
||||||
metadata_options(media_profile) ++
|
metadata_options(media_profile) ++
|
||||||
quality_options(media_profile) ++
|
quality_options(media_profile) ++
|
||||||
output_options(media_item_with_preloads)
|
output_options(media_item_with_preloads)
|
||||||
@@ -26,6 +27,18 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilder do
|
|||||||
{:ok, built_options}
|
{:ok, built_options}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Builds the output path for yt-dlp to download media based on the given source's
|
||||||
|
media profile.
|
||||||
|
|
||||||
|
Returns binary()
|
||||||
|
"""
|
||||||
|
def build_output_path_for(%Source{} = source_with_preloads) do
|
||||||
|
output_path_template = source_with_preloads.media_profile.output_path_template
|
||||||
|
|
||||||
|
build_output_path(output_path_template, source_with_preloads)
|
||||||
|
end
|
||||||
|
|
||||||
defp default_options do
|
defp default_options do
|
||||||
[:no_progress, :windows_filenames]
|
[:no_progress, :windows_filenames]
|
||||||
end
|
end
|
||||||
@@ -57,16 +70,19 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilder do
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp thumbnail_options(media_profile) do
|
defp thumbnail_options(media_item_with_preloads) do
|
||||||
|
media_profile = media_item_with_preloads.source.media_profile
|
||||||
mapped_struct = Map.from_struct(media_profile)
|
mapped_struct = Map.from_struct(media_profile)
|
||||||
|
|
||||||
Enum.reduce(mapped_struct, [], fn attr, acc ->
|
Enum.reduce(mapped_struct, [], fn attr, acc ->
|
||||||
case attr do
|
case attr do
|
||||||
{:download_thumbnail, true} ->
|
{:download_thumbnail, true} ->
|
||||||
acc ++ [:write_thumbnail, convert_thumbnail: "jpg"]
|
thumbnail_save_location = determine_thumbnail_location(media_item_with_preloads)
|
||||||
|
|
||||||
|
acc ++ [:write_thumbnail, convert_thumbnail: "jpg", output: "thumbnail:#{thumbnail_save_location}"]
|
||||||
|
|
||||||
{:embed_thumbnail, true} ->
|
{:embed_thumbnail, true} ->
|
||||||
acc ++ [:embed_thumbnail]
|
acc ++ [:embed_thumbnail, convert_thumbnail: "jpg"]
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
acc
|
acc
|
||||||
@@ -96,30 +112,43 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilder do
|
|||||||
:"480p" -> [format_sort: "res:480,#{video_codec_options}"]
|
:"480p" -> [format_sort: "res:480,#{video_codec_options}"]
|
||||||
:"720p" -> [format_sort: "res:720,#{video_codec_options}"]
|
:"720p" -> [format_sort: "res:720,#{video_codec_options}"]
|
||||||
:"1080p" -> [format_sort: "res:1080,#{video_codec_options}"]
|
:"1080p" -> [format_sort: "res:1080,#{video_codec_options}"]
|
||||||
:"1440p" -> [format_sort: "res:1440,#{video_codec_options}"]
|
|
||||||
:"2160p" -> [format_sort: "res:2160,#{video_codec_options}"]
|
:"2160p" -> [format_sort: "res:2160,#{video_codec_options}"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp output_options(media_item_with_preloads) do
|
defp output_options(media_item_with_preloads) do
|
||||||
media_profile = media_item_with_preloads.source.media_profile
|
|
||||||
additional_options_map = output_options_map(media_item_with_preloads)
|
|
||||||
{:ok, output_path} = OutputPathBuilder.build(media_profile.output_path_template, additional_options_map)
|
|
||||||
|
|
||||||
[
|
[
|
||||||
output: Path.join(base_directory(), output_path)
|
output: build_output_path_for(media_item_with_preloads.source)
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
defp output_options_map(media_item_with_preloads) do
|
defp build_output_path(string, source) do
|
||||||
source = media_item_with_preloads.source
|
additional_options_map = output_options_map(source)
|
||||||
|
{:ok, output_path} = OutputPathBuilder.build(string, additional_options_map)
|
||||||
|
|
||||||
|
Path.join(base_directory(), output_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp output_options_map(source) do
|
||||||
%{
|
%{
|
||||||
"source_custom_name" => source.custom_name,
|
"source_custom_name" => source.custom_name,
|
||||||
"source_collection_type" => source.collection_type
|
"source_collection_type" => source.collection_type
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# I don't love the string manipulation here, but what can ya' do.
|
||||||
|
# It's dependent on the output_path_template being a string ending `.{{ ext }}`
|
||||||
|
# (or equivalent), but that's validated by the MediaProfile schema.
|
||||||
|
defp determine_thumbnail_location(media_item_with_preloads) do
|
||||||
|
output_path_template = media_item_with_preloads.source.media_profile.output_path_template
|
||||||
|
|
||||||
|
output_path_template
|
||||||
|
|> String.split(~r{\.}, include_captures: true)
|
||||||
|
|> List.insert_at(-3, "-thumb")
|
||||||
|
|> Enum.join()
|
||||||
|
|> build_output_path(media_item_with_preloads.source)
|
||||||
|
end
|
||||||
|
|
||||||
defp base_directory do
|
defp base_directory do
|
||||||
Application.get_env(:pinchflat, :media_directory)
|
Application.get_env(:pinchflat, :media_directory)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -26,11 +26,7 @@ defmodule Pinchflat.Downloading.DownloadingHelpers do
|
|||||||
def enqueue_pending_download_tasks(%Source{download_media: true} = source) do
|
def enqueue_pending_download_tasks(%Source{download_media: true} = source) do
|
||||||
source
|
source
|
||||||
|> Media.list_pending_media_items_for()
|
|> Media.list_pending_media_items_for()
|
||||||
|> Enum.each(fn media_item ->
|
|> Enum.each(&MediaDownloadWorker.kickoff_with_task/1)
|
||||||
%{id: media_item.id}
|
|
||||||
|> MediaDownloadWorker.new()
|
|
||||||
|> Tasks.create_job_with_task(media_item)
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def enqueue_pending_download_tasks(%Source{download_media: false}) do
|
def enqueue_pending_download_tasks(%Source{download_media: false}) do
|
||||||
|
|||||||
@@ -6,19 +6,32 @@ defmodule Pinchflat.Downloading.MediaDownloadWorker do
|
|||||||
unique: [period: :infinity, states: [:available, :scheduled, :retryable, :executing]],
|
unique: [period: :infinity, states: [:available, :scheduled, :retryable, :executing]],
|
||||||
tags: ["media_item", "media_fetching"]
|
tags: ["media_item", "media_fetching"]
|
||||||
|
|
||||||
|
require Logger
|
||||||
|
|
||||||
|
alias __MODULE__
|
||||||
|
alias Pinchflat.Tasks
|
||||||
alias Pinchflat.Repo
|
alias Pinchflat.Repo
|
||||||
alias Pinchflat.Media
|
alias Pinchflat.Media
|
||||||
alias Pinchflat.Tasks
|
|
||||||
alias Pinchflat.Downloading.MediaDownloader
|
alias Pinchflat.Downloading.MediaDownloader
|
||||||
alias Pinchflat.Filesystem.FilesystemDataWorker
|
|
||||||
|
|
||||||
@impl Oban.Worker
|
@doc """
|
||||||
|
Starts the media_item media download worker and creates a task for the media_item.
|
||||||
|
|
||||||
|
Returns {:ok, %Task{}} | {:error, :duplicate_job} | {:error, %Ecto.Changeset{}}
|
||||||
|
"""
|
||||||
|
def kickoff_with_task(media_item, opts \\ []) do
|
||||||
|
%{id: media_item.id}
|
||||||
|
|> MediaDownloadWorker.new(opts)
|
||||||
|
|> Tasks.create_job_with_task(media_item)
|
||||||
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
For a given media item, download the media alongside any options.
|
For a given media item, download the media alongside any options.
|
||||||
Does not download media if its source is set to not download media.
|
Does not download media if its source is set to not download media.
|
||||||
|
|
||||||
Returns :ok | {:ok, %MediaItem{}} | {:error, any, ...any}
|
Returns :ok | {:ok, %MediaItem{}} | {:error, any, ...any}
|
||||||
"""
|
"""
|
||||||
|
@impl Oban.Worker
|
||||||
def perform(%Oban.Job{args: %{"id" => media_item_id}}) do
|
def perform(%Oban.Job{args: %{"id" => media_item_id}}) do
|
||||||
media_item =
|
media_item =
|
||||||
media_item_id
|
media_item_id
|
||||||
@@ -31,26 +44,30 @@ defmodule Pinchflat.Downloading.MediaDownloadWorker do
|
|||||||
else
|
else
|
||||||
:ok
|
:ok
|
||||||
end
|
end
|
||||||
|
rescue
|
||||||
|
Ecto.NoResultsError -> Logger.info("#{__MODULE__} discarded: media item #{media_item_id} not found")
|
||||||
|
Ecto.StaleEntryError -> Logger.info("#{__MODULE__} discarded: media item #{media_item_id} stale")
|
||||||
end
|
end
|
||||||
|
|
||||||
defp download_media_and_schedule_jobs(media_item) do
|
defp download_media_and_schedule_jobs(media_item) do
|
||||||
case MediaDownloader.download_for_media_item(media_item) do
|
case MediaDownloader.download_for_media_item(media_item) do
|
||||||
{:ok, _} ->
|
{:ok, updated_media_item} ->
|
||||||
schedule_filesystem_data_worker(media_item)
|
compute_and_save_media_filesize(updated_media_item)
|
||||||
{:ok, media_item}
|
|
||||||
|
{:ok, updated_media_item}
|
||||||
|
|
||||||
err ->
|
err ->
|
||||||
err
|
err
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp schedule_filesystem_data_worker(media_item) do
|
defp compute_and_save_media_filesize(media_item) do
|
||||||
%{id: media_item.id}
|
case File.stat(media_item.media_filepath) do
|
||||||
|> FilesystemDataWorker.new()
|
{:ok, %{size: size}} ->
|
||||||
|> Tasks.create_job_with_task(media_item)
|
Media.update_media_item(media_item, %{media_size_bytes: size})
|
||||||
|> case do
|
|
||||||
{:ok, task} -> {:ok, task}
|
_ ->
|
||||||
{:error, :duplicate_job} -> {:ok, :job_exists}
|
:ok
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -8,11 +8,12 @@ defmodule Pinchflat.Downloading.MediaDownloader do
|
|||||||
alias Pinchflat.Repo
|
alias Pinchflat.Repo
|
||||||
alias Pinchflat.Media
|
alias Pinchflat.Media
|
||||||
alias Pinchflat.Media.MediaItem
|
alias Pinchflat.Media.MediaItem
|
||||||
|
alias Pinchflat.Metadata.NfoBuilder
|
||||||
|
alias Pinchflat.Metadata.MetadataParser
|
||||||
|
alias Pinchflat.Metadata.MetadataFileHelpers
|
||||||
|
alias Pinchflat.Downloading.DownloadOptionBuilder
|
||||||
|
|
||||||
alias Pinchflat.YtDlp.Media, as: YtDlpMedia
|
alias Pinchflat.YtDlp.Media, as: YtDlpMedia
|
||||||
alias Pinchflat.Downloading.DownloadOptionBuilder, as: YtDlpDownloadOptionBuilder
|
|
||||||
alias Pinchflat.Metadata.MetadataParser, as: YtDlpMetadataParser
|
|
||||||
alias Pinchflat.Metadata.MetadataFileHelpers, as: YtDlpMetadataHelpers
|
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Downloads media for a media item, updating the media item based on the metadata
|
Downloads media for a media item, updating the media item based on the metadata
|
||||||
@@ -30,16 +31,17 @@ defmodule Pinchflat.Downloading.MediaDownloader do
|
|||||||
|
|
||||||
case download_with_options(media_item.original_url, item_with_preloads) do
|
case download_with_options(media_item.original_url, item_with_preloads) do
|
||||||
{:ok, parsed_json} ->
|
{:ok, parsed_json} ->
|
||||||
{parser, helpers} = {YtDlpMetadataParser, YtDlpMetadataHelpers}
|
|
||||||
|
|
||||||
parsed_attrs =
|
parsed_attrs =
|
||||||
parsed_json
|
parsed_json
|
||||||
|> parser.parse_for_media_item()
|
|> MetadataParser.parse_for_media_item()
|
||||||
|> Map.merge(%{
|
|> Map.merge(%{
|
||||||
media_downloaded_at: DateTime.utc_now(),
|
media_downloaded_at: DateTime.utc_now(),
|
||||||
|
nfo_filepath: determine_nfo_filepath(item_with_preloads, parsed_json),
|
||||||
metadata: %{
|
metadata: %{
|
||||||
metadata_filepath: helpers.compress_and_store_metadata_for(media_item, parsed_json),
|
# IDEA: might be worth kicking off a job for this since thumbnail fetching
|
||||||
thumbnail_filepath: helpers.download_and_store_thumbnail_for(media_item, parsed_json)
|
# could fail and I want to handle that in isolation
|
||||||
|
metadata_filepath: MetadataFileHelpers.compress_and_store_metadata_for(media_item, parsed_json),
|
||||||
|
thumbnail_filepath: MetadataFileHelpers.download_and_store_thumbnail_for(media_item, parsed_json)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -52,13 +54,18 @@ defmodule Pinchflat.Downloading.MediaDownloader do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# def download_for_source(source, url) do
|
defp determine_nfo_filepath(media_item, parsed_json) do
|
||||||
# # Create MI from source and URL
|
if media_item.source.media_profile.download_nfo do
|
||||||
# media_item = nil
|
filepath = Path.rootname(parsed_json["filepath"]) <> ".nfo"
|
||||||
# end
|
|
||||||
|
NfoBuilder.build_and_store_for_media_item(filepath, parsed_json)
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp download_with_options(url, item_with_preloads) do
|
defp download_with_options(url, item_with_preloads) do
|
||||||
{:ok, options} = YtDlpDownloadOptionBuilder.build(item_with_preloads)
|
{:ok, options} = DownloadOptionBuilder.build(item_with_preloads)
|
||||||
|
|
||||||
YtDlpMedia.download(url, options)
|
YtDlpMedia.download(url, options)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -40,7 +40,9 @@ defmodule Pinchflat.Downloading.OutputPathBuilder do
|
|||||||
"upload_year" => "%(upload_date>%Y)S",
|
"upload_year" => "%(upload_date>%Y)S",
|
||||||
"upload_month" => "%(upload_date>%m)S",
|
"upload_month" => "%(upload_date>%m)S",
|
||||||
"upload_day" => "%(upload_date>%d)S",
|
"upload_day" => "%(upload_date>%d)S",
|
||||||
"upload_yyyy_mm_dd" => "%(upload_date>%Y)S-%(upload_date>%m)S-%(upload_date>%d)S"
|
"upload_yyyy_mm_dd" => "%(upload_date>%Y-%m-%d)S",
|
||||||
|
"season_from_date" => "%(upload_date>%Y)S",
|
||||||
|
"season_episode_from_date" => "s%(upload_date>%Y)Se%(upload_date>%m%d)S"
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -6,34 +6,13 @@ defmodule Pinchflat.FastIndexing.FastIndexingHelpers do
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
alias Pinchflat.Media
|
alias Pinchflat.Media
|
||||||
alias Pinchflat.Tasks
|
|
||||||
alias Pinchflat.Sources.Source
|
alias Pinchflat.Sources.Source
|
||||||
alias Pinchflat.FastIndexing.YoutubeRss
|
alias Pinchflat.FastIndexing.YoutubeRss
|
||||||
alias Pinchflat.FastIndexing.FastIndexingWorker
|
|
||||||
alias Pinchflat.Downloading.MediaDownloadWorker
|
alias Pinchflat.Downloading.MediaDownloadWorker
|
||||||
alias Pinchflat.FastIndexing.MediaIndexingWorker
|
alias Pinchflat.FastIndexing.MediaIndexingWorker
|
||||||
|
|
||||||
alias Pinchflat.YtDlp.Media, as: YtDlpMedia
|
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 """
|
@doc """
|
||||||
Fetches new media IDs from a source's YouTube RSS feed and kicks off indexing tasks
|
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
|
for any new media items. See comments in `MediaIndexingWorker` for more info on the
|
||||||
@@ -54,9 +33,7 @@ defmodule Pinchflat.FastIndexing.FastIndexingHelpers do
|
|||||||
Enum.each(new_media_ids, fn media_id ->
|
Enum.each(new_media_ids, fn media_id ->
|
||||||
url = "https://www.youtube.com/watch?v=#{media_id}"
|
url = "https://www.youtube.com/watch?v=#{media_id}"
|
||||||
|
|
||||||
%{id: source.id, media_url: url}
|
MediaIndexingWorker.kickoff_with_task(source, url)
|
||||||
|> MediaIndexingWorker.new()
|
|
||||||
|> Tasks.create_job_with_task(source)
|
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -74,9 +51,7 @@ defmodule Pinchflat.FastIndexing.FastIndexingHelpers do
|
|||||||
case maybe_media_item do
|
case maybe_media_item do
|
||||||
{:ok, media_item} ->
|
{:ok, media_item} ->
|
||||||
if source.download_media && Media.pending_download?(media_item) do
|
if source.download_media && Media.pending_download?(media_item) do
|
||||||
%{id: media_item.id}
|
MediaDownloadWorker.kickoff_with_task(media_item)
|
||||||
|> MediaDownloadWorker.new()
|
|
||||||
|> Tasks.create_job_with_task(media_item)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
{:ok, media_item}
|
{:ok, media_item}
|
||||||
|
|||||||
@@ -6,13 +6,25 @@ defmodule Pinchflat.FastIndexing.FastIndexingWorker do
|
|||||||
unique: [period: :infinity, states: [:available, :scheduled, :retryable]],
|
unique: [period: :infinity, states: [:available, :scheduled, :retryable]],
|
||||||
tags: ["media_source", "fast_indexing"]
|
tags: ["media_source", "fast_indexing"]
|
||||||
|
|
||||||
|
require Logger
|
||||||
|
|
||||||
alias __MODULE__
|
alias __MODULE__
|
||||||
alias Pinchflat.Tasks
|
alias Pinchflat.Tasks
|
||||||
alias Pinchflat.Sources
|
alias Pinchflat.Sources
|
||||||
alias Pinchflat.Sources.Source
|
alias Pinchflat.Sources.Source
|
||||||
alias Pinchflat.FastIndexing.FastIndexingHelpers
|
alias Pinchflat.FastIndexing.FastIndexingHelpers
|
||||||
|
|
||||||
@impl Oban.Worker
|
@doc """
|
||||||
|
Starts the source fast indexing worker and creates a task for the source.
|
||||||
|
|
||||||
|
Returns {:ok, %Task{}} | {:error, :duplicate_job} | {:error, %Ecto.Changeset{}}
|
||||||
|
"""
|
||||||
|
def kickoff_with_task(source, opts \\ []) do
|
||||||
|
%{id: source.id}
|
||||||
|
|> FastIndexingWorker.new(opts)
|
||||||
|
|> Tasks.create_job_with_task(source)
|
||||||
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Kicks off the fast indexing process for a source, reschedules the job to run again
|
Kicks off the fast indexing process for a source, reschedules the job to run again
|
||||||
once complete. See `MediaCollectionIndexingWorker` and `MediaIndexingWorker` comments
|
once complete. See `MediaCollectionIndexingWorker` and `MediaIndexingWorker` comments
|
||||||
@@ -20,6 +32,7 @@ defmodule Pinchflat.FastIndexing.FastIndexingWorker do
|
|||||||
|
|
||||||
Returns :ok | {:ok, :job_exists} | {:ok, %Task{}}
|
Returns :ok | {:ok, :job_exists} | {:ok, %Task{}}
|
||||||
"""
|
"""
|
||||||
|
@impl Oban.Worker
|
||||||
def perform(%Oban.Job{args: %{"id" => source_id}}) do
|
def perform(%Oban.Job{args: %{"id" => source_id}}) do
|
||||||
source = Sources.get_source!(source_id)
|
source = Sources.get_source!(source_id)
|
||||||
|
|
||||||
@@ -30,15 +43,15 @@ defmodule Pinchflat.FastIndexing.FastIndexingWorker do
|
|||||||
else
|
else
|
||||||
:ok
|
:ok
|
||||||
end
|
end
|
||||||
|
rescue
|
||||||
|
Ecto.NoResultsError -> Logger.info("#{__MODULE__} discarded: source #{source_id} not found")
|
||||||
|
Ecto.StaleEntryError -> Logger.info("#{__MODULE__} discarded: source #{source_id} stale")
|
||||||
end
|
end
|
||||||
|
|
||||||
defp reschedule_indexing(source) do
|
defp reschedule_indexing(source) do
|
||||||
next_run_in = Source.fast_index_frequency() * 60
|
next_run_in = Source.fast_index_frequency() * 60
|
||||||
|
|
||||||
%{id: source.id}
|
case kickoff_with_task(source, schedule_in: next_run_in) do
|
||||||
|> FastIndexingWorker.new(schedule_in: next_run_in)
|
|
||||||
|> Tasks.create_job_with_task(source)
|
|
||||||
|> case do
|
|
||||||
{:ok, task} -> {:ok, task}
|
{:ok, task} -> {:ok, task}
|
||||||
{:error, :duplicate_job} -> {:ok, :job_exists}
|
{:error, :duplicate_job} -> {:ok, :job_exists}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -8,10 +8,22 @@ defmodule Pinchflat.FastIndexing.MediaIndexingWorker do
|
|||||||
|
|
||||||
require Logger
|
require Logger
|
||||||
|
|
||||||
|
alias __MODULE__
|
||||||
|
alias Pinchflat.Tasks
|
||||||
alias Pinchflat.Sources
|
alias Pinchflat.Sources
|
||||||
alias Pinchflat.FastIndexing.FastIndexingHelpers
|
alias Pinchflat.FastIndexing.FastIndexingHelpers
|
||||||
|
|
||||||
@impl Oban.Worker
|
@doc """
|
||||||
|
Starts the fast media indexing worker and creates a task for the source.
|
||||||
|
|
||||||
|
Returns {:ok, %Task{}} | {:error, :duplicate_job} | {:error, %Ecto.Changeset{}}
|
||||||
|
"""
|
||||||
|
def kickoff_with_task(source, media_url, opts \\ []) do
|
||||||
|
%{id: source.id, media_url: media_url}
|
||||||
|
|> MediaIndexingWorker.new(opts)
|
||||||
|
|> Tasks.create_job_with_task(source)
|
||||||
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Similar to `MediaCollectionIndexingWorker`, but for individual media items.
|
Similar to `MediaCollectionIndexingWorker`, but for individual media items.
|
||||||
Does not reschedule or check anything to do with a source's indexing
|
Does not reschedule or check anything to do with a source's indexing
|
||||||
@@ -37,6 +49,7 @@ defmodule Pinchflat.FastIndexing.MediaIndexingWorker do
|
|||||||
|
|
||||||
Returns :ok
|
Returns :ok
|
||||||
"""
|
"""
|
||||||
|
@impl Oban.Worker
|
||||||
def perform(%Oban.Job{args: %{"id" => source_id, "media_url" => media_url}}) do
|
def perform(%Oban.Job{args: %{"id" => source_id, "media_url" => media_url}}) do
|
||||||
source = Sources.get_source!(source_id)
|
source = Sources.get_source!(source_id)
|
||||||
|
|
||||||
@@ -49,5 +62,8 @@ defmodule Pinchflat.FastIndexing.MediaIndexingWorker do
|
|||||||
end
|
end
|
||||||
|
|
||||||
:ok
|
:ok
|
||||||
|
rescue
|
||||||
|
Ecto.NoResultsError -> Logger.info("#{__MODULE__} discarded: source #{source_id} not found")
|
||||||
|
Ecto.StaleEntryError -> Logger.info("#{__MODULE__} discarded: source #{source_id} stale")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
defmodule Pinchflat.Filesystem.FilesystemDataWorker do
|
|
||||||
@moduledoc false
|
|
||||||
|
|
||||||
use Oban.Worker,
|
|
||||||
queue: :media_local_metadata,
|
|
||||||
tags: ["media_item", "media_metadata", "local_metadata"],
|
|
||||||
max_attempts: 1
|
|
||||||
|
|
||||||
alias Pinchflat.Media
|
|
||||||
alias Pinchflat.Filesystem.FilesystemHelpers
|
|
||||||
|
|
||||||
@impl Oban.Worker
|
|
||||||
@doc """
|
|
||||||
For a given media item, compute and save metadata about the file on-disk.
|
|
||||||
|
|
||||||
Returns :ok
|
|
||||||
"""
|
|
||||||
def perform(%Oban.Job{args: %{"id" => media_item_id}}) do
|
|
||||||
media_item = Media.get_media_item!(media_item_id)
|
|
||||||
|
|
||||||
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.
|
|
||||||
:ok
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -15,12 +15,38 @@ defmodule Pinchflat.Filesystem.FilesystemHelpers do
|
|||||||
tmpfile_directory = Application.get_env(:pinchflat, :tmpfile_directory)
|
tmpfile_directory = Application.get_env(:pinchflat, :tmpfile_directory)
|
||||||
filepath = Path.join([tmpfile_directory, "#{StringUtils.random_string(64)}.#{type}"])
|
filepath = Path.join([tmpfile_directory, "#{StringUtils.random_string(64)}.#{type}"])
|
||||||
|
|
||||||
:ok = File.mkdir_p!(Path.dirname(filepath))
|
:ok = write_p!(filepath, "")
|
||||||
:ok = File.write(filepath, "")
|
|
||||||
|
|
||||||
filepath
|
filepath
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Writes content to a file, creating directories as needed.
|
||||||
|
Takes the same args as File.write!/3.
|
||||||
|
|
||||||
|
Returns :ok | raises on error
|
||||||
|
"""
|
||||||
|
def write_p!(filepath, content, modes \\ []) do
|
||||||
|
filepath
|
||||||
|
|> Path.dirname()
|
||||||
|
|> File.mkdir_p!()
|
||||||
|
|
||||||
|
File.write!(filepath, content, modes)
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Copies a file from source to destination, creating directories as needed.
|
||||||
|
|
||||||
|
Returns :ok | raises on error
|
||||||
|
"""
|
||||||
|
def cp_p!(source, destination) do
|
||||||
|
destination
|
||||||
|
|> Path.dirname()
|
||||||
|
|> File.mkdir_p!()
|
||||||
|
|
||||||
|
File.cp!(source, destination)
|
||||||
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Fetches the file size of a media item and saves it to the database.
|
Fetches the file size of a media item and saves it to the database.
|
||||||
|
|
||||||
@@ -35,4 +61,36 @@ defmodule Pinchflat.Filesystem.FilesystemHelpers do
|
|||||||
err
|
err
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Deletes a file and removes any empty directories in the path.
|
||||||
|
Does NOT remove any directories that are not empty.
|
||||||
|
|
||||||
|
Returns :ok | {:error, any()}
|
||||||
|
"""
|
||||||
|
def delete_file_and_remove_empty_directories(filepath) do
|
||||||
|
case File.rm(filepath) do
|
||||||
|
:ok ->
|
||||||
|
filepath
|
||||||
|
|> Path.dirname()
|
||||||
|
|> recursively_delete_empty_directories()
|
||||||
|
|
||||||
|
err ->
|
||||||
|
err
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp recursively_delete_empty_directories(directory) do
|
||||||
|
case File.rmdir(directory) do
|
||||||
|
:ok ->
|
||||||
|
directory
|
||||||
|
|> Path.dirname()
|
||||||
|
|> recursively_delete_empty_directories()
|
||||||
|
|
||||||
|
err ->
|
||||||
|
err
|
||||||
|
end
|
||||||
|
|
||||||
|
:ok
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@@ -7,9 +7,10 @@ defmodule Pinchflat.Media do
|
|||||||
|
|
||||||
alias Pinchflat.Repo
|
alias Pinchflat.Repo
|
||||||
alias Pinchflat.Tasks
|
alias Pinchflat.Tasks
|
||||||
alias Pinchflat.Media.MediaItem
|
|
||||||
alias Pinchflat.Sources.Source
|
alias Pinchflat.Sources.Source
|
||||||
|
alias Pinchflat.Media.MediaItem
|
||||||
alias Pinchflat.Metadata.MediaMetadata
|
alias Pinchflat.Metadata.MediaMetadata
|
||||||
|
alias Pinchflat.Filesystem.FilesystemHelpers
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Returns the list of media_items.
|
Returns the list of media_items.
|
||||||
@@ -65,6 +66,7 @@ defmodule Pinchflat.Media do
|
|||||||
|> where([mi], mi.source_id == ^source.id and is_nil(mi.media_filepath))
|
|> where([mi], mi.source_id == ^source.id and is_nil(mi.media_filepath))
|
||||||
|> where(^build_format_clauses(media_profile))
|
|> where(^build_format_clauses(media_profile))
|
||||||
|> where(^maybe_apply_cutoff_date(source))
|
|> where(^maybe_apply_cutoff_date(source))
|
||||||
|
|> where(^maybe_apply_title_regex(source))
|
||||||
|> Repo.maybe_limit(limit)
|
|> Repo.maybe_limit(limit)
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
end
|
end
|
||||||
@@ -141,38 +143,6 @@ defmodule Pinchflat.Media do
|
|||||||
"""
|
"""
|
||||||
def get_media_item!(id), do: Repo.get!(MediaItem, id)
|
def get_media_item!(id), do: Repo.get!(MediaItem, id)
|
||||||
|
|
||||||
@doc """
|
|
||||||
Produces a flat list of the filesystem paths for a media_item's downloaded files
|
|
||||||
|
|
||||||
Returns [binary()]
|
|
||||||
"""
|
|
||||||
def media_filepaths(media_item) do
|
|
||||||
mapped_struct = Map.from_struct(media_item)
|
|
||||||
|
|
||||||
MediaItem.filepath_attributes()
|
|
||||||
|> Enum.map(fn
|
|
||||||
:subtitle_filepaths = field -> Enum.map(mapped_struct[field], fn [_, filepath] -> filepath end)
|
|
||||||
field -> List.wrap(mapped_struct[field])
|
|
||||||
end)
|
|
||||||
|> List.flatten()
|
|
||||||
|> Enum.filter(&is_binary/1)
|
|
||||||
end
|
|
||||||
|
|
||||||
@doc """
|
|
||||||
Produces a flat list of the filesystem paths for a media_item's metadata files.
|
|
||||||
Returns an empty list if the media_item has no metadata.
|
|
||||||
|
|
||||||
Returns [binary()] | []
|
|
||||||
"""
|
|
||||||
def metadata_filepaths(media_item) do
|
|
||||||
metadata = Repo.preload(media_item, :metadata).metadata || %MediaMetadata{}
|
|
||||||
mapped_struct = Map.from_struct(metadata)
|
|
||||||
|
|
||||||
MediaMetadata.filepath_attributes()
|
|
||||||
|> Enum.map(fn field -> mapped_struct[field] end)
|
|
||||||
|> Enum.filter(&is_binary/1)
|
|
||||||
end
|
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Creates a media_item.
|
Creates a media_item.
|
||||||
|
|
||||||
@@ -219,19 +189,22 @@ defmodule Pinchflat.Media do
|
|||||||
end
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Deletes a media_item and its associated tasks.
|
Deletes a media_item, its associated tasks, and our internal metadata files.
|
||||||
Can optionally delete the media_item's files.
|
Can optionally delete the media_item's media files (media, thumbnail, subtitles, etc).
|
||||||
|
|
||||||
Returns {:ok, %MediaItem{}} | {:error, %Ecto.Changeset{}}
|
Returns {:ok, %MediaItem{}} | {:error, %Ecto.Changeset{}}
|
||||||
"""
|
"""
|
||||||
def delete_media_item(%MediaItem{} = media_item, opts \\ []) do
|
def delete_media_item(%MediaItem{} = media_item, opts \\ []) do
|
||||||
delete_files = Keyword.get(opts, :delete_files, false)
|
delete_files = Keyword.get(opts, :delete_files, false)
|
||||||
|
|
||||||
|
Tasks.delete_tasks_for(media_item)
|
||||||
|
|
||||||
if delete_files do
|
if delete_files do
|
||||||
{:ok, _} = delete_all_attachments(media_item)
|
{:ok, _} = delete_media_files(media_item)
|
||||||
end
|
end
|
||||||
|
|
||||||
Tasks.delete_tasks_for(media_item)
|
# Should delete these no matter what
|
||||||
|
delete_internal_metadata_files(media_item)
|
||||||
Repo.delete(media_item)
|
Repo.delete(media_item)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -242,26 +215,31 @@ defmodule Pinchflat.Media do
|
|||||||
MediaItem.changeset(media_item, attrs)
|
MediaItem.changeset(media_item, attrs)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp delete_all_attachments(media_item) do
|
defp delete_media_files(media_item) do
|
||||||
media_item = Repo.preload(media_item, :metadata)
|
mapped_struct = Map.from_struct(media_item)
|
||||||
|
|
||||||
media_item
|
MediaItem.filepath_attributes()
|
||||||
|> media_filepaths()
|
|> Enum.map(fn
|
||||||
|> Enum.concat(metadata_filepaths(media_item))
|
:subtitle_filepaths = field -> Enum.map(mapped_struct[field], fn [_, filepath] -> filepath end)
|
||||||
|> Enum.each(&File.rm/1)
|
field -> List.wrap(mapped_struct[field])
|
||||||
|
end)
|
||||||
# rmdir will attempt to delete the directory, but only if it is empty
|
|> List.flatten()
|
||||||
if media_item.media_filepath do
|
|> Enum.filter(&is_binary/1)
|
||||||
File.rmdir(Path.dirname(media_item.media_filepath))
|
|> Enum.each(&FilesystemHelpers.delete_file_and_remove_empty_directories/1)
|
||||||
end
|
|
||||||
|
|
||||||
if media_item.metadata && media_item.metadata.metadata_filepath do
|
|
||||||
File.rmdir(Path.dirname(media_item.metadata.metadata_filepath))
|
|
||||||
end
|
|
||||||
|
|
||||||
{:ok, media_item}
|
{:ok, media_item}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp delete_internal_metadata_files(media_item) do
|
||||||
|
metadata = Repo.preload(media_item, :metadata).metadata || %MediaMetadata{}
|
||||||
|
mapped_struct = Map.from_struct(metadata)
|
||||||
|
|
||||||
|
MediaMetadata.filepath_attributes()
|
||||||
|
|> Enum.map(fn field -> mapped_struct[field] end)
|
||||||
|
|> Enum.filter(&is_binary/1)
|
||||||
|
|> Enum.each(&FilesystemHelpers.delete_file_and_remove_empty_directories/1)
|
||||||
|
end
|
||||||
|
|
||||||
defp maybe_apply_cutoff_date(source) do
|
defp maybe_apply_cutoff_date(source) do
|
||||||
if source.download_cutoff_date do
|
if source.download_cutoff_date do
|
||||||
dynamic([mi], mi.upload_date >= ^source.download_cutoff_date)
|
dynamic([mi], mi.upload_date >= ^source.download_cutoff_date)
|
||||||
@@ -270,6 +248,14 @@ defmodule Pinchflat.Media do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp maybe_apply_title_regex(source) do
|
||||||
|
if source.title_filter_regex do
|
||||||
|
dynamic([mi], fragment("regexp_like(?, ?)", mi.title, ^source.title_filter_regex))
|
||||||
|
else
|
||||||
|
dynamic(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp build_format_clauses(media_profile) do
|
defp build_format_clauses(media_profile) do
|
||||||
mapped_struct = Map.from_struct(media_profile)
|
mapped_struct = Map.from_struct(media_profile)
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ defmodule Pinchflat.Media.MediaItem do
|
|||||||
:media_size_bytes,
|
:media_size_bytes,
|
||||||
:subtitle_filepaths,
|
:subtitle_filepaths,
|
||||||
:thumbnail_filepath,
|
:thumbnail_filepath,
|
||||||
:metadata_filepath
|
:metadata_filepath,
|
||||||
|
:nfo_filepath
|
||||||
]
|
]
|
||||||
# Pretty much all the fields captured at index are required.
|
# Pretty much all the fields captured at index are required.
|
||||||
@required_fields ~w(
|
@required_fields ~w(
|
||||||
@@ -54,6 +55,7 @@ defmodule Pinchflat.Media.MediaItem do
|
|||||||
field :media_size_bytes, :integer
|
field :media_size_bytes, :integer
|
||||||
field :thumbnail_filepath, :string
|
field :thumbnail_filepath, :string
|
||||||
field :metadata_filepath, :string
|
field :metadata_filepath, :string
|
||||||
|
field :nfo_filepath, :string
|
||||||
# This is an array of [iso-2 language, filepath] pairs. Probably could
|
# This is an array of [iso-2 language, filepath] pairs. Probably could
|
||||||
# be an associated record, but I don't see the benefit right now.
|
# be an associated record, but I don't see the benefit right now.
|
||||||
# Will very likely revisit because I can't leave well-enough alone.
|
# Will very likely revisit because I can't leave well-enough alone.
|
||||||
@@ -82,6 +84,6 @@ defmodule Pinchflat.Media.MediaItem do
|
|||||||
|
|
||||||
@doc false
|
@doc false
|
||||||
def filepath_attributes do
|
def filepath_attributes do
|
||||||
~w(media_filepath thumbnail_filepath metadata_filepath subtitle_filepaths)a
|
~w(media_filepath thumbnail_filepath metadata_filepath subtitle_filepaths nfo_filepath)a
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -9,6 +9,8 @@ defmodule Pinchflat.Metadata.MetadataFileHelpers do
|
|||||||
needed
|
needed
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
alias Pinchflat.Filesystem.FilesystemHelpers
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Compresses and stores metadata for a media item, returning the filepath.
|
Compresses and stores metadata for a media item, returning the filepath.
|
||||||
|
|
||||||
@@ -18,8 +20,7 @@ defmodule Pinchflat.Metadata.MetadataFileHelpers do
|
|||||||
filepath = generate_filepath_for(database_record, "metadata.json.gz")
|
filepath = generate_filepath_for(database_record, "metadata.json.gz")
|
||||||
{:ok, json} = Phoenix.json_library().encode(metadata_map)
|
{:ok, json} = Phoenix.json_library().encode(metadata_map)
|
||||||
|
|
||||||
File.mkdir_p!(Path.dirname(filepath))
|
:ok = FilesystemHelpers.write_p!(filepath, json, [:compressed])
|
||||||
:ok = File.write(filepath, json, [:compressed])
|
|
||||||
|
|
||||||
filepath
|
filepath
|
||||||
end
|
end
|
||||||
@@ -45,12 +46,60 @@ defmodule Pinchflat.Metadata.MetadataFileHelpers do
|
|||||||
filepath = generate_filepath_for(database_record, Path.basename(thumbnail_url))
|
filepath = generate_filepath_for(database_record, Path.basename(thumbnail_url))
|
||||||
thumbnail_blob = fetch_thumbnail_from_url(thumbnail_url)
|
thumbnail_blob = fetch_thumbnail_from_url(thumbnail_url)
|
||||||
|
|
||||||
File.mkdir_p!(Path.dirname(filepath))
|
:ok = FilesystemHelpers.write_p!(filepath, thumbnail_blob)
|
||||||
:ok = File.write(filepath, thumbnail_blob)
|
|
||||||
|
|
||||||
filepath
|
filepath
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Parses an upload date from the YYYYMMDD string returned in yt-dlp metadata
|
||||||
|
and returns a Date struct.
|
||||||
|
|
||||||
|
Returns Date.t()
|
||||||
|
"""
|
||||||
|
def parse_upload_date(upload_date) do
|
||||||
|
<<year::binary-size(4)>> <> <<month::binary-size(2)>> <> <<day::binary-size(2)>> = upload_date
|
||||||
|
|
||||||
|
Date.from_iso8601!("#{year}-#{month}-#{day}")
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Attempts to determine the series directory from a media filepath.
|
||||||
|
The series directory is the "root" directory for a given source
|
||||||
|
which should contain all the season-level folders of that source.
|
||||||
|
|
||||||
|
Used for determining where to store things like NFO data and banners
|
||||||
|
for media center apps. Not useful without a media center app.
|
||||||
|
|
||||||
|
Returns {:ok, binary()} | {:error, :indeterminable}
|
||||||
|
"""
|
||||||
|
def series_directory_from_media_filepath(media_filepath) do
|
||||||
|
# Matches "s" or "season" (case-insensitive)
|
||||||
|
# followed by an optional non-word character (. or _ or <space>, etc)
|
||||||
|
# followed by at least one digit
|
||||||
|
# followed immediately by the end of the string
|
||||||
|
# Example matches: s1, s.1, s01 season 1, Season.01, Season_1, Season 1, Season1
|
||||||
|
# Example non-matches: s01e01, season, series 1,
|
||||||
|
season_regex = ~r/^s(eason)?(\W|_)?\d{1,}$/i
|
||||||
|
|
||||||
|
{series_directory, found_series_directory} =
|
||||||
|
media_filepath
|
||||||
|
|> Path.split()
|
||||||
|
|> Enum.reduce_while({[], false}, fn part, {directory_acc, _} ->
|
||||||
|
if String.match?(part, season_regex) do
|
||||||
|
{:halt, {directory_acc, true}}
|
||||||
|
else
|
||||||
|
{:cont, {directory_acc ++ [part], false}}
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
if found_series_directory do
|
||||||
|
{:ok, Path.join(series_directory)}
|
||||||
|
else
|
||||||
|
{:error, :indeterminable}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp fetch_thumbnail_from_url(url) do
|
defp fetch_thumbnail_from_url(url) do
|
||||||
http_client = Application.get_env(:pinchflat, :http_client, Pinchflat.HTTP.HTTPClient)
|
http_client = Application.get_env(:pinchflat, :http_client, Pinchflat.HTTP.HTTPClient)
|
||||||
{:ok, body} = http_client.get(url, [], body_format: :binary)
|
{:ok, body} = http_client.get(url, [], body_format: :binary)
|
||||||
|
|||||||
@@ -54,9 +54,22 @@ defmodule Pinchflat.Metadata.MetadataParser do
|
|||||||
|> Enum.reverse()
|
|> Enum.reverse()
|
||||||
|> Enum.find_value(fn attrs -> attrs["filepath"] end)
|
|> Enum.find_value(fn attrs -> attrs["filepath"] end)
|
||||||
|
|
||||||
%{
|
if thumbnail_filepath do
|
||||||
thumbnail_filepath: thumbnail_filepath
|
# NOTE: whole ordeal needed due to a bug I found in yt-dlp
|
||||||
}
|
# https://github.com/yt-dlp/yt-dlp/issues/9445
|
||||||
|
# Can be reverted to remove this entire conditional once fixed
|
||||||
|
%{
|
||||||
|
thumbnail_filepath:
|
||||||
|
thumbnail_filepath
|
||||||
|
|> String.split(~r{\.}, include_captures: true)
|
||||||
|
|> List.insert_at(-3, "-thumb")
|
||||||
|
|> Enum.join()
|
||||||
|
}
|
||||||
|
else
|
||||||
|
%{
|
||||||
|
thumbnail_filepath: thumbnail_filepath
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp parse_infojson_metadata(metadata) do
|
defp parse_infojson_metadata(metadata) do
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
defmodule Pinchflat.Metadata.NfoBuilder do
|
||||||
|
@moduledoc """
|
||||||
|
Provides methods for building and storing NFO files for
|
||||||
|
use by Kodi/Jellyfin and other media center software.
|
||||||
|
"""
|
||||||
|
|
||||||
|
alias Pinchflat.Metadata.MetadataFileHelpers
|
||||||
|
alias Pinchflat.Filesystem.FilesystemHelpers
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Builds an NFO file for a media item (read: single "episode") and
|
||||||
|
stores it at the specified location.
|
||||||
|
|
||||||
|
Returns the filepath of the NFO file.
|
||||||
|
"""
|
||||||
|
def build_and_store_for_media_item(filepath, metadata) do
|
||||||
|
nfo = build_for_media_item(metadata)
|
||||||
|
|
||||||
|
FilesystemHelpers.write_p!(filepath, nfo)
|
||||||
|
|
||||||
|
filepath
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Builds an NFO file for a souce and stores it at the specified location.
|
||||||
|
Technically works for playlists, but it's really made for channels.
|
||||||
|
|
||||||
|
Returns the filepath of the NFO file.
|
||||||
|
"""
|
||||||
|
def build_and_store_for_source(filepath, metadata) do
|
||||||
|
nfo = build_for_source(metadata)
|
||||||
|
|
||||||
|
FilesystemHelpers.write_p!(filepath, nfo)
|
||||||
|
|
||||||
|
filepath
|
||||||
|
end
|
||||||
|
|
||||||
|
defp build_for_media_item(metadata) do
|
||||||
|
upload_date = MetadataFileHelpers.parse_upload_date(metadata["upload_date"])
|
||||||
|
# Cribbed from a combination of the Kodi wiki, ytdl-nfo, and ytdl-sub.
|
||||||
|
# WHO NEEDS A FANCY XML PARSER ANYWAY?!
|
||||||
|
"""
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||||
|
<episodedetails>
|
||||||
|
<title>#{metadata["title"]}</title>
|
||||||
|
<showtitle>#{metadata["uploader"]}</showtitle>
|
||||||
|
<uniqueid type="youtube" default="true">#{metadata["id"]}</uniqueid>
|
||||||
|
<plot>#{metadata["description"]}</plot>
|
||||||
|
<aired>#{upload_date}</aired>
|
||||||
|
<season>#{upload_date.year}</season>
|
||||||
|
<episode>#{Calendar.strftime(upload_date, "%m%d")}</episode>
|
||||||
|
<genre>YouTube</genre>
|
||||||
|
</episodedetails>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
defp build_for_source(metadata) do
|
||||||
|
"""
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||||
|
<tvshow>
|
||||||
|
<title>#{metadata["title"]}</title>
|
||||||
|
<plot>#{metadata["description"]}</plot>
|
||||||
|
<uniqueid type="youtube" default="true">#{metadata["id"]}</uniqueid>
|
||||||
|
<genre>YouTube</genre>
|
||||||
|
</tvshow>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
defmodule Pinchflat.Metadata.SourceImageParser do
|
||||||
|
@moduledoc """
|
||||||
|
Functions for parsing and storing source images.
|
||||||
|
"""
|
||||||
|
alias Pinchflat.Filesystem.FilesystemHelpers
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Given a base directory and source metadata, look for the appropriate images
|
||||||
|
and move them to the base directory. Returns a map of image types and their
|
||||||
|
filepaths (specifically for a source). If a given image type is not found,
|
||||||
|
the key will not be present in the map.
|
||||||
|
|
||||||
|
The metadata is expected to contain the `filepath` key for images, implying
|
||||||
|
that the images have already been downloaded by yt-dlp. This method will NOT
|
||||||
|
download images from the internet - it just copys them around.
|
||||||
|
|
||||||
|
Returns a map with the possible keys :poster_filepath, :fanart_filepath, and
|
||||||
|
:banner_filepath.
|
||||||
|
"""
|
||||||
|
def store_source_images(base_directory, source_metadata) do
|
||||||
|
(source_metadata["thumbnails"] || [])
|
||||||
|
|> Enum.filter(&(&1["filepath"] != nil))
|
||||||
|
|> select_useful_images()
|
||||||
|
|> Enum.map(&move_image(&1, base_directory))
|
||||||
|
|> Enum.into(%{})
|
||||||
|
end
|
||||||
|
|
||||||
|
defp select_useful_images(images) do
|
||||||
|
labelled_images =
|
||||||
|
Enum.reduce(images, [], fn image_map, acc ->
|
||||||
|
case image_map do
|
||||||
|
%{"id" => "avatar_uncropped"} ->
|
||||||
|
acc ++ [{:poster, :poster_filepath, image_map["filepath"]}]
|
||||||
|
|
||||||
|
%{"id" => "banner_uncropped"} ->
|
||||||
|
acc ++ [{:fanart, :fanart_filepath, image_map["filepath"]}]
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
acc
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
labelled_images
|
||||||
|
|> Enum.concat([{:banner, :banner_filepath, determine_best_banner(images)}])
|
||||||
|
|> Enum.filter(fn {_, _, tmp_filepath} -> tmp_filepath end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp determine_best_banner(images) do
|
||||||
|
best_candidate =
|
||||||
|
images
|
||||||
|
# Filter out images that don't have a width and height attribute
|
||||||
|
|> Enum.filter(&(&1["width"] && &1["height"]))
|
||||||
|
# Sort images with the highest width first
|
||||||
|
|> Enum.sort(&(&1["width"] >= &2["width"]))
|
||||||
|
# Find the first image where the ratio of width to height is greater than 3
|
||||||
|
|> Enum.find(&(&1["width"] / &1["height"] > 3))
|
||||||
|
|
||||||
|
Map.get(best_candidate || %{}, "filepath")
|
||||||
|
end
|
||||||
|
|
||||||
|
defp move_image({filename, source_attr_name, tmp_filepath}, base_directory) do
|
||||||
|
extension = Path.extname(tmp_filepath)
|
||||||
|
final_filepath = Path.join([base_directory, "#{filename}#{extension}"])
|
||||||
|
|
||||||
|
FilesystemHelpers.cp_p!(tmp_filepath, final_filepath)
|
||||||
|
|
||||||
|
{source_attr_name, final_filepath}
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
defmodule Pinchflat.Metadata.SourceMetadata do
|
||||||
|
@moduledoc """
|
||||||
|
The SourceMetadata schema.
|
||||||
|
|
||||||
|
Look. Don't @ me about Metadata vs. Metadatum. I'm very sensitive.
|
||||||
|
"""
|
||||||
|
|
||||||
|
use Ecto.Schema
|
||||||
|
import Ecto.Changeset
|
||||||
|
|
||||||
|
alias Pinchflat.Sources.Source
|
||||||
|
|
||||||
|
@allowed_fields ~w(metadata_filepath)a
|
||||||
|
@required_fields ~w(metadata_filepath)a
|
||||||
|
|
||||||
|
schema "source_metadata" do
|
||||||
|
field :metadata_filepath, :string
|
||||||
|
|
||||||
|
belongs_to :source, Source
|
||||||
|
|
||||||
|
timestamps(type: :utc_datetime)
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
def changeset(source_metadata, attrs) do
|
||||||
|
source_metadata
|
||||||
|
|> cast(attrs, @allowed_fields)
|
||||||
|
|> validate_required(@required_fields)
|
||||||
|
|> unique_constraint([:source_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
def filepath_attributes do
|
||||||
|
~w(metadata_filepath)a
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
defmodule Pinchflat.Metadata.SourceMetadataStorageWorker do
|
||||||
|
@moduledoc false
|
||||||
|
|
||||||
|
use Oban.Worker,
|
||||||
|
queue: :remote_metadata,
|
||||||
|
tags: ["media_source", "source_metadata", "remote_metadata"],
|
||||||
|
max_attempts: 3
|
||||||
|
|
||||||
|
require Logger
|
||||||
|
|
||||||
|
alias __MODULE__
|
||||||
|
alias Pinchflat.Repo
|
||||||
|
alias Pinchflat.Tasks
|
||||||
|
alias Pinchflat.Sources
|
||||||
|
alias Pinchflat.Utils.StringUtils
|
||||||
|
alias Pinchflat.Metadata.NfoBuilder
|
||||||
|
alias Pinchflat.YtDlp.MediaCollection
|
||||||
|
alias Pinchflat.Metadata.SourceImageParser
|
||||||
|
alias Pinchflat.Metadata.MetadataFileHelpers
|
||||||
|
alias Pinchflat.Downloading.DownloadOptionBuilder
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Starts the source metadata storage worker and creates a task for the source.
|
||||||
|
|
||||||
|
Returns {:ok, %Task{}} | {:error, :duplicate_job} | {:error, %Ecto.Changeset{}}
|
||||||
|
"""
|
||||||
|
def kickoff_with_task(source, opts \\ []) do
|
||||||
|
%{id: source.id}
|
||||||
|
|> SourceMetadataStorageWorker.new(opts)
|
||||||
|
|> Tasks.create_job_with_task(source)
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Fetches and stores various forms of metadata for a source:
|
||||||
|
- JSON metadata for internal use
|
||||||
|
- The series directory for the source
|
||||||
|
- The NFO file for the source (if specified)
|
||||||
|
- Downloads and stores source images (if specified)
|
||||||
|
|
||||||
|
The worker is kicked off after a source is inserted/updated - this can
|
||||||
|
take an unknown amount of time so don't rely on this data being here
|
||||||
|
before, say, the first indexing or downloading task is complete.
|
||||||
|
|
||||||
|
Returns :ok
|
||||||
|
"""
|
||||||
|
@impl Oban.Worker
|
||||||
|
def perform(%Oban.Job{args: %{"id" => source_id}}) do
|
||||||
|
source = Repo.preload(Sources.get_source!(source_id), [:metadata, :media_profile])
|
||||||
|
series_directory = determine_series_directory(source)
|
||||||
|
{source_metadata, image_filepath_attrs} = fetch_source_metadata_and_images(series_directory, source)
|
||||||
|
|
||||||
|
# `run_post_commit_tasks: false` prevents this from running in an infinite loop
|
||||||
|
Sources.update_source(
|
||||||
|
source,
|
||||||
|
Map.merge(
|
||||||
|
%{
|
||||||
|
series_directory: series_directory,
|
||||||
|
nfo_filepath: store_source_nfo(source, series_directory, source_metadata),
|
||||||
|
metadata: %{
|
||||||
|
metadata_filepath: MetadataFileHelpers.compress_and_store_metadata_for(source, source_metadata)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
image_filepath_attrs
|
||||||
|
),
|
||||||
|
run_post_commit_tasks: false
|
||||||
|
)
|
||||||
|
|
||||||
|
:ok
|
||||||
|
rescue
|
||||||
|
Ecto.NoResultsError -> Logger.info("#{__MODULE__} discarded: source #{source_id} not found")
|
||||||
|
Ecto.StaleEntryError -> Logger.info("#{__MODULE__} discarded: source #{source_id} stale")
|
||||||
|
end
|
||||||
|
|
||||||
|
defp fetch_source_metadata_and_images(series_directory, source) do
|
||||||
|
if source.media_profile.download_source_images && series_directory do
|
||||||
|
output_path = "#{tmp_directory()}/#{StringUtils.random_string(16)}/source_image.%(ext)S"
|
||||||
|
opts = [:write_all_thumbnails, convert_thumbnails: "jpg", output: output_path]
|
||||||
|
|
||||||
|
{:ok, metadata} = MediaCollection.get_source_metadata(source.original_url, opts)
|
||||||
|
image_attrs = SourceImageParser.store_source_images(series_directory, metadata)
|
||||||
|
|
||||||
|
{metadata, image_attrs}
|
||||||
|
else
|
||||||
|
{:ok, metadata} = MediaCollection.get_source_metadata(source.original_url, [])
|
||||||
|
|
||||||
|
{metadata, %{}}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp determine_series_directory(source) do
|
||||||
|
output_path = DownloadOptionBuilder.build_output_path_for(source)
|
||||||
|
{:ok, %{filepath: filepath}} = MediaCollection.get_source_details(source.original_url, output: output_path)
|
||||||
|
|
||||||
|
case MetadataFileHelpers.series_directory_from_media_filepath(filepath) do
|
||||||
|
{:ok, series_directory} -> series_directory
|
||||||
|
{:error, _} -> nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp store_source_nfo(source, series_directory, metadata) do
|
||||||
|
if source.media_profile.download_nfo && series_directory do
|
||||||
|
nfo_filepath = Path.join(series_directory, "tvshow.nfo")
|
||||||
|
|
||||||
|
NfoBuilder.build_and_store_for_source(nfo_filepath, metadata)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp tmp_directory do
|
||||||
|
Application.get_env(:pinchflat, :tmpfile_directory)
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -17,8 +17,10 @@ defmodule Pinchflat.Profiles.MediaProfile do
|
|||||||
sub_langs
|
sub_langs
|
||||||
download_thumbnail
|
download_thumbnail
|
||||||
embed_thumbnail
|
embed_thumbnail
|
||||||
|
download_source_images
|
||||||
download_metadata
|
download_metadata
|
||||||
embed_metadata
|
embed_metadata
|
||||||
|
download_nfo
|
||||||
shorts_behaviour
|
shorts_behaviour
|
||||||
livestream_behaviour
|
livestream_behaviour
|
||||||
preferred_resolution
|
preferred_resolution
|
||||||
@@ -32,17 +34,19 @@ defmodule Pinchflat.Profiles.MediaProfile do
|
|||||||
field :output_path_template, :string,
|
field :output_path_template, :string,
|
||||||
default: "/{{ source_custom_name }}/{{ upload_yyyy_mm_dd }} {{ title }}/{{ title }} [{{ id }}].{{ ext }}"
|
default: "/{{ source_custom_name }}/{{ upload_yyyy_mm_dd }} {{ title }}/{{ title }} [{{ id }}].{{ ext }}"
|
||||||
|
|
||||||
field :download_subs, :boolean, default: true
|
field :download_subs, :boolean, default: false
|
||||||
field :download_auto_subs, :boolean, default: true
|
field :download_auto_subs, :boolean, default: false
|
||||||
field :embed_subs, :boolean, default: true
|
field :embed_subs, :boolean, default: false
|
||||||
field :sub_langs, :string, default: "en"
|
field :sub_langs, :string, default: "en"
|
||||||
|
|
||||||
field :download_thumbnail, :boolean, default: true
|
field :download_thumbnail, :boolean, default: false
|
||||||
field :embed_thumbnail, :boolean, default: true
|
field :embed_thumbnail, :boolean, default: false
|
||||||
|
field :download_source_images, :boolean, default: false
|
||||||
|
|
||||||
field :download_metadata, :boolean, default: true
|
field :download_metadata, :boolean, default: false
|
||||||
field :embed_metadata, :boolean, default: true
|
field :embed_metadata, :boolean, default: false
|
||||||
|
|
||||||
|
field :download_nfo, :boolean, default: false
|
||||||
# NOTE: these do NOT speed up indexing - the indexer still has to go
|
# NOTE: these do NOT speed up indexing - the indexer still has to go
|
||||||
# through the entire collection to determine if a media is a short or
|
# through the entire collection to determine if a media is a short or
|
||||||
# a livestream.
|
# a livestream.
|
||||||
@@ -65,6 +69,12 @@ defmodule Pinchflat.Profiles.MediaProfile do
|
|||||||
media_profile
|
media_profile
|
||||||
|> cast(attrs, @allowed_fields)
|
|> cast(attrs, @allowed_fields)
|
||||||
|> validate_required(@required_fields)
|
|> validate_required(@required_fields)
|
||||||
|
# Ensures it ends with `.{{ ext }}` or `.%(ext)s` or similar (with a little wiggle room)
|
||||||
|
|> validate_format(:output_path_template, ext_regex(), message: "must end with .{{ ext }}")
|
||||||
|> unique_constraint(:name)
|
|> unique_constraint(:name)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp ext_regex do
|
||||||
|
~r/\.({{ ?ext ?}}|%\( ?ext ?\)[sS])$/
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@@ -9,7 +9,7 @@ defmodule Pinchflat.SlowIndexing.FileFollowerServer do
|
|||||||
require Logger
|
require Logger
|
||||||
|
|
||||||
@poll_interval_ms Application.compile_env(:pinchflat, :file_watcher_poll_interval)
|
@poll_interval_ms Application.compile_env(:pinchflat, :file_watcher_poll_interval)
|
||||||
@activity_timeout_ms 60_000
|
@activity_timeout_ms 600_000
|
||||||
|
|
||||||
# Client API
|
# Client API
|
||||||
@doc """
|
@doc """
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ defmodule Pinchflat.SlowIndexing.MediaCollectionIndexingWorker do
|
|||||||
unique: [period: :infinity, states: [:available, :scheduled, :retryable]],
|
unique: [period: :infinity, states: [:available, :scheduled, :retryable]],
|
||||||
tags: ["media_source", "media_collection_indexing"]
|
tags: ["media_source", "media_collection_indexing"]
|
||||||
|
|
||||||
|
require Logger
|
||||||
|
|
||||||
alias __MODULE__
|
alias __MODULE__
|
||||||
alias Pinchflat.Tasks
|
alias Pinchflat.Tasks
|
||||||
alias Pinchflat.Sources
|
alias Pinchflat.Sources
|
||||||
@@ -13,7 +15,17 @@ defmodule Pinchflat.SlowIndexing.MediaCollectionIndexingWorker do
|
|||||||
alias Pinchflat.FastIndexing.FastIndexingWorker
|
alias Pinchflat.FastIndexing.FastIndexingWorker
|
||||||
alias Pinchflat.SlowIndexing.SlowIndexingHelpers
|
alias Pinchflat.SlowIndexing.SlowIndexingHelpers
|
||||||
|
|
||||||
@impl Oban.Worker
|
@doc """
|
||||||
|
Starts the source slow indexing worker and creates a task for the source.
|
||||||
|
|
||||||
|
Returns {:ok, %Task{}} | {:error, :duplicate_job} | {:error, %Ecto.Changeset{}}
|
||||||
|
"""
|
||||||
|
def kickoff_with_task(source, opts \\ []) do
|
||||||
|
%{id: source.id}
|
||||||
|
|> MediaCollectionIndexingWorker.new(opts)
|
||||||
|
|> Tasks.create_job_with_task(source)
|
||||||
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
The ID is that of a source _record_, not a YouTube channel/playlist ID. Indexes
|
The ID is that of a source _record_, not a YouTube channel/playlist ID. Indexes
|
||||||
the provided source, kicks off downloads for each new MediaItem, and
|
the provided source, kicks off downloads for each new MediaItem, and
|
||||||
@@ -58,6 +70,7 @@ defmodule Pinchflat.SlowIndexing.MediaCollectionIndexingWorker do
|
|||||||
|
|
||||||
Returns :ok | {:ok, %Task{}}
|
Returns :ok | {:ok, %Task{}}
|
||||||
"""
|
"""
|
||||||
|
@impl Oban.Worker
|
||||||
def perform(%Oban.Job{args: %{"id" => source_id}}) do
|
def perform(%Oban.Job{args: %{"id" => source_id}}) do
|
||||||
source = Sources.get_source!(source_id)
|
source = Sources.get_source!(source_id)
|
||||||
|
|
||||||
@@ -79,6 +92,9 @@ defmodule Pinchflat.SlowIndexing.MediaCollectionIndexingWorker do
|
|||||||
# perform a no-op
|
# perform a no-op
|
||||||
:ok
|
:ok
|
||||||
end
|
end
|
||||||
|
rescue
|
||||||
|
Ecto.NoResultsError -> Logger.info("#{__MODULE__} discarded: source #{source_id} not found")
|
||||||
|
Ecto.StaleEntryError -> Logger.info("#{__MODULE__} discarded: source #{source_id} stale")
|
||||||
end
|
end
|
||||||
|
|
||||||
defp reschedule_indexing(source) do
|
defp reschedule_indexing(source) do
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ defmodule Pinchflat.SlowIndexing.SlowIndexingHelpers do
|
|||||||
|
|
||||||
require Logger
|
require Logger
|
||||||
|
|
||||||
|
alias Pinchflat.Repo
|
||||||
alias Pinchflat.Media
|
alias Pinchflat.Media
|
||||||
alias Pinchflat.Tasks
|
alias Pinchflat.Tasks
|
||||||
alias Pinchflat.Sources
|
alias Pinchflat.Sources
|
||||||
@@ -31,16 +32,14 @@ defmodule Pinchflat.SlowIndexing.SlowIndexingHelpers do
|
|||||||
Tasks.delete_pending_tasks_for(source, "MediaIndexingWorker")
|
Tasks.delete_pending_tasks_for(source, "MediaIndexingWorker")
|
||||||
Tasks.delete_pending_tasks_for(source, "MediaCollectionIndexingWorker")
|
Tasks.delete_pending_tasks_for(source, "MediaCollectionIndexingWorker")
|
||||||
|
|
||||||
%{id: source.id}
|
MediaCollectionIndexingWorker.kickoff_with_task(source)
|
||||||
# Schedule this one immediately, but future ones will be on an interval
|
|
||||||
|> MediaCollectionIndexingWorker.new()
|
|
||||||
|> Tasks.create_job_with_task(source)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Given a media source, creates (indexes) the media by creating media_items for each
|
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
|
media ID in the source. Afterward, kicks off a download task for each pending media
|
||||||
item belonging to the source. You can't tell me the method name isn't descriptive!
|
item belonging to the source. You can't tell me the method name isn't descriptive!
|
||||||
|
Returns a list of media items or changesets (if the media item couldn't be created).
|
||||||
|
|
||||||
Indexing is slow and usually returns a list of all media data at once for record creation.
|
Indexing is slow and usually returns a list of all media data at once for record creation.
|
||||||
To help with this, we use a file follower to watch the file that yt-dlp writes to
|
To help with this, we use a file follower to watch the file that yt-dlp writes to
|
||||||
@@ -56,12 +55,15 @@ defmodule Pinchflat.SlowIndexing.SlowIndexingHelpers do
|
|||||||
Since indexing returns all media data EVERY TIME, we that that opportunity to update
|
Since indexing returns all media data EVERY TIME, we that that opportunity to update
|
||||||
indexing metadata for media items that have already been created.
|
indexing metadata for media items that have already been created.
|
||||||
|
|
||||||
Returns [%MediaItem{}, ...]
|
Returns [%MediaItem{} | %Ecto.Changeset{}]
|
||||||
"""
|
"""
|
||||||
def index_and_enqueue_download_for_media_items(%Source{} = source) do
|
def index_and_enqueue_download_for_media_items(%Source{} = source) do
|
||||||
# See the method definition below for more info on how file watchers work
|
# See the method definition below for more info on how file watchers work
|
||||||
# (important reading if you're not familiar with it)
|
# (important reading if you're not familiar with it)
|
||||||
{:ok, media_attributes} = get_media_attributes_for_collection_and_setup_file_watcher(source)
|
{:ok, media_attributes} = get_media_attributes_for_collection_and_setup_file_watcher(source)
|
||||||
|
# Reload because the source may have been updated during the (long-running) indexing process
|
||||||
|
# and important settings like `download_media` may have changed.
|
||||||
|
source = Repo.reload!(source)
|
||||||
|
|
||||||
result =
|
result =
|
||||||
Enum.map(media_attributes, fn media_attrs ->
|
Enum.map(media_attributes, fn media_attrs ->
|
||||||
@@ -119,14 +121,16 @@ defmodule Pinchflat.SlowIndexing.SlowIndexingHelpers do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp create_media_item_and_enqueue_download(source, media_attrs) do
|
defp create_media_item_and_enqueue_download(source, media_attrs) do
|
||||||
|
# Reload because the source may have been updated during the (long-running) indexing process
|
||||||
|
# and important settings like `download_media` may have changed.
|
||||||
|
source = Repo.reload!(source)
|
||||||
|
|
||||||
case Media.create_media_item_from_backend_attrs(source, media_attrs) do
|
case Media.create_media_item_from_backend_attrs(source, media_attrs) do
|
||||||
{:ok, %MediaItem{} = media_item} ->
|
{:ok, %MediaItem{} = media_item} ->
|
||||||
if source.download_media && Media.pending_download?(media_item) do
|
if source.download_media && Media.pending_download?(media_item) do
|
||||||
Logger.debug("FileFollowerServer Handler: Enqueuing download task for #{inspect(media_attrs)}")
|
Logger.debug("FileFollowerServer Handler: Enqueuing download task for #{inspect(media_attrs)}")
|
||||||
|
|
||||||
%{id: media_item.id}
|
MediaDownloadWorker.kickoff_with_task(media_item)
|
||||||
|> MediaDownloadWorker.new()
|
|
||||||
|> Tasks.create_job_with_task(media_item)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
{:error, changeset} ->
|
{:error, changeset} ->
|
||||||
|
|||||||
@@ -10,25 +10,33 @@ defmodule Pinchflat.Sources.Source do
|
|||||||
alias Pinchflat.Tasks.Task
|
alias Pinchflat.Tasks.Task
|
||||||
alias Pinchflat.Media.MediaItem
|
alias Pinchflat.Media.MediaItem
|
||||||
alias Pinchflat.Profiles.MediaProfile
|
alias Pinchflat.Profiles.MediaProfile
|
||||||
|
alias Pinchflat.Metadata.SourceMetadata
|
||||||
|
|
||||||
@allowed_fields ~w(
|
@allowed_fields ~w(
|
||||||
collection_name
|
collection_name
|
||||||
collection_id
|
collection_id
|
||||||
collection_type
|
collection_type
|
||||||
custom_name
|
custom_name
|
||||||
|
nfo_filepath
|
||||||
|
poster_filepath
|
||||||
|
fanart_filepath
|
||||||
|
banner_filepath
|
||||||
|
series_directory
|
||||||
index_frequency_minutes
|
index_frequency_minutes
|
||||||
fast_index
|
fast_index
|
||||||
download_media
|
download_media
|
||||||
last_indexed_at
|
last_indexed_at
|
||||||
original_url
|
original_url
|
||||||
download_cutoff_date
|
download_cutoff_date
|
||||||
|
title_filter_regex
|
||||||
media_profile_id
|
media_profile_id
|
||||||
)a
|
)a
|
||||||
|
|
||||||
# Expensive API calls are made when a source is inserted/updated so
|
# Expensive API calls are made when a source is inserted/updated so
|
||||||
# we want to ensure that the source is valid before making the call.
|
# we want to ensure that the source is valid before making the call.
|
||||||
# This way, we check that the other attributes are valid before ensuring
|
# This way, we check that the other attributes are valid before ensuring
|
||||||
# that all fields are valid.
|
# that all fields are valid. This is still only one DB insert but it's
|
||||||
|
# a two-stage validation process to fail fast before the API call.
|
||||||
@initially_required_fields ~w(
|
@initially_required_fields ~w(
|
||||||
index_frequency_minutes
|
index_frequency_minutes
|
||||||
fast_index
|
fast_index
|
||||||
@@ -57,9 +65,18 @@ defmodule Pinchflat.Sources.Source do
|
|||||||
# Only download media items that were published after this date
|
# Only download media items that were published after this date
|
||||||
field :download_cutoff_date, :date
|
field :download_cutoff_date, :date
|
||||||
field :original_url, :string
|
field :original_url, :string
|
||||||
|
field :title_filter_regex, :string
|
||||||
|
|
||||||
|
field :series_directory, :string
|
||||||
|
field :nfo_filepath, :string
|
||||||
|
field :poster_filepath, :string
|
||||||
|
field :fanart_filepath, :string
|
||||||
|
field :banner_filepath, :string
|
||||||
|
|
||||||
belongs_to :media_profile, MediaProfile
|
belongs_to :media_profile, MediaProfile
|
||||||
|
|
||||||
|
has_one :metadata, SourceMetadata, on_replace: :update
|
||||||
|
|
||||||
has_many :tasks, Task
|
has_many :tasks, Task
|
||||||
has_many :media_items, MediaItem, foreign_key: :source_id
|
has_many :media_items, MediaItem, foreign_key: :source_id
|
||||||
|
|
||||||
@@ -80,7 +97,7 @@ defmodule Pinchflat.Sources.Source do
|
|||||||
|> cast(attrs, @allowed_fields)
|
|> cast(attrs, @allowed_fields)
|
||||||
|> dynamic_default(:custom_name, fn cs -> get_field(cs, :collection_name) end)
|
|> dynamic_default(:custom_name, fn cs -> get_field(cs, :collection_name) end)
|
||||||
|> validate_required(required_fields)
|
|> validate_required(required_fields)
|
||||||
|> unique_constraint([:collection_id, :media_profile_id])
|
|> cast_assoc(:metadata, with: &SourceMetadata.changeset/2, required: false)
|
||||||
end
|
end
|
||||||
|
|
||||||
@doc false
|
@doc false
|
||||||
@@ -94,4 +111,9 @@ defmodule Pinchflat.Sources.Source do
|
|||||||
# minutes
|
# minutes
|
||||||
15
|
15
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
def filepath_attributes do
|
||||||
|
~w(nfo_filepath fanart_filepath poster_filepath banner_filepath)a
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@@ -11,9 +11,12 @@ defmodule Pinchflat.Sources do
|
|||||||
alias Pinchflat.Sources.Source
|
alias Pinchflat.Sources.Source
|
||||||
alias Pinchflat.Profiles.MediaProfile
|
alias Pinchflat.Profiles.MediaProfile
|
||||||
alias Pinchflat.YtDlp.MediaCollection
|
alias Pinchflat.YtDlp.MediaCollection
|
||||||
|
alias Pinchflat.Metadata.SourceMetadata
|
||||||
|
alias Pinchflat.Filesystem.FilesystemHelpers
|
||||||
alias Pinchflat.Downloading.DownloadingHelpers
|
alias Pinchflat.Downloading.DownloadingHelpers
|
||||||
alias Pinchflat.FastIndexing.FastIndexingHelpers
|
alias Pinchflat.FastIndexing.FastIndexingWorker
|
||||||
alias Pinchflat.SlowIndexing.SlowIndexingHelpers
|
alias Pinchflat.SlowIndexing.SlowIndexingHelpers
|
||||||
|
alias Pinchflat.Metadata.SourceMetadataStorageWorker
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Returns the list of sources. Returns [%Source{}, ...]
|
Returns the list of sources. Returns [%Source{}, ...]
|
||||||
@@ -48,15 +51,19 @@ defmodule Pinchflat.Sources do
|
|||||||
though we know it's going to fail so it picks up any addl. database errors
|
though we know it's going to fail so it picks up any addl. database errors
|
||||||
and fulfills our return contract.
|
and fulfills our return contract.
|
||||||
|
|
||||||
|
You can pass options to control the behavior of the function:
|
||||||
|
- `run_post_commit_tasks` (default: true) - If false, the function will not
|
||||||
|
enqueue any tasks in `commit_and_handle_tasks`.
|
||||||
|
|
||||||
Returns {:ok, %Source{}} | {:error, %Ecto.Changeset{}}
|
Returns {:ok, %Source{}} | {:error, %Ecto.Changeset{}}
|
||||||
"""
|
"""
|
||||||
def create_source(attrs) do
|
def create_source(attrs, opts \\ []) do
|
||||||
case change_source(%Source{}, attrs, :initial) do
|
case change_source(%Source{}, attrs, :initial) do
|
||||||
%Ecto.Changeset{valid?: true} ->
|
%Ecto.Changeset{valid?: true} ->
|
||||||
%Source{}
|
%Source{}
|
||||||
|> change_source_from_url(attrs)
|
|> maybe_change_source_from_url(attrs)
|
||||||
|> maybe_change_indexing_frequency()
|
|> maybe_change_indexing_frequency()
|
||||||
|> commit_and_handle_tasks()
|
|> commit_and_handle_tasks(opts)
|
||||||
|
|
||||||
changeset ->
|
changeset ->
|
||||||
Repo.insert(changeset)
|
Repo.insert(changeset)
|
||||||
@@ -76,15 +83,19 @@ defmodule Pinchflat.Sources do
|
|||||||
though we know it's going to fail so it picks up any addl. database errors
|
though we know it's going to fail so it picks up any addl. database errors
|
||||||
and fulfills our return contract.
|
and fulfills our return contract.
|
||||||
|
|
||||||
|
You can pass options to control the behavior of the function:
|
||||||
|
- `run_post_commit_tasks` (default: true) - If false, the function will not
|
||||||
|
enqueue any tasks in `commit_and_handle_tasks`.
|
||||||
|
|
||||||
Returns {:ok, %Source{}} | {:error, %Ecto.Changeset{}}
|
Returns {:ok, %Source{}} | {:error, %Ecto.Changeset{}}
|
||||||
"""
|
"""
|
||||||
def update_source(%Source{} = source, attrs) do
|
def update_source(%Source{} = source, attrs, opts \\ []) do
|
||||||
case change_source(source, attrs, :initial) do
|
case change_source(source, attrs, :initial) do
|
||||||
%Ecto.Changeset{valid?: true} ->
|
%Ecto.Changeset{valid?: true} ->
|
||||||
source
|
source
|
||||||
|> change_source_from_url(attrs)
|
|> maybe_change_source_from_url(attrs)
|
||||||
|> maybe_change_indexing_frequency()
|
|> maybe_change_indexing_frequency()
|
||||||
|> commit_and_handle_tasks()
|
|> commit_and_handle_tasks(opts)
|
||||||
|
|
||||||
changeset ->
|
changeset ->
|
||||||
Repo.update(changeset)
|
Repo.update(changeset)
|
||||||
@@ -99,6 +110,7 @@ defmodule Pinchflat.Sources do
|
|||||||
"""
|
"""
|
||||||
def delete_source(%Source{} = source, opts \\ []) do
|
def delete_source(%Source{} = source, opts \\ []) do
|
||||||
delete_files = Keyword.get(opts, :delete_files, false)
|
delete_files = Keyword.get(opts, :delete_files, false)
|
||||||
|
Tasks.delete_tasks_for(source)
|
||||||
|
|
||||||
source
|
source
|
||||||
|> Media.list_media_items_for()
|
|> Media.list_media_items_for()
|
||||||
@@ -106,7 +118,11 @@ defmodule Pinchflat.Sources do
|
|||||||
Media.delete_media_item(media_item, delete_files: delete_files)
|
Media.delete_media_item(media_item, delete_files: delete_files)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Tasks.delete_tasks_for(source)
|
if delete_files do
|
||||||
|
delete_source_files(source)
|
||||||
|
end
|
||||||
|
|
||||||
|
delete_internal_metadata_files(source)
|
||||||
Repo.delete(source)
|
Repo.delete(source)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -117,19 +133,9 @@ defmodule Pinchflat.Sources do
|
|||||||
Source.changeset(source, attrs, validation_stage)
|
Source.changeset(source, attrs, validation_stage)
|
||||||
end
|
end
|
||||||
|
|
||||||
@doc """
|
# NOTE: When operating in the ideal path, this effectively adds an API call
|
||||||
Returns an `%Ecto.Changeset{}` for tracking source changes and additionally
|
# to the source creation/update process. Should be used only when needed.
|
||||||
fetches source details from the original_url (if provided). If the source
|
defp maybe_change_source_from_url(%Source{} = source, attrs) do
|
||||||
details cannot be fetched, an error is added to the changeset.
|
|
||||||
|
|
||||||
Note that this fetches source details as long as the `original_url` is present.
|
|
||||||
This means that it'll go for it even if a changeset is otherwise invalid. This
|
|
||||||
is pretty easy to change, but for MVP I'm not concerned.
|
|
||||||
|
|
||||||
NOTE: When operating in the ideal path, this effectively adds an API call
|
|
||||||
to the source creation/update process. Should be used only when needed.
|
|
||||||
"""
|
|
||||||
def change_source_from_url(%Source{} = source, attrs) do
|
|
||||||
case change_source(source, attrs) do
|
case change_source(source, attrs) do
|
||||||
%Ecto.Changeset{changes: %{original_url: _}} = changeset ->
|
%Ecto.Changeset{changes: %{original_url: _}} = changeset ->
|
||||||
add_source_details_to_changeset(source, changeset)
|
add_source_details_to_changeset(source, changeset)
|
||||||
@@ -139,10 +145,27 @@ defmodule Pinchflat.Sources do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp add_source_details_to_changeset(source, changeset) do
|
defp delete_source_files(source) do
|
||||||
%Ecto.Changeset{changes: changes} = changeset
|
mapped_struct = Map.from_struct(source)
|
||||||
|
|
||||||
case MediaCollection.get_source_details(changes.original_url) do
|
Source.filepath_attributes()
|
||||||
|
|> Enum.map(fn field -> mapped_struct[field] end)
|
||||||
|
|> Enum.filter(&is_binary/1)
|
||||||
|
|> Enum.each(&FilesystemHelpers.delete_file_and_remove_empty_directories/1)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp delete_internal_metadata_files(source) do
|
||||||
|
metadata = Repo.preload(source, :metadata).metadata || %SourceMetadata{}
|
||||||
|
mapped_struct = Map.from_struct(metadata)
|
||||||
|
|
||||||
|
SourceMetadata.filepath_attributes()
|
||||||
|
|> Enum.map(fn field -> mapped_struct[field] end)
|
||||||
|
|> Enum.filter(&is_binary/1)
|
||||||
|
|> Enum.each(&FilesystemHelpers.delete_file_and_remove_empty_directories/1)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp add_source_details_to_changeset(source, changeset) do
|
||||||
|
case MediaCollection.get_source_details(changeset.changes.original_url) do
|
||||||
{:ok, source_details} ->
|
{:ok, source_details} ->
|
||||||
add_source_details_by_collection_type(source, changeset, source_details)
|
add_source_details_by_collection_type(source, changeset, source_details)
|
||||||
|
|
||||||
@@ -191,11 +214,18 @@ defmodule Pinchflat.Sources do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp commit_and_handle_tasks(changeset) do
|
defp commit_and_handle_tasks(changeset, opts) do
|
||||||
|
run_post_commit_tasks = Keyword.get(opts, :run_post_commit_tasks, true)
|
||||||
|
|
||||||
case Repo.insert_or_update(changeset) do
|
case Repo.insert_or_update(changeset) do
|
||||||
{:ok, %Source{} = source} ->
|
{:ok, %Source{} = source} ->
|
||||||
maybe_handle_media_tasks(changeset, source)
|
if run_post_commit_tasks do
|
||||||
maybe_run_indexing_task(changeset, source)
|
maybe_handle_media_tasks(changeset, source)
|
||||||
|
maybe_run_indexing_task(changeset, source)
|
||||||
|
run_metadata_storage_task(source)
|
||||||
|
end
|
||||||
|
|
||||||
|
{:ok, source}
|
||||||
|
|
||||||
err ->
|
err ->
|
||||||
err
|
err
|
||||||
@@ -215,8 +245,6 @@ defmodule Pinchflat.Sources do
|
|||||||
_ ->
|
_ ->
|
||||||
:ok
|
:ok
|
||||||
end
|
end
|
||||||
|
|
||||||
{:ok, source}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
defp maybe_run_indexing_task(changeset, source) do
|
defp maybe_run_indexing_task(changeset, source) do
|
||||||
@@ -231,8 +259,11 @@ defmodule Pinchflat.Sources do
|
|||||||
maybe_update_slow_indexing_task(changeset, source)
|
maybe_update_slow_indexing_task(changeset, source)
|
||||||
maybe_update_fast_indexing_task(changeset, source)
|
maybe_update_fast_indexing_task(changeset, source)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
{:ok, source}
|
# This runs every time to pick up any changes to the metadata
|
||||||
|
defp run_metadata_storage_task(source) do
|
||||||
|
SourceMetadataStorageWorker.kickoff_with_task(source)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp maybe_update_slow_indexing_task(changeset, source) do
|
defp maybe_update_slow_indexing_task(changeset, source) do
|
||||||
@@ -253,7 +284,8 @@ defmodule Pinchflat.Sources do
|
|||||||
defp maybe_update_fast_indexing_task(changeset, source) do
|
defp maybe_update_fast_indexing_task(changeset, source) do
|
||||||
case changeset.changes do
|
case changeset.changes do
|
||||||
%{fast_index: true} ->
|
%{fast_index: true} ->
|
||||||
FastIndexingHelpers.kickoff_fast_indexing_task(source)
|
Tasks.delete_pending_tasks_for(source, "FastIndexingWorker")
|
||||||
|
FastIndexingWorker.kickoff_with_task(source)
|
||||||
|
|
||||||
%{fast_index: false} ->
|
%{fast_index: false} ->
|
||||||
Tasks.delete_pending_tasks_for(source, "FastIndexingWorker")
|
Tasks.delete_pending_tasks_for(source, "FastIndexingWorker")
|
||||||
|
|||||||
@@ -22,9 +22,15 @@ defmodule Pinchflat.Tasks do
|
|||||||
|
|
||||||
Returns [%Task{}, ...]
|
Returns [%Task{}, ...]
|
||||||
"""
|
"""
|
||||||
def list_tasks_for(attached_record_type, attached_record_id, worker_name \\ nil, job_states \\ Oban.Job.states()) do
|
def list_tasks_for(record, worker_name \\ nil, job_states \\ Oban.Job.states()) do
|
||||||
stringified_states = Enum.map(job_states, &to_string/1)
|
stringified_states = Enum.map(job_states, &to_string/1)
|
||||||
|
|
||||||
|
record_type =
|
||||||
|
case record do
|
||||||
|
%Source{} -> :source_id
|
||||||
|
%MediaItem{} -> :media_item_id
|
||||||
|
end
|
||||||
|
|
||||||
worker_name_finder =
|
worker_name_finder =
|
||||||
if worker_name do
|
if worker_name do
|
||||||
# Workers are the full module name - we want to match on the string ENDING with
|
# Workers are the full module name - we want to match on the string ENDING with
|
||||||
@@ -41,7 +47,7 @@ defmodule Pinchflat.Tasks do
|
|||||||
Repo.all(
|
Repo.all(
|
||||||
from t in Task,
|
from t in Task,
|
||||||
join: j in assoc(t, :job),
|
join: j in assoc(t, :job),
|
||||||
where: field(t, ^attached_record_type) == ^attached_record_id,
|
where: field(t, ^record_type) == ^record.id,
|
||||||
where: ^worker_name_finder,
|
where: ^worker_name_finder,
|
||||||
where: j.state in ^stringified_states
|
where: j.state in ^stringified_states
|
||||||
)
|
)
|
||||||
@@ -53,10 +59,9 @@ defmodule Pinchflat.Tasks do
|
|||||||
|
|
||||||
Returns [%Task{}, ...]
|
Returns [%Task{}, ...]
|
||||||
"""
|
"""
|
||||||
def list_pending_tasks_for(attached_record_type, attached_record_id, worker_name \\ nil) do
|
def list_pending_tasks_for(record, worker_name \\ nil) do
|
||||||
list_tasks_for(
|
list_tasks_for(
|
||||||
attached_record_type,
|
record,
|
||||||
attached_record_id,
|
|
||||||
worker_name,
|
worker_name,
|
||||||
[:available, :scheduled, :retryable]
|
[:available, :scheduled, :retryable]
|
||||||
)
|
)
|
||||||
@@ -126,14 +131,10 @@ defmodule Pinchflat.Tasks do
|
|||||||
|
|
||||||
Returns :ok
|
Returns :ok
|
||||||
"""
|
"""
|
||||||
def delete_tasks_for(attached_record, worker_name \\ nil) do
|
def delete_tasks_for(record, worker_name \\ nil) do
|
||||||
tasks =
|
record
|
||||||
case attached_record do
|
|> list_tasks_for(worker_name)
|
||||||
%Source{} = source -> list_tasks_for(:source_id, source.id, worker_name)
|
|> Enum.each(&delete_task/1)
|
||||||
%MediaItem{} = media_item -> list_tasks_for(:media_item_id, media_item.id, worker_name)
|
|
||||||
end
|
|
||||||
|
|
||||||
Enum.each(tasks, &delete_task/1)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
@@ -142,14 +143,10 @@ defmodule Pinchflat.Tasks do
|
|||||||
|
|
||||||
Returns :ok
|
Returns :ok
|
||||||
"""
|
"""
|
||||||
def delete_pending_tasks_for(attached_record, worker_name \\ nil) do
|
def delete_pending_tasks_for(record, worker_name \\ nil) do
|
||||||
tasks =
|
record
|
||||||
case attached_record do
|
|> list_pending_tasks_for(worker_name)
|
||||||
%Source{} = source -> list_pending_tasks_for(:source_id, source.id, worker_name)
|
|> Enum.each(&delete_task/1)
|
||||||
%MediaItem{} = media_item -> list_pending_tasks_for(:media_item_id, media_item.id, worker_name)
|
|
||||||
end
|
|
||||||
|
|
||||||
Enum.each(tasks, &delete_task/1)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ defmodule Pinchflat.YtDlp.CommandRunner do
|
|||||||
|
|
||||||
case System.cmd(command, formatted_command_opts, stderr_to_stdout: true) do
|
case System.cmd(command, formatted_command_opts, stderr_to_stdout: true) do
|
||||||
{_, 0} ->
|
{_, 0} ->
|
||||||
# IDEA: consider deleting the file after reading it
|
# IDEA: consider deleting the file after reading it. It's in the tmp dir, so it's not
|
||||||
|
# a huge deal, but it's still a good idea to clean up after ourselves.
|
||||||
# (even on error? especially on error?)
|
# (even on error? especially on error?)
|
||||||
File.read(output_filepath)
|
File.read(output_filepath)
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ defmodule Pinchflat.YtDlp.Media do
|
|||||||
|
|
||||||
alias __MODULE__
|
alias __MODULE__
|
||||||
alias Pinchflat.Utils.FunctionUtils
|
alias Pinchflat.Utils.FunctionUtils
|
||||||
|
alias Pinchflat.Metadata.MetadataFileHelpers
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Downloads a single piece of media (and possibly its metadata) directly to its
|
Downloads a single piece of media (and possibly its metadata) directly to its
|
||||||
@@ -85,8 +86,8 @@ defmodule Pinchflat.YtDlp.Media do
|
|||||||
description: response["description"],
|
description: response["description"],
|
||||||
original_url: response["webpage_url"],
|
original_url: response["webpage_url"],
|
||||||
livestream: response["was_live"],
|
livestream: response["was_live"],
|
||||||
short_form_content: short_form_content?(response),
|
short_form_content: response["webpage_url"] && short_form_content?(response),
|
||||||
upload_date: parse_upload_date(response["upload_date"])
|
upload_date: response["upload_date"] && MetadataFileHelpers.parse_upload_date(response["upload_date"])
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -99,16 +100,13 @@ defmodule Pinchflat.YtDlp.Media do
|
|||||||
# WILL returns false positives, but it's a best-effort approach
|
# WILL returns false positives, but it's a best-effort approach
|
||||||
# that should work for most cases. The aspect_ratio check is
|
# that should work for most cases. The aspect_ratio check is
|
||||||
# based on a gut feeling and may need to be tweaked.
|
# based on a gut feeling and may need to be tweaked.
|
||||||
|
#
|
||||||
|
# These don't fail if duration or aspect_ratio are missing
|
||||||
|
# due to Elixir's comparison semantics
|
||||||
response["duration"] <= 60 && response["aspect_ratio"] < 0.8
|
response["duration"] <= 60 && response["aspect_ratio"] < 0.8
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp parse_upload_date(upload_date) do
|
|
||||||
<<year::binary-size(4)>> <> <<month::binary-size(2)>> <> <<day::binary-size(2)>> = upload_date
|
|
||||||
|
|
||||||
Date.from_iso8601!("#{year}-#{month}-#{day}")
|
|
||||||
end
|
|
||||||
|
|
||||||
defp backend_runner do
|
defp backend_runner do
|
||||||
# This approach lets us mock the command for testing
|
# This approach lets us mock the command for testing
|
||||||
Application.get_env(:pinchflat, :yt_dlp_runner)
|
Application.get_env(:pinchflat, :yt_dlp_runner)
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ defmodule Pinchflat.YtDlp.MediaCollection do
|
|||||||
|
|
||||||
require Logger
|
require Logger
|
||||||
|
|
||||||
alias Pinchflat.Utils.FunctionUtils
|
|
||||||
alias Pinchflat.Filesystem.FilesystemHelpers
|
alias Pinchflat.Filesystem.FilesystemHelpers
|
||||||
alias Pinchflat.YtDlp.Media, as: YtDlpMedia
|
alias Pinchflat.YtDlp.Media, as: YtDlpMedia
|
||||||
|
|
||||||
@@ -36,11 +35,20 @@ defmodule Pinchflat.YtDlp.MediaCollection do
|
|||||||
|
|
||||||
case runner.run(url, command_opts, output_template, output_filepath: output_filepath) do
|
case runner.run(url, command_opts, output_template, output_filepath: output_filepath) do
|
||||||
{:ok, output} ->
|
{:ok, output} ->
|
||||||
output
|
parsed_lines =
|
||||||
|> String.split("\n", trim: true)
|
output
|
||||||
|> Enum.map(&Phoenix.json_library().decode!/1)
|
|> String.split("\n", trim: true)
|
||||||
|> Enum.map(&YtDlpMedia.response_to_struct/1)
|
|> Enum.map(fn line ->
|
||||||
|> FunctionUtils.wrap_ok()
|
case Phoenix.json_library().decode(line) do
|
||||||
|
{:ok, parsed_json} ->
|
||||||
|
YtDlpMedia.response_to_struct(parsed_json)
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
{:ok, Enum.filter(parsed_lines, &(&1 != nil))}
|
||||||
|
|
||||||
res ->
|
res ->
|
||||||
res
|
res
|
||||||
@@ -50,20 +58,20 @@ defmodule Pinchflat.YtDlp.MediaCollection do
|
|||||||
@doc """
|
@doc """
|
||||||
Gets a source's ID and name from its URL.
|
Gets a source's ID and name from its URL.
|
||||||
|
|
||||||
yt-dlp does not _really_ have source-specific functions, so
|
yt-dlp does not _really_ have source-specific functions that return what
|
||||||
instead we're fetching just the first video (using playlist_end: 1)
|
we need, so instead we're fetching just the first video (using playlist_end: 1)
|
||||||
and parsing the source ID and name from _its_ metadata
|
and parsing the source ID and name from _its_ metadata
|
||||||
|
|
||||||
Returns {:ok, map()} | {:error, any, ...}.
|
Returns {:ok, map()} | {:error, any, ...}.
|
||||||
"""
|
"""
|
||||||
def get_source_details(source_url) do
|
def get_source_details(source_url, addl_opts \\ []) do
|
||||||
# `ignore_no_formats_error` is necessary because yt-dlp will error out if
|
# `ignore_no_formats_error` is necessary because yt-dlp will error out if
|
||||||
# the first video has not released yet (ie: is a premier). We don't care about
|
# the first video has not released yet (ie: is a premier). We don't care about
|
||||||
# available formats since we're just getting the source details
|
# available formats since we're just getting the source details
|
||||||
opts = [:simulate, :skip_download, :ignore_no_formats_error, playlist_end: 1]
|
command_opts = [:simulate, :skip_download, :ignore_no_formats_error, playlist_end: 1] ++ addl_opts
|
||||||
output_template = "%(.{channel,channel_id,playlist_id,playlist_title})j"
|
output_template = "%(.{channel,channel_id,playlist_id,playlist_title,filename})j"
|
||||||
|
|
||||||
with {:ok, output} <- backend_runner().run(source_url, opts, output_template),
|
with {:ok, output} <- backend_runner().run(source_url, command_opts, output_template),
|
||||||
{:ok, parsed_json} <- Phoenix.json_library().decode(output) do
|
{:ok, parsed_json} <- Phoenix.json_library().decode(output) do
|
||||||
{:ok, format_source_details(parsed_json)}
|
{:ok, format_source_details(parsed_json)}
|
||||||
else
|
else
|
||||||
@@ -71,12 +79,44 @@ defmodule Pinchflat.YtDlp.MediaCollection do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Gets a source's metadata from its URL.
|
||||||
|
|
||||||
|
This is mostly for things like getting the source's avatar and banner image
|
||||||
|
(if applicable). However, this yt-dlp call doesn't have enough overlap with
|
||||||
|
`get_source_details/1` to allow combining them - this one has _almost_ everything
|
||||||
|
we need, but it doesn't contain enough information to tell 100% if the url is a channel
|
||||||
|
or a playlist.
|
||||||
|
|
||||||
|
The main purpose of this (past using as a fetcher for _other_ metadata) is to live
|
||||||
|
as a compressed blob for possible future use. That's why it's not getting formatted like
|
||||||
|
`get_source_details/1`
|
||||||
|
|
||||||
|
Returns {:ok, map()} | {:error, any, ...}.
|
||||||
|
"""
|
||||||
|
def get_source_metadata(source_url, addl_opts \\ []) do
|
||||||
|
opts = [playlist_items: 0] ++ addl_opts
|
||||||
|
output_template = "playlist:%()j"
|
||||||
|
|
||||||
|
with {:ok, output} <- backend_runner().run(source_url, opts, output_template),
|
||||||
|
{:ok, parsed_json} <- Phoenix.json_library().decode(output) do
|
||||||
|
{:ok, parsed_json}
|
||||||
|
else
|
||||||
|
err -> err
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp format_source_details(response) do
|
defp format_source_details(response) do
|
||||||
|
# NOTE: I should probably make this a struct some day
|
||||||
%{
|
%{
|
||||||
channel_id: response["channel_id"],
|
channel_id: response["channel_id"],
|
||||||
channel_name: response["channel"],
|
channel_name: response["channel"],
|
||||||
playlist_id: response["playlist_id"],
|
playlist_id: response["playlist_id"],
|
||||||
playlist_name: response["playlist_title"]
|
playlist_name: response["playlist_title"],
|
||||||
|
# It's not a name, it's a path dammit!
|
||||||
|
# This actually isn't used for the inital response - it's
|
||||||
|
# used later to update a source's metadata
|
||||||
|
filepath: response["filename"]
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -317,17 +317,7 @@ defmodule PinchflatWeb.CoreComponents do
|
|||||||
<span :if={@label_suffix} class="text-xs text-bodydark"><%= @label_suffix %></span>
|
<span :if={@label_suffix} class="text-xs text-bodydark"><%= @label_suffix %></span>
|
||||||
</.label>
|
</.label>
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<input type="hidden" name={@name} value="false" />
|
<input type="hidden" id={@id} name={@name} x-bind:value="enabled" {@rest} />
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
id={@id}
|
|
||||||
name={@name}
|
|
||||||
value="true"
|
|
||||||
x-bind:checked="enabled"
|
|
||||||
class="sr-only"
|
|
||||||
@change="enabled = !enabled"
|
|
||||||
{@rest}
|
|
||||||
/>
|
|
||||||
<div class="inline-block cursor-pointer" @click="enabled = !enabled">
|
<div class="inline-block cursor-pointer" @click="enabled = !enabled">
|
||||||
<div x-bind:class="enabled && '!bg-primary'" class="block h-8 w-14 rounded-full bg-black"></div>
|
<div x-bind:class="enabled && '!bg-primary'" class="block h-8 w-14 rounded-full bg-black"></div>
|
||||||
<div
|
<div
|
||||||
@@ -349,23 +339,26 @@ defmodule PinchflatWeb.CoreComponents do
|
|||||||
def input(%{type: "select"} = assigns) do
|
def input(%{type: "select"} = assigns) do
|
||||||
~H"""
|
~H"""
|
||||||
<div phx-feedback-for={@name}>
|
<div phx-feedback-for={@name}>
|
||||||
<.label for={@id}>
|
<.label :if={@label} for={@id}>
|
||||||
<%= @label %><span :if={@label_suffix} class="text-xs text-bodydark"><%= @label_suffix %></span>
|
<%= @label %><span :if={@label_suffix} class="text-xs text-bodydark"><%= @label_suffix %></span>
|
||||||
</.label>
|
</.label>
|
||||||
<select
|
<div class="flex">
|
||||||
id={@id}
|
<select
|
||||||
name={@name}
|
id={@id}
|
||||||
class={[
|
name={@name}
|
||||||
"relative z-20 w-full appearance-none rounded border border-stroke bg-transparent py-3 pl-5 pr-12 outline-none transition",
|
class={[
|
||||||
"focus:border-primary active:border-primary dark:border-form-strokedark dark:bg-form-input text-black dark:text-white",
|
"relative z-20 w-full appearance-none rounded border border-stroke bg-transparent py-3 pl-5 pr-12 outline-none transition",
|
||||||
@inputclass
|
"focus:border-primary active:border-primary dark:border-form-strokedark dark:bg-form-input text-black dark:text-white",
|
||||||
]}
|
@inputclass
|
||||||
multiple={@multiple}
|
]}
|
||||||
{@rest}
|
multiple={@multiple}
|
||||||
>
|
{@rest}
|
||||||
<option :if={@prompt} value=""><%= @prompt %></option>
|
>
|
||||||
<%= Phoenix.HTML.Form.options_for_select(@options, @value) %>
|
<option :if={@prompt} value=""><%= @prompt %></option>
|
||||||
</select>
|
<%= Phoenix.HTML.Form.options_for_select(@options, @value) %>
|
||||||
|
</select>
|
||||||
|
<%= render_slot(@inner_block) %>
|
||||||
|
</div>
|
||||||
<.help :if={@help}><%= @help %></.help>
|
<.help :if={@help}><%= @help %></.help>
|
||||||
<.error :for={msg <- @errors}><%= msg %></.error>
|
<.error :for={msg <- @errors}><%= msg %></.error>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -28,9 +28,10 @@ defmodule PinchflatWeb.CustomComponents.ButtonComponents do
|
|||||||
"#{@rounding} inline-flex items-center justify-center px-8 py-4",
|
"#{@rounding} inline-flex items-center justify-center px-8 py-4",
|
||||||
"#{@color}",
|
"#{@color}",
|
||||||
"hover:bg-opacity-90 lg:px-8 xl:px-10",
|
"hover:bg-opacity-90 lg:px-8 xl:px-10",
|
||||||
"disabled:bg-opacity-50 disabled:cursor-not-allowed disabled:text-gray-2",
|
"disabled:bg-opacity-50 disabled:cursor-not-allowed disabled:text-grey-5",
|
||||||
@class
|
@class
|
||||||
]}
|
]}
|
||||||
|
type={@type}
|
||||||
disabled={@disabled}
|
disabled={@disabled}
|
||||||
{@rest}
|
{@rest}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -31,6 +31,20 @@ defmodule PinchflatWeb.CustomComponents.TextComponents do
|
|||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Renders a subtle link with the given href and content.
|
||||||
|
"""
|
||||||
|
attr :href, :string, required: true
|
||||||
|
slot :inner_block
|
||||||
|
|
||||||
|
def subtle_link(assigns) do
|
||||||
|
~H"""
|
||||||
|
<.link href={@href} class="underline decoration-bodydark decoration-1 hover:decoration-white">
|
||||||
|
<%= render_slot(@inner_block) %>
|
||||||
|
</.link>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Renders an icon as a link with the given href.
|
Renders an icon as a link with the given href.
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
<div class="flex h-screen overflow-hidden">
|
<div class="flex h-screen overflow-hidden">
|
||||||
<div class="relative flex flex-1 flex-col overflow-y-auto overflow-x-hidden">
|
<div class="relative flex flex-1 flex-col overflow-y-auto overflow-x-hidden">
|
||||||
<header class="sticky top-0 z-999 flex w-full bg-white drop-shadow-1 dark:bg-boxdark dark:drop-shadow-none">
|
<header class="sticky top-0 z-999 flex w-full bg-white drop-shadow-1 dark:bg-boxdark dark:drop-shadow-none">
|
||||||
<div class="flex flex-grow items-center px-4 py-4 shadow-2 md:px-6 2xl:px-11">
|
<div class="w-65 px-4 py-2 shadow-2 md:px-6">
|
||||||
<div class="flex items-center">
|
<div class="flex items-center gap-2 py-2">
|
||||||
<img src={~p"/images/logo.png?cachebust=2024-02-29"} alt="Pinchflat" class="w-9 h-9" />
|
<img src={~p"/images/logo.png?cachebust=2024-03-20"} alt="Pinchflat" class="w-auto" />
|
||||||
<h2 class="text-xl font-bold text-white pl-2">Pinchflat</h2>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
<header class="sticky top-0 z-999 flex w-full bg-white drop-shadow-1 dark:bg-boxdark dark:drop-shadow-none">
|
<header class="sticky top-0 z-999 flex h-20 w-full bg-white drop-shadow-1 dark:bg-boxdark dark:drop-shadow-none">
|
||||||
<div class="flex flex-grow items-center justify-between lg:justify-end px-4 py-4 shadow-2 md:px-6 2xl:px-11">
|
<div class="flex flex-grow items-center justify-between lg:justify-end px-4 py-4 shadow-2 md:px-6 2xl:px-11">
|
||||||
<div class="flex items-center gap-2 sm:gap-4 lg:hidden">
|
<div class="flex items-center gap-2 sm:gap-4 lg:hidden w-2/6">
|
||||||
|
<section class="pr-1">
|
||||||
|
<img src={~p"/images/icon.png?cachebust=2024-03-20"} alt="Pinchflat" class="w-10" />
|
||||||
|
</section>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
class="z-99999 block rounded-sm border border-stroke bg-white p-1.5 shadow-sm dark:border-strokedark dark:bg-boxdark lg:hidden"
|
class="z-99999 block mx-2 rounded-sm border border-stroke bg-white p-1.5 shadow-sm dark:border-strokedark dark:bg-boxdark lg:hidden"
|
||||||
@click.stop="sidebarVisible = !sidebarVisible"
|
@click.stop="sidebarVisible = !sidebarVisible"
|
||||||
>
|
>
|
||||||
<.icon name="hero-bars-3" />
|
<.icon name="hero-bars-3" />
|
||||||
</button>
|
</button>
|
||||||
<a class="hidden sm:flex items-center lg:hidden" href="/">
|
|
||||||
<img src={~p"/images/logo.png?cachebust=2024-02-29"} alt="Pinchflat" class="w-9 h-9" />
|
|
||||||
<h2 class="text-xl font-bold text-white pl-2">Pinchflat</h2>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-meta-4 rounded-md">
|
<div class="bg-meta-4 rounded-md w-4/6 lg:w-3/6 xl:w-2/6">
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<span class="absolute left-2 top-1/2 -translate-y-1/2 flex">
|
<span class="absolute left-2 top-1/2 -translate-y-1/2 flex">
|
||||||
<.icon name="hero-magnifying-glass" />
|
<.icon name="hero-magnifying-glass" />
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
name="q"
|
name="q"
|
||||||
value={@params["q"]}
|
value={@params["q"]}
|
||||||
placeholder="Type to search..."
|
placeholder="Type to search..."
|
||||||
class="w-full bg-transparent pl-9 pr-4 border-0 focus:ring-0 focus:outline-none lg:w-125"
|
class="w-full bg-transparent pl-9 pr-4 border-0 focus:ring-0 focus:outline-none"
|
||||||
/>
|
/>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,24 +1,23 @@
|
|||||||
<aside
|
<aside
|
||||||
x-bind:class="sidebarVisible ? 'translate-x-0' : '-translate-x-full'"
|
x-bind:class="sidebarVisible ? 'translate-x-0' : '-translate-x-full'"
|
||||||
class={[
|
class={[
|
||||||
"-translate-x-full absolute left-0 top-0 z-9999 flex h-screen w-60 flex-col overflow-y-hidden justify-between",
|
"-translate-x-full absolute left-0 top-0 z-9999 flex h-screen w-65 flex-col overflow-y-hidden justify-between",
|
||||||
"bg-black duration-300 ease-linear shadow-lg sm:shadow-none dark:bg-boxdark lg:static lg:translate-x-0"
|
"bg-black duration-300 ease-linear shadow-lg sm:shadow-none dark:bg-boxdark lg:static lg:translate-x-0"
|
||||||
]}
|
]}
|
||||||
@click.outside="sidebarVisible = false"
|
@click.outside="sidebarVisible = false"
|
||||||
>
|
>
|
||||||
<section>
|
<section>
|
||||||
<div class="flex items-center justify-between gap-2 px-6 py-5.5 lg:py-6.5">
|
<div class="flex items-center justify-between gap-2 px-6 py-4">
|
||||||
<a href="/" class="flex items-center">
|
<a href="/" class="flex items-center">
|
||||||
<img src={~p"/images/logo.png?cachebust=2024-02-29"} alt="Pinchflat" class="w-9 h-9" />
|
<img src={~p"/images/logo.png?cachebust=2024-03-20"} alt="Pinchflat" class="w-auto" />
|
||||||
<h2 class="text-xl font-bold text-white pl-2">Pinchflat</h2>
|
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<button class="block lg:hidden" @click.stop="sidebarVisible = !sidebarVisible">
|
<button class="block mt-3 lg:hidden" @click.stop="sidebarVisible = !sidebarVisible">
|
||||||
<.icon name="hero-arrow-left" class="fill-current" />
|
<.icon name="hero-arrow-left" class="fill-current" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="no-scrollbar flex flex-col overflow-y-auto duration-300 ease-linear">
|
<div class="no-scrollbar flex flex-col overflow-y-auto duration-300 ease-linear">
|
||||||
<nav class="mt-5 px-4 py-4 lg:mt-9 lg:px-6">
|
<nav class="mt-3 px-4 py-4 lg:px-6">
|
||||||
<h3 class="mb-4 ml-4 text-sm font-medium text-bodydark2">MENU</h3>
|
<h3 class="mb-4 ml-4 text-sm font-medium text-bodydark2">MENU</h3>
|
||||||
<div class="flex flex-col justify-between">
|
<div class="flex flex-col justify-between">
|
||||||
<ul class="mb-6 flex flex-col gap-1.5">
|
<ul class="mb-6 flex flex-col gap-1.5">
|
||||||
@@ -31,7 +30,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<nav class="mt-5 px-4 py-4 lg:mt-9 lg:px-6">
|
<nav class="px-4 py-4 lg:px-6">
|
||||||
<ul class="mb-6 flex flex-col gap-1.5">
|
<ul class="mb-6 flex flex-col gap-1.5">
|
||||||
<.sidebar_item
|
<.sidebar_item
|
||||||
icon="hero-code-bracket"
|
icon="hero-code-bracket"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<%= assigns[:page_title] || "Pinchflat" %>
|
<%= assigns[:page_title] || "Pinchflat" %>
|
||||||
</.live_title>
|
</.live_title>
|
||||||
<link phx-track-static rel="stylesheet" href={~p"/assets/app.css"} />
|
<link phx-track-static rel="stylesheet" href={~p"/assets/app.css"} />
|
||||||
<link rel="icon" type="image/x-icon" href={~p"/favicon.ico?cachebust=2024-02-29"} />
|
<link rel="icon" type="image/x-icon" href={~p"/favicon.ico?cachebust=2024-03-20"} />
|
||||||
<script defer phx-track-static type="text/javascript" src={~p"/assets/app.js"}>
|
<script defer phx-track-static type="text/javascript" src={~p"/assets/app.js"}>
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
method="delete"
|
method="delete"
|
||||||
data-confirm="Are you sure you want to delete this record and all associated files on disk? This cannot be undone."
|
data-confirm="Are you sure you want to delete this record and all associated files on disk? This cannot be undone."
|
||||||
>
|
>
|
||||||
<.button color="bg-meta-1" rounding="rounded-full">
|
<.button color="bg-meta-1" rounding="rounded-lg">
|
||||||
Delete Files
|
Delete Files
|
||||||
</.button>
|
</.button>
|
||||||
</.link>
|
</.link>
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
defmodule PinchflatWeb.MediaProfiles.MediaProfileHTML do
|
defmodule PinchflatWeb.MediaProfiles.MediaProfileHTML do
|
||||||
use PinchflatWeb, :html
|
use PinchflatWeb, :html
|
||||||
|
|
||||||
|
alias Pinchflat.Profiles.MediaProfile
|
||||||
|
|
||||||
embed_templates "media_profile_html/*"
|
embed_templates "media_profile_html/*"
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
@@ -53,4 +55,25 @@ defmodule PinchflatWeb.MediaProfiles.MediaProfileHTML do
|
|||||||
duration_string
|
duration_string
|
||||||
)a
|
)a
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def preset_options do
|
||||||
|
[
|
||||||
|
{"Default", "default"},
|
||||||
|
{"Media Center (Plex, Jellyfin, Kodi, etc.)", "media_center"},
|
||||||
|
{"Music", "audio"},
|
||||||
|
{"Archiving", "archiving"}
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
defp default_output_template do
|
||||||
|
%MediaProfile{}.output_path_template
|
||||||
|
end
|
||||||
|
|
||||||
|
defp media_center_output_template do
|
||||||
|
"/shows/{{ source_custom_name }}/Season {{ season_from_date }}/{{ season_episode_from_date }} - {{ title }}.{{ ext }}"
|
||||||
|
end
|
||||||
|
|
||||||
|
defp audio_output_template do
|
||||||
|
"/music/{{ source_custom_name }}/{{ title }}.{{ ext }}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@@ -2,7 +2,9 @@
|
|||||||
<.link href={~p"/media_profiles"}>
|
<.link href={~p"/media_profiles"}>
|
||||||
<.icon name="hero-arrow-left" class="w-10 h-10 hover:dark:text-white" />
|
<.icon name="hero-arrow-left" class="w-10 h-10 hover:dark:text-white" />
|
||||||
</.link>
|
</.link>
|
||||||
<h2 class="text-title-md2 font-bold text-black dark:text-white ml-4">Edit Media Profile</h2>
|
<h2 class="text-title-md2 font-bold text-black dark:text-white ml-4">
|
||||||
|
Editing "<%= @media_profile.name %>"
|
||||||
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="rounded-sm border border-stroke bg-white px-5 pb-2.5 pt-6 shadow-default dark:border-strokedark dark:bg-boxdark sm:px-7.5 xl:pb-1">
|
<div class="rounded-sm border border-stroke bg-white px-5 pb-2.5 pt-6 shadow-default dark:border-strokedark dark:bg-boxdark sm:px-7.5 xl:pb-1">
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
</h2>
|
</h2>
|
||||||
<nav>
|
<nav>
|
||||||
<.link href={~p"/media_profiles/new"}>
|
<.link href={~p"/media_profiles/new"}>
|
||||||
<.button color="bg-primary" rounding="rounded-full">
|
<.button color="bg-primary" rounding="rounded-lg">
|
||||||
<span class="font-bold text-xl mx-2">+</span> New <span class="hidden sm:inline pl-1">Media Profile</span>
|
<span class="font-bold text-xl mx-2">+</span> New <span class="hidden sm:inline pl-1">Media Profile</span>
|
||||||
</.button>
|
</.button>
|
||||||
</.link>
|
</.link>
|
||||||
@@ -16,10 +16,9 @@
|
|||||||
<div class="flex flex-col gap-10 min-w-max">
|
<div class="flex flex-col gap-10 min-w-max">
|
||||||
<.table rows={@media_profiles} table_class="text-black dark:text-white">
|
<.table rows={@media_profiles} table_class="text-black dark:text-white">
|
||||||
<:col :let={media_profile} label="Name">
|
<:col :let={media_profile} label="Name">
|
||||||
<%= media_profile.name %>
|
<.subtle_link href={~p"/media_profiles/#{media_profile.id}"}>
|
||||||
</:col>
|
<%= media_profile.name %>
|
||||||
<:col :let={media_profile} label="Output Template">
|
</.subtle_link>
|
||||||
<code class="text-sm"><%= media_profile.output_path_template %></code>
|
|
||||||
</:col>
|
</:col>
|
||||||
<:col :let={media_profile} label="Preferred Resolution">
|
<:col :let={media_profile} label="Preferred Resolution">
|
||||||
<%= media_profile.preferred_resolution %>
|
<%= media_profile.preferred_resolution %>
|
||||||
|
|||||||
@@ -3,116 +3,243 @@
|
|||||||
Oops, something went wrong! Please check the errors below.
|
Oops, something went wrong! Please check the errors below.
|
||||||
</.error>
|
</.error>
|
||||||
|
|
||||||
<h3 class="my-4 text-2xl text-black dark:text-white">
|
<section x-data="{ selectedPreset: null }">
|
||||||
General Options
|
<h3 class="my-4 text-2xl text-black dark:text-white">
|
||||||
</h3>
|
Use a Preset
|
||||||
<.input
|
</h3>
|
||||||
field={f[:name]}
|
<section x-data="{ selection: null }">
|
||||||
type="text"
|
<.input
|
||||||
label="Name"
|
prompt="Select preset"
|
||||||
placeholder="New Profile"
|
name="media_profile_preset"
|
||||||
help="Something descriptive. Does not impact indexing or downloading (required)"
|
value=""
|
||||||
/>
|
options={preset_options()}
|
||||||
|
type="select"
|
||||||
|
x-model="selection"
|
||||||
|
inputclass="w-full"
|
||||||
|
help="You can further customize the settings after selecting a preset. This is just a starting point"
|
||||||
|
>
|
||||||
|
<.button
|
||||||
|
class="h-13 w-2/5 lg:w-1/5 ml-2 md:ml-4"
|
||||||
|
rounding="rounded"
|
||||||
|
type="button"
|
||||||
|
x-on:click="selectedPreset = selection; selection = null"
|
||||||
|
x-bind:disabled="!selection"
|
||||||
|
>
|
||||||
|
<span x-text="selection ? 'Load' : 'Select'">Select</span><span class="hidden lg:inline ml-1">Preset</span>
|
||||||
|
</.button>
|
||||||
|
</.input>
|
||||||
|
</section>
|
||||||
|
|
||||||
<.input
|
<h3 class="mt-8 text-2xl text-black dark:text-white">
|
||||||
field={f[:output_path_template]}
|
General Options
|
||||||
type="text"
|
</h3>
|
||||||
inputclass="font-mono"
|
|
||||||
label="Output path template"
|
|
||||||
help="Must end with .{{ ext }}. See below for more details. The default is good for most cases (required)"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<h3 class="mt-8 text-2xl text-black dark:text-white">
|
<section x-data="{
|
||||||
Subtitle Options
|
presets: {
|
||||||
</h3>
|
default: 'Default',
|
||||||
<.input
|
media_center: 'TV Shows',
|
||||||
field={f[:download_subs]}
|
audio: 'Audio',
|
||||||
type="toggle"
|
archiving: 'Archiving'
|
||||||
label="Download Subtitles"
|
}
|
||||||
help="Downloads subtitle files alongside media file"
|
}">
|
||||||
/>
|
<.input
|
||||||
<.input
|
field={f[:name]}
|
||||||
field={f[:download_auto_subs]}
|
type="text"
|
||||||
type="toggle"
|
label="Name"
|
||||||
label="Download Autogenerated Subtitles"
|
placeholder="New Profile"
|
||||||
help="Prefers normal subs but will download autogenerated if needed"
|
help="Something descriptive. Does not impact indexing or downloading (required)"
|
||||||
/>
|
x-init="$watch('selectedPreset', p => p && ($el.value = presets[p]))"
|
||||||
<.input
|
/>
|
||||||
field={f[:embed_subs]}
|
</section>
|
||||||
type="toggle"
|
|
||||||
label="Embed Subtitles"
|
|
||||||
help="Embeds subtitles in the video file itself, if supported (recommended)"
|
|
||||||
/>
|
|
||||||
<.input
|
|
||||||
field={f[:sub_langs]}
|
|
||||||
type="text"
|
|
||||||
label="Subtitle Languages"
|
|
||||||
help="Use commas for multiple languages (eg: en,de)"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<h3 class="mt-8 text-2xl text-black dark:text-white">
|
<section x-data={"{
|
||||||
Thumbnail Options
|
presets: {
|
||||||
</h3>
|
default: '#{default_output_template()}',
|
||||||
<.input
|
media_center: '#{media_center_output_template()}',
|
||||||
field={f[:download_thumbnail]}
|
audio: '#{audio_output_template()}',
|
||||||
type="toggle"
|
archiving: '#{default_output_template()}'
|
||||||
label="Download Thumbnail"
|
}
|
||||||
help="Downloads thumbnail alongside media file"
|
}"}>
|
||||||
/>
|
<.input
|
||||||
<.input
|
field={f[:output_path_template]}
|
||||||
field={f[:embed_thumbnail]}
|
type="text"
|
||||||
type="toggle"
|
inputclass="font-mono"
|
||||||
label="Embed Thumbnail"
|
label="Output path template"
|
||||||
help="Embeds thumbnail in the video file itself, if supported (recommended)"
|
help="Must end with .{{ ext }}. See below for more details. The default is good for most cases (required)"
|
||||||
/>
|
x-init="$watch('selectedPreset', p => p && ($el.value = presets[p]))"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
<h3 class="mt-8 text-2xl text-black dark:text-white">
|
<h3 class="mt-10 text-2xl text-black dark:text-white">
|
||||||
Metadata Options
|
Subtitle Options
|
||||||
</h3>
|
</h3>
|
||||||
<.input
|
|
||||||
field={f[:download_metadata]}
|
|
||||||
type="toggle"
|
|
||||||
label="Download Metadata"
|
|
||||||
help="Downloads metadata file alongside media file"
|
|
||||||
/>
|
|
||||||
<.input
|
|
||||||
field={f[:embed_metadata]}
|
|
||||||
type="toggle"
|
|
||||||
label="Embed Metadata"
|
|
||||||
help="Embeds metadata in the video file itself, if supported (recommended)"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<h3 class="mt-8 text-2xl text-black dark:text-white">
|
<section x-data="{ presets: { default: true, media_center: true, audio: false, archiving: true } }">
|
||||||
Release Format Options
|
<.input
|
||||||
</h3>
|
field={f[:download_subs]}
|
||||||
|
type="toggle"
|
||||||
|
label="Download Subtitles"
|
||||||
|
help="Downloads subtitle files alongside media file"
|
||||||
|
x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
<.input
|
<section x-data="{ presets: { default: false, media_center: false, audio: false, archiving: false } }">
|
||||||
field={f[:shorts_behaviour]}
|
<.input
|
||||||
options={friendly_format_type_options()}
|
field={f[:download_auto_subs]}
|
||||||
type="select"
|
type="toggle"
|
||||||
label="Include Shorts?"
|
label="Download Autogenerated Subtitles"
|
||||||
help="Experimental. Please report any issues on GitHub"
|
help="Prefers normal subs but will download autogenerated if needed. Requires 'Download Subtitles' to be enabled"
|
||||||
/>
|
x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
|
||||||
<.input
|
/>
|
||||||
field={f[:livestream_behaviour]}
|
</section>
|
||||||
options={friendly_format_type_options()}
|
|
||||||
type="select"
|
|
||||||
label="Include Livestreams?"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<h3 class="mt-8 text-2xl text-black dark:text-white">
|
<section x-data="{ presets: { default: true, media_center: true, audio: false, archiving: true } }">
|
||||||
Quality Options
|
<.input
|
||||||
</h3>
|
field={f[:embed_subs]}
|
||||||
|
type="toggle"
|
||||||
|
label="Embed Subtitles"
|
||||||
|
help="Downloads and embeds subtitles in the media file itself, if supported. Uneffected by 'Download Subtitles' (recommended)"
|
||||||
|
x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
<.input
|
<section x-data="{ presets: { default: 'en', media_center: 'en', audio: '', archiving: 'all' } }">
|
||||||
field={f[:preferred_resolution]}
|
<.input
|
||||||
options={friendly_resolution_options()}
|
field={f[:sub_langs]}
|
||||||
type="select"
|
type="text"
|
||||||
label="Preferred Resolution"
|
label="Subtitle Languages"
|
||||||
help="Will grab the closest available resolution if your preferred is not available"
|
help="Use commas for multiple languages (eg: en,de)"
|
||||||
/>
|
x-init="$watch('selectedPreset', p => p && ($el.value = presets[p]))"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
<.button class="my-10 sm:mb-7.5 w-full sm:w-auto">Save Media profile</.button>
|
<h3 class="mt-10 text-2xl text-black dark:text-white">
|
||||||
|
Thumbnail Options
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<section x-data="{ presets: { default: true, media_center: true, audio: false, archiving: true } }">
|
||||||
|
<.input
|
||||||
|
field={f[:download_thumbnail]}
|
||||||
|
type="toggle"
|
||||||
|
label="Download Thumbnail"
|
||||||
|
help="Downloads thumbnail alongside media file"
|
||||||
|
x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section x-data="{ presets: { default: true, media_center: true, audio: true, archiving: true } }">
|
||||||
|
<.input
|
||||||
|
field={f[:embed_thumbnail]}
|
||||||
|
type="toggle"
|
||||||
|
label="Embed Thumbnail"
|
||||||
|
help="Downloads and embeds thumbnail in the media file itself, if supported. Uneffected by 'Download Thumbnail' (recommended)"
|
||||||
|
x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<h3 class="mt-10 text-2xl text-black dark:text-white">
|
||||||
|
Metadata Options
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<section x-data="{ presets: { default: false, media_center: false, audio: false, archiving: true } }">
|
||||||
|
<.input
|
||||||
|
field={f[:download_metadata]}
|
||||||
|
type="toggle"
|
||||||
|
label="Download Metadata"
|
||||||
|
help="Downloads metadata file alongside media file"
|
||||||
|
x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section x-data="{ presets: { default: true, media_center: true, audio: true, archiving: true } }">
|
||||||
|
<.input
|
||||||
|
field={f[:embed_metadata]}
|
||||||
|
type="toggle"
|
||||||
|
label="Embed Metadata"
|
||||||
|
help="Downloads and embeds metadata in the media file itself, if supported. Uneffected by 'Download Metadata' (recommended)"
|
||||||
|
x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<h3 class="mt-10 text-2xl text-black dark:text-white">
|
||||||
|
Release Format Options
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<section x-data="{ presets: { default: 'include', media_center: 'exclude', audio: 'exclude', archiving: 'include' } }">
|
||||||
|
<.input
|
||||||
|
field={f[:shorts_behaviour]}
|
||||||
|
options={friendly_format_type_options()}
|
||||||
|
type="select"
|
||||||
|
label="Include Shorts"
|
||||||
|
help="Experimental. Please report any issues on GitHub"
|
||||||
|
x-init="$watch('selectedPreset', p => p && ($el.value = presets[p]))"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section x-data="{ presets: { default: 'exclude', media_center: 'exclude', audio: 'exclude', archiving: 'include' } }">
|
||||||
|
<.input
|
||||||
|
field={f[:livestream_behaviour]}
|
||||||
|
options={friendly_format_type_options()}
|
||||||
|
type="select"
|
||||||
|
label="Include Livestreams"
|
||||||
|
help="Excludes media that comes from a past livestream"
|
||||||
|
x-init="$watch('selectedPreset', p => p && ($el.value = presets[p]))"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<h3 class="mt-10 text-2xl text-black dark:text-white">
|
||||||
|
Quality Options
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<section x-data="{ presets: { default: '1080p', media_center: '1080p', audio: 'audio', archiving: '2160p' } }">
|
||||||
|
<.input
|
||||||
|
field={f[:preferred_resolution]}
|
||||||
|
options={friendly_resolution_options()}
|
||||||
|
type="select"
|
||||||
|
label="Preferred Resolution"
|
||||||
|
help="Will grab the closest available resolution if your preferred is not available. 'Audio Only' grabs the highest quality m4a"
|
||||||
|
x-init="$watch('selectedPreset', p => p && ($el.value = presets[p]))"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<h3 class="mt-8 text-2xl text-black dark:text-white">
|
||||||
|
Media Center Options
|
||||||
|
</h3>
|
||||||
|
<p class="text-sm mt-2 max-w-prose">
|
||||||
|
Everything in this section is experimental - please open a GitHub issue if you see something odd.
|
||||||
|
<strong>
|
||||||
|
These options only work if this Media Profile's output template is set to split media into seasons.
|
||||||
|
</strong>
|
||||||
|
Try the "Media Center" preset if you're not sure.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<section
|
||||||
|
phx-click={show_modal("upgrade-modal")}
|
||||||
|
x-data="{ presets: { default: false, media_center: true, audio: false, archiving: false } }"
|
||||||
|
>
|
||||||
|
<.input
|
||||||
|
field={f[:download_nfo]}
|
||||||
|
type="toggle"
|
||||||
|
label="Download NFO data"
|
||||||
|
label_suffix="(pro)"
|
||||||
|
help="Downloads NFO data alongside media file for use with Jellyfin, Kodi, etc."
|
||||||
|
x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section x-data="{ presets: { default: false, media_center: true, audio: false, archiving: true } }">
|
||||||
|
<.input
|
||||||
|
field={f[:download_source_images]}
|
||||||
|
type="toggle"
|
||||||
|
label="Download Series Images"
|
||||||
|
help="Downloads poster and banner images for use with Jellyfin, Kodi, etc. Only works for full channels (not playlists)"
|
||||||
|
x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<.button class="my-10 sm:mb-7.5 w-full sm:w-auto" rounding="rounded-lg">Save Media profile</.button>
|
||||||
|
</section>
|
||||||
|
|
||||||
<div class="rounded-sm dark:bg-meta-4 p-4 md:p-6 mb-5">
|
<div class="rounded-sm dark:bg-meta-4 p-4 md:p-6 mb-5">
|
||||||
<.output_template_help />
|
<.output_template_help />
|
||||||
|
|||||||
@@ -4,13 +4,13 @@
|
|||||||
<.icon name="hero-arrow-left" class="w-10 h-10 hover:dark:text-white" />
|
<.icon name="hero-arrow-left" class="w-10 h-10 hover:dark:text-white" />
|
||||||
</.link>
|
</.link>
|
||||||
<h2 class="text-title-md2 font-bold text-black dark:text-white ml-2">
|
<h2 class="text-title-md2 font-bold text-black dark:text-white ml-2">
|
||||||
Media Profile <span class="hidden sm:inline">#<%= @media_profile.id %></span>
|
<%= @media_profile.name %>
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav>
|
<nav>
|
||||||
<.link href={~p"/media_profiles/#{@media_profile}/edit"}>
|
<.link href={~p"/media_profiles/#{@media_profile}/edit"}>
|
||||||
<.button color="bg-primary" rounding="rounded-full">
|
<.button color="bg-primary" rounding="rounded-lg">
|
||||||
<.icon name="hero-pencil-square" class="mr-2" />Edit <span class="hidden sm:inline pl-1">Media Profile</span>
|
<.icon name="hero-pencil-square" class="mr-2" />Edit <span class="hidden sm:inline pl-1">Media Profile</span>
|
||||||
</.button>
|
</.button>
|
||||||
</.link>
|
</.link>
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
method="delete"
|
method="delete"
|
||||||
data-confirm="Are you sure you want to delete this profile and all its sources (leaving files in place)? This cannot be undone."
|
data-confirm="Are you sure you want to delete this profile and all its sources (leaving files in place)? This cannot be undone."
|
||||||
>
|
>
|
||||||
<.button color="bg-meta-1" rounding="rounded-full">
|
<.button color="bg-meta-1" rounding="rounded-lg">
|
||||||
Delete Profile and its Sources
|
Delete Profile and its Sources
|
||||||
</.button>
|
</.button>
|
||||||
</.link>
|
</.link>
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
data-confirm="Are you sure you want to delete this profile, all its sources, and its files on disk? This cannot be undone."
|
data-confirm="Are you sure you want to delete this profile, all its sources, and its files on disk? This cannot be undone."
|
||||||
class="mt-5 md:mt-0"
|
class="mt-5 md:mt-0"
|
||||||
>
|
>
|
||||||
<.button color="bg-meta-1" rounding="rounded-full">
|
<.button color="bg-meta-1" rounding="rounded-lg">
|
||||||
Delete Profile, Sources, and Files
|
Delete Profile, Sources, and Files
|
||||||
</.button>
|
</.button>
|
||||||
</.link>
|
</.link>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<p class="text-md text-bodydark">Don't worry, you can create more Media Profiles later!</p>
|
<p class="text-md text-bodydark">Don't worry, you can create more Media Profiles later!</p>
|
||||||
<div class="mt-8">
|
<div class="mt-8">
|
||||||
<.link href={~p"/media_profiles/new"}>
|
<.link href={~p"/media_profiles/new"}>
|
||||||
<.button color="bg-primary" rounding="rounded-full" disabled={@media_profiles_exist}>
|
<.button color="bg-primary" rounding="rounded-lg" disabled={@media_profiles_exist}>
|
||||||
<span class="font-bold mx-2">+</span> New Media Profile
|
<span class="font-bold mx-2">+</span> New Media Profile
|
||||||
</.button>
|
</.button>
|
||||||
</.link>
|
</.link>
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<div class="mt-8">
|
<div class="mt-8">
|
||||||
<.link href={~p"/sources/new"}>
|
<.link href={~p"/sources/new"}>
|
||||||
<.button color="bg-primary" rounding="rounded-full" disabled={not @media_profiles_exist}>
|
<.button color="bg-primary" rounding="rounded-lg" disabled={not @media_profiles_exist}>
|
||||||
<span class="font-bold mx-2">+</span> New Source
|
<span class="font-bold mx-2">+</span> New Source
|
||||||
</.button>
|
</.button>
|
||||||
</.link>
|
</.link>
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
<p class="text-md text-bodydark">Feel free to add more Media Profiles or Sources in the meantime!</p>
|
<p class="text-md text-bodydark">Feel free to add more Media Profiles or Sources in the meantime!</p>
|
||||||
<div class="mt-8">
|
<div class="mt-8">
|
||||||
<.link href={~p"/?onboarding=0"}>
|
<.link href={~p"/?onboarding=0"}>
|
||||||
<.button color="bg-primary" rounding="rounded-full" disabled={not @sources_exist}>
|
<.button color="bg-primary" rounding="rounded-lg" disabled={not @sources_exist}>
|
||||||
Let's Go <span class="font-bold mx-2">🚀</span>
|
Let's Go <span class="font-bold mx-2">🚀</span>
|
||||||
</.button>
|
</.button>
|
||||||
</.link>
|
</.link>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<div class="mb-6 flex gap-3 flex-row items-center justify-between">
|
<div class="mb-6 flex gap-3 flex-row items-center justify-between">
|
||||||
<h2 class="text-title-md2 font-bold text-black dark:text-white">
|
<h2 class="text-title-md2 font-bold text-black dark:text-white">
|
||||||
<span class="hidden sm:inline">Search </span>Results for "<%= StringUtils.truncate(@search_term, 50) %>"
|
Results for "<%= StringUtils.truncate(@search_term, 50) %>"
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
<%= if match?([_|_], @search_results) do %>
|
<%= if match?([_|_], @search_results) do %>
|
||||||
<.table rows={@search_results} table_class="text-black dark:text-white">
|
<.table rows={@search_results} table_class="text-black dark:text-white">
|
||||||
<:col :let={result} label="Title">
|
<:col :let={result} label="Title">
|
||||||
<%= StringUtils.truncate(result.title, 40) %>
|
<%= result.title %>
|
||||||
</:col>
|
</:col>
|
||||||
<:col :let={result} label="Excerpt">
|
<:col :let={result} label="Excerpt">
|
||||||
<.highlight_search_terms text={result.matching_search_term} />
|
<.highlight_search_terms text={result.matching_search_term} />
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ defmodule PinchflatWeb.Sources.SourceController do
|
|||||||
def show(conn, %{"id" => id}) do
|
def show(conn, %{"id" => id}) do
|
||||||
source = Repo.preload(Sources.get_source!(id), :media_profile)
|
source = Repo.preload(Sources.get_source!(id), :media_profile)
|
||||||
|
|
||||||
pending_tasks = Repo.preload(Tasks.list_pending_tasks_for(:source_id, source.id), :job)
|
pending_tasks = Repo.preload(Tasks.list_pending_tasks_for(source), :job)
|
||||||
pending_media = Media.list_pending_media_items_for(source, limit: 100)
|
pending_media = Media.list_pending_media_items_for(source, limit: 100)
|
||||||
downloaded_media = Media.list_downloaded_media_items_for(source, limit: 100)
|
downloaded_media = Media.list_downloaded_media_items_for(source, limit: 100)
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ defmodule PinchflatWeb.Sources.SourceHTML do
|
|||||||
|
|
||||||
def friendly_index_frequencies do
|
def friendly_index_frequencies do
|
||||||
[
|
[
|
||||||
{"On Create", -1},
|
{"Only once when first created", -1},
|
||||||
{"1 Hour", 60},
|
{"1 Hour", 60},
|
||||||
{"3 Hours", 3 * 60},
|
{"3 Hours", 3 * 60},
|
||||||
{"6 Hours", 6 * 60},
|
{"6 Hours", 6 * 60},
|
||||||
|
|||||||
@@ -2,7 +2,9 @@
|
|||||||
<.link href={~p"/sources"}>
|
<.link href={~p"/sources"}>
|
||||||
<.icon name="hero-arrow-left" class="w-10 h-10 hover:dark:text-white" />
|
<.icon name="hero-arrow-left" class="w-10 h-10 hover:dark:text-white" />
|
||||||
</.link>
|
</.link>
|
||||||
<h2 class="text-title-md2 font-bold text-black dark:text-white ml-4">Edit Source</h2>
|
<h2 class="text-title-md2 font-bold text-black dark:text-white ml-4">
|
||||||
|
Editing "<%= @source.custom_name %>"
|
||||||
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="rounded-sm border border-stroke bg-white px-5 pb-2.5 pt-6 shadow-default dark:border-strokedark dark:bg-boxdark sm:px-7.5 xl:pb-1">
|
<div class="rounded-sm border border-stroke bg-white px-5 pb-2.5 pt-6 shadow-default dark:border-strokedark dark:bg-boxdark sm:px-7.5 xl:pb-1">
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<h2 class="text-title-md2 font-bold text-black dark:text-white">Sources</h2>
|
<h2 class="text-title-md2 font-bold text-black dark:text-white">Sources</h2>
|
||||||
<nav>
|
<nav>
|
||||||
<.link href={~p"/sources/new"}>
|
<.link href={~p"/sources/new"}>
|
||||||
<.button color="bg-primary" rounding="rounded-full">
|
<.button color="bg-primary" rounding="rounded-lg">
|
||||||
<span class="font-bold mx-2">+</span> New <span class="hidden sm:inline pl-1">Source</span>
|
<span class="font-bold mx-2">+</span> New <span class="hidden sm:inline pl-1">Source</span>
|
||||||
</.button>
|
</.button>
|
||||||
</.link>
|
</.link>
|
||||||
@@ -14,19 +14,18 @@
|
|||||||
<div class="flex flex-col gap-10 min-w-max">
|
<div class="flex flex-col gap-10 min-w-max">
|
||||||
<.table rows={@sources} table_class="text-black dark:text-white">
|
<.table rows={@sources} table_class="text-black dark:text-white">
|
||||||
<:col :let={source} label="Name">
|
<:col :let={source} label="Name">
|
||||||
<%= source.custom_name || source.collection_name %>
|
<.subtle_link href={~p"/sources/#{source.id}"}>
|
||||||
|
<%= source.custom_name || source.collection_name %>
|
||||||
|
</.subtle_link>
|
||||||
</:col>
|
</:col>
|
||||||
<:col :let={source} label="Type"><%= source.collection_type %></:col>
|
<:col :let={source} label="Type"><%= source.collection_type %></:col>
|
||||||
<:col :let={source} label="Should Download?">
|
<:col :let={source} label="Should Download?">
|
||||||
<.icon name={if source.download_media, do: "hero-check", else: "hero-x-mark"} />
|
<.icon name={if source.download_media, do: "hero-check", else: "hero-x-mark"} />
|
||||||
</:col>
|
</:col>
|
||||||
<:col :let={source} label="Media Profile">
|
<:col :let={source} label="Media Profile">
|
||||||
<.link
|
<.subtle_link href={~p"/media_profiles/#{source.media_profile_id}"}>
|
||||||
href={~p"/media_profiles/#{source.media_profile_id}"}
|
|
||||||
class="hover:text-secondary duration-200 ease-in-out"
|
|
||||||
>
|
|
||||||
<%= source.media_profile.name %>
|
<%= source.media_profile.name %>
|
||||||
</.link>
|
</.subtle_link>
|
||||||
</:col>
|
</:col>
|
||||||
<:col :let={source} label="" class="flex place-content-evenly">
|
<:col :let={source} label="" class="flex place-content-evenly">
|
||||||
<.icon_link href={~p"/sources/#{source.id}"} icon="hero-eye" class="mx-1" />
|
<.icon_link href={~p"/sources/#{source.id}"} icon="hero-eye" class="mx-1" />
|
||||||
|
|||||||
@@ -4,13 +4,13 @@
|
|||||||
<.icon name="hero-arrow-left" class="w-10 h-10 hover:dark:text-white" />
|
<.icon name="hero-arrow-left" class="w-10 h-10 hover:dark:text-white" />
|
||||||
</.link>
|
</.link>
|
||||||
<h2 class="text-title-md2 font-bold text-black dark:text-white ml-4">
|
<h2 class="text-title-md2 font-bold text-black dark:text-white ml-4">
|
||||||
Source <span class="hidden sm:inline">#<%= @source.id %></span>
|
<%= @source.custom_name %>
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav>
|
<nav>
|
||||||
<.link href={~p"/sources/#{@source}/edit"}>
|
<.link href={~p"/sources/#{@source}/edit"}>
|
||||||
<.button color="bg-primary" rounding="rounded-full">
|
<.button color="bg-primary" rounding="rounded-lg">
|
||||||
<.icon name="hero-pencil-square" class="mr-2" /> Edit <span class="hidden sm:inline pl-1">Source</span>
|
<.icon name="hero-pencil-square" class="mr-2" /> Edit <span class="hidden sm:inline pl-1">Source</span>
|
||||||
</.button>
|
</.button>
|
||||||
</.link>
|
</.link>
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
method="delete"
|
method="delete"
|
||||||
data-confirm="Are you sure you want to delete this source (leaving files in place)? This cannot be undone."
|
data-confirm="Are you sure you want to delete this source (leaving files in place)? This cannot be undone."
|
||||||
>
|
>
|
||||||
<.button color="bg-meta-1" rounding="rounded-full">
|
<.button color="bg-meta-1" rounding="rounded-lg">
|
||||||
Delete Source
|
Delete Source
|
||||||
</.button>
|
</.button>
|
||||||
</.link>
|
</.link>
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
data-confirm="Are you sure you want to delete this source and it's files on disk? This cannot be undone."
|
data-confirm="Are you sure you want to delete this source and it's files on disk? This cannot be undone."
|
||||||
class="mt-5 md:mt-0"
|
class="mt-5 md:mt-0"
|
||||||
>
|
>
|
||||||
<.button color="bg-meta-1" rounding="rounded-full">
|
<.button color="bg-meta-1" rounding="rounded-lg">
|
||||||
Delete Source and Files
|
Delete Source and Files
|
||||||
</.button>
|
</.button>
|
||||||
</.link>
|
</.link>
|
||||||
|
|||||||
@@ -1,11 +1,22 @@
|
|||||||
<.simple_form :let={f} for={@changeset} action={@action}>
|
<.simple_form
|
||||||
|
:let={f}
|
||||||
|
for={@changeset}
|
||||||
|
action={@action}
|
||||||
|
x-data="{ advancedMode: !!JSON.parse(localStorage.getItem('advancedMode')) }"
|
||||||
|
x-init="$watch('advancedMode', value => localStorage.setItem('advancedMode', JSON.stringify(value)))"
|
||||||
|
>
|
||||||
<.error :if={@changeset.action}>
|
<.error :if={@changeset.action}>
|
||||||
Oops, something went wrong! Please check the errors below.
|
Oops, something went wrong! Please check the errors below.
|
||||||
</.error>
|
</.error>
|
||||||
|
|
||||||
<h3 class="mt-8 text-2xl text-black dark:text-white">
|
<section class="flex justify-between items-center mt-8">
|
||||||
General Options
|
<h3 class=" text-2xl text-black dark:text-white">
|
||||||
</h3>
|
General Options
|
||||||
|
</h3>
|
||||||
|
<span class="cursor-pointer hover:underline" x-on:click="advancedMode = !advancedMode">
|
||||||
|
Editing Mode: <span x-text="advancedMode ? 'Advanced' : 'Basic'"></span>
|
||||||
|
</span>
|
||||||
|
</section>
|
||||||
|
|
||||||
<.input
|
<.input
|
||||||
field={f[:custom_name]}
|
field={f[:custom_name]}
|
||||||
@@ -21,6 +32,7 @@
|
|||||||
options={Enum.map(@media_profiles, &{&1.name, &1.id})}
|
options={Enum.map(@media_profiles, &{&1.name, &1.id})}
|
||||||
type="select"
|
type="select"
|
||||||
label="Media Profile"
|
label="Media Profile"
|
||||||
|
help="Sets your preferences for what media to look for and how to store it"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<h3 class="mt-8 text-2xl text-black dark:text-white">
|
<h3 class="mt-8 text-2xl text-black dark:text-white">
|
||||||
@@ -32,7 +44,7 @@
|
|||||||
options={friendly_index_frequencies()}
|
options={friendly_index_frequencies()}
|
||||||
type="select"
|
type="select"
|
||||||
label="Index Frequency"
|
label="Index Frequency"
|
||||||
help="Time between one index of this source finishing and the next one starting. Setting to 'On Create' will still run an initial index but no subsequent ones"
|
help="Indexing is the process of checking for media to download. Sets the time between one index of this source finishing and the next one starting"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<%!-- TODO: use Alpine to disable the index frequency when fast indexing is enabled --%>
|
<%!-- TODO: use Alpine to disable the index frequency when fast indexing is enabled --%>
|
||||||
@@ -40,7 +52,7 @@
|
|||||||
<.input
|
<.input
|
||||||
field={f[:fast_index]}
|
field={f[:fast_index]}
|
||||||
type="toggle"
|
type="toggle"
|
||||||
label="Use Fast Indexing?"
|
label="Use Fast Indexing"
|
||||||
label_suffix="(pro)"
|
label_suffix="(pro)"
|
||||||
help="Experimental. Ignores 'Index Frequency'. Recommended for large channels that upload frequently. See below for more info"
|
help="Experimental. Ignores 'Index Frequency'. Recommended for large channels that upload frequently. See below for more info"
|
||||||
/>
|
/>
|
||||||
@@ -53,7 +65,7 @@
|
|||||||
<.input
|
<.input
|
||||||
field={f[:download_media]}
|
field={f[:download_media]}
|
||||||
type="toggle"
|
type="toggle"
|
||||||
label="Download Media?"
|
label="Download Media"
|
||||||
help="Unchecking still indexes media but it won't be downloaded until you enable this option"
|
help="Unchecking still indexes media but it won't be downloaded until you enable this option"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@@ -62,10 +74,30 @@
|
|||||||
type="text"
|
type="text"
|
||||||
label="Download Cutoff Date"
|
label="Download Cutoff Date"
|
||||||
placeholder="YYYY-MM-DD"
|
placeholder="YYYY-MM-DD"
|
||||||
|
maxlength="10"
|
||||||
|
pattern="((?:19|20)[0-9][0-9])-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])"
|
||||||
|
title="YYYY-MM-DD"
|
||||||
help="Only download media uploaded after this date. Leave blank to download all media. Must be in YYYY-MM-DD format"
|
help="Only download media uploaded after this date. Leave blank to download all media. Must be in YYYY-MM-DD format"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<.button class="my-10 sm:mb-7.5 w-full sm:w-auto">Save Source</.button>
|
<section x-show="advancedMode">
|
||||||
|
<h3 class="mt-8 text-2xl text-black dark:text-white">
|
||||||
|
Advanced Options
|
||||||
|
</h3>
|
||||||
|
<p class="text-sm mt-2">
|
||||||
|
Tread carefully
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<.input
|
||||||
|
field={f[:title_filter_regex]}
|
||||||
|
type="text"
|
||||||
|
label="Title Filter Regex"
|
||||||
|
placeholder="(?i)^How to Bike$"
|
||||||
|
help="A PCRE-compatible regex. Only media with titles that match this regex will be downloaded. Look up 'SQLean Regex docs' for more"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<.button class="my-10 sm:mb-7.5 w-full sm:w-auto" rounding="rounded-lg">Save Source</.button>
|
||||||
|
|
||||||
<div class="rounded-sm dark:bg-meta-4 p-4 md:p-6 mb-5">
|
<div class="rounded-sm dark:bg-meta-4 p-4 md:p-6 mb-5">
|
||||||
<.fast_indexing_help />
|
<.fast_indexing_help />
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ defmodule Pinchflat.MixProject do
|
|||||||
def project do
|
def project do
|
||||||
[
|
[
|
||||||
app: :pinchflat,
|
app: :pinchflat,
|
||||||
version: "0.1.0-alpha.3",
|
version: "0.1.0-alpha.7",
|
||||||
elixir: "~> 1.16",
|
elixir: "~> 1.16",
|
||||||
elixirc_paths: elixirc_paths(Mix.env()),
|
elixirc_paths: elixirc_paths(Mix.env()),
|
||||||
start_permanent: Mix.env() == :prod,
|
start_permanent: Mix.env() == :prod,
|
||||||
@@ -13,6 +13,16 @@ defmodule Pinchflat.MixProject do
|
|||||||
preferred_cli_env: [
|
preferred_cli_env: [
|
||||||
check: :test,
|
check: :test,
|
||||||
credo: :test
|
credo: :test
|
||||||
|
],
|
||||||
|
test_coverage: [
|
||||||
|
ignore_modules: [
|
||||||
|
Pinchflat.HTTP.HTTPClient,
|
||||||
|
PinchflatWeb.Layouts,
|
||||||
|
Pinchflat.DataCase,
|
||||||
|
Pinchflat.Release,
|
||||||
|
~r/Fixtures/,
|
||||||
|
~r/HTML$/
|
||||||
|
]
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
defmodule Pinchflat.Repo.Migrations.AddNfoFilepathToMediaItem do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:media_items) do
|
||||||
|
add :nfo_filepath, :string
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
defmodule Pinchflat.Repo.Migrations.AddDownloadNfoToMediaProfile do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:media_profiles) do
|
||||||
|
add :download_nfo, :boolean, default: false, null: false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
defmodule Pinchflat.Repo.Migrations.CreateSourceMetadata do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
create table(:source_metadata) do
|
||||||
|
add :metadata_filepath, :string, null: false
|
||||||
|
add :source_id, references(:sources, on_delete: :delete_all), null: false
|
||||||
|
|
||||||
|
timestamps(type: :utc_datetime)
|
||||||
|
end
|
||||||
|
|
||||||
|
create unique_index(:source_metadata, [:source_id])
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
defmodule Pinchflat.Repo.Migrations.AddNfoPathToSources do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:sources) do
|
||||||
|
add :nfo_filepath, :string
|
||||||
|
add :series_directory, :string
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
defmodule Pinchflat.Repo.Migrations.AddSourcePhotosFields do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:sources) do
|
||||||
|
add :fanart_filepath, :string
|
||||||
|
add :poster_filepath, :string
|
||||||
|
add :banner_filepath, :string
|
||||||
|
end
|
||||||
|
|
||||||
|
alter table(:media_profiles) do
|
||||||
|
add :download_source_images, :boolean, default: false, null: false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
defmodule Pinchflat.Repo.Migrations.AddTitleRegexToSource do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:sources) do
|
||||||
|
add :title_filter_regex, :string
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
defmodule Pinchflat.Repo.Migrations.RemoveUniqueIndexFromSources do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
drop unique_index(:sources, [:collection_id, :media_profile_id])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 119 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 164 KiB |
@@ -4,7 +4,7 @@ defmodule Pinchflat.Boot.DataBackfillWorkerTest do
|
|||||||
import Pinchflat.MediaFixtures
|
import Pinchflat.MediaFixtures
|
||||||
|
|
||||||
alias Pinchflat.Boot.DataBackfillWorker
|
alias Pinchflat.Boot.DataBackfillWorker
|
||||||
alias Pinchflat.Filesystem.FilesystemDataWorker
|
alias Pinchflat.JobFixtures.TestJobWorker
|
||||||
|
|
||||||
describe "cancel_pending_backfill_jobs/0" do
|
describe "cancel_pending_backfill_jobs/0" do
|
||||||
test "cancels all pending backfill jobs" do
|
test "cancels all pending backfill jobs" do
|
||||||
@@ -21,14 +21,14 @@ defmodule Pinchflat.Boot.DataBackfillWorkerTest do
|
|||||||
|
|
||||||
test "does not cancel jobs for other workers" do
|
test "does not cancel jobs for other workers" do
|
||||||
%{id: 0}
|
%{id: 0}
|
||||||
|> FilesystemDataWorker.new()
|
|> TestJobWorker.new()
|
||||||
|> Repo.insert_unique_job()
|
|> Repo.insert_unique_job()
|
||||||
|
|
||||||
assert_enqueued(worker: FilesystemDataWorker)
|
assert_enqueued(worker: TestJobWorker)
|
||||||
|
|
||||||
DataBackfillWorker.cancel_pending_backfill_jobs()
|
DataBackfillWorker.cancel_pending_backfill_jobs()
|
||||||
|
|
||||||
assert_enqueued(worker: FilesystemDataWorker)
|
assert_enqueued(worker: TestJobWorker)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -125,7 +125,15 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilderTest do
|
|||||||
assert :write_thumbnail in res
|
assert :write_thumbnail in res
|
||||||
end
|
end
|
||||||
|
|
||||||
test "convertes thumbnail to jpg when download_thumbnail is true", %{media_item: media_item} do
|
test "appends -thumb to the thumbnail name when download_thumbnail is true", %{media_item: media_item} do
|
||||||
|
media_item = update_media_profile_attribute(media_item, %{download_thumbnail: true})
|
||||||
|
|
||||||
|
assert {:ok, res} = DownloadOptionBuilder.build(media_item)
|
||||||
|
|
||||||
|
assert {:output, "thumbnail:/tmp/test/media/%(title)S-thumb.%(ext)s"} in res
|
||||||
|
end
|
||||||
|
|
||||||
|
test "converts thumbnail to jpg when download_thumbnail is true", %{media_item: media_item} do
|
||||||
media_item = update_media_profile_attribute(media_item, %{download_thumbnail: true})
|
media_item = update_media_profile_attribute(media_item, %{download_thumbnail: true})
|
||||||
|
|
||||||
assert {:ok, res} = DownloadOptionBuilder.build(media_item)
|
assert {:ok, res} = DownloadOptionBuilder.build(media_item)
|
||||||
@@ -141,6 +149,14 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilderTest do
|
|||||||
assert :embed_thumbnail in res
|
assert :embed_thumbnail in res
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "convertes thumbnail to jpg when embed_thumbnail is true", %{media_item: media_item} do
|
||||||
|
media_item = update_media_profile_attribute(media_item, %{embed_thumbnail: true})
|
||||||
|
|
||||||
|
assert {:ok, res} = DownloadOptionBuilder.build(media_item)
|
||||||
|
|
||||||
|
assert {:convert_thumbnail, "jpg"} in res
|
||||||
|
end
|
||||||
|
|
||||||
test "doesn't include these options when not specified", %{media_item: media_item} do
|
test "doesn't include these options when not specified", %{media_item: media_item} do
|
||||||
media_item = update_media_profile_attribute(media_item, %{embed_thumbnail: false, download_thumbnail: false})
|
media_item = update_media_profile_attribute(media_item, %{embed_thumbnail: false, download_thumbnail: false})
|
||||||
|
|
||||||
@@ -181,12 +197,19 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilderTest do
|
|||||||
end
|
end
|
||||||
|
|
||||||
describe "build/1 when testing quality options" do
|
describe "build/1 when testing quality options" do
|
||||||
test "it includes quality options", %{media_item: media_item} do
|
test "it includes quality options" do
|
||||||
media_item = update_media_profile_attribute(media_item, %{preferred_resolution: :"1080p"})
|
resolutions = ["360", "480", "720", "1080", "2160"]
|
||||||
|
|
||||||
assert {:ok, res} = DownloadOptionBuilder.build(media_item)
|
Enum.each(resolutions, fn resolution ->
|
||||||
|
resolution_atom = String.to_existing_atom(resolution <> "p")
|
||||||
|
|
||||||
assert {:format_sort, "res:1080,+codec:avc:m4a"} in res
|
media_profile = media_profile_fixture(%{preferred_resolution: resolution_atom})
|
||||||
|
source = source_fixture(%{media_profile_id: media_profile.id})
|
||||||
|
media_item = Repo.preload(media_item_fixture(source_id: source.id), source: :media_profile)
|
||||||
|
|
||||||
|
assert {:ok, res} = DownloadOptionBuilder.build(media_item)
|
||||||
|
assert {:format_sort, "res:#{resolution},+codec:avc:m4a"} in res
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it includes quality options for audio only", %{media_item: media_item} do
|
test "it includes quality options for audio only", %{media_item: media_item} do
|
||||||
@@ -199,13 +222,21 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilderTest do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "build_output_path_for/1" do
|
||||||
|
test "builds an output path for a source", %{media_item: media_item} do
|
||||||
|
path = DownloadOptionBuilder.build_output_path_for(media_item.source)
|
||||||
|
|
||||||
|
assert path == "/tmp/test/media/%(title)S.%(ext)s"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp update_media_profile_attribute(media_item_with_preloads, attrs) do
|
defp update_media_profile_attribute(media_item_with_preloads, attrs) do
|
||||||
media_item_with_preloads.source.media_profile
|
media_item_with_preloads.source.media_profile
|
||||||
|> Profiles.change_media_profile(attrs)
|
|> Profiles.change_media_profile(attrs)
|
||||||
|> Repo.update!()
|
|> Repo.update()
|
||||||
|
|
||||||
media_item_with_preloads
|
media_item_with_preloads
|
||||||
|> Repo.reload()
|
|> Repo.reload()
|
||||||
|> Repo.preload(source: :media_profile)
|
|> Repo.preload([source: :media_profile], force: true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||