📄 access.c
字号:
meta_info_add_str( "Genre", p_cdda->cddb.disc->genre ); meta_info_add_str( "Extended Data", p_cdda->cddb.disc->ext_data ); { char year[5]; if (p_cdda->cddb.disc->year != 0) { snprintf(year, 5, "%d", p_cdda->cddb.disc->year); meta_info_add_str( "Year", year ); } if ( p_cdda->cddb.disc->discid ) { input_AddInfo( p_cat, _("CDDB Disc ID"), "%x", p_cdda->cddb.disc->discid ); } if ( p_cdda->cddb.disc->category != CDDB_CAT_INVALID ) { input_AddInfo( p_cat, _("CDDB Disc Category"), "%s", CDDB_CATEGORY[p_cdda->cddb.disc->category] ); } } }#endif /*HAVE_LIBCDDB*/#define TITLE_MAX 30 { track_t i_track = p_cdda->i_nb_tracks; char psz_buffer[MSTRTIME_MAX_SIZE]; mtime_t i_duration = (p_cdda->p_sectors[i_track] - p_cdda->p_sectors[0]) / CDIO_CD_FRAMES_PER_SEC; dbg_print( INPUT_DBG_META, "Duration %ld", (long int) i_duration ); input_AddInfo( p_cat, _("Duration"), "%s", secstotimestr( psz_buffer, i_duration ) ); for( i_track = 0 ; i_track < p_cdda->i_nb_tracks ; i_track++ ) { char track_str[TITLE_MAX]; mtime_t i_duration = (p_cdda->p_sectors[i_track+1] - p_cdda->p_sectors[i_track]) / CDIO_CD_FRAMES_PER_SEC; snprintf(track_str, TITLE_MAX, "%s %02d", _("Track"), i_track+1); p_cat = input_InfoCategory( p_input, track_str ); input_AddInfo( p_cat, _("Duration"), "%s", secstotimestr( psz_buffer, i_duration ) );#ifdef HAVE_LIBCDDB if (p_cdda->i_cddb_enabled) { cddb_track_t *t=cddb_disc_get_track(p_cdda->cddb.disc, i_track); if (t != NULL && t->artist != NULL) { input_AddInfo( p_cat, _("Artist"), "%s", t->artist ); input_AddInfo( p_cat, _("Title"), "%s", t->title ); } }#endif } } if( p_playlist ) vlc_object_release( p_playlist );}#ifdef HAVE_LIBCDDB#define free_and_dup(var, val) \ if (var) free(var); \ if (val) var=strdup(val);static voidGetCDDBInfo( const input_thread_t *p_input, cdda_data_t *p_cdda ){ dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT), "" ); if (config_GetInt( p_input, MODULE_STRING "-cddb-enabled" )) { int i, i_matches; cddb_conn_t *conn = cddb_new(); const CdIo *cdio = p_cdda->p_cddev->cdio; cddb_log_set_handler (uninit_log_handler); if (!conn) { msg_Warn( p_input, "unable to initialize libcddb" ); goto cddb_destroy; } cddb_set_email_address( conn, config_GetPsz( p_input, MODULE_STRING "-cddb-email") ); cddb_set_server_name( conn, config_GetPsz( p_input, MODULE_STRING "-cddb-server") ); cddb_set_server_port(conn, config_GetInt( p_input, MODULE_STRING "-cddb-port") ); /* Set the location of the local CDDB cache directory. The default location of this directory is */ if (!config_GetInt( p_input, MODULE_STRING "-cddb-enable-cache" )) cddb_cache_disable(conn); cddb_cache_set_dir(conn, config_GetPsz( p_input, MODULE_STRING "-cddb-cachedir") ); cddb_set_timeout(conn, config_GetInt( p_input, MODULE_STRING "-cddb-timeout") ); if (config_GetInt( p_input, MODULE_STRING "-cddb-httpd" )) { cddb_http_enable(conn); } else cddb_http_disable(conn); p_cdda->cddb.disc = cddb_disc_new(); if (!p_cdda->cddb.disc) { msg_Err( p_input, "Unable to create CDDB disc structure." ); goto cddb_end; } for(i = 1; i <= p_cdda->i_nb_tracks; i++) { cddb_track_t *t = cddb_track_new(); t->frame_offset = cdio_get_track_lba(cdio, i); cddb_disc_add_track(p_cdda->cddb.disc, t); } p_cdda->cddb.disc->length = cdio_get_track_lba(cdio, CDIO_CDROM_LEADOUT_TRACK) / CDIO_CD_FRAMES_PER_SEC; if (!cddb_disc_calc_discid(p_cdda->cddb.disc)) { msg_Err( p_input, "CDDB disc calc failed" ); goto cddb_destroy; } i_matches = cddb_query(conn, p_cdda->cddb.disc); if (i_matches > 0) { if (i_matches > 1) msg_Warn( p_input, "Found %d matches in CDDB. Using first one.", i_matches); cddb_read(conn, p_cdda->cddb.disc); if (p_cdda->i_debug & INPUT_DBG_CDDB) cddb_disc_print(p_cdda->cddb.disc); } else { msg_Warn( p_input, "CDDB error: %s", cddb_error_str(errno)); } cddb_destroy: cddb_destroy(conn); } cddb_end: ;}#endif /*HAVE_LIBCDDB*/#define add_format_str_info(val) \ { \ const char *str = val; \ unsigned int len; \ if (val != NULL) { \ len=strlen(str); \ if (len != 0) { \ strncat(tp, str, TEMP_STR_LEN-(tp-temp_str)); \ tp += len; \ } \ saw_control_prefix = false; \ } \ }#define add_format_num_info(val, fmt) \ { \ char num_str[10]; \ unsigned int len; \ sprintf(num_str, fmt, val); \ len=strlen(num_str); \ if (len != 0) { \ strncat(tp, num_str, TEMP_STR_LEN-(tp-temp_str)); \ tp += len; \ } \ saw_control_prefix = false; \ }/*! Take a format string and expand escape sequences, that is sequences that begin with %, with information from the current CD. The expanded string is returned. Here is a list of escape sequences: %a : The album artist ** %A : The album information ** %C : Category ** %I : CDDB disk ID ** %G : Genre ** %M : The current MRL %m : The CD-DA Media Catalog Number (MCN) %n : The number of tracks on the CD %p : The artist/performer/composer in the track ** %T : The track number ** %s : Number of seconds in this track %t : The name ** %Y : The year 19xx or 20xx ** %% : a %*/static char *CDDAFormatStr(const input_thread_t *p_input, cdda_data_t *p_cdda, const char format_str[], const char *mrl, int i_track){#define TEMP_STR_SIZE 256#define TEMP_STR_LEN (TEMP_STR_SIZE-1) static char temp_str[TEMP_STR_SIZE]; size_t i; char * tp = temp_str; bool saw_control_prefix = false; size_t format_len = strlen(format_str); bzero(temp_str, TEMP_STR_SIZE); for (i=0; i<format_len; i++) { if (!saw_control_prefix && format_str[i] != '%') { *tp++ = format_str[i]; saw_control_prefix = false; continue; } switch(format_str[i]) { case '%': if (saw_control_prefix) { *tp++ = '%'; } saw_control_prefix = !saw_control_prefix; break;#ifdef HAVE_LIBCDDB case 'a': if (!p_cdda->i_cddb_enabled) goto not_special; add_format_str_info(p_cdda->cddb.disc->artist); break; case 'A': if (!p_cdda->i_cddb_enabled) goto not_special; add_format_str_info(p_cdda->cddb.disc->title); break; case 'C': if (!p_cdda->i_cddb_enabled) goto not_special; add_format_str_info(CDDB_CATEGORY[p_cdda->cddb.disc->category]); break; case 'G': if (!p_cdda->i_cddb_enabled) goto not_special; add_format_str_info(p_cdda->cddb.disc->genre); break; case 'I': if (!p_cdda->i_cddb_enabled) goto not_special; add_format_num_info(p_cdda->cddb.disc->discid, "%x"); break; case 'Y': if (!p_cdda->i_cddb_enabled) goto not_special; add_format_num_info(p_cdda->cddb.disc->year, "%5d"); break; case 't': if (p_cdda->i_cddb_enabled) { cddb_track_t *t=cddb_disc_get_track(p_cdda->cddb.disc, i_track-1); if (t != NULL && t->title != NULL) add_format_str_info(t->title); } else goto not_special; break; case 'p': if (p_cdda->i_cddb_enabled) { cddb_track_t *t=cddb_disc_get_track(p_cdda->cddb.disc, i_track-1); if (t != NULL && t->artist != NULL) add_format_str_info(t->artist); } else goto not_special; break;#endif case 'M': add_format_str_info(mrl); break;#if FINISHED case 'm': add_format_str_info(p_cdda->mcn); break;#endif case 'n': add_format_num_info(p_cdda->i_nb_tracks, "%d"); break;#ifdef HAVE_LIBCDDB case 's': if (p_cdda->i_cddb_enabled) { char psz_buffer[MSTRTIME_MAX_SIZE]; mtime_t i_duration = (p_cdda->p_sectors[i_track] - p_cdda->p_sectors[i_track-1]) / CDIO_CD_FRAMES_PER_SEC; add_format_str_info(secstotimestr( psz_buffer, i_duration ) ); } else goto not_special; break;#endif case 'T': add_format_num_info(i_track, "%02d"); break;#ifdef HAVE_LIBCDDB not_special:#endif default: *tp++ = '%'; *tp++ = format_str[i]; saw_control_prefix = false; } } return strdup(temp_str);}static voidCDDACreatePlayListItem(const input_thread_t *p_input, cdda_data_t *p_cdda, playlist_t *p_playlist, unsigned int i_track, char *psz_mrl, int psz_mrl_max, const char *psz_source, int playlist_operation, int i_pos){ mtime_t i_duration = (p_cdda->p_sectors[i_track] - p_cdda->p_sectors[i_track-1]) * (1000000 / CDIO_CD_FRAMES_PER_SEC) ; char *p_author; char *p_title; char *config_varname = MODULE_STRING "-title-format"; playlist_item_t *p_item;#ifdef HAVE_LIBCDDB if (p_cdda->i_cddb_enabled) { config_varname = MODULE_STRING "-cddb-title-format"; }#endif /*HAVE_LIBCDDB*/ snprintf(psz_mrl, psz_mrl_max, "%s%s@T%u", CDDA_MRL_PREFIX, psz_source, i_track); p_title = CDDAFormatStr(p_input, p_cdda, config_GetPsz( p_input, config_varname ), psz_mrl, i_track); dbg_print( INPUT_DBG_META, "mrl: %s, title: %s, duration, %ld, pos %d", psz_mrl, p_title, (long int) i_duration / 1000000 , i_pos ); playlist_AddExt( p_playlist, psz_mrl, p_title, playlist_operation, i_pos, i_duration , NULL, 0); if( i_pos == PLAYLIST_END ) i_pos = p_playlist->i_size - 1; vlc_mutex_lock( &p_playlist->object_lock ); p_item = playlist_ItemGetByPos( p_playlist, i_pos ); vlc_mutex_unlock( &p_playlist->object_lock ); if( !p_item ) return; vlc_mutex_lock( &p_item->lock ); p_author = CDDAFormatStr( p_input, p_cdda, config_GetPsz( p_input, MODULE_STRING "-author-format" ), psz_mrl, i_track ); playlist_ItemAddInfo( p_item , _("General"),_("Author"), p_author);#ifdef HAVE_LIBCDDB if (p_cdda->i_cddb_enabled) { const char *psz_general_cat = _("General"); playlist_ItemAddInfo( p_item, psz_general_cat, _("Album"), "%s", p_cdda->cddb.disc->title); playlist_ItemAddInfo( p_item, psz_general_cat, _("Disc Artist(s)"),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -