diff options
Diffstat (limited to 'mg_selection.c')
| -rw-r--r-- | mg_selection.c | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/mg_selection.c b/mg_selection.c index 05904f3..f01063a 100644 --- a/mg_selection.c +++ b/mg_selection.c @@ -9,11 +9,21 @@ * */ +#include <sys/types.h> +#include <sys/time.h> +#include <sys/stat.h> #include <stdio.h> +#include <fts.h> + #include "mg_selection.h" #include "vdr_setup.h" #include "mg_tools.h" +#include <mpegfile.h> +#include <flacfile.h> +#include <id3v2tag.h> +#include <fileref.h> + //! \brief adds string n to string s, using a comma to separate them static string comma (string & s, string n); @@ -1115,3 +1125,227 @@ mgSelection::choices(mgOrder *o,unsigned int level, unsigned int *current) } return result; } + +char * +mgSelection::sql_Cstring(TagLib::String s) +{ + return m_db.sql_Cstring(s.toCString()); +} + +char * +mgSelection::lower(char *s) +{ + char *p=s; + while (*p) + { + int i=(int)(*p); + (*p)=(char)tolower(i); + p++; + } + return s; +} + +TagLib::String +mgSelection::getlanguage(const char *filename) +{ + TagLib::String result = ""; + TagLib::ID3v2::Tag * id3v2tag=0; + char *extension = strrchr(filename,'.'); + if (!extension) + return result; + extension++; + lower(extension); + if (!strcmp(extension,"flac")) + { + TagLib::FLAC::File f(filename); + id3v2tag = f.ID3v2Tag(); + if (id3v2tag) + { + TagLib::ID3v2::FrameList l = id3v2tag->frameListMap()["TLAN"]; + if (!l.isEmpty()) + result = l.front()->toString(); + } + } + else if (!strcmp(extension,"mp3")) + { + TagLib::MPEG::File f(filename); + id3v2tag = f.ID3v2Tag(); + if (id3v2tag) + { + TagLib::ID3v2::FrameList l = id3v2tag->frameListMap()["TLAN"]; + if (!l.isEmpty()) + result = l.front()->toString(); + } + } + return result; +} + +char * +mgSelection::getAlbum(const char *c_album,const char *c_artist,const char *c_title) +{ + char * result; + char *b; + asprintf(&b,"SELECT cddbid FROM album" + " WHERE title=%s AND artist=%s",c_title,c_artist); + result=m_db.sql_Cstring(m_db.get_col0(b)); + free(b); + if (!strcmp(result,"'NULL'")) + { + asprintf(&result,"'%ld-%9s",random(),c_artist+1); + char *p=strchr(result,0)-1; + if (*p!='\'') + *p='\''; + asprintf(&b,"INSERT INTO album SET artist=%s,title=%s,cddbid=%s", + c_artist,c_album,result); + m_db.exec_sql(b); + free(b); + } + return result; +} + +void +mgSelection::AddTrack(const char *filename) +{ +// mgDebug(1,"%s:AddTrack(%s)",get_current_dir_name(),filename); + + TagLib::FileRef f( filename) ; + if (f.isNull()) + return; + TagLib::Tag *tag = f.tag(); + if (!f.tag()) + return; + char *c_album; + if (tag->album()=="") + c_album=strdup("'Unassigned'"); + else + c_album=sql_Cstring(tag->album()); + char *c_artist=sql_Cstring(tag->artist()); + char *c_title=sql_Cstring(tag->title()); + char *c_cddbid=getAlbum(c_album,c_artist,c_title); + char *c_mp3file=sql_Cstring(filename); + char *c_genre1=sql_Cstring(id(keyGenres,tag->genre().to8Bit())); + char *c_lang=sql_Cstring(getlanguage(filename)); + char *folderstring=(char*)malloc(strlen(c_mp3file)*3); + unsigned int trackno=tag->track(); + unsigned int year=tag->year(); + TagLib::AudioProperties *ap = f.audioProperties(); + int len = ap->length(); // tracks.length + int bitrate = ap->bitrate(); // tracks.bitrate + int sample = ap->sampleRate(); //tracks.samplerate + int channels = ap->channels(); //tracks.channels + folderstring[0]=0; + if (m_db.HasFolderFields()) + { + char *path = strdup(filename); + char *folder1=""; + char *folder2=""; + char *folder3=""; + char *folder4=""; + char *p=path; + char *slash; + slash=strchr(p,'/'); + if (slash) + { + folder1=p; + *slash=0; + p=slash+1; + slash=strchr(p,'/'); + if (slash) + { + folder2=p; + *slash=0; + p=slash+1; + slash=strchr(p,'/'); + if (slash) + { + folder3=p; + *slash=0; + p=slash+1; + slash=strchr(p,'/'); + if (slash) + { + folder4=p; + *slash=0; + } + } + } + } + char *c_folder1=sql_Cstring(folder1); + char *c_folder2=sql_Cstring(folder2); + char *c_folder3=sql_Cstring(folder3); + char *c_folder4=sql_Cstring(folder4); + free(path); + sprintf(folderstring,"folder1=%s,folder2=%s,folder3=%s,folder4=%s", + c_folder1,c_folder2,c_folder3,c_folder4); + free(c_folder1); + free(c_folder2); + free(c_folder3); + free(c_folder4); + } + char sql[2000]; + sprintf(sql,"INSERT INTO tracks SET artist=%s,title=%s,year=%d,sourceid=%s," + "tracknb=%d,mp3file=%s,length=%d,bitrate=%d,samplerate=%d," + "channels=%d,genre1=%s,genre2='',lang=%s,%s", + c_artist,c_title,year,c_cddbid, + trackno,c_mp3file,len,bitrate,sample, + channels,c_genre1,c_lang,folderstring); + free(c_album); + free(c_artist); + free(c_title); + free(c_cddbid); + free(c_mp3file); + free(c_genre1); + free(c_lang); + free(folderstring); + m_db.exec_sql(sql); +} + +void +mgSelection::SyncFile(const char *filename) +{ + if (!strncmp(filename,"./",2)) + filename += 2; + if (strlen(filename)>255) + { + mgWarning("Length of file exceeds database field capacity: %s", filename); + + return; + } + string escapedmp3file = m_db.sql_string(filename); + string s = m_db.get_col0("SELECT id from tracks WHERE mp3file="+escapedmp3file); + if (s!="NULL") + { + } + else + { + AddTrack(filename); + } +} + +void +mgSelection::Sync(const char * path, bool assorted,bool delete_missing) +{ + if (!m_db.Connected()) + { + mgError("Cannot connect to data base"); + } + // init random number generator + struct timeval tv; + struct timezone tz; + gettimeofday( &tv, &tz ); + srandom( tv.tv_usec ); + + m_db.CreateFolderFields(); + chdir(the_setup.ToplevelDir); + FTS *fts; + FTSENT *ftsent; + const char * paths[2]; + paths[0]=path; + paths[1]=0; + fts = fts_open( const_cast<char *const *>(paths), FTS_LOGICAL, 0); + while ( (ftsent = fts_read(fts)) != NULL) + { + SyncFile(ftsent->fts_path); + } + fts_close(fts); +} |
