summaryrefslogtreecommitdiff
path: root/mg_sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'mg_sync.c')
-rw-r--r--mg_sync.c313
1 files changed, 0 insertions, 313 deletions
diff --git a/mg_sync.c b/mg_sync.c
deleted file mode 100644
index 1e4645a..0000000
--- a/mg_sync.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/*!
- * \file mg_sync.c
- * \brief synchronization between SQL and filesystem
- *
- * \version $Revision: 1.0 $
- * \date $Date: 2004-12-07 10:10:35 +0200 (Tue, 07 Dec 2004) $
- * \author Wolfgang Rohdewald
- * \author Responsible author: $Author: wr $
- *
- */
-
-#include "mg_sync.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <fts.h>
-#include <sys/time.h>
-#include <time.h>
-
-#include <mpegfile.h>
-#include <flacfile.h>
-#include <id3v2tag.h>
-#include <fileref.h>
-
-#include "mg_tools.h"
-#include "mg_mysql.h"
-#include "mg_setup.h"
-
-char *
-mgDbGd::sql_Cstring(TagLib::String s,char *buf)
-{
- return m_db.sql_Cstring(s.toCString(),buf);
-}
-
-char *
-mgDbGd::lower(char *s)
-{
- char *p=s;
- while (*p)
- {
- int i=(int)(*p);
- (*p)=(char)tolower(i);
- p++;
- }
- return s;
-}
-
-TagLib::String
-mgDbGd::getlanguage(const char *filename)
-{
- TagLib::String result = "";
- TagLib::ID3v2::Tag * id3v2tag=0;
- if (!strcmp(c_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(c_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 *
-mgDbGd::getAlbum(const char *c_album,const char *c_artist,const char *c_directory)
-{
- char * result;
- char *b;
- asprintf(&b,"SELECT cddbid FROM album"
- " WHERE title=%s AND artist=%s",c_album,c_artist);
- result=m_db.sql_Cstring(m_db.get_col0(b));
- free(b);
- if (!strcmp(result,"'NULL'"))
- {
- const char *directory="substring(tracks.mp3file,1,length(tracks.mp3file)"
- "-instr(reverse(tracks.mp3file),'/'))";
- char *where;
- asprintf(&where,"WHERE tracks.sourceid=album.cddbid "
- "AND %s=%s "
- "AND album.title=%s",
- directory,c_directory,
- c_album);
-
- // how many artists will the album have after adding this one?
- asprintf(&b,"SELECT distinct album.artist FROM tracks, album %s "
- " union select %s",where,c_artist);
- MYSQL_RES *rows = m_db.exec_sql (b);
- free(b);
- long new_album_artists = m_db.affected_rows();
- mysql_free_result(rows);
- if (new_album_artists>1) // is the album multi artist?
- {
- asprintf(&b,"SELECT album.cddbid FROM tracks, album %s",where);
- free(result);
- result=m_db.sql_Cstring(m_db.get_col0(b));
- free(b);
- asprintf(&b,"UPDATE album SET artist='Various Artists' WHERE cddbid=%s",result);
- m_db.exec_sql(b);
- // here we could change all tracks.sourceid to result and delete
- // the other album entries for this album, but that should only
- // be needed if a pre 0.1.4 import has been done incorrectly, so we
- // don't bother
- }
- else
- { // no usable album found
- free(result);
- asprintf(&result,"'%ld-%9s",random(),c_artist+1);
- char *p=strchr(result,0)-1;
- if (*p!='\'')
- *p='\'';
- asprintf(&b,"INSERT INTO album SET title=%s,artist=%s,cddbid=%s",
- c_album,c_artist,result);
- m_db.exec_sql(b);
- free(b);
- }
- free(where);
- }
- return result;
-}
-
-mgDbGd::mgDbGd(bool separate_thread)
-{
- m_separate_thread = separate_thread;
- if (separate_thread)
- mysql_thread_init();
- m_genre_rows=0;
- if (!m_db.Connected())
- return;
- m_genre_rows = m_db.exec_sql ("SELECT id,genre from genre");
- MYSQL_ROW rx;
- while ((rx = mysql_fetch_row (m_genre_rows)) != 0)
- m_Genres[rx[1]]=rx[0];
- // init random number generator
- struct timeval tv;
- struct timezone tz;
- gettimeofday( &tv, &tz );
- srandom( tv.tv_usec );
-}
-
-mgDbGd::~mgDbGd()
-{
- if (m_genre_rows) mysql_free_result(m_genre_rows);
- if (m_separate_thread)
- mysql_thread_end();
-}
-
-void
-mgDbGd::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
-mgDbGd::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
-mgDbGd::GetFileInfo(const char *filename)
-{
- TagLib::FileRef f( filename) ;
- if (f.isNull())
- return false;
- TagLib::Tag *tag = f.tag();
- if (!f.tag())
- return false;
- if (tag->album()=="")
- strcpy(c_album,"'Unassigned'");
- else
- 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;
- }
- TagLib::String sgenre1=tag->genre();
- const char *genrename=sgenre1.toCString();
- const char *genreid=m_Genres[genrename].c_str();
- sql_Cstring(genreid,c_genre1);
- sql_Cstring(getlanguage(filename),c_lang);
- trackno=tag->track();
- year=tag->year();
- TagLib::AudioProperties *ap = f.audioProperties();
- 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 *folders[4];
- char *fbuf=SeparateFolders(filename,folders,4);
- sql_Cstring(folders[0],c_folder1);
- sql_Cstring(folders[1],c_folder2);
- sql_Cstring(folders[2],c_folder3);
- sql_Cstring(folders[3],c_folder4);
- free(fbuf);
- }
- return true;
-}
-
-void
-mgDbGd::SyncFile(const char *filename)
-{
- if (!strncmp(filename,"./",2)) // strip leading ./
- filename += 2;
- const char *cfilename=filename;
- if (isdigit(filename[0]) && isdigit(filename[1]) && filename[2]=='/' && !strchr(filename+3,'/'))
- cfilename=cfilename+3;
- if (strlen(cfilename)>255)
- {
- mgWarning("Length of file exceeds database field capacity: %s", filename);
- return;
- }
- mgDebug(3,"Importing %s",filename);
- sql_Cstring(cfilename,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
- {
- if (GetFileInfo(filename))
- AddTrack();
- }
-}
-
-void
-mgDbGd::Sync(char * const * path_argv, bool delete_missing)
-{
- extern void showimportcount(unsigned int,bool final=false);
- if (!m_db.Connected())
- return;
-
- unsigned int count=0;
- m_db.CreateFolderFields();
- chdir(the_setup.ToplevelDir);
- FTS *fts;
- FTSENT *ftsent;
- fts = fts_open( path_argv, FTS_LOGICAL, 0);
- if (fts)
- {
- while ( (ftsent = fts_read(fts)) != NULL)
- {
- 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);
- count++;
- if (count%1000==0)
- showimportcount(count);
- }
- }
- fts_close(fts);
- }
- showimportcount(count,true);
-}
-
-void
-mgDbGd::Create()
-{
- m_db.Create();
-}