diff --git a/tubesync/sync/migrations/0011_auto_20220201_1654.py b/tubesync/sync/migrations/0011_auto_20220201_1654.py
new file mode 100644
index 0000000..96d9f4a
--- /dev/null
+++ b/tubesync/sync/migrations/0011_auto_20220201_1654.py
@@ -0,0 +1,21 @@
+# Generated by Django 3.2.11 on 2022-02-01 16:54
+
+import django.core.files.storage
+from django.db import migrations, models
+import sync.models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('sync', '0010_auto_20210924_0554'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='source',
+ name='write_json',
+ field=models.BooleanField(
+ default=False, help_text='Write a JSON file with the media info, these may be detected and used by some media servers', verbose_name='write json'),
+ ),
+ ]
diff --git a/tubesync/sync/models.py b/tubesync/sync/models.py
index 4c99f71..3ac58a4 100644
--- a/tubesync/sync/models.py
+++ b/tubesync/sync/models.py
@@ -298,6 +298,11 @@ class Source(models.Model):
default=False,
help_text=_('Write an NFO file in XML with the media info, these may be detected and used by some media servers')
)
+ write_json = models.BooleanField(
+ _('write json'),
+ default=False,
+ help_text=_('Write a JSON file with the media info, these may be detected and used by some media servers')
+ )
has_failed = models.BooleanField(
_('has failed'),
default=False,
@@ -1072,6 +1077,16 @@ class Media(models.Model):
def nfopath(self):
return self.source.directory_path / self.nfoname
+ @property
+ def jsonname(self):
+ filename = os.path.basename(self.media_file.path)
+ prefix, ext = os.path.splitext(filename)
+ return f'{prefix}.info.json'
+
+ @property
+ def jsonpath(self):
+ return self.source.directory_path / self.jsonname
+
@property
def directory_path(self):
# Otherwise, create a suitable filename from the source media_format
@@ -1220,7 +1235,7 @@ class Media(models.Model):
f'no valid format available')
# Download the media with youtube-dl
download_youtube_media(self.url, format_str, self.source.extension,
- str(self.filepath))
+ str(self.filepath), self.source.write_json)
# Return the download paramaters
return format_str, self.source.extension
diff --git a/tubesync/sync/templates/sync/source.html b/tubesync/sync/templates/sync/source.html
index f8b1e39..1668e3b 100644
--- a/tubesync/sync/templates/sync/source.html
+++ b/tubesync/sync/templates/sync/source.html
@@ -111,6 +111,10 @@
Write NFO? |
Write NFO? {% if source.write_nfo %}{% else %}{% endif %} |
+
+ Write JSON? |
+ Write JSON? {% if source.write_json %}{% else %}{% endif %} |
+
{% if source.delete_old_media and source.days_to_keep > 0 %}
Delete old media |
diff --git a/tubesync/sync/views.py b/tubesync/sync/views.py
index a45ed70..1eb9f43 100644
--- a/tubesync/sync/views.py
+++ b/tubesync/sync/views.py
@@ -280,7 +280,7 @@ class AddSourceView(CreateView):
fields = ('source_type', 'key', 'name', 'directory', 'media_format',
'index_schedule', 'download_media', 'download_cap', 'delete_old_media',
'days_to_keep', 'source_resolution', 'source_vcodec', 'source_acodec',
- 'prefer_60fps', 'prefer_hdr', 'fallback', 'copy_thumbnails', 'write_nfo')
+ 'prefer_60fps', 'prefer_hdr', 'fallback', 'copy_thumbnails', 'write_nfo', 'write_json')
errors = {
'invalid_media_format': _('Invalid media format, the media format contains '
'errors or is empty. Check the table at the end of '
@@ -371,7 +371,7 @@ class UpdateSourceView(UpdateView):
fields = ('source_type', 'key', 'name', 'directory', 'media_format',
'index_schedule', 'download_media', 'download_cap', 'delete_old_media',
'days_to_keep', 'source_resolution', 'source_vcodec', 'source_acodec',
- 'prefer_60fps', 'prefer_hdr', 'fallback', 'copy_thumbnails', 'write_nfo')
+ 'prefer_60fps', 'prefer_hdr', 'fallback', 'copy_thumbnails', 'write_nfo', 'write_json')
errors = {
'invalid_media_format': _('Invalid media format, the media format contains '
'errors or is empty. Check the table at the end of '
@@ -421,6 +421,8 @@ class DeleteSourceView(DeleteView, FormMixin):
delete_file(media.thumbpath)
# Delete NFO file if it exists
delete_file(media.nfopath)
+ # Delete JSON file if it exists
+ delete_file(media.jsonpath)
return super().post(request, *args, **kwargs)
def get_success_url(self):
diff --git a/tubesync/sync/youtube.py b/tubesync/sync/youtube.py
index f6a959b..6827749 100644
--- a/tubesync/sync/youtube.py
+++ b/tubesync/sync/youtube.py
@@ -64,7 +64,7 @@ def get_media_info(url):
return response
-def download_media(url, media_format, extension, output_file):
+def download_media(url, media_format, extension, output_file, info_json):
'''
Downloads a YouTube URL to a file on disk.
'''
@@ -108,6 +108,7 @@ def download_media(url, media_format, extension, output_file):
'outtmpl': output_file,
'quiet': True,
'progress_hooks': [hook],
+ 'writeinfojson': info_json
})
with yt_dlp.YoutubeDL(opts) as y:
try: