Update models.py

This commit is contained in:
tcely 2025-04-21 14:09:41 -04:00 committed by GitHub
parent 86e9ac2e34
commit 2a10ecce76
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -19,7 +19,8 @@ from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from common.logger import log from common.logger import log
from common.errors import NoFormatException from common.errors import NoFormatException
from common.utils import clean_filename, clean_emoji from common.utils import ( clean_filename, clean_emoji,
django_queryset_generator as qs_gen, )
from .youtube import (get_media_info as get_youtube_media_info, from .youtube import (get_media_info as get_youtube_media_info,
download_media as download_youtube_media, download_media as download_youtube_media,
get_channel_image_info as get_youtube_channel_image_info) get_channel_image_info as get_youtube_channel_image_info)
@ -812,6 +813,7 @@ class Media(models.Model):
) )
def save(self, force_insert=False, force_update=False, using=None, update_fields=None): def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
setattr(self, '_cached_metadata_dict', None)
# Correct the path after a source is renamed # Correct the path after a source is renamed
if self.created and self.downloaded and not self.media_file_exists: if self.created and self.downloaded and not self.media_file_exists:
fp_list = list((self.filepath,)) fp_list = list((self.filepath,))
@ -838,9 +840,9 @@ class Media(models.Model):
) )
) )
if update_md: if update_md:
self.title = self.metadata_title[:200] or self.title
self.duration = self.metadata_duration or self.duration
setattr(self, '_cached_metadata_dict', None) setattr(self, '_cached_metadata_dict', None)
self.title = self.metadata_title[:200]
self.duration = self.metadata_duration
if update_fields is not None: if update_fields is not None:
# If only some fields are being updated, make sure we update title and duration if metadata changes # If only some fields are being updated, make sure we update title and duration if metadata changes
update_fields = {"title", "duration"}.union(update_fields) update_fields = {"title", "duration"}.union(update_fields)
@ -1105,6 +1107,7 @@ class Media(models.Model):
def metadata_dumps(self, arg_dict=dict()): def metadata_dumps(self, arg_dict=dict()):
from common.utils import json_serial
data = arg_dict or self.new_metadata.with_formats data = arg_dict or self.new_metadata.with_formats
return json.dumps(data, separators=(',', ':'), default=json_serial) return json.dumps(data, separators=(',', ':'), default=json_serial)
@ -1135,13 +1138,11 @@ class Media(models.Model):
def save_to_metadata(self, key, value, /): def save_to_metadata(self, key, value, /):
data = self.loaded_metadata data = self.loaded_metadata
data[key] = value data[key] = value
self.ingest_metadata(data)
#epoch = self.get_metadata_first_value('epoch', arg_dict=data) #epoch = self.get_metadata_first_value('epoch', arg_dict=data)
#migrated = dict(migrated=True, epoch=epoch) #migrated = dict(migrated=True, epoch=epoch)
from common.utils import json_serial self.metadata = self.metadata_dumps(arg_dict=data)
compact_json = json.dumps(data, separators=(',', ':'), default=json_serial)
self.metadata = compact_json
self.save() self.save()
self.ingest_metadata(data)
from common.logger import log from common.logger import log
log.debug(f'Saved to metadata: {self.key} / {self.uuid}: {key=}: {value}') log.debug(f'Saved to metadata: {self.key} / {self.uuid}: {key=}: {value}')
@ -1158,12 +1159,11 @@ class Media(models.Model):
if (now - ran_at) < timedelta(hours=1): if (now - ran_at) < timedelta(hours=1):
return data return data
from common.utils import json_serial compact_json = self.metadata_dumps(arg_dict=data)
compact_json = json.dumps(data, separators=(',', ':'), default=json_serial)
filtered_data = filter_response(data, True) filtered_data = filter_response(data, True)
filtered_data['_reduce_data_ran_at'] = round((now - self.posix_epoch).total_seconds()) filtered_data['_reduce_data_ran_at'] = round((now - self.posix_epoch).total_seconds())
filtered_json = json.dumps(filtered_data, separators=(',', ':'), default=json_serial) filtered_json = self.metadata_dumps(arg_dict=filtered_data)
except Exception as e: except Exception as e:
from common.logger import log from common.logger import log
log.exception('reduce_data: %s', e) log.exception('reduce_data: %s', e)
@ -1753,8 +1753,8 @@ class Metadata(models.Model):
''' '''
class Meta: class Meta:
db_table = 'sync_media_metadata' db_table = 'sync_media_metadata'
verbose_name = _('Metadata about a Media item') verbose_name = _('Metadata about Media')
verbose_name_plural = _('Metadata about a Media item') verbose_name_plural = _('Metadata about Media')
unique_together = ( unique_together = (
('media', 'site', 'key'), ('media', 'site', 'key'),
) )
@ -1770,10 +1770,10 @@ class Metadata(models.Model):
media = models.OneToOneField( media = models.OneToOneField(
Media, Media,
# on_delete=models.DO_NOTHING, # on_delete=models.DO_NOTHING,
on_delete=models.CASCADE, on_delete=models.SET_NULL,
related_name='new_metadata', related_name='new_metadata',
help_text=_('Media the metadata belongs to'), help_text=_('Media the metadata belongs to'),
null=False, null=True,
parent_link=False, parent_link=False,
) )
site = models.CharField( site = models.CharField(
@ -1830,14 +1830,14 @@ class Metadata(models.Model):
@atomic(durable=False) @atomic(durable=False)
def ingest_formats(self, formats=list(), /): def ingest_formats(self, formats=list(), /):
for number, format in enumerate(formats, start=1): for number, format in enumerate(formats, start=1):
mdf = self.metadataformat.get_or_create(site=self.site, key=self.key, code=format.get('format_id'), number=number)[0] mdf, created = self.format.get_or_create(site=self.site, key=self.key, number=number)
mdf.value = format mdf.value = format
mdf.save() mdf.save()
@property @property
def with_formats(self): def with_formats(self):
formats = self.metadataformat.all().order_by('number') formats = self.format.all().order_by('number')
formats_list = [ f.value for f in formats ] formats_list = [ f.value for f in qs_gen(formats) ]
metadata = self.value.copy() metadata = self.value.copy()
metadata.update(dict(formats=formats_list)) metadata.update(dict(formats=formats_list))
return metadata return metadata
@ -1869,7 +1869,11 @@ class Metadata(models.Model):
self.value = data.copy() # try not to have side-effects for the caller self.value = data.copy() # try not to have side-effects for the caller
formats_key = self.media.get_metadata_field('formats') formats_key = self.media.get_metadata_field('formats')
formats = self.value.pop(formats_key, list()) formats = self.value.pop(formats_key, list())
self.uploaded = self.media.published self.uploaded = min(
self.published,
self.retrieved,
self.media.created,
)
self.save() self.save()
self.ingest_formats(formats) self.ingest_formats(formats)
@ -1882,11 +1886,10 @@ class MetadataFormat(models.Model):
''' '''
class Meta: class Meta:
db_table = f'{Metadata._meta.db_table}_format' db_table = f'{Metadata._meta.db_table}_format'
verbose_name = _('Format from the Metadata about a Media item') verbose_name = _('Format from Media Metadata')
verbose_name_plural = _('Formats from the Metadata about a Media item') verbose_name_plural = _('Formats from Media Metadata')
unique_together = ( unique_together = (
('metadata', 'site', 'key', 'number'), ('metadata', 'site', 'key', 'number'),
('metadata', 'site', 'key', 'code'),
) )
ordering = ['site', 'key', 'number'] ordering = ['site', 'key', 'number']
@ -1901,7 +1904,7 @@ class MetadataFormat(models.Model):
Metadata, Metadata,
# on_delete=models.DO_NOTHING, # on_delete=models.DO_NOTHING,
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='metadataformat', related_name='format',
help_text=_('Metadata the format belongs to'), help_text=_('Metadata the format belongs to'),
null=False, null=False,
) )
@ -1921,7 +1924,7 @@ class MetadataFormat(models.Model):
db_index=True, db_index=True,
null=False, null=False,
default='', default='',
help_text=_('Media identifier at the site for which this format is available'), help_text=_('Media identifier at the site from which this format is available'),
) )
number = models.PositiveIntegerField( number = models.PositiveIntegerField(
_('number'), _('number'),
@ -1929,14 +1932,6 @@ class MetadataFormat(models.Model):
null=False, null=False,
help_text=_('Ordering number for this format') help_text=_('Ordering number for this format')
) )
code = models.CharField(
_('code'),
max_length=64,
blank=True,
null=False,
default='',
help_text=_('Format identification code'),
)
value = models.JSONField( value = models.JSONField(
_('value'), _('value'),
encoder=JSONEncoder, encoder=JSONEncoder,