From 695c1f6e594917c4bfb4f0369187f6f9ff3b82ce Mon Sep 17 00:00:00 2001 From: tcely Date: Mon, 17 Feb 2025 08:07:46 -0500 Subject: [PATCH 1/6] Add `metadata_published` property --- tubesync/sync/models.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tubesync/sync/models.py b/tubesync/sync/models.py index d8a43649..8ae84a4e 100644 --- a/tubesync/sync/models.py +++ b/tubesync/sync/models.py @@ -1032,6 +1032,20 @@ class Media(models.Model): field = self.get_metadata_field('title') return self.loaded_metadata.get(field, '').strip() + @property + def metadata_published(self): + published_dt = None + field = self.get_metadata_field('timestamp') + timestamp = self.loaded_metadata.get(field, None) + if timestamp is not None: + try: + timestamp_float = float(timestamp) + posix_epoch = datetime(1970, 1, 1, tzinfo=tz.utc) + published_dt = posix_epoch + timedelta(seconds=timestamp_float) + except Exception as e: + log.warn(f'Could not compute published from timestamp for: {self.source} / {self} with "{e}"') + return published_dt + @property def slugtitle(self): replaced = self.title.replace('_', '-').replace('&', 'and').replace('+', 'and') From 0a1b08b6548ddad8cc439db189c725aaad3e45ea Mon Sep 17 00:00:00 2001 From: tcely Date: Mon, 17 Feb 2025 08:13:20 -0500 Subject: [PATCH 2/6] Use `Media.metadata_published` --- tubesync/sync/tasks.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tubesync/sync/tasks.py b/tubesync/sync/tasks.py index a773abf7..b90113cb 100644 --- a/tubesync/sync/tasks.py +++ b/tubesync/sync/tasks.py @@ -386,6 +386,9 @@ def download_media_metadata(media_id): # Media must have a valid upload date if upload_date: media.published = timezone.make_aware(upload_date) + published = media.metadata_published + if published: + media.published = published # Store title in DB so it's fast to access if media.metadata_title: From 494250625c6c9c652f1e9902a239e6fb5d557ae0 Mon Sep 17 00:00:00 2001 From: tcely Date: Mon, 17 Feb 2025 08:19:19 -0500 Subject: [PATCH 3/6] Add an optional argument to `metadata_published` --- tubesync/sync/models.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tubesync/sync/models.py b/tubesync/sync/models.py index 8ae84a4e..6330360c 100644 --- a/tubesync/sync/models.py +++ b/tubesync/sync/models.py @@ -1033,10 +1033,11 @@ class Media(models.Model): return self.loaded_metadata.get(field, '').strip() @property - def metadata_published(self): + def metadata_published(self, timestamp=None): published_dt = None - field = self.get_metadata_field('timestamp') - timestamp = self.loaded_metadata.get(field, None) + if timestamp is None: + field = self.get_metadata_field('timestamp') + timestamp = self.loaded_metadata.get(field, None) if timestamp is not None: try: timestamp_float = float(timestamp) From 37b15ed625838c2bdfe2cda066597e6924fcac6a Mon Sep 17 00:00:00 2001 From: tcely Date: Mon, 17 Feb 2025 08:23:49 -0500 Subject: [PATCH 4/6] Use `Media.metadata_published` for indexing also --- tubesync/sync/tasks.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/tubesync/sync/tasks.py b/tubesync/sync/tasks.py index b90113cb..fd6ec53b 100644 --- a/tubesync/sync/tasks.py +++ b/tubesync/sync/tasks.py @@ -217,15 +217,9 @@ def index_source_task(source_id): media.duration = float(video.get(fields('duration', media), None) or 0) or None media.title = str(video.get(fields('title', media), ''))[:200] timestamp = video.get(fields('timestamp', media), None) - if timestamp is not None: - try: - timestamp_float = float(timestamp) - posix_epoch = datetime(1970, 1, 1, tzinfo=tz.utc) - published_dt = posix_epoch + timedelta(seconds=timestamp_float) - except Exception as e: - log.warn(f'Could not set published for: {source} / {media} with "{e}"') - else: - media.published = published_dt + published_dt = media.metadata_published(timestamp) + if published_dt is not None: + media.published = published_dt try: media.save() log.debug(f'Indexed media: {source} / {media}') From 35a4d2fd391bfc73c9d2d73954c4cb7f16d7c9b7 Mon Sep 17 00:00:00 2001 From: tcely Date: Mon, 17 Feb 2025 08:34:37 -0500 Subject: [PATCH 5/6] Use a function instead of a property --- tubesync/sync/models.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tubesync/sync/models.py b/tubesync/sync/models.py index 6330360c..8ca8d6ab 100644 --- a/tubesync/sync/models.py +++ b/tubesync/sync/models.py @@ -1032,7 +1032,6 @@ class Media(models.Model): field = self.get_metadata_field('title') return self.loaded_metadata.get(field, '').strip() - @property def metadata_published(self, timestamp=None): published_dt = None if timestamp is None: From 226d886557b6cb035a349b177db152fb5c1dd745 Mon Sep 17 00:00:00 2001 From: tcely Date: Mon, 17 Feb 2025 08:35:56 -0500 Subject: [PATCH 6/6] fixup: call the function --- tubesync/sync/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tubesync/sync/tasks.py b/tubesync/sync/tasks.py index fd6ec53b..2bb3e75e 100644 --- a/tubesync/sync/tasks.py +++ b/tubesync/sync/tasks.py @@ -380,7 +380,7 @@ def download_media_metadata(media_id): # Media must have a valid upload date if upload_date: media.published = timezone.make_aware(upload_date) - published = media.metadata_published + published = media.metadata_published() if published: media.published = published