Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 19th, 2010 | Syntax: None | Size: 6.58 KB | Hits: 142 | Expires: Never
Copy text to clipboard
  1. // Copyright (c) 2010 John Altenmueller | Altenmueller.com
  2. // This code may be freely used under the terms of the BSD license:
  3. // http://www.opensource.org/licenses/bsd-license.php
  4.  
  5. #include <iostream>
  6. #include <string>
  7. #include <cstring>
  8. #include <cstdlib>
  9. #include <taglib/tag.h>
  10. #include <taglib/fileref.h>
  11.  
  12. void printUsage();
  13. std::string tagToFilename( TagLib::Tag &tag, std::string format );
  14. int filenameToTag(TagLib::Tag &tag, std::string filename, std::string format);
  15. int filenameToTagWrapper(std::string format, std::string filename);
  16. int tagToFilenameWrapper( std::string format, std::string filename );
  17.  
  18. std::string tagToFilename( TagLib::Tag &tag, std::string format )
  19. {
  20.   char temp[1024];
  21.   size_t pos=0;
  22.   pos = format.find("%");
  23.   while ( pos != std::string::npos )
  24.   {
  25.     switch( format[pos+1] )
  26.     {
  27.       case 'n':
  28.         format.replace(pos, 2, tag.title().toCString());
  29.         pos += tag.title().length();
  30.         break;
  31.        
  32.       case 'a':
  33.         format.replace(pos, 2, tag.artist().toCString());
  34.         pos += tag.artist().length();
  35.         break;
  36.        
  37.       case 'b':
  38.         format.replace(pos, 2, tag.album().toCString());
  39.         pos += tag.album().length();
  40.         break;
  41.        
  42.       case 'g':
  43.         format.replace(pos, 2, tag.genre().toCString());
  44.         pos += tag.genre().length();
  45.         break;
  46.        
  47.       case 'c':
  48.         format.replace(pos, 2, tag.comment().toCString());
  49.         pos += tag.comment().length();
  50.         break;
  51.        
  52.       case 'y':
  53.         sprintf(temp, "%d", tag.year());
  54.         format.replace(pos, 2, temp);
  55.         pos += strlen(temp);
  56.         break;
  57.        
  58.       case 't':
  59.         sprintf(temp, "%d", tag.track());
  60.         format.replace(pos, 2, temp);
  61.         pos += strlen(temp);
  62.         break;
  63.        
  64.       default:
  65.         return "";
  66.     }
  67.     pos = format.find("%", pos);
  68.   }
  69.  
  70.   return format;
  71. }
  72.  
  73. std::string trimWhitespace(std::string str)
  74. {
  75.   str = str.erase( str.find_last_not_of(" ") + 1);
  76.   str = str.erase( 0, str.find_first_not_of(" ") );
  77.   return str;
  78. }
  79.  
  80. int filenameToTag(TagLib::Tag &tag, std::string filename, std::string format)
  81. {
  82.   size_t pos1, pos2;
  83.   char type;
  84.   int temp_int;
  85.   char temp_str[1024];
  86.   std::string temp_str2;
  87.   std::string token;
  88.   std::string temp_token;
  89.   char extract[1024];
  90.   char *extract_ptr;
  91.  
  92.   memset(temp_str, 0, 1024);
  93.  
  94.   filename = filename.substr(0, filename.rfind("."));
  95.  
  96.   pos1 = format.find("%");
  97.  
  98.   while (pos1 != std::string::npos)
  99.   {
  100.     pos2 = format.find("%", pos1+1);
  101.     if (pos2 != std::string::npos)
  102.     {
  103.       token = format.substr(0, pos2);
  104.     }
  105.     else
  106.     {
  107.       token = format;
  108.     }
  109.    
  110.     std::cout << "token=" << token << std::endl;
  111.    
  112.     switch (token[pos1+1])
  113.     {
  114.       case 'n':
  115.       case 'a':
  116.       case 'b':
  117.       case 'g':
  118.       case 'c':
  119.         type = token[pos1+1];
  120.         token[pos1+1] = 's';
  121.         if (pos2 == std::string::npos)
  122.         {
  123.           size_t temp_pos = filename.rfind(format.substr(pos1+2));
  124.           if (temp_pos != std::string::npos)
  125.           {
  126.             strncpy( temp_str, filename.substr(pos1, temp_pos-1).c_str(), 1024 );
  127.           }
  128.           else
  129.           {
  130.             strncpy( temp_str, filename.substr(pos1).c_str(), 1024 );
  131.           }
  132.         }
  133.         else
  134.         {
  135.           temp_token = trimWhitespace(token.substr(2));
  136.           if (temp_token.length())
  137.           {
  138.             temp_str2 = filename.substr(pos1, filename.find(temp_token));
  139.             temp_str2 = trimWhitespace( temp_str2 );
  140.             strncpy( temp_str, temp_str2.c_str(), 1024 );
  141.             extract_ptr = temp_str;
  142.           }
  143.           else
  144.           {
  145.             sscanf( filename.c_str(), token.c_str(), temp_str );
  146.             extract_ptr = temp_str;
  147.           }
  148.         }
  149.         std::cout << "temp_str=" << temp_str << "|" << std::endl;
  150.         if ( strlen(temp_str) )
  151.         {
  152.           switch (type)
  153.           {
  154.             case 'n':
  155.               tag.setTitle(temp_str);
  156.               break;
  157.             case 'a':
  158.               tag.setArtist(temp_str);
  159.               break;
  160.             case 'b':
  161.               tag.setAlbum(temp_str);
  162.               break;
  163.             case 'g':
  164.               tag.setGenre(temp_str);
  165.               break;
  166.             case 'c':
  167.               tag.setComment(temp_str);
  168.               break;
  169.           }
  170.         }
  171.         break;
  172.       case 'y':
  173.         token[pos1+1] = 'd';
  174.         if ( sscanf( filename.c_str(), token.c_str(), &temp_int ) )
  175.         {
  176.           sprintf(extract, "%d", temp_int);
  177.           extract_ptr = extract;
  178.           tag.setYear(temp_int);
  179.         }
  180.         else
  181.         {
  182.           memset( extract_ptr, 0, 1024 );
  183.         }
  184.         break;
  185.       case 't':
  186.         token[pos1+1] = 'd';
  187.         if ( sscanf( filename.c_str(), token.c_str(), &temp_int ) )
  188.         {
  189.           std::cout << "temp_int=" << temp_int << std::endl;
  190.           sprintf(extract, "%d", temp_int);
  191.           extract_ptr = extract;
  192.           tag.setTrack(temp_int);
  193.         }
  194.         else
  195.         {
  196.           memset( extract_ptr, 0, 1024 );
  197.         }
  198.         break;
  199.       default:
  200.         return -1;
  201.     } // switch
  202.     filename = filename.substr(filename.find(extract_ptr)+strlen(extract_ptr));
  203.     format = format.substr(pos1+2);
  204.    
  205.     std::cout << "filename=" << filename << std::endl;
  206.     std::cout << "format=" << format << std::endl;
  207.    
  208.     pos1 = format.find("%", 1);
  209.   } // while
  210.  
  211.   return 0;
  212. }
  213.  
  214. int filenameToTagWrapper(std::string format, std::string filename)
  215. {
  216.   int success = 0;
  217.   TagLib::FileRef f(filename.c_str());
  218.   if ( filenameToTag(*f.tag(), filename, format) < 0 )
  219.   {
  220.     std::cerr << "Error: formatting string is bad!\n\n";
  221.     printUsage();
  222.     success = -1;
  223.   }
  224.   else
  225.   {
  226.     f.save();
  227.   }
  228.   return success;
  229. }
  230.  
  231. void printUsage()
  232. {
  233.   std::cout << "Usage: opentag format file1.mp3 file2.mp3 ...\n";
  234.   std::cout << "where format is a string containing type specs:\n";
  235.   std::cout << "    %n - track name\n";
  236.   std::cout << "    %a - artist\n";
  237.   std::cout << "    %b - album\n";
  238.   std::cout << "    %g - genre\n";
  239.   std::cout << "    %c - comment\n";
  240.   std::cout << "    %y - year\n";
  241.   std::cout << "    %t - track number\n";
  242. }
  243.  
  244. int main(int argc, char** argv)
  245. {
  246.   if (argc < 3)
  247.   {
  248.     printUsage();
  249.     exit(0);
  250.   }
  251.  
  252.   TagLib::FileRef f("07-knobbers.mp3");
  253.  
  254.   filenameToTag(*f.tag(), "fatboy slim - dance bitch.mp3", "%a - %n");
  255.   f.save();
  256. /*  filenameToTagWrapper( "%t-%n", "07-knobbers.mp3" );*/
  257.   return 0;
  258. }