From f58f3dcbfca1c5b173e5897070cf84278c49c28f Mon Sep 17 00:00:00 2001 From: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Date: Sun, 17 Dec 2023 19:24:09 -0800 Subject: [PATCH] address some concerns, make cpp a bit safer --- .../20231209211223_alter_lyric_column.go | 11 ++++++-- scanner/metadata/metadata.go | 2 +- scanner/metadata/taglib/taglib_wrapper.cpp | 28 +++++++++---------- scanner/metadata/taglib/taglib_wrapper.go | 12 ++++++-- scanner/metadata/taglib/taglib_wrapper.h | 1 + 5 files changed, 34 insertions(+), 20 deletions(-) diff --git a/db/migration/20231209211223_alter_lyric_column.go b/db/migration/20231209211223_alter_lyric_column.go index c1d70012e..20000457b 100644 --- a/db/migration/20231209211223_alter_lyric_column.go +++ b/db/migration/20231209211223_alter_lyric_column.go @@ -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 } diff --git a/scanner/metadata/metadata.go b/scanner/metadata/metadata.go index 071dad368..7d7035150 100644 --- a/scanner/metadata/metadata.go +++ b/scanner/metadata/metadata.go @@ -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") } diff --git a/scanner/metadata/taglib/taglib_wrapper.cpp b/scanner/metadata/taglib/taglib_wrapper.cpp index 8170ac158..1533e4d1c 100644 --- a/scanner/metadata/taglib/taglib_wrapper.cpp +++ b/scanner/metadata/taglib/taglib_wrapper.cpp @@ -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(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); } } } diff --git a/scanner/metadata/taglib/taglib_wrapper.go b/scanner/metadata/taglib/taglib_wrapper.go index bed5fb1c4..773a48729 100644 --- a/scanner/metadata/taglib/taglib_wrapper.go +++ b/scanner/metadata/taglib/taglib_wrapper.go @@ -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} } } diff --git a/scanner/metadata/taglib/taglib_wrapper.h b/scanner/metadata/taglib/taglib_wrapper.h index 17743dd32..8f0a82126 100644 --- a/scanner/metadata/taglib/taglib_wrapper.h +++ b/scanner/metadata/taglib/taglib_wrapper.h @@ -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);