static cddb_disc_t *GetCDDBInfo( access_t *p_access, int i_titles, int *p_sectors ) { if( var_InheritInteger( p_access, "album-art" ) == ALBUM_ART_WHEN_ASKED ) return NULL; /* */ cddb_conn_t *p_cddb = cddb_new(); if( !p_cddb ) { msg_Warn( p_access, "unable to use CDDB" ); return NULL; } /* */ cddb_http_enable( p_cddb ); char *psz_tmp = var_InheritString( p_access, "cddb-server" ); if( psz_tmp ) { cddb_set_server_name( p_cddb, psz_tmp ); free( psz_tmp ); } cddb_set_server_port( p_cddb, var_InheritInteger( p_access, "cddb-port" ) ); cddb_set_email_address( p_cddb, "*****@*****.**" ); cddb_set_http_path_query( p_cddb, "/~cddb/cddb.cgi" ); cddb_set_http_path_submit( p_cddb, "/~cddb/submit.cgi" ); char *psz_cachedir; char *psz_temp = config_GetUserDir( VLC_CACHE_DIR ); if( asprintf( &psz_cachedir, "%s" DIR_SEP "cddb", psz_temp ) > 0 ) { cddb_cache_enable( p_cddb ); cddb_cache_set_dir( p_cddb, psz_cachedir ); free( psz_cachedir ); } free( psz_temp ); cddb_set_timeout( p_cddb, 10 ); /* */ cddb_disc_t *p_disc = cddb_disc_new(); if( !p_disc ) { msg_Err( p_access, "unable to create CDDB disc structure." ); goto error; } int64_t i_length = 0; for( int i = 0; i < i_titles; i++ ) { cddb_track_t *t = cddb_track_new(); cddb_track_set_frame_offset( t, p_sectors[i] ); cddb_disc_add_track( p_disc, t ); const int64_t i_size = ( p_sectors[i+1] - p_sectors[i] ) * (int64_t)CDDA_DATA_SIZE; i_length += INT64_C(1000000) * i_size / 44100 / 4 ; } cddb_disc_set_length( p_disc, (int)(i_length/1000000) ); if( !cddb_disc_calc_discid( p_disc ) ) { msg_Err( p_access, "CDDB disc ID calculation failed" ); goto error; } const int i_matches = cddb_query( p_cddb, p_disc ); if( i_matches < 0 ) { msg_Warn( p_access, "CDDB error: %s", cddb_error_str((cddb_error_t)errno) ); // sunqueen modify goto error; } else if( i_matches == 0 ) { msg_Dbg( p_access, "Couldn't find any matches in CDDB." ); goto error; } else if( i_matches > 1 ) msg_Warn( p_access, "found %d matches in CDDB. Using first one.", i_matches ); cddb_read( p_cddb, p_disc ); cddb_destroy( p_cddb); return p_disc; error: if( p_disc ) cddb_disc_destroy( p_disc ); cddb_destroy( p_cddb ); return NULL; }
bool AudioCDDemux::freedb_query( cddb_disc_t *&cddb_disc ) { #ifdef Q_OS_WIN bool hasHomeEnv = getenv( "HOME" ); if ( !hasHomeEnv ) putenv( "HOME=" + QDir::homePath().toLocal8Bit() ); #endif cddb_conn_t *cddb = cddb_new(); #ifdef Q_OS_WIN if ( !hasHomeEnv ) putenv( "HOME=" ); #endif cddb_disc = cddb_disc_new(); #ifdef Q_OS_WIN const QString cddbDir = QMPlay2Core.getSettingsDir() + "CDDB"; if ( QDir( cddbDir ).exists() || QDir( QMPlay2Core.getSettingsDir() ).mkdir( "CDDB" ) ) cddb_cache_set_dir( cddb, cddbDir.toLocal8Bit() ); #endif cddb_disc_set_length( cddb_disc, FRAMES_TO_SECONDS( cdio_get_track_lba( cdio, CDIO_CDROM_LEADOUT_TRACK ) ) ); for ( int trackno = 1 ; trackno <= numTracks ; ++trackno ) { cddb_track_t *pcddb_track = cddb_track_new(); cddb_track_set_frame_offset( pcddb_track, cdio_get_track_lba( cdio, trackno ) ); cddb_disc_add_track( cddb_disc, pcddb_track ); } bool useNetwork = false; cddb_disc_calc_discid( cddb_disc ); if ( cddb_disc_get_discid( cddb_disc ) == discID ) cddb_cache_only( cddb ); else { discID = cddb_disc_get_discid( cddb_disc ); cddb_set_timeout( cddb, 3 ); cddb_http_enable( cddb ); cddb_set_server_port( cddb, 80 ); Settings sets( "QMPlay2" ); if ( sets.getBool( "Proxy/Use" ) ) { cddb_http_proxy_enable( cddb ); cddb_set_http_proxy_server_name( cddb, sets.getString( "Proxy/Host" ).toLocal8Bit() ); cddb_set_http_proxy_server_port( cddb, sets.getUInt( "Proxy/Port" ) ); if ( sets.getBool( "Proxy/Login" ) ) { cddb_set_http_proxy_username( cddb, sets.getString( "Proxy/User" ).toLocal8Bit() ); cddb_set_http_proxy_password( cddb, QString( QByteArray::fromBase64( sets.getByteArray( "Proxy/Password" ) ) ).toLocal8Bit() ); } } useNetwork = true; } for ( int i = 0 ; i <= useNetwork ; ++i ) { if ( cddb_query( cddb, cddb_disc ) > 0 ) { do if ( cddb_disc_get_discid( cddb_disc ) == discID ) { cddb_read( cddb, cddb_disc ); cddb_destroy( cddb ); return true; } while ( cddb_query_next( cddb, cddb_disc ) ); } if ( useNetwork && !i ) cddb_set_server_name( cddb, "freedb.musicbrainz.org" ); } cddb_disc_destroy( cddb_disc ); cddb_destroy( cddb ); cddb_disc = NULL; return false; }
static void print_cddb_info(CdIo_t *p_cdio, track_t i_tracks, track_t i_first_track) { int i, matches; cddb_conn_t *conn = cddb_new(); cddb_disc_t *disc = NULL; if (!conn) { report(stderr, "%s: unable to initialize libcddb\n", program_name); goto cddb_destroy; } if (NULL == opts.cddb_email) cddb_set_email_address(conn, "me@home"); else cddb_set_email_address(conn, opts.cddb_email); if (NULL == opts.cddb_server) cddb_set_server_name(conn, "freedb.freedb.org"); else cddb_set_server_name(conn, opts.cddb_server); if (opts.cddb_timeout >= 0) cddb_set_timeout(conn, opts.cddb_timeout); cddb_set_server_port(conn, opts.cddb_port); if (opts.cddb_http) cddb_http_enable(conn); else cddb_http_disable(conn); if (NULL != opts.cddb_cachedir) cddb_cache_set_dir(conn, opts.cddb_cachedir); if (opts.cddb_disable_cache) cddb_cache_disable(conn); disc = cddb_disc_new(); if (!disc) { report(stderr, "%s: unable to create CDDB disc structure", program_name); goto cddb_destroy; } for(i = 0; i < i_tracks; i++) { cddb_track_t *t = cddb_track_new(); t->frame_offset = cdio_get_track_lba(p_cdio, i+i_first_track); cddb_disc_add_track(disc, t); } disc->length = cdio_get_track_lba(p_cdio, CDIO_CDROM_LEADOUT_TRACK) / CDIO_CD_FRAMES_PER_SEC; if (!cddb_disc_calc_discid(disc)) { report(stderr, "%s: libcddb calc discid failed.\n", program_name); goto cddb_destroy; } matches = cddb_query(conn, disc); if (-1 == matches) { sprintf(temp_msg, "%s: %s\n", program_name, cddb_error_str(cddb_errno(conn))); report(stdout, temp_msg); } else { sprintf(temp_msg, "%s: Found %d matches in CDDB\n", program_name, matches); report(stdout, temp_msg); for (i=1; i<=matches; i++) { cddb_read(conn, disc); cddb_disc_print(disc); cddb_query_next(conn, disc); } } cddb_disc_destroy(disc); cddb_destroy: cddb_destroy(conn); }