blob: d92c9fbcacd2a6c6c1252e2c3f10223598f1862c [file] [log] [blame]
/*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is MPEG4IP.
*
* The Initial Developer of the Original Code is Cisco Systems Inc.
* Portions created by Cisco Systems Inc. are
* Copyright (C) Cisco Systems Inc. 2001-2002. All Rights Reserved.
*
* Portions created by Rouven Wessling are
* Copyright (C) 2008-2009. All Rights Reserved.
*
* Contributor(s):
* Dave Mackie dmackie@cisco.com
* Rouven Wessling mp4v2@rouvenwessling.de
*/
#include "util/impl.h"
using namespace mp4v2::util;
extern "C" int main( int argc, char** argv )
{
const char* const usageString =
"<file-name>";
/* begin processing command line */
char* ProgName = argv[0];
while ( true ) {
int c = -1;
int option_index = 0;
static const prog::Option long_options[] = {
{ "version", prog::Option::NO_ARG, 0, 'V' },
{ NULL, prog::Option::NO_ARG, 0, 0 }
};
c = prog::getOptionSingle( argc, argv, "V", long_options, &option_index );
if ( c == -1 )
break;
switch ( c ) {
case '?':
fprintf( stderr, "usage: %s %s\n", ProgName, usageString );
exit( 0 );
case 'V':
fprintf( stderr, "%s - %s\n", ProgName, MP4V2_PROJECT_name_formal );
exit( 0 );
default:
fprintf( stderr, "%s: unknown option specified, ignoring: %c\n",
ProgName, c );
}
}
/* check that we have at least one non-option argument */
if ( ( argc - prog::optind ) < 1 ) {
fprintf( stderr, "usage: %s %s\n", ProgName, usageString );
exit( 1 );
}
/* end processing of command line */
printf( "%s version %s\n", ProgName, MP4V2_PROJECT_version );
while ( prog::optind < argc ) {
char *mp4FileName = argv[prog::optind++];
printf( "%s:\n", mp4FileName );
char* info = MP4FileInfo( mp4FileName );
if ( !info ) {
fprintf( stderr,
"%s: can't open %s\n",
ProgName, mp4FileName );
continue;
}
fputs( info, stdout );
MP4FileHandle mp4file = MP4Read( mp4FileName ); //, MP4_DETAILS_ERROR);
if ( mp4file != MP4_INVALID_FILE_HANDLE ) {
const MP4Tags* tags = MP4TagsAlloc();
MP4TagsFetch( tags, mp4file );
if ( tags->name ) {
fprintf( stdout, " Name: %s\n", tags->name );
}
if ( tags->sortName ) {
fprintf( stdout, " Sort Name: %s\n", tags->sortName );
}
if ( tags->artist ) {
fprintf( stdout, " Artist: %s\n", tags->artist );
}
if ( tags->sortArtist ) {
fprintf( stdout, " Sort Artist: %s\n", tags->sortArtist );
}
if ( tags->composer ) {
fprintf( stdout, " Composer: %s\n", tags->composer );
}
if ( tags->sortComposer ) {
fprintf( stdout, " Sort Composer: %s\n", tags->sortComposer );
}
if ( tags->encodingTool ) {
fprintf( stdout, " Encoded with: %s\n", tags->encodingTool );
}
if ( tags->encodedBy ) {
fprintf( stdout, " Encoded by: %s\n", tags->encodedBy );
}
if ( tags->releaseDate ) {
fprintf( stdout, " Release Date: %s\n", tags->releaseDate );
}
if ( tags->album ) {
fprintf( stdout, " Album: %s\n", tags->album );
}
if ( tags->sortAlbum ) {
fprintf( stdout, " Sort Album: %s\n", tags->sortAlbum );
}
if ( tags->track ) {
fprintf( stdout, " Track: %u of %u\n", tags->track->index, tags->track->total );
}
if ( tags->disk ) {
fprintf( stdout, " Disk: %u of %u\n", tags->disk->index, tags->disk->total );
}
if ( tags->genre ) {
fprintf( stdout, " Genre: %s\n", tags->genre );
}
if ( tags->genreType ) {
std::string s = itmf::enumGenreType.toString(static_cast<itmf::GenreType>(*tags->genreType ), true);
fprintf( stdout, " GenreType: %u, %s\n", *tags->genreType, s.c_str() );
}
if ( tags->grouping ) {
fprintf( stdout, " Grouping: %s\n", tags->grouping );
}
if ( tags->tempo ) {
fprintf( stdout, " BPM: %u\n", *tags->tempo );
}
if ( tags->comments ) {
fprintf( stdout, " Comments: %s\n", tags->comments );
}
if ( tags->compilation ) {
fprintf( stdout, " Part of Compilation: %s\n", *tags->compilation ? "yes" : "no" );
}
if ( tags->gapless ) {
fprintf( stdout, " Part of Gapless Album: %s\n", *tags->gapless ? "yes" : "no" );
}
if ( tags->artworkCount ) {
fprintf( stdout, " Cover Art pieces: %u\n", tags->artworkCount );
}
if ( tags->albumArtist ) {
fprintf( stdout, " Album Artist: %s\n", tags->albumArtist );
}
if ( tags->sortAlbumArtist ) {
fprintf( stdout, " Sort Album Artist: %s\n", tags->sortAlbumArtist );
}
if ( tags->copyright ) {
fprintf( stdout, " Copyright: %s\n", tags->copyright );
}
if ( tags->contentRating ) {
std::string s = itmf::enumContentRating.toString( static_cast<itmf::ContentRating>( *tags->contentRating ), true );
fprintf( stdout, " Content Rating: %s\n", s.c_str() );
}
if ( tags->hdVideo ) {
fprintf( stdout, " HD Video: %s\n", *tags->hdVideo ? "yes" : "no");
}
if ( tags->mediaType ) {
std::string s = itmf::enumStikType.toString( static_cast<itmf::StikType>( *tags->mediaType ), true );
fprintf( stdout, " Media Type: %s\n", s.c_str() );
}
if ( tags->tvShow ) {
fprintf( stdout, " TV Show: %s\n", tags->tvShow );
}
if ( tags->sortTVShow ) {
fprintf( stdout, " Sort TV Show: %s\n", tags->sortTVShow );
}
if ( tags->tvNetwork ) {
fprintf( stdout, " TV Network: %s\n", tags->tvNetwork );
}
if ( tags->tvEpisodeID ) {
fprintf( stdout, " TV Episode Number: %s\n", tags->tvEpisodeID );
}
if ( tags->description ) {
fprintf( stdout, " Short Description: %s\n", tags->description );
}
if ( tags->longDescription ) {
fprintf( stdout, " Long Description: %s\n", tags->longDescription );
}
if ( tags->lyrics ) {
fprintf( stdout, " Lyrics: \n %s\n", tags->lyrics );
}
if ( tags->tvEpisode ) {
fprintf( stdout, " TV Episode: %u\n", *tags->tvEpisode );
}
if ( tags->tvSeason ) {
fprintf( stdout, " TV Season: %u\n", *tags->tvSeason );
}
if ( tags->podcast) {
fprintf( stdout, " Podcast: %s\n", *tags->podcast ? "yes" : "no" );
}
if ( tags->keywords ) {
fprintf( stdout, " Keywords: %s\n", tags->keywords );
}
if ( tags->category ) {
fprintf( stdout, " Category: %s\n", tags->category );
}
if ( tags->contentID ) {
fprintf( stdout, " Content ID: %u\n", *tags->contentID );
}
if ( tags->artistID ) {
fprintf( stdout, " Artist ID: %u\n", *tags->artistID );
}
if ( tags->playlistID ) {
fprintf( stdout, " Playlist ID: %llu\n", *tags->playlistID );
}
if ( tags->genreID ) {
fprintf( stdout, " Genre ID: %u\n", *tags->genreID );
}
if ( tags->composerID ) {
fprintf( stdout, " Composer ID: %u\n", *tags->composerID );
}
if ( tags->xid ) {
fprintf( stdout, " xid: %s\n", tags->xid );
}
if ( tags->iTunesAccount ) {
fprintf( stdout, " iTunes Account: %s\n", tags->iTunesAccount );
}
if ( tags->iTunesAccountType ) {
std::string s = itmf::enumAccountType.toString( static_cast<itmf::AccountType>( *tags->iTunesAccountType ), true );
fprintf( stdout, " iTunes Account Type: %s\n", s.c_str() );
}
if ( tags->purchaseDate ) {
fprintf( stdout, " Purchase Date: %s\n", tags->purchaseDate );
}
if ( tags->iTunesCountry ) {
std::string s = itmf::enumCountryCode.toString( static_cast<itmf::CountryCode>( *tags->iTunesCountry ), true );
fprintf( stdout, " iTunes Store Country: %s\n", s.c_str() );
}
MP4TagsFree( tags );
MP4Close( mp4file );
}
free( info );
}
return( 0 );
}