aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_mp3/Lyrics3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Input/in_mp3/Lyrics3.cpp')
-rw-r--r--Src/Plugins/Input/in_mp3/Lyrics3.cpp193
1 files changed, 193 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_mp3/Lyrics3.cpp b/Src/Plugins/Input/in_mp3/Lyrics3.cpp
new file mode 100644
index 00000000..bdd8ece6
--- /dev/null
+++ b/Src/Plugins/Input/in_mp3/Lyrics3.cpp
@@ -0,0 +1,193 @@
+#include <windows.h>
+#include "Lyrics3.h"
+#include "config.h"
+#include <strsafe.h>
+
+// http://www.id3.org/Lyrics3v2
+
+Lyrics3::Lyrics3()
+{
+ artist=0;
+ title=0;
+ album=0;
+ hasData=false;
+ dirty=false;
+}
+
+Lyrics3::~Lyrics3()
+{
+ free(artist);
+ free(title);
+ free(album);
+}
+
+static wchar_t *CopyField(const uint8_t *buffer, uint32_t size)
+{
+ int converted = MultiByteToWideChar(28591, 0,(LPCSTR)buffer, size, 0, 0);
+ wchar_t *str = (wchar_t *)calloc((converted+1), sizeof(wchar_t));
+ if (str)
+ {
+ converted = MultiByteToWideChar(28591, 0, (LPCSTR)buffer, size, str, converted);
+ str[converted]=0;
+ }
+
+ return str;
+}
+
+int Lyrics3::Decode(const void *data, size_t datalen)
+{
+ if (!config_parse_lyrics3)
+ return 1;
+
+ if (memcmp(data, "LYRICSBEGIN", 11) == 0)
+ {
+ hasData = true;
+
+ datalen-=11;
+ uint8_t *buffer = (uint8_t *)data+11;
+
+ while (datalen > 8)
+ {
+ uint8_t fid[4] = {0};
+ uint8_t sizeT[6] = {0};
+ uint32_t size;
+ fid[3] = 0;
+ sizeT[5] = 0;
+
+ memcpy(fid, buffer, 3);
+ buffer+=3; datalen-=3;
+
+ memcpy(sizeT, buffer, 5);
+ buffer+=5; datalen-=5;
+
+ size = strtoul((char *)sizeT, 0, 10);
+
+ if (datalen >= size)
+ {
+ /*if ( memcmp(fid, "IND", 3) == 0) // the IND field
+ {
+ if ( buff2[ posn + 8 + 1 ] == '1')
+ stampsUsed = true;
+ }
+ else */
+ if (memcmp(fid, "ETT", 3) == 0) // the TITLE field
+ {
+ title = CopyField(buffer, size);
+ }
+ else if (strcmp((char *) fid, "EAR") == 0) // the ARTIST field
+ {
+ artist = CopyField(buffer, size);
+ }
+ else if (strcmp((char *) fid, "EAL") == 0) // the ALBUM field
+ {
+ album = CopyField(buffer, size);
+ }
+ /*else if ( strcmp((char *) fid, "LYR") == 0) // the LYRICS field
+ {
+ char *text;
+ luint newSize;
+
+ newSize = ID3_CRLFtoLF((char *) & buff2[ posn + 8 ], size);
+
+ if ( stampsUsed)
+ newSize = ID3_StripTimeStamps((char *) & buff2[ posn + 8 ], newSize);
+
+ if ( text = (char*)malloc(newSize + 1))
+ {
+ text[ newSize ] = 0;
+
+ memcpy( text, &buff2[ posn + 8 ], newSize);
+
+ ID3_AddLyrics( this, text);
+
+ free(text);
+ }
+ else
+ ID3_THROW( ID3E_NoMemory);
+ }*/
+
+ datalen-=size;
+ buffer+=size;
+ }
+ else
+ break;
+ }
+ return 0;
+ }
+ return 1;
+
+}
+
+int Lyrics3::GetString(const char *tag, wchar_t *data, int dataLen)
+{
+ if (!hasData)
+ return 0;
+
+ if (!_stricmp(tag, "title"))
+ {
+ if (title && *title)
+ {
+ StringCchCopyW(data, dataLen, title);
+ return 1;
+ }
+ return -1;
+ }
+ else if (!_stricmp(tag, "artist"))
+ {
+ if (artist && *artist)
+ {
+ StringCchCopyW(data, dataLen, artist);
+ return 1;
+ }
+ return -1;
+ }
+ else if (!_stricmp(tag, "album"))
+ {
+ if (album && *album)
+ {
+ StringCchCopyW(data, dataLen, album);
+ return 1;
+ }
+ return -1;
+ }
+
+ return 0;
+}
+
+int Lyrics3::SetString(const char *tag, const wchar_t *data)
+{
+ int ret=0;
+ if (!_stricmp(tag, "title"))
+ {
+ if (title) free(title);
+ title = _wcsdup(data);
+ ret = 1;
+ }
+ else if (!_stricmp(tag, "artist"))
+ {
+ if ( artist ) free(artist);
+ artist = _wcsdup(data);
+ ret = 1;
+ }
+ else if (!_stricmp(tag, "album"))
+ {
+ if ( album ) free(album);
+ album = _wcsdup(data);
+ ret = 1;
+ }
+
+ if(ret)
+ {
+ hasData=true;
+ }
+ return ret;
+}
+
+void Lyrics3::Clear()
+{
+ free(artist); artist=0;
+ free(album); album=0;
+ free(title); title=0;
+ dirty=true;
+ hasData=false;
+} \ No newline at end of file