diff --git a/tubesync/sync/models/__init__.py b/tubesync/sync/models/__init__.py
index a5e3d675..d0029c53 100644
--- a/tubesync/sync/models/__init__.py
+++ b/tubesync/sync/models/__init__.py
@@ -21,20 +21,21 @@ from common.logger import log
from common.errors import NoFormatException
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,
get_channel_image_info as get_youtube_channel_image_info)
-from .utils import (seconds_to_timestr, parse_media_format, filter_response,
+from ..utils import (seconds_to_timestr, parse_media_format, filter_response,
write_text_file, mkdir_p, directory_and_stem, glob_quote,
multi_key_sort)
-from .matching import ( get_best_combined_format, get_best_audio_format,
+from ..matching import ( get_best_combined_format, get_best_audio_format,
get_best_video_format)
-from .fields import CommaSepChoiceField
-from .choices import ( Val, CapChoices, Fallback, FileExtension,
+from ..fields import CommaSepChoiceField
+from ..choices import ( Val, CapChoices, Fallback, FileExtension,
FilterSeconds, IndexSchedule, MediaServerType,
MediaState, SourceResolution, SourceResolutionInteger,
SponsorBlock_Category, YouTube_AudioCodec,
YouTube_SourceType, YouTube_VideoCodec)
+from .media_server import MediaServer
media_file_storage = FileSystemStorage(location=str(settings.DOWNLOAD_ROOT), base_url='/media-data/')
_srctype_dict = lambda n: dict(zip( YouTube_SourceType.values, (n,) * len(YouTube_SourceType.values) ))
@@ -1998,91 +1999,3 @@ class MetadataFormat(models.Model):
self.site,
self.value.get('format') or self.value.get('format_id'),
)
-
-
-class MediaServer(models.Model):
- '''
- A remote media server, such as a Plex server.
- '''
-
- ICONS = {
- Val(MediaServerType.JELLYFIN): '',
- Val(MediaServerType.PLEX): '',
- }
- HANDLERS = MediaServerType.handlers_dict()
-
- server_type = models.CharField(
- _('server type'),
- max_length=1,
- db_index=True,
- choices=MediaServerType.choices,
- default=MediaServerType.PLEX,
- help_text=_('Server type')
- )
- host = models.CharField(
- _('host'),
- db_index=True,
- max_length=200,
- help_text=_('Hostname or IP address of the media server')
- )
- port = models.PositiveIntegerField(
- _('port'),
- db_index=True,
- help_text=_('Port number of the media server')
- )
- use_https = models.BooleanField(
- _('use https'),
- default=False,
- help_text=_('Connect to the media server over HTTPS')
- )
- verify_https = models.BooleanField(
- _('verify https'),
- default=True,
- help_text=_('If connecting over HTTPS, verify the SSL certificate is valid')
- )
- options = models.TextField(
- _('options'),
- blank=False, # valid JSON only
- null=True,
- help_text=_('JSON encoded options for the media server')
- )
-
- def __str__(self):
- return f'{self.get_server_type_display()} server at {self.url}'
-
- class Meta:
- verbose_name = _('Media Server')
- verbose_name_plural = _('Media Servers')
- unique_together = (
- ('host', 'port'),
- )
-
- @property
- def url(self):
- scheme = 'https' if self.use_https else 'http'
- return f'{scheme}://{self.host.strip()}:{self.port}'
-
- @property
- def icon(self):
- return self.ICONS.get(self.server_type)
-
- @property
- def handler(self):
- handler_class = self.HANDLERS.get(self.server_type)
- return handler_class(self)
-
- @property
- def loaded_options(self):
- try:
- return json.loads(self.options)
- except Exception as e:
- return {}
-
- def validate(self):
- return self.handler.validate()
-
- def update(self):
- return self.handler.update()
-
- def get_help_html(self):
- return self.handler.HELP