summaryrefslogtreecommitdiff
path: root/mugglei.c
diff options
context:
space:
mode:
Diffstat (limited to 'mugglei.c')
-rwxr-xr-xmugglei.c793
1 files changed, 58 insertions, 735 deletions
diff --git a/mugglei.c b/mugglei.c
index 6feecf3..1e2f7ae 100755
--- a/mugglei.c
+++ b/mugglei.c
@@ -31,705 +31,32 @@
#include <fileref.h>
#include "mg_tools.h"
+#include "mg_setup.h"
+#include "mg_sync.h"
-MYSQL *db;
-static char *server_args[] =
-{
- "this_program", /* this string is not used */
- "--datadir=.",
- "--key_buffer_size=32M"
-};
-
-static char *server_groups[] =
-{
- "embedded",
- "server",
- "this_program_SERVER",
- (char *)NULL
-};
-
-char *db_cmds[] =
-{
- "DROP DATABASE IF EXISTS GiantDisc; CREATE DATABASE GiantDisc;",
- "grant all privileges on GiantDisc.* to vdr@localhost;",
- "use GiantDisc;",
- "drop table if exists album; CREATE TABLE album ( "
- "artist varchar(255) default NULL, "
- "title varchar(255) default NULL, "
- "cddbid varchar(20) NOT NULL default '', "
- "coverimg varchar(255) default NULL, "
- "covertxt mediumtext, "
- "modified date default NULL, "
- "genre varchar(10) default NULL, "
- "PRIMARY KEY (cddbid), "
- "KEY artist (artist(10)), "
- "KEY title (title(10)), "
- "KEY genre (genre), "
- "KEY modified (modified)) "
- "TYPE=MyISAM;",
- "drop table if exists genre; CREATE TABLE genre ("
- "id varchar(10) NOT NULL default '', "
- "id3genre smallint(6) default NULL, "
- "genre varchar(255) default NULL, "
- "freq int(11) default NULL, "
- "PRIMARY KEY (id)) "
- "TYPE=MyISAM;",
- "drop table if exists language; CREATE TABLE language ("
- "id varchar(4) NOT NULL default '', "
- "language varchar(40) default NULL, "
- "freq int(11) default NULL, "
- "PRIMARY KEY (id)) "
- "TYPE=MyISAM;",
- "drop table if exists musictype; CREATE TABLE musictype ("
- "musictype varchar(40) default NULL, "
- "id tinyint(3) unsigned NOT NULL auto_increment, "
- "PRIMARY KEY (id)) "
- "TYPE=MyISAM;",
- "drop table if exists player;CREATE TABLE player ( "
- "ipaddr varchar(255) NOT NULL default '', "
- "uichannel varchar(255) NOT NULL default '', "
- "logtarget int(11) default NULL, "
- "cdripper varchar(255) default NULL, "
- "mp3encoder varchar(255) default NULL, "
- "cdromdev varchar(255) default NULL, "
- "cdrwdev varchar(255) default NULL, "
- "id int(11) NOT NULL default '0', "
- "PRIMARY KEY (id)) "
- "TYPE=MyISAM;",
- "drop table if exists playerstate;CREATE TABLE playerstate ( "
- "playerid int(11) NOT NULL default '0', "
- "playertype int(11) NOT NULL default '0', "
- "snddevice varchar(255) default NULL, "
- "playerapp varchar(255) default NULL, "
- "playerparams varchar(255) default NULL, "
- "ptlogger varchar(255) default NULL, "
- "currtracknb int(11) default NULL, "
- "state varchar(4) default NULL, "
- "shufflepar varchar(255) default NULL, "
- "shufflestat varchar(255) default NULL, "
- "pauseframe int(11) default NULL, "
- "framesplayed int(11) default NULL, "
- "framestotal int(11) default NULL, "
- "anchortime bigint(20) default NULL, "
- "PRIMARY KEY (playerid,playertype)) "
- "TYPE=HEAP;",
- "drop table if exists playlist;CREATE TABLE playlist ( "
- "title varchar(255) default NULL, "
- "author varchar(255) default NULL, "
- "note varchar(255) default NULL, "
- "created timestamp(8) NOT NULL, "
- "id int(10) unsigned NOT NULL auto_increment, "
- "PRIMARY KEY (id)) "
- "TYPE=MyISAM;",
- "drop table if exists playlistitem;CREATE TABLE playlistitem ( "
- "playlist int(11) NOT NULL default '0', "
- "tracknumber mediumint(9) NOT NULL default '0', "
- "trackid int(11) default NULL, "
- "PRIMARY KEY (playlist,tracknumber)) "
- "TYPE=MyISAM;",
- "drop table if exists playlog;CREATE TABLE playlog ( "
- "trackid int(11) default NULL, "
- "played date default NULL, "
- "id tinyint(3) unsigned NOT NULL auto_increment, "
- "PRIMARY KEY (id)) "
- "TYPE=MyISAM;",
- "drop table if exists recordingitem;CREATE TABLE recordingitem ( "
- "trackid int(11) default NULL, "
- "recdate date default NULL, "
- "rectime time default NULL, "
- "reclength int(11) default NULL, "
- "enddate date default NULL, "
- "endtime time default NULL, "
- "repeat varchar(10) default NULL, "
- "initcmd varchar(255) default NULL, "
- "parameters varchar(255) default NULL, "
- "atqjob int(11) default NULL, "
- "id int(11) NOT NULL default '0', "
- "PRIMARY KEY (id)) "
- "TYPE=MyISAM;",
- "drop table if exists source; CREATE TABLE source ( "
- "source varchar(40) default NULL, "
- "id tinyint(3) unsigned NOT NULL auto_increment, "
- "PRIMARY KEY (id)) "
- "TYPE=MyISAM;",
- "drop table if exists tracklistitem;CREATE TABLE tracklistitem ( "
- "playerid int(11) NOT NULL default '0', "
- "listtype smallint(6) NOT NULL default '0', "
- "tracknb int(11) NOT NULL default '0', "
- "trackid int(11) NOT NULL default '0', "
- "PRIMARY KEY (playerid,listtype,tracknb)) "
- "TYPE=MyISAM;",
- "drop table if exists tracks;CREATE TABLE tracks ( "
- "artist varchar(255) default NULL, "
- "title varchar(255) default NULL, "
- "genre1 varchar(10) default NULL, "
- "genre2 varchar(10) default NULL, "
- "year smallint(5) unsigned default NULL, "
- "lang varchar(4) default NULL, "
- "type tinyint(3) unsigned default NULL, "
- "rating tinyint(3) unsigned default NULL, "
- "length smallint(5) unsigned default NULL, "
- "source tinyint(3) unsigned default NULL, "
- "sourceid varchar(20) default NULL, "
- "tracknb tinyint(3) unsigned default NULL, "
- "mp3file varchar(255) default NULL, "
- "condition tinyint(3) unsigned default NULL, "
- "voladjust smallint(6) default '0', "
- "lengthfrm mediumint(9) default '0', "
- "startfrm mediumint(9) default '0', "
- "bpm smallint(6) default '0', "
- "lyrics mediumtext, "
- "bitrate varchar(10) default NULL, "
- "created date default NULL, "
- "modified date default NULL, "
- "backup tinyint(3) unsigned default NULL, "
- "samplerate int(7) unsigned default NULL, "
- "channels tinyint(3) unsigned default NULL, "
- "id int(11) NOT NULL auto_increment, "
- "folder1 varchar(255), "
- "folder2 varchar(255), "
- "folder3 varchar(255), "
- "folder4 varchar(255), "
- "PRIMARY KEY (id), "
- "KEY title (title(10)), "
- "KEY mp3file (mp3file(10)), "
- "KEY genre1 (genre1), "
- "KEY genre2 (genre2), "
- "KEY year (year), "
- "KEY lang (lang), "
- "KEY type (type), "
- "KEY rating (rating), "
- "KEY sourceid (sourceid), "
- "KEY artist (artist(10))) "
- "TYPE=MyISAM;"
-};
+using namespace std;
-bool folderfields;
+int SysLogLevel = 1;
-std::string host, user, pass, dbname, sck;
bool import_assorted, delete_mode, create_mode;
-#define MAX_QUERY_BUFLEN 2048
-static char querybuf[MAX_QUERY_BUFLEN];
-
-void showmessage(const char *msg)
+void showmessage(const char *msg,int duration)
{
}
-void
-init_folderfields()
-{
- folderfields=false;
- mysql_query(db,"DESCRIBE tracks folder1");
- MYSQL_RES *rows = mysql_store_result(db);
- if (rows)
- {
- folderfields = mysql_num_rows(rows)>0;
- mysql_free_result(rows);
- if (!folderfields)
- {
- folderfields = !mysql_query(db,
- "alter table tracks add column folder1 varchar(255),"
- "add column folder2 varchar(255),"
- "add column folder3 varchar(255),"
- "add column folder4 varchar(255)");
-
- }
- }
-}
-
-MYSQL_RES* mgSqlReadQuery(MYSQL *db, const char *fmt, ...)
+void showimportcount(unsigned int count)
{
- va_list ap;
- va_start( ap, fmt );
- vsnprintf( querybuf, MAX_QUERY_BUFLEN-1, fmt, ap );
-
- if( mysql_query(db, querybuf) )
- {
- mgError( "SQL error in MUGGLE:\n%s: %s\n", querybuf,mysql_error(db) );
- }
-
- MYSQL_RES *result = mysql_store_result(db);
-
- va_end(ap);
- return result;
}
-void mgSqlWriteQuery(MYSQL *db, const char *fmt, ...)
+const char *I18nTranslate(const char *s,const char *Plugin)
{
- va_list ap;
- va_start(ap, fmt);
- vsnprintf(querybuf, MAX_QUERY_BUFLEN-1, fmt, ap);
-
- if( mysql_query(db, querybuf) )
- {
- mgError( "SQL error in MUGGLE:\n%s %s\n", querybuf,mysql_error(db) );
- }
-
- va_end(ap);
-}
-
-int init_database()
-{
- db = mysql_init(0); // NULL?
-
- if( db == NULL )
- {
- std::cout << "mysql_init failed." << std::endl;
- return -1;
- }
-
- // check for use of sockets
- if( sck != "" )
- {
- if( mysql_real_connect( db, NULL, user.c_str(), pass.c_str(), dbname.c_str(),
- 0, sck.c_str(), 0 ) == NULL )
-
- {
- std::cout << "mysql_real_connect using sockets failed." << std::endl;
- return -2;
- }
- }
- else
- {
- if( mysql_real_connect( db, host.c_str(), user.c_str(), pass.c_str(), dbname.c_str(),
- 0, NULL, 0 ) == NULL )
- {
- std::cout << "mysql_real_connect via TCP failed." << std::endl;
- return -2;
- }
- }
-
- return 0;
-}
-
-MYSQL_RES *
-exec_sql( std::string query )
-{
- if( query.empty() )
- return 0;
- mgDebug( 3, "exec_sql(%X,%s)", db, query.c_str() );
- if (mysql_query (db, (query + ';').c_str ()))
- {
- mgError("SQL Error in %s: %s",query.c_str(),mysql_error (db));
- std::cout << "ERROR in " << query << ":" << mysql_error(db) << std::endl;
- return 0;
- }
- return mysql_store_result(db);
-}
-
-int create_database()
-{
- // create database and tables
- int len = sizeof( db_cmds ) / sizeof( char* );
- for( int i=0; i < len; i ++ )
- {
- exec_sql( std::string( db_cmds[i] ) );
- }
- return 0;
-}
-
-time_t get_fs_modification_time( std::string filename )
-{
- struct stat *buf = (struct stat*) malloc( sizeof( struct stat ) );
- time_t mod = 0;
-
- // yes: obtain modification date for file and db entry
- if( !stat( filename.c_str(), buf ) )
- {
- mod = buf->st_mtime;
- free( buf );
- }
-
- return mod;
-}
-
-time_t get_db_modification_time( long uid )
-{
- time_t mt = 0;
-
- MYSQL_RES *result = mgSqlReadQuery( db, "SELECT UNIX_TIMESTAMP(modification_time) "
- "FROM tracks WHERE id=\"%d\"", uid );
- if( mysql_num_rows(result) )
- {
- MYSQL_ROW row = mysql_fetch_row( result );
-
- std::string mod_time = row[0];
- mt = (time_t) atol( mod_time.c_str() );
- }
-
- return mt;
-}
-
-TagLib::String escape_string( MYSQL *db, TagLib::String s )
-{
- char *buf = strdup( s.toCString() );
- char *escbuf = (char *) malloc( 2*strlen( buf ) + 1 );
-
- mysql_real_escape_string( db, escbuf, s.toCString(), s.size() );
- TagLib::String r = TagLib::String( escbuf );
-
- free( escbuf );
- free( buf);
-
- return r;
-}
-
-long find_file_in_database( MYSQL *db, std::string filename )
-{
- long uid = -1;
-
- TagLib::String file = TagLib::String( filename.c_str() );
- file = escape_string( db, file );
-
- MYSQL_RES *result = mgSqlReadQuery( db, "SELECT id FROM tracks WHERE mp3file=\"%s\"", file.toCString() );
- if( mysql_num_rows(result) )
- {
- MYSQL_ROW row = mysql_fetch_row( result );
- uid = atol( row[0] );
- }
-
- // obtain ID and return
- return uid;
-}
-
-TagLib::String find_genre_id( TagLib::String genre )
-{
- TagLib::String id = "";
-
- if( genre.size() )
- {
- MYSQL_RES *result = mgSqlReadQuery( db, "SELECT id FROM genre WHERE "
- "genre=\"%s\"", genre.toCString() );
-
- if( mysql_num_rows(result) )
- {
- MYSQL_ROW row = mysql_fetch_row( result );
-
- id = row[0];
- }
- }
-
- return id;
-}
-
-// read tags from the mp3 file and store them into the corresponding database entry
-void update_db( long uid, std::string filename )
-{
- TagLib::String title, album, artist, genre, cddbid, language;
- uint trackno, year;
-
- // ID3_Tag filetag( filename.c_str() );
- TagLib::FileRef f( filename.c_str() );
-
- if( !f.isNull() && f.tag() )
- {
- // std::cout << "Evaluating " << filename << std::endl;
- TagLib::Tag *tag = f.tag();
-
- // obtain tag information
- title = tag->title();
- album = tag->album();
- year = tag->year();
- artist = tag->artist();
- trackno = tag->track();
- genre = tag->genre();
- language = "";
- TagLib::ID3v2::Tag * id3v2tag=0;
- if (filename.substr(filename.size()-5)==".flac")
- {
- TagLib::FLAC::File f(filename.c_str());
- id3v2tag = f.ID3v2Tag();
- if (id3v2tag)
- {
- TagLib::ID3v2::FrameList l = id3v2tag->frameListMap()["TLAN"];
- if (!l.isEmpty())
- language = l.front()->toString();
- }
- }
- else if (filename.substr(filename.size()-4)==".mp3")
- {
- TagLib::MPEG::File f(filename.c_str());
- id3v2tag = f.ID3v2Tag();
- if (id3v2tag)
- {
- TagLib::ID3v2::FrameList l = id3v2tag->frameListMap()["TLAN"];
- if (!l.isEmpty())
- language = l.front()->toString();
- }
- }
-
- TagLib::String gid = find_genre_id( genre );
-
- 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
-
- title = escape_string( db, title );
- album = escape_string( db, album );
- artist = escape_string( db, artist );
-
- // TODO: CD identifier (if it exists), playcounter, popularimeter (rating?), volume adjustment, lyrics, cover
-
- // finally update the database
-
- // obtain associated album or create
- if( album == "" )
- { // no album found, create default album for artist
- MYSQL_RES *result = mgSqlReadQuery( db, "SELECT cddbid FROM album WHERE title=\"Unassigned\" AND artist=\"%s\"", artist.toCString() );
- MYSQL_ROW row = mysql_fetch_row( result );
-
- // Default album does not yet exist (num rows == 0)
- int nrows = mysql_num_rows(result);
- if( nrows == 0 )
- {
- // create new album entry "Unassigned" for this artist
- long id = random();
- char *buf;
- asprintf( &buf, "%ld-%s", id, tag->artist().toCString() );
- cddbid = TagLib::String( buf ).substr( 0, 20 );
- cddbid = escape_string( db, cddbid );
- free( buf );
-
- mgSqlWriteQuery( db,
- "INSERT INTO album (artist, title, cddbid) "
- "VALUES (\"%s\", \"Unassigned\", \"%s\")",
- artist.toCString(), cddbid.toCString() );
- }
- else
- { // use first album found as source id for the track
- cddbid = escape_string(db,row[0]);
- }
- }
- else
- { // album tag found, associate or create
- MYSQL_RES *result;
- if( import_assorted )
- { // lookup an existing album by title only (artist should be "Various Artists"
- result = mgSqlReadQuery( db, "SELECT cddbid FROM album WHERE title=\"%s\" AND artist=\"Various Artists\"",
- album.toCString(), artist.toCString() );
- }
- else
- {
- result = mgSqlReadQuery( db, "SELECT cddbid FROM album WHERE title=\"%s\" AND artist=\"%s\"",
- album.toCString(), artist.toCString() );
- }
- MYSQL_ROW row = mysql_fetch_row( result );
-
- // num rows == 0 ?
- int nrows = mysql_num_rows(result);
- if( nrows == 0 )
- {
- // create new album entry
- long id = random();
- char *buf;
- asprintf( &buf, "%ld-%s", id, tag->album().toCString() );
- cddbid = TagLib::String( buf ).substr( 0, 20 );
- cddbid = escape_string( db, cddbid );
- free( buf );
-
- if( import_assorted )
- { // in this case, the album author is "Various Artists"
- mgSqlWriteQuery( db,
- "INSERT INTO album (artist,title,cddbid) "
- "VALUES (\"Various Artists\", \"%s\", \"%s\")",
- album.toCString(), cddbid.toCString() );
- }
- else
- {
- mgSqlWriteQuery( db,
- "INSERT INTO album (artist,title,cddbid) "
- "VALUES (\"%s\", \"%s\", \"%s\")",
- artist.toCString(), album.toCString(), cddbid.toCString() );
- }
- }
- else
- { // use first album found as source id for the track
- cddbid = escape_string(db,row[0]);
- }
- }
-
- // update tracks table
- if( uid > 0 )
- { // the entry is known to exist already, hence update it
-
- mgSqlWriteQuery( db, "UPDATE tracks SET artist=\"%s\", title=\"%s\", year=\"%d\","
- "sourceid=\"%s\", mp3file=\"%s\", length=%d, bitrate=\"%d\","
- "samplerate=%d, channels=%d, genre1=\"%s\", lang=\"%s\" WHERE id=%d",
- artist.toCString(), title.toCString(), year,
- cddbid.toCString(), filename.c_str(), len, bitrate,
- sample, channels, gid.toCString(), language.toCString(), uid );
- }
- else
- { // the entry does not exist, create it
- if (folderfields)
- {
- char *path = strdup(filename.c_str());
- 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;
- }
- }
- }
- }
- TagLib::String f1 = escape_string( db, folder1 );
- TagLib::String f2 = escape_string( db, folder2 );
- TagLib::String f3 = escape_string( db, folder3 );
- TagLib::String f4 = escape_string( db, folder4 );
- mgSqlWriteQuery( db,
- "INSERT INTO tracks "
- "(artist, title, year,sourceid,tracknb,mp3file,length,bitrate,samplerate,channels,genre1,genre2,lang,folder1,folder2,folder3,folder4) VALUES"
- "(\"%s\", \"%s\", %d, \"%s\", %d, \"%s\", %d, \"%d\", %d, %d, \"%s\",\"\",\"%s\","
- "\"%s\",\"%s\",\"%s\",\"%s\")",
- artist.toCString(), title.toCString(), year, cddbid.toCString(),
- trackno, filename.c_str(), len, bitrate, sample, channels, gid.toCString(),
- language.toCString(),f1.toCString(),f2.toCString(),f3.toCString(),f4.toCString());
- free(path);
- }
- else
- mgSqlWriteQuery( db,
- "INSERT INTO tracks "
- "(artist, title, year,sourceid,tracknb,mp3file,length,bitrate,samplerate,channels,genre1,genre2,lang) VALUES"
- "(\"%s\", \"%s\", %d, \"%s\", %d, \"%s\", %d, \"%d\", %d, %d, \"%s\",\"\",\"%s\")",
- artist.toCString(), title.toCString(), year, cddbid.toCString(),
- trackno, filename.c_str(), len, bitrate, sample, channels, gid.toCString(),
- language.toCString());
-
-#ifdef VERBOSE
- std::cout << "-- TAG --" << std::endl;
- std::cout << "title - '" << tag->title() << "'" << std::endl;
- std::cout << "artist - '" << tag->artist() << "'" << std::endl;
- std::cout << "album - '" << tag->album() << "'" << std::endl;
- std::cout << "year - '" << tag->year() << "'" << std::endl;
- std::cout << "comment - '" << tag->comment() << "'" << std::endl;
- std::cout << "track - '" << tag->track() << "'" << std::endl;
- std::cout << "genre - '" << tag->genre() << "'" << std::endl;
- std::cout << "language- '" << language << "'" << std::endl;
-#endif
- }
- }
-}
-
-void update_tags( long uid )
-{
- MYSQL_RES *result;
- MYSQL_ROW row;
-
- if( uid >= 0 )
- {
- result = mgSqlReadQuery( db, "SELECT artist,title,year,tracknb,mp3file,genre1,id FROM tracks where id=%d", uid );
- }
- else
- {
- result = mgSqlReadQuery( db, "SELECT artist,title,year,tracknb,mp3file,genre1,id FROM tracks" );
- }
-
- // loop all results
- char* cwd = getcwd( NULL, 0 );
- std::string wdir = std::string( cwd );
- free( cwd );
-
- struct stat *buf = (struct stat*) malloc( sizeof( struct stat ) );
- while(( row = mysql_fetch_row(result) ) != NULL )
- {
-
- std::string file = wdir + "/" + std::string( row[4] );
-
- if( !stat( file.c_str(), buf ) )
- {
- // set tags?
- /*
- std::string artist = row[0];
- std::string title = row[1];
- int year = atoi( row[2] );
- int track = atoi( row[3] );
- std::string genre = row[5];
- */
- }
- else
- {
- if( delete_mode )
- {
-#ifdef VERBOSE
- std::cout << "Deleting entry " << row[6] << " from database because the file no longer exists." << std::endl;
-#endif
- mgSqlWriteQuery( db, "DELETE FROM tracks where id=%s", row[6] );
- }
- }
- }
- free( buf );
-}
-
-void evaluate_file( std::string filename )
-{
- // is filename stored in database?
- long uid = find_file_in_database( db, filename );
- if( uid >= 0 )
- {
- // currently only update database, do not consider writing changes from the db back to tags
- /*
- // determine modification times in database and on filesystem
- time_t db_time = get_db_modification_time( uid );
- time_t fs_time = get_fs_modification_time( filename );
-
- if( db_time > fs_time )
- {
- // db is newer: update id3 tags from db
- update_tags( uid, filename );
- }
- else
- {
- // file is newer: update db from id3 tags
- update_db( uid, filename );
- }
- */
-
- update_db( uid, filename );
- }
- else
- {
- // not in db yet: import file
- update_db( -1, filename );
- }
+ return s;
}
int main( int argc, char *argv[] )
{
- if( mysql_server_init(sizeof(server_args) / sizeof(char *),
- server_args, server_groups) )
- {
- exit(1);
- }
- std::string filename;
+ mgSetDebugLevel(1);
if( argc < 2 )
{ // we need at least a filename!
@@ -737,35 +64,49 @@ int main( int argc, char *argv[] )
std::cout << "(C) Lars von Wedel" << std::endl;
std::cout << "This is free software; see the source for copying conditions." << std::endl;
std::cout << "" << std::endl;
+ std::cout << "Usage: mugglei [OPTION]... [FILE]..." << std::endl;
+ std::cout << "" << std::endl;
+ std::cout << " all FILE arguments will be imported. If they are directories, their content is imported"<< std::endl;
+ std::cout << "" << std::endl;
+ std::cout << "Only files ending in .flac, .mp3, .ogg (ignoring case) will be imported" << std::endl;
+ std::cout << "" << std::endl;
std::cout << "Options:" << std::endl;
std::cout << " -h <hostname> - specify host of mySql database server (default is 'localhost')" << std::endl;
std::cout << " -s <socket> - specify a socket for mySQL communication (default is TCP)" << std::endl;
std::cout << " -n <database> - specify database name (default is 'GiantDisc')" << std::endl;
std::cout << " -u <username> - specify user of mySql database (default is empty)" << std::endl;
std::cout << " -p <password> - specify password of user (default is empty password)" << std::endl;
- std::cout << " -f <filename> - name of music file to import or update" << std::endl;
- std::cout << " -a - import track as if it was on an assorted album" << std::endl;
+ std::cout << " -t <topleveldir> - name of music top level directory" << std::endl;
std::cout << " -z - scan all database entries and delete entries for files not found" << std::endl;
- std::cout << " -c - create a new database entry deleting existing entries" << std::endl;
+ std::cout << " -z is not yet implemented" << std::endl;
+ std::cout << " -c - delete the entire database and recreate a new empty one" << std::endl;
+#ifndef HAVE_SERVER
+ std::cout << " -d <datadir> - the data directory for the embedded mysql server. Defaults to ./.muggle" << std::endl;
+#endif
+ std::cout << " -v - the wanted log level, the higher the more. Default is 1" << std::endl;
exit( 1 );
}
// option defaults
- host = "localhost";
- dbname = "GiantDisc";
- user = "";
- pass = "";
- sck = "";
import_assorted = false;
delete_mode = false;
create_mode = false;
- filename = "";
+#ifndef HAVE_SERVER
+ char *buf;
+ asprintf(&buf,"%s/.muggle",getenv("HOME"));
+ set_datadir(buf);
+ free(buf);
+#endif
// parse command line options
while( 1 )
{
- int c = getopt(argc, argv, "h:u:p:n:af:s:z");
+#ifndef HAVE_SERVER
+ int c = getopt(argc, argv, "h:s:n:u:p:t:zcv:d:");
+#else
+ int c = getopt(argc, argv, "h:s:n:u:p:t:zcv:");
+#endif
if (c == -1)
break;
@@ -778,32 +119,28 @@ int main( int argc, char *argv[] )
} break;
case 'h':
{
- host = optarg;
+ the_setup.DbHost = optarg;
} break;
case 'n':
{
- dbname = optarg;
+ the_setup.DbName = optarg;
} break;
case 'u':
{
- user = optarg;
+ the_setup.DbUser = optarg;
} break;
case 'p':
{
- pass = optarg;
+ the_setup.DbPass = optarg;
} break;
- case 'a':
+ case 's':
{
- import_assorted = true;
+ the_setup.DbSocket = optarg;
} break;
- case 'f':
+ case 't':
{
- filename = optarg;
+ the_setup.ToplevelDir = optarg;
} break;
- case 's':
- {
- sck = optarg;
- } break;
case 'z':
{
delete_mode = true;
@@ -812,39 +149,25 @@ int main( int argc, char *argv[] )
{
create_mode = true;
} break;
+ case 'v':
+ {
+ mgSetDebugLevel(atol(optarg));
+ } break;
+#ifndef HAVE_SERVER
+ case 'd':
+ {
+ set_datadir(optarg);
+ } break;
+#endif
}
}
-
- if( filename.length() > 255 )
- {
- std::cerr << "Warning: length of file exceeds database field capacity: " << filename << std::endl;
- }
-
- // init random number generator
- struct timeval tv;
- struct timezone tz;
- gettimeofday( &tv, &tz );
- srandom( tv.tv_usec );
-
- if( 0 == init_database() )
- {
- init_folderfields();
- if( delete_mode )
- {
- update_tags( -1 );
- }
- else if( create_mode )
- {
- create_database();
- }
- if( filename.size() )
- {
- evaluate_file( filename );
- }
- }
-
- mysql_server_end();
-
+ mgSync *sync = new mgSync; // because we want to delete it before database_end
+ if (create_mode)
+ sync->Create();
+ if (optind<argc)
+ sync->Sync(argv+optind,delete_mode);
+ delete sync;
+ database_end();
return 0;
}