|
1 | 1 | package id3 |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "fmt" |
4 | 5 | "strings" |
5 | 6 |
|
6 | | - "github.com/bogem/id3v2/v2" |
| 7 | + "github.com/streambinder/id3v2-sylt" |
7 | 8 | "github.com/streambinder/spotitube/lyrics" |
| 9 | + "github.com/streambinder/spotitube/util" |
8 | 10 | ) |
9 | 11 |
|
10 | 12 | const ( |
11 | 13 | frameAttachedPicture = "Attached picture" |
12 | 14 | frameTrackNumber = "Track number/Position in set" |
13 | 15 | frameUnsynchronizedLyrics = "Unsynchronised lyrics/text transcription" |
| 16 | + frameSynchronizedLyrics = "Synchronised lyrics/text" |
14 | 17 | frameSpotifyID = "Spotify ID" |
15 | 18 | frameArtworkURL = "Artwork URL" |
16 | 19 | frameDuration = "Duration" |
@@ -126,20 +129,47 @@ func (tag *Tag) SetLyrics(title, lyrics string) { |
126 | 129 | tag.setUnsynchronizedLyrics(title, lyrics) |
127 | 130 | } |
128 | 131 |
|
129 | | -func (tag *Tag) setSynchronizedLyrics(_, data string) { |
| 132 | +func (tag *Tag) setSynchronizedLyrics(title, data string) { |
130 | 133 | if !lyrics.IsSynced(data) { |
131 | 134 | return |
132 | 135 | } |
133 | 136 |
|
134 | | - // implement me |
| 137 | + var syncedText []id3v2.SyncedText |
| 138 | + for _, line := range lyrics.GetSync(data) { |
| 139 | + syncedText = append(syncedText, id3v2.SyncedText{ |
| 140 | + Timestamp: line.Time, |
| 141 | + Text: line.Text, |
| 142 | + }) |
| 143 | + } |
| 144 | + |
| 145 | + tag.AddSynchronisedLyricsFrame(id3v2.SynchronisedLyricsFrame{ |
| 146 | + Encoding: tag.DefaultEncoding(), |
| 147 | + Language: "eng", |
| 148 | + TimestampFormat: id3v2.SYLTAbsoluteMillisecondsTimestampFormat, |
| 149 | + ContentType: id3v2.SYLTLyricsContentType, |
| 150 | + ContentDescriptor: title, |
| 151 | + SynchronizedTexts: syncedText, |
| 152 | + }) |
| 153 | +} |
| 154 | + |
| 155 | +func (tag *Tag) SynchronizedLyrics() string { |
| 156 | + frame, ok := tag.GetLastFrame(tag.CommonID(frameSynchronizedLyrics)).(id3v2.SynchronisedLyricsFrame) |
| 157 | + if ok { |
| 158 | + var lyrics []string |
| 159 | + for _, line := range frame.SynchronizedTexts { |
| 160 | + lyrics = append(lyrics, fmt.Sprintf("[%s]%s", util.MillisToColonMinutes(line.Timestamp), line.Text)) |
| 161 | + } |
| 162 | + return strings.Join(lyrics, "\n") |
| 163 | + } |
| 164 | + return "" |
135 | 165 | } |
136 | 166 |
|
137 | | -func (tag *Tag) setUnsynchronizedLyrics(title, lyrics string) { |
| 167 | +func (tag *Tag) setUnsynchronizedLyrics(title, data string) { |
138 | 168 | tag.AddUnsynchronisedLyricsFrame(id3v2.UnsynchronisedLyricsFrame{ |
139 | 169 | Encoding: tag.DefaultEncoding(), |
140 | 170 | Language: "eng", |
141 | 171 | ContentDescriptor: title, |
142 | | - Lyrics: lyrics, |
| 172 | + Lyrics: lyrics.GetPlain(data), |
143 | 173 | }) |
144 | 174 | } |
145 | 175 |
|
|
0 commit comments