205 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Python
		
	
	
	
| from django.forms import widgets
 | |
| from dynamic_preferences import types
 | |
| from dynamic_preferences.registries import global_preferences_registry
 | |
| 
 | |
| music = types.Section("music")
 | |
| quality_filters = types.Section("quality_filters")
 | |
| 
 | |
| 
 | |
| @global_preferences_registry.register
 | |
| class MaxTracks(types.BooleanPreference):
 | |
|     show_in_api = True
 | |
|     section = music
 | |
|     name = "transcoding_enabled"
 | |
|     verbose_name = "Transcoding enabled"
 | |
|     help_text = (
 | |
|         "Enable transcoding of audio files in formats requested by the client. "
 | |
|         "This is especially useful for devices that do not support formats "
 | |
|         "such as Flac or Ogg, but the transcoding process will increase the "
 | |
|         "load on the server."
 | |
|     )
 | |
|     default = True
 | |
| 
 | |
| 
 | |
| @global_preferences_registry.register
 | |
| class MusicCacheDuration(types.IntPreference):
 | |
|     show_in_api = True
 | |
|     section = music
 | |
|     name = "transcoding_cache_duration"
 | |
|     default = 60 * 24 * 7
 | |
|     verbose_name = "Transcoding cache duration"
 | |
|     help_text = (
 | |
|         "How many minutes do you want to keep a copy of transcoded tracks "
 | |
|         "on the server? Transcoded files that were not listened in this interval "
 | |
|         "will be erased and retranscoded on the next listening."
 | |
|     )
 | |
|     field_kwargs = {"required": False}
 | |
| 
 | |
| 
 | |
| @global_preferences_registry.register
 | |
| class MbidTaggedContent(types.BooleanPreference):
 | |
|     show_in_api = True
 | |
|     section = music
 | |
|     name = "only_allow_musicbrainz_tagged_files"
 | |
|     verbose_name = "Only allow Musicbrainz tagged files"
 | |
|     help_text = (
 | |
|         "Requires uploaded files to be tagged with a MusicBrainz ID. "
 | |
|         "Enabling this setting has no impact on previously uploaded files. "
 | |
|         "You can use the CLI to clear files that don't contain an MBID or "
 | |
|         "or enable quality filtering to hide untagged content from API calls. "
 | |
|     )
 | |
|     default = False
 | |
| 
 | |
| 
 | |
| @global_preferences_registry.register
 | |
| class MbGenreTags(types.BooleanPreference):
 | |
|     show_in_api = True
 | |
|     section = music
 | |
|     name = "musicbrainz_genre_update"
 | |
|     verbose_name = "Prepopulate tags with MusicBrainz Genre "
 | |
|     help_text = (
 | |
|         "Will trigger a monthly update of the tag table "
 | |
|         "using Musicbrainz genres. Non-existing tag will be created and "
 | |
|         "MusicBrainz Ids will be added to the tags if "
 | |
|         "they match the genre name."
 | |
|     )
 | |
|     default = True
 | |
| 
 | |
| 
 | |
| @global_preferences_registry.register
 | |
| class MbSyncTags(types.BooleanPreference):
 | |
|     show_in_api = True
 | |
|     section = music
 | |
|     name = "sync_musicbrainz_tags"
 | |
|     verbose_name = "Sync MusicBrainz to to funkwhale objects"
 | |
|     help_text = (
 | |
|         "If uploaded files are tagged with a MusicBrainz ID, "
 | |
|         "Funkwhale will query MusicBrainz server to add tags to "
 | |
|         "the track, artist and album objects."
 | |
|     )
 | |
|     default = False
 | |
| 
 | |
| 
 | |
| # quality_filters section. Note that the default False is not applied in the fronted
 | |
| # (the filter will onlyu be use if set to True)
 | |
| @global_preferences_registry.register
 | |
| class BitrateFilter(types.ChoicePreference):
 | |
|     show_in_api = True
 | |
|     section = quality_filters
 | |
|     name = "bitrate_filter"
 | |
|     verbose_name = "Upload Quality Filter"
 | |
|     default = "low"
 | |
|     choices = [
 | |
|         ("low", "Allow all audio qualities"),
 | |
|         ("medium", "Medium : Do not allow low quality"),
 | |
|         ("high", "High : only allow high and very-high audio qualities"),
 | |
|         ("very_high", "Very High : only allow very-high audio quality"),
 | |
|     ]
 | |
|     help_text = (
 | |
|         "The main page content can be filtered based on audio quality. "
 | |
|         "This will exclude lower quality, higher qualities are never excluded. "
 | |
|         "Quality Table can be found in the docs."
 | |
|     )
 | |
|     field_kwargs = {"choices": choices, "required": False}
 | |
| 
 | |
| 
 | |
| @global_preferences_registry.register
 | |
| class HasMbid(types.BooleanPreference):
 | |
|     show_in_api = True
 | |
|     section = quality_filters
 | |
|     name = "has_mbid"
 | |
|     verbose_name = "Musicbrainz Ids filter"
 | |
|     help_text = "Should we filter out metadata without Musicbrainz Ids ?"
 | |
|     default = False
 | |
| 
 | |
| 
 | |
| @global_preferences_registry.register
 | |
| class Format(types.MultipleChoicePreference):
 | |
|     show_in_api = True
 | |
|     section = quality_filters
 | |
|     name = "format"
 | |
|     verbose_name = "Allowed Audio Format"
 | |
|     default = (["aac", "aif", "aiff", "flac", "mp3", "ogg", "opus"],)
 | |
|     choices = [
 | |
|         ("ogg", "ogg"),
 | |
|         ("opus", "opus"),
 | |
|         ("flac", "flac"),
 | |
|         ("aif", "aif"),
 | |
|         ("aiff", "aiff"),
 | |
|         ("aac", "aac"),
 | |
|         ("mp3", "mp3"),
 | |
|     ]
 | |
|     help_text = "Witch audio format to allow"
 | |
| 
 | |
| 
 | |
| @global_preferences_registry.register
 | |
| class AlbumArt(types.BooleanPreference):
 | |
|     show_in_api = True
 | |
|     section = quality_filters
 | |
|     name = "has_cover"
 | |
|     verbose_name = "Album art Filter"
 | |
|     help_text = "Only Albums with a cover will be displayed in the home page"
 | |
|     default = False
 | |
| 
 | |
| 
 | |
| @global_preferences_registry.register
 | |
| class Tags(types.BooleanPreference):
 | |
|     show_in_api = True
 | |
|     section = quality_filters
 | |
|     name = "has_tags"
 | |
|     verbose_name = "Tags Filter"
 | |
|     help_text = "Only content with at least one tag will be displayed"
 | |
|     default = False
 | |
| 
 | |
| 
 | |
| @global_preferences_registry.register
 | |
| class ReleaseDate(types.BooleanPreference):
 | |
|     show_in_api = True
 | |
|     section = quality_filters
 | |
|     name = "has_release_date"
 | |
|     verbose_name = "Release date Filter"
 | |
|     help_text = "Only content with a release date will be displayed"
 | |
|     default = False
 | |
| 
 | |
| 
 | |
| @global_preferences_registry.register
 | |
| class JoinPhrases(types.StringPreference):
 | |
|     show_in_api = True
 | |
|     section = music
 | |
|     name = "join_phrases"
 | |
|     verbose_name = "Join Phrases"
 | |
|     help_text = (
 | |
|         "Used by the artist parser to create multiples artists in case the metadata "
 | |
|         "is a single string. BE WARNED, changing the order or the values can break the parser in unexpected ways. "
 | |
|         "It's MANDATORY to escape dots and to put doted variation before because the first match is used "
 | |
|         r"(example : `|feat\.|ft\.|feat|` and not `feat|feat\.|ft\.|feat`.). ORDER is really important "
 | |
|         "(says an anarchist). To avoid artist duplication and wrongly parsed artist data "
 | |
|         "it's recommended to tag files with Musicbrainz Picard. "
 | |
|     )
 | |
|     default = (
 | |
|         r"featuring | feat\. | ft\. | feat | with | and | & | vs\. | \| | \||\| |\|| , | ,|, |,|"
 | |
|         r" ; | ;|; |;| versus | vs | \( | \(|\( |\(| Remix\) |Remix\) | Remix\)| \) | \)|\) |\)| x |"
 | |
|         "accompanied by | alongside | together with | collaboration with | featuring special guest |"
 | |
|         "joined by | joined with | featuring guest | introducing | accompanied by | performed by | performed with |"
 | |
|         "performed by and | and | featuring | with | presenting | accompanied by | and special guest |"
 | |
|         "featuring special guests | featuring and | featuring & | and featuring "
 | |
|     )
 | |
|     widget = widgets.Textarea
 | |
|     field_kwargs = {"required": False}
 | |
| 
 | |
| 
 | |
| @global_preferences_registry.register
 | |
| class DefaultJoinPhrases(types.StringPreference):
 | |
|     show_in_api = True
 | |
|     section = music
 | |
|     name = "default_join_phrase"
 | |
|     verbose_name = "Default Join Phrase"
 | |
|     help_text = (
 | |
|         "The default join phrase used by artist parser"
 | |
|         "For example: `artists = [artist1, Artist2]` will be displayed has : artist1.name, artis2.name"
 | |
|         "Changing this value will not update already parsed artists"
 | |
|     )
 | |
|     default = ", "
 | |
|     widget = widgets.Textarea
 | |
|     field_kwargs = {"required": False}
 |