-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig.py
More file actions
125 lines (113 loc) · 5.1 KB
/
config.py
File metadata and controls
125 lines (113 loc) · 5.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import os
import json
CONFIG_PATH = os.path.expanduser("~/.soundvault_config.json")
# List of external metadata services supported by the application.
SUPPORTED_SERVICES = [
"AcoustID",
"Last.fm",
"Spotify",
"MusicBrainz",
"Gracenote",
]
# Threshold for considering two tracks as near-duplicates when syncing
NEAR_DUPLICATE_THRESHOLD = 0.1
EXACT_DUPLICATE_THRESHOLD = 0.02
MIXED_CODEC_THRESHOLD_BOOST = 0.03
ARTWORK_VASTLY_DIFFERENT_THRESHOLD = 24
PREVIEW_ARTWORK_MAX_DIM = 192
PREVIEW_ARTWORK_QUALITY = 20
# File format quality priority used during Library Sync
FORMAT_PRIORITY = {".flac": 3, ".wav": 2, ".mp3": 1}
# Default fingerprint matching thresholds by file extension. The ``default`` key
# is used when a specific extension is not provided.
DEFAULT_FP_THRESHOLDS = {
"default": 0.3,
".flac": 0.3,
".mp3": 0.35,
".m4a": 0.35,
".aac": 0.35,
}
# Default threshold for simple duplicate detection
DEFAULT_DUP_THRESHOLD = 0.03
# Default prefix length used for duplicate grouping
DEFAULT_DUP_PREFIX_LEN = 16
# Default settings for fingerprint normalization
FP_OFFSET_MS = 0
FP_DURATION_MS = 120_000
FP_TRIM_SILENCE = True
FP_SILENCE_THRESHOLD_DB = -50.0
FP_SILENCE_MIN_LEN_MS = 500
FP_TRIM_LEAD_MAX_MS = 1000
FP_TRIM_TRAIL_MAX_MS = 1000
FP_TRIM_PADDING_MS = 100
ALLOW_MISMATCHED_EDITS = True
FP_SUBPROCESS_TIMEOUT_SEC = 180
def load_config():
"""Load configuration from ``CONFIG_PATH``.
Returns an empty dict if the file does not exist or can't be read.
"""
try:
with open(CONFIG_PATH, "r", encoding="utf-8") as f:
cfg = json.load(f)
if "musicbrainz_useragent" not in cfg:
cfg["musicbrainz_useragent"] = {
"app": "",
"version": "",
"contact": "",
}
if "format_fp_thresholds" not in cfg:
cfg["format_fp_thresholds"] = DEFAULT_FP_THRESHOLDS.copy()
cfg.setdefault("duplicate_threshold", DEFAULT_DUP_THRESHOLD)
cfg.setdefault("duplicate_prefix_len", DEFAULT_DUP_PREFIX_LEN)
cfg.setdefault("trim_silence", FP_TRIM_SILENCE)
cfg.setdefault("near_duplicate_threshold", NEAR_DUPLICATE_THRESHOLD)
cfg.setdefault("exact_duplicate_threshold", EXACT_DUPLICATE_THRESHOLD)
cfg.setdefault("fingerprint_offset_ms", FP_OFFSET_MS)
cfg.setdefault("fingerprint_duration_ms", FP_DURATION_MS)
cfg.setdefault("fingerprint_silence_threshold_db", FP_SILENCE_THRESHOLD_DB)
cfg.setdefault("fingerprint_silence_min_len_ms", FP_SILENCE_MIN_LEN_MS)
cfg.setdefault("fingerprint_trim_lead_max_ms", FP_TRIM_LEAD_MAX_MS)
cfg.setdefault("fingerprint_trim_trail_max_ms", FP_TRIM_TRAIL_MAX_MS)
cfg.setdefault("fingerprint_trim_padding_ms", FP_TRIM_PADDING_MS)
cfg.setdefault("allow_mismatched_edits", ALLOW_MISMATCHED_EDITS)
cfg.setdefault("fingerprint_subprocess_timeout_sec", FP_SUBPROCESS_TIMEOUT_SEC)
cfg.setdefault("mixed_codec_threshold_boost", MIXED_CODEC_THRESHOLD_BOOST)
cfg.setdefault("artwork_vastly_different_threshold", ARTWORK_VASTLY_DIFFERENT_THRESHOLD)
cfg.setdefault("duplicate_finder_show_artwork_variants", True)
cfg.setdefault("duplicate_finder_debug_trace", False)
cfg.setdefault("preview_artwork_max_dim", PREVIEW_ARTWORK_MAX_DIM)
cfg.setdefault("preview_artwork_quality", PREVIEW_ARTWORK_QUALITY)
cfg.setdefault("library_root", "")
cfg.setdefault("use_library_sync_review", False)
cfg.setdefault("library_sync_review", {})
return cfg
except Exception:
return {
"trim_silence": FP_TRIM_SILENCE,
"near_duplicate_threshold": NEAR_DUPLICATE_THRESHOLD,
"exact_duplicate_threshold": EXACT_DUPLICATE_THRESHOLD,
"fingerprint_offset_ms": FP_OFFSET_MS,
"fingerprint_duration_ms": FP_DURATION_MS,
"fingerprint_silence_threshold_db": FP_SILENCE_THRESHOLD_DB,
"fingerprint_silence_min_len_ms": FP_SILENCE_MIN_LEN_MS,
"fingerprint_trim_lead_max_ms": FP_TRIM_LEAD_MAX_MS,
"fingerprint_trim_trail_max_ms": FP_TRIM_TRAIL_MAX_MS,
"fingerprint_trim_padding_ms": FP_TRIM_PADDING_MS,
"allow_mismatched_edits": ALLOW_MISMATCHED_EDITS,
"fingerprint_subprocess_timeout_sec": FP_SUBPROCESS_TIMEOUT_SEC,
"library_root": "",
"duplicate_threshold": DEFAULT_DUP_THRESHOLD,
"duplicate_prefix_len": DEFAULT_DUP_PREFIX_LEN,
"use_library_sync_review": False,
"library_sync_review": {},
"mixed_codec_threshold_boost": MIXED_CODEC_THRESHOLD_BOOST,
"artwork_vastly_different_threshold": ARTWORK_VASTLY_DIFFERENT_THRESHOLD,
"duplicate_finder_show_artwork_variants": True,
"duplicate_finder_debug_trace": False,
"preview_artwork_max_dim": PREVIEW_ARTWORK_MAX_DIM,
"preview_artwork_quality": PREVIEW_ARTWORK_QUALITY,
}
def save_config(cfg: dict) -> None:
"""Write ``cfg`` to ``CONFIG_PATH`` as JSON."""
with open(CONFIG_PATH, "w", encoding="utf-8") as f:
json.dump(cfg, f, indent=2)