From 552fabed154f3f8084b286bd4a116071f71e0771 Mon Sep 17 00:00:00 2001 From: Veiko Aasa Date: Thu, 18 Apr 2024 12:52:12 +0300 Subject: [PATCH] minidlna: Add media directory selection form The form provides an option to select default directory, user specified directory or samba shares if enabled. The form also checks that the directory exists and is readable by the minidlna user. Tested that changing media directory to a samba share location works. Closes #2084. Signed-off-by: Veiko Aasa Reviewed-by: Sunil Mohan Adapa --- plinth/modules/minidlna/__init__.py | 2 ++ plinth/modules/minidlna/forms.py | 27 ++++++++++++++------------- plinth/modules/minidlna/views.py | 15 +++++---------- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/plinth/modules/minidlna/__init__.py b/plinth/modules/minidlna/__init__.py index edf97e245..11291ad4d 100644 --- a/plinth/modules/minidlna/__init__.py +++ b/plinth/modules/minidlna/__init__.py @@ -29,6 +29,8 @@ _description = [ 'such as PS3 and Xbox 360) or applications such as totem and Kodi.') ] +SYSTEM_USER = 'minidlna' + class MiniDLNAApp(app_module.App): """Freedombox app managing miniDlna.""" diff --git a/plinth/modules/minidlna/forms.py b/plinth/modules/minidlna/forms.py index 556c34e13..388cb19be 100644 --- a/plinth/modules/minidlna/forms.py +++ b/plinth/modules/minidlna/forms.py @@ -3,20 +3,21 @@ FreedomBox configuration form for MiniDLNA server. """ -from django import forms from django.utils.translation import gettext_lazy as _ +from plinth.modules.storage.forms import (DirectorySelectForm, + DirectoryValidator) -class MiniDLNAServerForm(forms.Form): +from . import SYSTEM_USER + + +class MiniDLNAServerForm(DirectorySelectForm): """MiniDLNA server configuration form.""" - media_dir = forms.CharField( - label=_('Media Files Directory'), - help_text=_('Directory that MiniDLNA Server will read for content. All' - ' sub-directories of this will be also scanned for media ' - 'files. ' - 'If you change the default ensure that the new directory ' - 'exists and that is readable from the "minidlna" user. ' - 'Any user media directories ("/home/username/") will ' - 'usually work.'), - required=False, - ) + + def __init__(self, *args, **kw): + validator = DirectoryValidator(username=SYSTEM_USER) + super().__init__( + title=_('Media Files Directory'), help_text=_( + 'Directory that MiniDLNA Server will read for content. All ' + 'sub-directories of this will be also scanned for media files.' + ), default='/var/lib/minidlna', validator=validator, *args, **kw) diff --git a/plinth/modules/minidlna/views.py b/plinth/modules/minidlna/views.py index 16f58fdfa..df2529fa9 100644 --- a/plinth/modules/minidlna/views.py +++ b/plinth/modules/minidlna/views.py @@ -1,8 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later """Views for the minidlna module.""" -import os - from django.contrib import messages from django.utils.translation import gettext_lazy as _ @@ -21,7 +19,8 @@ class MiniDLNAAppView(AppView): def get_initial(self): """Return initial values of the form.""" initial = super().get_initial() - initial.update({'media_dir': privileged.get_media_dir()}) + initial.update({'storage_path': privileged.get_media_dir()}) + return initial def form_valid(self, form): @@ -29,12 +28,8 @@ class MiniDLNAAppView(AppView): old_config = form.initial new_config = form.cleaned_data - if old_config['media_dir'].strip() != new_config['media_dir']: - if os.path.isdir(new_config['media_dir']) is False: - messages.error(self.request, - _('Specified directory does not exist.')) - else: - privileged.set_media_dir(new_config['media_dir']) - messages.success(self.request, _('Updated media directory')) + if old_config['storage_path'] != new_config['storage_path']: + privileged.set_media_dir(new_config['storage_path']) + messages.success(self.request, _('Updated media directory')) return super().form_valid(form)