address some concerns, make cpp a bit safer

This commit is contained in:
Kendall Garner
2023-12-17 19:24:09 -08:00
parent b0b38cfa0d
commit f58f3dcbfc
5 changed files with 34 additions and 20 deletions

View File

@@ -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
}

View File

@@ -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") }

View File

@@ -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);
}
}
}

View File

@@ -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}
}
}

View File

@@ -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);