76 lines
1.6 KiB
Python
76 lines
1.6 KiB
Python
import sqlite3
|
|
import os
|
|
import glob
|
|
import shutil
|
|
import sox
|
|
|
|
shutil.rmtree('static/clip')
|
|
os.makedirs('static/clip', exist_ok=True)
|
|
|
|
db = sqlite3.connect("file:songbook.sqlite?mode=ro", uri=True)
|
|
|
|
cur = db.cursor()
|
|
|
|
for song, motif, start, duration, album, track in db.execute('''
|
|
select
|
|
clip.song_id, motif_id, start_ms, duration_ms, max(album_id), track
|
|
from
|
|
clip
|
|
join
|
|
song_album
|
|
on
|
|
clip.song_id=song_album.song_id
|
|
group by
|
|
clip.song_id, motif_id'''
|
|
):
|
|
|
|
# get source path
|
|
|
|
album_folder = f'{album - 1:02}. *'
|
|
song_file = f'{track:03}. *.flac'
|
|
|
|
source = glob.glob(f"/mnt/petal/media/Audio/Music/Soundtracks/Final Fantasy XIV/{album_folder}/{song_file}")
|
|
assert(len(source) == 1)
|
|
source = source[0]
|
|
|
|
print(source)
|
|
|
|
# get clip filename
|
|
|
|
destination = f'static/clip/{song:04}-{motif:03}.mp3'
|
|
|
|
print(destination)
|
|
|
|
source_duration = sox.file_info.duration(source)
|
|
|
|
# trim and fade start
|
|
|
|
fade_length = 2
|
|
|
|
if start < fade_length:
|
|
trim_start = 0
|
|
fade_in = 0
|
|
else:
|
|
trim_start = start - fade_length
|
|
fade_in = fade_length
|
|
|
|
# trim and fade end (to be continued)
|
|
|
|
if source_duration - (start + duration ) < fade_length:
|
|
trim_end = None
|
|
fade_out = 0
|
|
else:
|
|
trim_end = start + duration + fade_length
|
|
fade_out = fade_length
|
|
|
|
# call sox
|
|
|
|
tf = sox.Transformer()
|
|
tf.trim(trim_start, trim_end)
|
|
tf.fade(fade_in, fade_out, 't')
|
|
sox_status = tf.build_file(source, destination, return_output=True)
|
|
|
|
# error check
|
|
|
|
if sox_status != (0, '', ''):
|
|
print(sox_status) |