mirror of
https://github.com/navidrome/navidrome.git
synced 2025-08-10 00:52:20 +00:00
address some concerns, make cpp a bit safer
This commit is contained in:
@@ -34,14 +34,19 @@ func upAlterLyricColumn(ctx context.Context, tx *sql.Tx) error {
|
||||
return err
|
||||
}
|
||||
|
||||
var id, lyrics string
|
||||
var id string
|
||||
var lyrics sql.NullString
|
||||
for rows.Next() {
|
||||
err = rows.Scan(&id, &lyrics)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
lyrics, err := model.ToLyrics("xxx", lyrics)
|
||||
if !lyrics.Valid {
|
||||
continue
|
||||
}
|
||||
|
||||
lyrics, err := model.ToLyrics("xxx", lyrics.String)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -51,7 +56,7 @@ func upAlterLyricColumn(ctx context.Context, tx *sql.Tx) error {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = stmt.Exec(string(text[:]), id)
|
||||
_, err = stmt.Exec(string(text), id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -145,7 +145,7 @@ func (t Tags) Lyrics() string {
|
||||
log.Warn("Unexpected error occurred when serializing lyrics", "file", t.filePath, "error", err)
|
||||
return ""
|
||||
}
|
||||
return string(res[:])
|
||||
return string(res)
|
||||
}
|
||||
|
||||
func (t Tags) Compilation() bool { return t.getBool("tcmp", "compilation", "wm/iscompilation") }
|
||||
|
||||
@@ -19,8 +19,6 @@
|
||||
|
||||
#include "taglib_wrapper.h"
|
||||
|
||||
char *LYRICS_KEY = (char *) "lyrics-";
|
||||
|
||||
char has_cover(const TagLib::FileRef f);
|
||||
|
||||
int taglib_read(const FILENAME_CHAR_T *filename, unsigned long id) {
|
||||
@@ -100,31 +98,33 @@ int taglib_read(const FILENAME_CHAR_T *filename, unsigned long id) {
|
||||
|
||||
tags.erase("LYRICS");
|
||||
|
||||
char lyricsTag[11];
|
||||
strncpy(lyricsTag, LYRICS_KEY, 7);
|
||||
strncpy(lyricsTag+7, frame->language().data(), 3);
|
||||
lyricsTag[10] = '\0';
|
||||
const auto bv = frame->language();
|
||||
char language[4] = {'x', 'x', 'x', '\0'};
|
||||
if (bv.size() == 3) {
|
||||
strncpy(language, bv.data(), 3);
|
||||
}
|
||||
|
||||
char *val = (char *)frame->text().toCString(true);
|
||||
|
||||
go_map_put_str(id, lyricsTag, val);
|
||||
go_map_put_lyrics(id, language, val);
|
||||
}
|
||||
} else if (kv.first == "SYLT") {
|
||||
for (const auto &tag: kv.second) {
|
||||
TagLib::ID3v2::SynchronizedLyricsFrame *frame = dynamic_cast<TagLib::ID3v2::SynchronizedLyricsFrame *>(tag);
|
||||
if (frame == NULL) continue;
|
||||
|
||||
|
||||
char lyricsTag[11];
|
||||
strncpy(lyricsTag, LYRICS_KEY, 7);
|
||||
strncpy(lyricsTag+7, frame->language().data(), 3);
|
||||
lyricsTag[10] = '\0';
|
||||
const auto bv = frame->language();
|
||||
char language[4] = {'x', 'x', 'x', '\0'};
|
||||
if (bv.size() == 3) {
|
||||
strncpy(language, bv.data(), 3);
|
||||
}
|
||||
|
||||
const auto format = frame->timestampFormat();
|
||||
if (format == TagLib::ID3v2::SynchronizedLyricsFrame::AbsoluteMilliseconds) {
|
||||
|
||||
for (const auto &line: frame->synchedText()) {
|
||||
char *text = (char *)line.text.toCString(true);
|
||||
go_map_put_lyric_line(id, lyricsTag, text, line.time);
|
||||
go_map_put_lyric_line(id, language, text, line.time);
|
||||
}
|
||||
} else if (format == TagLib::ID3v2::SynchronizedLyricsFrame::AbsoluteMpegFrames) {
|
||||
const int sampleRate = props->sampleRate();
|
||||
@@ -133,7 +133,7 @@ int taglib_read(const FILENAME_CHAR_T *filename, unsigned long id) {
|
||||
for (const auto &line: frame->synchedText()) {
|
||||
const int timeInMs = (line.time * 1000) / sampleRate;
|
||||
char *text = (char *)line.text.toCString(true);
|
||||
go_map_put_lyric_line(id, lyricsTag, text, timeInMs);
|
||||
go_map_put_lyric_line(id, language, text, timeInMs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,6 +95,12 @@ func go_map_put_str(id C.ulong, key *C.char, val *C.char) {
|
||||
do_put_map(id, k, val)
|
||||
}
|
||||
|
||||
//export go_map_put_lyrics
|
||||
func go_map_put_lyrics(id C.ulong, lang *C.char, val *C.char) {
|
||||
k := "lyrics-" + strings.ToLower(C.GoString(lang))
|
||||
do_put_map(id, k, val)
|
||||
}
|
||||
|
||||
func do_put_map(id C.ulong, key string, val *C.char) {
|
||||
if key == "" {
|
||||
return
|
||||
@@ -131,11 +137,13 @@ func go_map_put_lyric_line(id C.ulong, lang *C.char, text *C.char, time C.int) {
|
||||
lock.RLock()
|
||||
defer lock.RUnlock()
|
||||
|
||||
key := "lyrics-" + language
|
||||
|
||||
m := maps[uint32(id)]
|
||||
existing, ok := m[language]
|
||||
existing, ok := m[key]
|
||||
if ok {
|
||||
existing[0] += formatted_line
|
||||
} else {
|
||||
m[language] = []string{formatted_line}
|
||||
m[key] = []string{formatted_line}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ extern "C" {
|
||||
extern void go_map_put_m4a_str(unsigned long id, char *key, char *val);
|
||||
extern void go_map_put_str(unsigned long id, char *key, char *val);
|
||||
extern void go_map_put_int(unsigned long id, char *key, int val);
|
||||
extern void go_map_put_lyrics(unsigned long id, char *lang, char *val);
|
||||
extern void go_map_put_lyric_line(unsigned long id, char *lang, char *text, int time);
|
||||
int taglib_read(const FILENAME_CHAR_T *filename, unsigned long id);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user