"Fossies" - the Fresh Open Source Software Archive

Member "mp3info-0.8.5a/mp3info.c" (6 Nov 2006, 8319 Bytes) of package /linux/misc/old/mp3info-0.8.5a.tgz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "mp3info.c" see the Fossies "Dox" file reference documentation.

    1 /*
    2     MP3Info - Displays and allows editing of MP3 ID3 tags and various
    3               technical aspects of MP3 files.
    4 
    5     mp3info.c - main part of console version of MP3Info
    6     
    7     Copyright (C) 2000-2006 Cedric Tefft <cedric@phreaker.net>
    8 
    9     This program is free software; you can redistribute it and/or modify
   10     it under the terms of the GNU General Public License as published by
   11     the Free Software Foundation; either version 2 of the License, or
   12     (at your option) any later version.
   13 
   14     This program is distributed in the hope that it will be useful,
   15     but WITHOUT ANY WARRANTY; without even the implied warranty of
   16     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   17     GNU General Public License for more details.
   18 
   19     You should have received a copy of the GNU General Public License
   20     along with this program; if not, write to the Free Software
   21     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   22 
   23   ***************************************************************************
   24 
   25   This program is based in part on MP3Info 0.5 by Ricardo Cerqueira <rmc@rccn.net>
   26 
   27 */
   28 
   29 
   30 #define __MAIN
   31 #include "mp3info.h"
   32 #undef __MAIN
   33 #include <sys/stat.h>
   34 
   35 char FILENAME_FORMAT_STRING[]="File: %F\n";
   36 char ID3_FORMAT_STRING[]="Title:   %-30t Track: %n\nArtist:  %a\nAlbum:   %-30l Year:  %y\nComment: %-30c Genre: %g [%G]\n";
   37 char TECH_FORMAT_STRING[]="Media Type:  MPEG %2.1v Layer %L\nAudio:       %r KB/s, %qKHz (%o)\nEmphasis:    %e\nCRC:         %E\nCopyright:   %C\nOriginal:    %O\nPadding:     %p\nLength:      %m:%02s\n";
   38 
   39 int main(int argc, char *argv[]) {
   40    FILE  *fp;
   41    int c, i, interactive = 0, view_only=1,delete_tag=0,file_open,retcode=0;
   42    int want_id3=1,scantype=SCAN_NONE,fullscan_vbr=0;
   43    int show_techinfo=0,force_mode=0,quickscan=1;
   44    int new_track=0,new_genre=0,firstfilearg;
   45    id3tag new_tag;
   46    char *print_format=NULL;
   47    char error_msg[256];
   48    unsigned int g,n;
   49    int vbr_report=VBR_VARIABLE;
   50    mp3info mp3;
   51 
   52 
   53    new_tag.title[0]=new_tag.artist[0]=new_tag.album[0]=new_tag.year[0]=
   54    new_tag.comment[0]=new_tag.track[0]=new_tag.genre[0]=1;
   55    /* use something REALLY unlikely... -- so we could clear the tag... */
   56 
   57    if (argc < 2 ) /* Only command is given. Short help */ {
   58        printf("%s %s\n"\
   59           "\n  MP3Info comes with ABSOLUTELY NO WARRANTY.  This is free software, and\n"\
   60           "  you are welcome to redistribute it under certain conditions.\n"\
   61           "  See the file 'LICENSE' for more information.\n"\
   62           "\nUse 'mp3info -h' for a usage summary or see the mp3info man page for a\n"\
   63           "complete description.\n",VERSION,COPYRIGHT);
   64        return 0;
   65    }
   66 
   67 
   68 
   69    while ((c=getopt(argc,argv,"vhGidfxFt:a:l:y:c:n:g:p:r:"))!=-1) {
   70 
   71     switch(c) {
   72         case 'v': /* View mode is now automatic when no changes are
   73                  made to the ID3 tag. This switch is accepted 
   74                  only for backward compatibility */
   75             break;
   76         case 'h':
   77             display_help(); return 0;
   78             break;
   79         case 'G':
   80             display_genres(alphagenreindex,typegenre); return 0;
   81             break;
   82         case 'i':
   83             view_only=0;
   84             interactive = 1;
   85             break;
   86         case 'd':
   87             view_only=0;
   88             delete_tag=1;
   89             break;
   90         case 'p':
   91             print_format=optarg;
   92             translate_escapes(print_format);
   93             want_id3=0;
   94             break;
   95             case 'f':
   96             force_mode=1;
   97             break;
   98         case 'x':
   99             show_techinfo=1;
  100             break;
  101         case 't':
  102             strncpy(new_tag.title,optarg,TEXT_FIELD_LEN);
  103             view_only=0;
  104             break;
  105         case 'a':
  106             strncpy(new_tag.artist,optarg,TEXT_FIELD_LEN);
  107             view_only=0;
  108             break;
  109         case 'l':
  110             strncpy(new_tag.album,optarg,TEXT_FIELD_LEN);
  111             view_only=0;
  112             break;
  113         case 'y':
  114             strncpy(new_tag.year,optarg,INT_FIELD_LEN);
  115             view_only=0;
  116             break;
  117         case 'c':
  118             strncpy(new_tag.comment,optarg,TEXT_FIELD_LEN);
  119             view_only=0;
  120             break;
  121         case 'n':
  122             n=atoi(optarg);
  123             if(n <= 255) {
  124                 new_tag.track[0] = (unsigned char) n;
  125                 new_track=1;
  126                 view_only=0;
  127             } else {
  128                 fprintf(stderr,"Error: '%s' is not a valid track number.\n",optarg);
  129                 fprintf(stderr,"Valid track numbers are integers from 0 to 255.\n");
  130                 fprintf(stderr,"Use a value of '0' to remove the track number field\n");
  131                 retcode |= 6;
  132                 return retcode;
  133             }
  134             break;
  135         case 'g':
  136             g=get_genre(optarg);
  137             if(g <= 255) {
  138                 new_tag.genre[0] = (unsigned char) g;
  139                 new_genre=1;
  140                 view_only=0;
  141             } else {
  142                 fprintf(stderr,"Error: '%s' is not a recognized genre name or number.\n",optarg);
  143                 fprintf(stderr,"Use the '-G' option to see a list of valid genre names and numbers\n");
  144                 retcode |= 6;
  145                 return retcode;
  146             }
  147             sscanf(optarg,"%u",&g);
  148             break;
  149         case 'r':
  150             switch(optarg[0]) {
  151                 case 'a': vbr_report=VBR_AVERAGE; break;
  152                 case 'm': vbr_report=VBR_MEDIAN; break;
  153                 case 'v': vbr_report=VBR_VARIABLE; break;
  154                 default:
  155                     fprintf(stderr,"Error: %s is not a valid option to the VBR reporting switch (-r)\n",optarg);
  156                     fprintf(stderr,"Valid options are 'a', 'm' and 'v'.  Run '%s -h' for more info.\n",argv[0]);
  157                     retcode |= 6;
  158                     return retcode;
  159             }
  160             break;
  161         case 'F': quickscan=0; break;
  162     }
  163    }
  164 
  165    if(!view_only)
  166     scantype=SCAN_QUICK;
  167 
  168    if(print_format) {
  169     determine_tasks(print_format,&want_id3,&scantype,&fullscan_vbr,vbr_report);
  170    } else if(view_only) {
  171     determine_tasks(ID3_FORMAT_STRING,&want_id3,&scantype,&fullscan_vbr,vbr_report);
  172     if(show_techinfo)
  173         determine_tasks(TECH_FORMAT_STRING,&want_id3,&scantype,&fullscan_vbr,vbr_report);
  174    }
  175 
  176    
  177    if(!quickscan && (scantype == SCAN_QUICK))
  178     scantype=SCAN_FULL;
  179 
  180    firstfilearg=optind;
  181 
  182    for(i=optind;i < argc; i++) { /* Iterate over all filenames */
  183       file_open=0;
  184       if (view_only == 1) { 
  185         if ( !( fp=fopen(argv[i],"rb") ) ) {
  186             sprintf(error_msg,"Error opening MP3: %s",argv[i]);
  187                 perror(error_msg);
  188         retcode |= 1;
  189         } else {
  190         file_open=1;
  191     }
  192       } else {
  193         if ( !( fp=fopen(argv[i],"rb+") ) ) {
  194             sprintf(error_msg,"Error opening MP3: %s",argv[i]);
  195                 perror(error_msg);
  196             retcode |= 1;
  197         } else {
  198         file_open=1;
  199     }
  200       }
  201 
  202       if(file_open == 1) {
  203     memset(&mp3,0,sizeof(mp3info));
  204     mp3.filename=argv[i];
  205     mp3.file=fp;
  206     get_mp3_info(&mp3,scantype,fullscan_vbr);
  207     
  208     if((scantype != SCAN_NONE) && !mp3.header_isvalid && !force_mode) {
  209         fprintf(stderr,"%s is corrupt or is not a standard MP3 file.\n",mp3.filename);
  210         retcode |= 2;
  211     }
  212 
  213     if(view_only) {
  214        if(want_id3 && !mp3.id3_isvalid)
  215         fprintf(stderr,"%s does not have an ID3 1.x tag.\n",mp3.filename);
  216 
  217         if(print_format) {
  218         format_output(print_format,&mp3,vbr_report);
  219             } else {
  220 
  221         if(mp3.id3_isvalid || (show_techinfo && mp3.header_isvalid))
  222                 format_output(FILENAME_FORMAT_STRING,&mp3,vbr_report);
  223                 
  224             if(mp3.id3_isvalid)
  225             format_output(ID3_FORMAT_STRING,&mp3,vbr_report);
  226 
  227                 if(show_techinfo && mp3.header_isvalid)
  228             format_output(TECH_FORMAT_STRING,&mp3,vbr_report);
  229 
  230                 printf("\n");
  231 
  232         }
  233    
  234     } else if(mp3.header_isvalid || force_mode) {
  235 
  236          if(new_tag.title[0]!=1) {
  237           strncpy(mp3.id3.title,new_tag.title,TEXT_FIELD_LEN);
  238          }
  239 
  240          if(new_tag.artist[0]!=1) {
  241           strncpy(mp3.id3.artist,new_tag.artist,TEXT_FIELD_LEN);
  242          }
  243 
  244          if(new_tag.album[0]!=1) {
  245           strncpy(mp3.id3.album,new_tag.album,TEXT_FIELD_LEN);
  246          }
  247 
  248          if(new_tag.comment[0]!=1) {
  249             strncpy(mp3.id3.comment,new_tag.comment,TEXT_FIELD_LEN);
  250          }
  251 
  252          if(new_track) {
  253           mp3.id3.track[0]=new_tag.track[0];
  254           if(new_tag.track[0] == '\0') {
  255              pad(mp3.id3.comment,TEXT_FIELD_LEN);
  256           }
  257          }
  258 
  259          if(new_tag.year[0]!=1) {
  260           strncpy(mp3.id3.year,new_tag.year,INT_FIELD_LEN);
  261          }
  262 
  263          if(new_genre) {
  264           mp3.id3.genre[0]=new_tag.genre[0];
  265          }
  266           
  267          if( interactive ) {
  268           tagedit_curs(mp3.filename,i-firstfilearg+1,argc-firstfilearg,&(mp3.id3));
  269          }
  270                   
  271 
  272                
  273              /* Finally! Get it done! */
  274              if(!delete_tag) {
  275               write_tag(&mp3);
  276              }
  277 
  278      } else {
  279         fprintf(stderr,"Use the -f switch to add ID3 info to this file anyway.\n");
  280      }
  281 
  282          fclose(mp3.file);
  283 
  284          if(delete_tag && mp3.id3_isvalid) {
  285         truncate(mp3.filename,mp3.datasize);
  286      }
  287 
  288 
  289       }
  290 
  291    }
  292 
  293    if(optind == argc) {
  294     fprintf(stderr,"No MP3 files specified!\n");
  295     retcode |= 8;
  296    }
  297 
  298 
  299    return retcode;
  300 
  301 }
  302 
  303