summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwr61 <wr61@e10066b5-e1e2-0310-b819-94efdf66514b>2005-03-01 15:47:51 +0000
committerwr61 <wr61@e10066b5-e1e2-0310-b819-94efdf66514b>2005-03-01 15:47:51 +0000
commit6d50a31dc66fadb6b8d4689e6cc229076090b127 (patch)
treeaee0a9df599645f5288101bb208974740b8697e9
parent6d1523d831b71ea65adda748170e1c3c12d5ecb7 (diff)
downloadvdr-plugin-muggle-6d50a31dc66fadb6b8d4689e6cc229076090b127.tar.gz
vdr-plugin-muggle-6d50a31dc66fadb6b8d4689e6cc229076090b127.tar.bz2
implement updating tracks in mg_sync
git-svn-id: https://vdr-muggle.svn.sourceforge.net/svnroot/vdr-muggle/branches/0.1.3-wr@523 e10066b5-e1e2-0310-b819-94efdf66514b
-rw-r--r--mg_mysql.c35
-rw-r--r--mg_mysql.h4
-rw-r--r--mg_sync.c137
-rw-r--r--mg_sync.h25
4 files changed, 121 insertions, 80 deletions
diff --git a/mg_mysql.c b/mg_mysql.c
index 9fef40d..2cfc297 100644
--- a/mg_mysql.c
+++ b/mg_mysql.c
@@ -252,29 +252,34 @@ mgmySql::sql_string( const string s )
}
char*
-mgmySql::sql_Cstring( const string s )
+mgmySql::sql_Cstring( const string s, char *buf )
{
- return sql_Cstring(s.c_str());
+ return sql_Cstring(s.c_str(),buf);
}
char*
-mgmySql::sql_Cstring( const char *s)
+mgmySql::sql_Cstring( const char *s, char *buf)
{
- char *buf;
- int buflen;
- if (!this)
- buflen=strlen(s)+2;
+ char *b;
+ if (buf)
+ b=buf;
else
- buflen=2*strlen(s)+3;
- buf = (char *) malloc( buflen);
- buf[0]='\'';
+ {
+ int buflen;
+ if (!this)
+ buflen=strlen(s)+2;
+ else
+ buflen=2*strlen(s)+3;
+ b = (char *) malloc( buflen);
+ }
+ b[0]='\'';
if (!this)
- strcpy(buf+1,s);
+ strcpy(b+1,s);
else
- mysql_real_escape_string( m_db, buf+1, s, strlen(s) );
- *(strchr(buf,0)+1)=0;
- *(strchr(buf,0))='\'';
- return buf;
+ mysql_real_escape_string( m_db, b+1, s, strlen(s) );
+ *(strchr(b,0)+1)=0;
+ *(strchr(b,0))='\'';
+ return b;
}
void
diff --git a/mg_mysql.h b/mg_mysql.h
index 8ac4855..bcc1cbe 100644
--- a/mg_mysql.h
+++ b/mg_mysql.h
@@ -41,8 +41,8 @@ class mgmySql
*/
string sql_string( string s );
- char* sql_Cstring( const string s );
- char* sql_Cstring( const char *s );
+ char* sql_Cstring( const string s,char *buf=0);
+ char* sql_Cstring( const char *s,char *buf=0);
string get_col0( const string query);
diff --git a/mg_sync.c b/mg_sync.c
index d30659a..373f7ab 100644
--- a/mg_sync.c
+++ b/mg_sync.c
@@ -13,6 +13,7 @@
#include <sys/types.h>
#include <sys/stat.h>
+#include <unistd.h>
#include <fts.h>
#include <sys/time.h>
#include <time.h>
@@ -27,9 +28,9 @@
#include "mg_setup.h"
char *
-mgSync::sql_Cstring(TagLib::String s)
+mgSync::sql_Cstring(TagLib::String s,char *buf)
{
- return m_db.sql_Cstring(s.toCString());
+ return m_db.sql_Cstring(s.toCString(),buf);
}
char *
@@ -50,12 +51,7 @@ mgSync::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"))
+ if (!strcmp(c_extension,"flac"))
{
TagLib::FLAC::File f(filename);
id3v2tag = f.ID3v2Tag();
@@ -66,7 +62,7 @@ mgSync::getlanguage(const char *filename)
result = l.front()->toString();
}
}
- else if (!strcmp(extension,"mp3"))
+ else if (!strcmp(c_extension,"mp3"))
{
TagLib::MPEG::File f(filename);
id3v2tag = f.ID3v2Tag();
@@ -148,43 +144,70 @@ mgSync::~mgSync()
}
void
-mgSync::AddTrack(const char *filename)
+mgSync::UpdateTrack(long trackid)
+{
+ char sql[7000];
+ char *c_cddbid=getAlbum(c_album,c_artist,c_directory);
+ sprintf(sql,"UPDATE tracks SET artist=%s, title=%s,year=%d,sourceid=%s,"
+ "tracknb=%d,length=%d,bitrate=%d,samplerate=%d,"
+ "channels=%d,genre1=%s,lang=%s WHERE id=%ld",
+ c_artist,c_title,year,c_cddbid,
+ trackno,len,bitrate,sample,
+ channels,c_genre1,c_lang,trackid);
+ free(c_cddbid);
+ m_db.exec_sql(sql);
+}
+
+void
+mgSync::AddTrack()
+{
+ char sql[7000];
+ char *c_cddbid=getAlbum(c_album,c_artist,c_directory);
+ sprintf(sql,"INSERT INTO tracks SET artist=%s,title=%s,year=%u,sourceid=%s,"
+ "tracknb=%u,mp3file=%s,length=%d,bitrate=%d,samplerate=%d,"
+ "channels=%d,genre1=%s,genre2='',lang=%s,"
+ "folder1=%s,folder2=%s,folder3=%s,folder4=%s",
+ c_artist,c_title,year,c_cddbid,
+ trackno,c_mp3file,len,bitrate,sample,
+ channels,c_genre1,c_lang,
+ c_folder1,c_folder2,c_folder3,c_folder4);
+ free(c_cddbid);
+ m_db.exec_sql(sql);
+}
+
+bool
+mgSync::GetFileInfo(const char *filename)
{
TagLib::FileRef f( filename) ;
if (f.isNull())
- return;
+ return false;
TagLib::Tag *tag = f.tag();
if (!f.tag())
- return;
- char *c_album;
+ return false;
if (tag->album()=="")
- c_album=strdup("'Unassigned'");
+ strcpy(c_album,"'Unassigned'");
else
- c_album=sql_Cstring(tag->album());
- char *c_artist=sql_Cstring(tag->artist());
- char *c_title=sql_Cstring(tag->title());
- char *c_directory=sql_Cstring(filename);
+ sql_Cstring(tag->album(),c_album);
+ sql_Cstring(tag->artist(),c_artist);
+ sql_Cstring(tag->title(),c_title);
+ sql_Cstring(filename,c_directory);
char *slash=strrchr(c_directory,'/');
if (slash)
{
*slash='\'';
*(slash+1)=0;
}
- char *c_cddbid=getAlbum(c_album,c_artist,c_directory);
- char *c_mp3file=sql_Cstring(filename);
const char *genrename=tag->genre().toCString();
const char *genreid=m_Genres[genrename].c_str();
- char *c_genre1=sql_Cstring(genreid);
- 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();
+ sql_Cstring(genreid,c_genre1);
+ sql_Cstring(getlanguage(filename),c_lang);
+ trackno=tag->track();
+ 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;
+ len = ap->length(); // tracks.length
+ bitrate = ap->bitrate(); // tracks.bitrate
+ sample = ap->sampleRate(); //tracks.samplerate
+ channels = ap->channels(); //tracks.channels
if (m_db.HasFolderFields())
{
char *path = strdup(filename);
@@ -221,35 +244,13 @@ mgSync::AddTrack(const char *filename)
}
}
}
- char *c_folder1=sql_Cstring(folder1);
- char *c_folder2=sql_Cstring(folder2);
- char *c_folder3=sql_Cstring(folder3);
- char *c_folder4=sql_Cstring(folder4);
+ sql_Cstring(folder1,c_folder1);
+ sql_Cstring(folder2,c_folder2);
+ sql_Cstring(folder3,c_folder3);
+ sql_Cstring(folder4,c_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_directory);
- 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);
+ return true;
}
void
@@ -262,14 +263,20 @@ mgSync::SyncFile(const char *filename)
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);
+ mgDebug(3,"Importing %s",filename);
+ sql_Cstring(filename,c_mp3file);
+ char sql[600];
+ sprintf(sql,"SELECT id from tracks WHERE mp3file=%s",c_mp3file);
+ string s = m_db.get_col0(sql);
if (s!="NULL")
{
+ if (GetFileInfo(filename))
+ UpdateTrack(atol(s.c_str()));
}
else
{
- AddTrack(filename);
+ if (GetFileInfo(filename))
+ AddTrack();
}
}
@@ -296,7 +303,15 @@ mgSync::Sync(const char * path, bool delete_missing)
fts = fts_open( const_cast<char *const *>(paths), FTS_LOGICAL, 0);
while ( (ftsent = fts_read(fts)) != NULL)
{
- SyncFile(ftsent->fts_path);
+ if (!((ftsent->fts_statp->st_mode)||S_IFREG))
+ continue;
+ char *extension = strrchr(ftsent->fts_path,'.');
+ if (!extension)
+ continue;
+ strcpy(c_extension,extension+1);
+ lower(c_extension);
+ if (!strcmp(c_extension,"flac") || !strcmp(c_extension,"ogg") || !strcmp(c_extension,"mp3"))
+ SyncFile(ftsent->fts_path);
}
fts_close(fts);
}
diff --git a/mg_sync.h b/mg_sync.h
index 3ab9469..45d3bc5 100644
--- a/mg_sync.h
+++ b/mg_sync.h
@@ -34,14 +34,35 @@ class mgSync
private:
mgmySql m_db;
- char *sql_Cstring(TagLib::String s);
+ char *sql_Cstring(TagLib::String s,char *buf=0);
char *lower(char *s);
TagLib::String getlanguage(const char *filename);
char * getAlbum(const char *c_album,const char *c_artist,const char *c_directory);
- void AddTrack(const char *filename);
+ bool GetFileInfo(const char *filename);
+ void AddTrack();
+ void UpdateTrack(long trackid);
void SyncFile(const char *filename);
map<string,string> m_Genres;
MYSQL_RES* m_genre_rows;
+
+ char c_album[520]; // at least 256 * 2 + 2 for VARCHAR(255), see sql_string()
+ char c_artist[520];
+ char c_title[520];
+ char c_directory[520];
+ char c_mp3file[520];
+ char c_genre1[520];
+ char c_lang[520];
+ char c_folder1[520];
+ char c_folder2[520];
+ char c_folder3[520];
+ char c_folder4[520];
+ char c_extension[300];
+ unsigned int trackno;
+ unsigned int year;
+ int len;
+ int bitrate;
+ int sample;
+ int channels;
};
#endif