summaryrefslogtreecommitdiff
path: root/mg_selection.c
diff options
context:
space:
mode:
authorwr61 <wr61@e10066b5-e1e2-0310-b819-94efdf66514b>2005-02-28 01:30:25 +0000
committerwr61 <wr61@e10066b5-e1e2-0310-b819-94efdf66514b>2005-02-28 01:30:25 +0000
commit9e6139533024afca59ef5873d333f0af93ccbc17 (patch)
tree3629b26c8ab1415ac11d7324384ad805e7be281e /mg_selection.c
parentc3d04581101a47717cda7b9d810646100a2934bd (diff)
downloadvdr-plugin-muggle-9e6139533024afca59ef5873d333f0af93ccbc17.tar.gz
vdr-plugin-muggle-9e6139533024afca59ef5873d333f0af93ccbc17.tar.bz2
mgSelection::Sync, not yet very well tested
git-svn-id: https://vdr-muggle.svn.sourceforge.net/svnroot/vdr-muggle/branches/0.1.3-wr@518 e10066b5-e1e2-0310-b819-94efdf66514b
Diffstat (limited to 'mg_selection.c')
-rw-r--r--mg_selection.c234
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);
+}