winamp/Src/Plugins/Library/ml_local/guess.cpp

122 lines
2.5 KiB
C++

#include <string.h>
#include <memory.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
wchar_t *guessTitles(const wchar_t *filename,
int *tracknum,
wchar_t **artist,
wchar_t **album,
wchar_t **title) // should free the result of this function after using artist/album/title
{
*tracknum=0;
*artist=0;
*album=0;
*title=0;
if (!filename[0]) return 0;
wchar_t *_artist=NULL;
wchar_t *_album=NULL;
const wchar_t *f=filename;
while (f && *f) f++;
while (f && (f > filename) && *f != L'/' && *f != L'\\') f--;
if (f == filename) return 0;
int dirlen = f-filename;
wchar_t *fullfn = (wchar_t*)_wcsdup(filename);
fullfn[dirlen]=0;
wchar_t *n=fullfn+dirlen;
while (n >= fullfn && *n != L'/' && *n != L'\\') n--;
n++;
// try to guess artist and album from the dirname
if (!wcsstr(n,L"-")) // assume dir name is album name, artist name unknown
{
*album=n;
_album=n;
}
else
{
*artist=_artist=n;
_album=wcsstr(n,L"-")+1;
wchar_t *t=_album-2;
while (t >= n && *t == L' ') t--;
t[1]=0;
while (_album && *_album == L' ') _album++;
*album=_album;
}
// get filename shizit
wcsncpy(fullfn+dirlen+1,filename+dirlen+1,wcslen(filename) - (dirlen + 1));
n=fullfn+dirlen+1;
while (n && *n) n++;
while (n > fullfn+dirlen+1 && *n != L'.') n--;
if (*n == L'.') *n=0;
n=fullfn+dirlen+1;
while (n && *n == L' ') n++;
// detect XX. filename
if (wcsstr(n,L".") && _wtoi(n) && _wtoi(n) < 130)
{
wchar_t *tmp=n;
while (tmp && *tmp >= L'0' && *tmp <= L'9') tmp++;
while (tmp && *tmp == L' ') tmp++;
if (tmp && *tmp == L'.')
{
*tracknum=_wtoi(n);
n=tmp+1;
while (n && *n == L'.') n++;
while (n && *n == L' ') n++;
}
}
// detect XX- filename
if (!*tracknum && wcsstr(n,L"-") && _wtoi(n) && _wtoi(n) < 130)
{
wchar_t *tmp=n;
while (tmp && *tmp >= L'0' && *tmp <= L'9') tmp++;
while (tmp && *tmp == L' ') tmp++;
if (tmp && *tmp == L'-')
{
*tracknum=_wtoi(n);
n=tmp+1;
while (n && *n == L'-') n++;
while (n && *n == L' ') n++;
}
}
while (wcsstr(n,L"-"))
{
wchar_t *a=n;
n=wcsstr(n,L"-");
{
wchar_t *t=n-1;
while (t >= a && *t == L' ') t--;
t[1]=0;
}
*n=0;
n++;
while (n && *n == L'-') n++;
while (n && *n == L' ') n++;
// a is the next token.
if (!*tracknum && !_wcsnicmp(a,L"Track ",6) && _wtoi(a+6)) *tracknum=_wtoi(a+6);
else if (*artist== _artist)
{
*artist=a;
}
if (*artist != _artist && *tracknum) break;
}
*title=n;
return fullfn;
}