v2 tidy/refactor
This commit is contained in:
parent
9fb05079dc
commit
b00f70ff4b
121
app/songdb.py
121
app/songdb.py
@ -12,11 +12,11 @@ from models import Notes, Playdates, PlaylistTracks, Session, Tracks
|
||||
from mutagen.flac import FLAC
|
||||
from mutagen.mp3 import MP3
|
||||
from pydub import AudioSegment, effects
|
||||
from tinytag import TinyTag
|
||||
|
||||
# Globals (I know)
|
||||
messages = []
|
||||
|
||||
|
||||
def main():
|
||||
"Main loop"
|
||||
|
||||
@ -226,86 +226,6 @@ def full_update_db(session):
|
||||
session.commit()
|
||||
|
||||
|
||||
def get_audio_segment(path):
|
||||
try:
|
||||
if path.endswith('.mp3'):
|
||||
return AudioSegment.from_mp3(path)
|
||||
elif path.endswith('.flac'):
|
||||
return AudioSegment.from_file(path, "flac")
|
||||
except AttributeError:
|
||||
return None
|
||||
|
||||
|
||||
def get_music_info(path):
|
||||
"""
|
||||
Return a dictionary of title, artist, duration-in-milliseconds and path.
|
||||
"""
|
||||
|
||||
tag = TinyTag.get(path)
|
||||
|
||||
return dict(
|
||||
title=tag.title,
|
||||
artist=tag.artist,
|
||||
duration=tag.duration,
|
||||
path=path
|
||||
)
|
||||
|
||||
|
||||
def leading_silence(audio_segment, silence_threshold=Config.DBFS_SILENCE,
|
||||
chunk_size=Config.AUDIO_SEGMENT_CHUNK_SIZE):
|
||||
"""
|
||||
Returns the millisecond/index that the leading silence ends.
|
||||
audio_segment - the segment to find silence in
|
||||
silence_threshold - the upper bound for how quiet is silent in dFBS
|
||||
chunk_size - chunk size for interating over the segment in ms
|
||||
|
||||
https://github.com/jiaaro/pydub/blob/master/pydub/silence.py
|
||||
"""
|
||||
|
||||
trim_ms = 0 # ms
|
||||
assert chunk_size > 0 # to avoid infinite loop
|
||||
while (
|
||||
audio_segment[trim_ms:trim_ms + chunk_size].dBFS < # noqa W504
|
||||
silence_threshold and trim_ms < len(audio_segment)):
|
||||
trim_ms += chunk_size
|
||||
|
||||
# if there is no end it should return the length of the segment
|
||||
return min(trim_ms, len(audio_segment))
|
||||
|
||||
|
||||
def fade_point(audio_segment, fade_threshold=0,
|
||||
chunk_size=Config.AUDIO_SEGMENT_CHUNK_SIZE):
|
||||
"""
|
||||
Returns the millisecond/index of the point where the volume drops below
|
||||
the maximum and doesn't get louder again.
|
||||
audio_segment - the sdlg_search_database_uiegment to find silence in
|
||||
fade_threshold - the upper bound for how quiet is silent in dFBS
|
||||
chunk_size - chunk size for interating over the segment in ms
|
||||
"""
|
||||
|
||||
assert chunk_size > 0 # to avoid infinite loop
|
||||
|
||||
segment_length = audio_segment.duration_seconds * 1000 # ms
|
||||
trim_ms = segment_length - chunk_size
|
||||
max_vol = audio_segment.dBFS
|
||||
if fade_threshold == 0:
|
||||
fade_threshold = max_vol
|
||||
|
||||
while (
|
||||
audio_segment[trim_ms:trim_ms + chunk_size].dBFS < fade_threshold
|
||||
and trim_ms > 0): # noqa W503
|
||||
trim_ms -= chunk_size
|
||||
|
||||
# if there is no trailing silence, return lenght of track (it's less
|
||||
# the chunk_size, but for chunk_size = 10ms, this may be ignored)
|
||||
return int(trim_ms)
|
||||
|
||||
|
||||
def trailing_silence(audio_segment, silence_threshold=-50.0,
|
||||
chunk_size=Config.AUDIO_SEGMENT_CHUNK_SIZE):
|
||||
return fade_point(audio_segment, silence_threshold, chunk_size)
|
||||
|
||||
|
||||
def update_db(session):
|
||||
"""
|
||||
Repopulate database
|
||||
@ -376,44 +296,5 @@ def update_db(session):
|
||||
print("\n".join(messages))
|
||||
|
||||
|
||||
def update_meta(session, track, artist=None, title=None):
|
||||
"""
|
||||
Updates both the tag info in the file and the database entry with passed
|
||||
artist and tag details.
|
||||
"""
|
||||
|
||||
DEBUG(f"songdb.update_meta({session=}, {track=}, {artist=}, {title=})")
|
||||
|
||||
if not artist and not title:
|
||||
return
|
||||
|
||||
ftype = os.path.splitext(track.path)[1][1:]
|
||||
if ftype == 'flac':
|
||||
tag_handler = FLAC
|
||||
elif ftype == 'mp3':
|
||||
tag_handler = MP3
|
||||
else:
|
||||
INFO(f"File type {ftype} not implemented")
|
||||
return
|
||||
|
||||
# Update tags
|
||||
f = tag_handler(track.path)
|
||||
try:
|
||||
if artist:
|
||||
f["artist"] = artist
|
||||
if title:
|
||||
f["title"] = title
|
||||
f.save()
|
||||
except TypeError:
|
||||
show_warning("TAG error", "Can't update tag. Try editing in Audacity")
|
||||
|
||||
# Update database
|
||||
with Session() as session:
|
||||
if artist:
|
||||
track.update_artist(session, artist)
|
||||
if title:
|
||||
track.update_title(session, title)
|
||||
|
||||
|
||||
if __name__ == '__main__' and '__file__' in globals():
|
||||
main()
|
||||
|
||||
8
test_playlists.py
Normal file
8
test_playlists.py
Normal file
@ -0,0 +1,8 @@
|
||||
from app.playlists import PlaylistTab
|
||||
|
||||
|
||||
def test_init(session):
|
||||
"""Just check we can create a playlist"""
|
||||
|
||||
playlist = PlaylistTab()
|
||||
assert playlist
|
||||
6
testdata/mom.py
vendored
Normal file
6
testdata/mom.py
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
# Tags for mom.py
|
||||
|
||||
{
|
||||
"title": "Man of Mystery",
|
||||
"artist": "The Shadows",
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user