mirror of
https://github.com/meeb/tubesync.git
synced 2025-06-24 14:06:36 +00:00
Update models.py
This commit is contained in:
parent
86e9ac2e34
commit
2a10ecce76
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user