diff --git a/tubesync/sync/models.py b/tubesync/sync/models.py index d8a43649..1809d18a 100644 --- a/tubesync/sync/models.py +++ b/tubesync/sync/models.py @@ -4,7 +4,7 @@ import json import re from xml.etree import ElementTree from collections import OrderedDict -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone as tz from pathlib import Path from django.conf import settings from django.db import models @@ -559,6 +559,7 @@ class Media(models.Model): **(_same_name('upload_date')), **(_same_name('timestamp')), **(_same_name('title')), + **(_same_name('fulltitle')), **(_same_name('description')), **(_same_name('duration')), **(_same_name('formats')), @@ -1029,8 +1030,28 @@ class Media(models.Model): @property def metadata_title(self): - field = self.get_metadata_field('title') - return self.loaded_metadata.get(field, '').strip() + result = '' + for key in ('fulltitle', 'title'): + field = self.get_metadata_field(key) + value = self.loaded_metadata.get(field, '').strip() + if value: + result = value + break + return result + + def metadata_published(self, timestamp=None): + published_dt = 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) + 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): diff --git a/tubesync/sync/tasks.py b/tubesync/sync/tasks.py index a773abf7..0cdb2f32 100644 --- a/tubesync/sync/tasks.py +++ b/tubesync/sync/tasks.py @@ -10,7 +10,7 @@ import math import uuid from io import BytesIO from hashlib import sha1 -from datetime import datetime, timedelta, timezone as tz +from datetime import datetime, timedelta from shutil import copyfile from PIL import Image from django.conf import settings @@ -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}') @@ -386,6 +380,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: