funkwhale/api/funkwhale_api/music/dynamic_preferences_registr...

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}