diff --git a/core/migrations/0012_default_active_m3u_accounts.py b/core/migrations/0012_default_active_m3u_accounts.py new file mode 100644 index 00000000..11888772 --- /dev/null +++ b/core/migrations/0012_default_active_m3u_accounts.py @@ -0,0 +1,22 @@ +# Generated by Django 5.1.6 on 2025-03-01 14:01 + +from django.db import migrations +from django.utils.text import slugify + +def preload_core_settings(apps, schema_editor): + CoreSettings = apps.get_model("core", "CoreSettings") + CoreSettings.objects.create( + key=slugify("Auto-Import Mapped Files"), + name="Auto-Import Mapped Files", + value=True, + ) + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0011_fix_stream_profiles_and_user_agents'), + ] + + operations = [ + migrations.RunPython(preload_core_settings), + ] diff --git a/core/models.py b/core/models.py index a4fa92d4..a8571b5c 100644 --- a/core/models.py +++ b/core/models.py @@ -144,6 +144,7 @@ DEFAULT_USER_AGENT_KEY= slugify("Default User-Agent") DEFAULT_STREAM_PROFILE_KEY = slugify("Default Stream Profile") STREAM_HASH_KEY = slugify("M3U Hash Key") PREFERRED_REGION_KEY = slugify("Preferred Region") +AUTO_IMPORT_MAPPED_FILES = slugify("Auto-Import Mapped Files") class CoreSettings(models.Model): key = models.CharField( @@ -173,9 +174,18 @@ class CoreSettings(models.Model): def get_m3u_hash_key(cls): return cls.objects.get(key=STREAM_HASH_KEY).value + @classmethod def get_preferred_region(cls): """Retrieve the preferred region setting (or return None if not found).""" try: return cls.objects.get(key=PREFERRED_REGION_KEY).value except cls.DoesNotExist: return None + + @classmethod + def get_auto_import_mapped_files(cls): + """Retrieve the preferred region setting (or return None if not found).""" + try: + return cls.objects.get(key=AUTO_IMPORT_MAPPED_FILES).value + except cls.DoesNotExist: + return None diff --git a/core/tasks.py b/core/tasks.py index 5dd6a746..f6069e69 100644 --- a/core/tasks.py +++ b/core/tasks.py @@ -14,6 +14,7 @@ from apps.m3u.models import M3UAccount from apps.epg.models import EPGSource from apps.m3u.tasks import refresh_single_m3u_account from apps.epg.tasks import refresh_epg_data +from .models import CoreSettings logger = logging.getLogger(__name__) @@ -67,6 +68,7 @@ def scan_and_process_files(): m3u_account, _ = M3UAccount.objects.get_or_create(file_path=filepath, defaults={ "name": filename, + "is_active": CoreSettings.get_auto_import_mapped_files(), }) redis_client.set(redis_key, mtime, ex=REDIS_TTL) @@ -117,11 +119,17 @@ def scan_and_process_files(): epg_source, _ = EPGSource.objects.get_or_create(file_path=filepath, defaults={ "name": filename, "source_type": "xmltv", + "is_active": CoreSettings.get_auto_import_mapped_files(), }) + redis_client.set(redis_key, mtime, ex=REDIS_TTL) + redis_client.set(redis_key, mtime, ex=REDIS_TTL) + + if not epg_source.is_active: + logger.info("EPG source is inactive, skipping.") + continue + refresh_epg_data.delay(epg_source.id) # Trigger Celery task - redis_client.set(redis_key, mtime, ex=REDIS_TTL) - redis_client.set(redis_key, mtime, ex=REDIS_TTL) channel_layer = get_channel_layer() async_to_sync(channel_layer.group_send)( diff --git a/frontend/src/pages/Settings.jsx b/frontend/src/pages/Settings.jsx index 81a85c78..19bec97e 100644 --- a/frontend/src/pages/Settings.jsx +++ b/frontend/src/pages/Settings.jsx @@ -12,6 +12,8 @@ import { Paper, Select, Stack, + Switch, + Text, Title, } from '@mantine/core'; import { isNotEmpty, useForm } from '@mantine/form'; @@ -280,6 +282,7 @@ const SettingsPage = () => { 'default-user-agent': '', 'default-stream-profile': '', 'preferred-region': '', + 'auto-import-mapped-files': true, }, validate: { @@ -294,6 +297,15 @@ const SettingsPage = () => { form.setValues( Object.entries(settings).reduce((acc, [key, value]) => { // Modify each value based on its own properties + switch (value.value) { + case 'true': + value.value = true; + break; + case 'false': + value.value = false; + break; + } + acc[key] = value.value; return acc; }, {}) @@ -307,7 +319,7 @@ const SettingsPage = () => { for (const settingKey in values) { // If the user changed the setting’s value from what’s in the DB: if (String(values[settingKey]) !== String(settings[settingKey].value)) { - changedSettings[settingKey] = values[settingKey]; + changedSettings[settingKey] = `${values[settingKey]}`; } } @@ -373,13 +385,29 @@ const SettingsPage = () => { }))} /> + + + Auto-Import Mapped Files + + + +