/* $Id: mass.c,v 1.1.1.1 2000/01/30 16:39:22 benediktroth Exp $ */ #include #include #include #include #include #include #include #include #include "yamt.h" #include "mass.h" GtkWidget *mass_box_new( ) { GtkWidget *box; GtkWidget *mass_frame_directory; GtkWidget *mass_table_directory; GtkWidget *mass_label_directory; GtkWidget *mass_tag_label_title; GtkWidget *mass_tag_label_artist; GtkWidget *mass_tag_label_album; GtkWidget *mass_tag_label_comment; GtkWidget *mass_tag_label_year; GtkWidget *mass_tag_label_genre; GtkWidget *mass_tag_frame; GtkWidget *mass_tag_table; GtkWidget *mass_buttons_select; GtkWidget *mass_buttons_box; GtkWidget *mass_buttons_start; GtkWidget *mass_buttons_quit; gint i; mass_tag_genre_list=NULL; /* The box it which everything is put */ box = gtk_vbox_new( FALSE, 0); /* Frame for directory */ mass_frame_directory = gtk_frame_new( NULL ); gtk_box_pack_start( GTK_BOX (box), mass_frame_directory, TRUE, FALSE, 0 ); gtk_widget_show( mass_frame_directory ); /* Table for directory */ mass_table_directory = gtk_table_new( 1, 1, TRUE); gtk_container_set_border_width( GTK_CONTAINER (mass_table_directory), 5); gtk_container_add( GTK_CONTAINER (mass_frame_directory), mass_table_directory ); gtk_widget_show( mass_table_directory ); /* Directory */ mass_label_directory=gtk_label_new( _("Directory: ") ); gtk_table_attach_defaults( GTK_TABLE (mass_table_directory), mass_label_directory, 0, 1, 0, 1); gtk_widget_show( mass_label_directory ); mass_directory=gtk_label_new( _("[no dir selected]") ); gtk_table_attach_defaults( GTK_TABLE (mass_table_directory), mass_directory, 1, 2, 0, 1); gtk_widget_show( mass_directory ); /* The select button */ mass_buttons_select = gnome_stock_or_ordinary_button( GNOME_STOCK_PIXMAP_OPEN ); gtk_signal_connect( GTK_OBJECT(mass_buttons_select), "clicked", GTK_SIGNAL_FUNC(mass_directory_select), NULL ); gtk_table_attach_defaults( GTK_TABLE (mass_table_directory), mass_buttons_select, 2, 3, 0, 1); gtk_widget_show( mass_buttons_select ); /* The recursive button */ mass_buttons_recursive = gtk_check_button_new_with_label( _("Recurse Subdirs") ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(mass_buttons_recursive), FALSE ); gtk_table_attach_defaults( GTK_TABLE (mass_table_directory), mass_buttons_recursive, 1, 2, 1, 2); gtk_widget_show( mass_buttons_recursive ); /******************************************* ID3 TAG *******************************************/ /* Frame for the id3 tag */ mass_tag_frame = gtk_frame_new( NULL ); gtk_frame_set_label( GTK_FRAME (mass_tag_frame), _("ID3 TAG") ); gtk_box_pack_start( GTK_BOX (box), mass_tag_frame, TRUE, FALSE, 0 ); gtk_widget_show( mass_tag_frame ); /* Table for id3 tag */ mass_tag_table = gtk_table_new( 6, 4, FALSE); gtk_container_add( GTK_CONTAINER (mass_tag_frame), mass_tag_table); gtk_widget_show(mass_tag_table); /* Title */ mass_tag_label_title=gtk_label_new( _("Title: ") ); gtk_misc_set_alignment( GTK_MISC(mass_tag_label_title), 1, 0.5 ); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_label_title, 0, 1, 0, 1); gtk_widget_show( mass_tag_label_title ); mass_tag_title = gtk_entry_new_with_max_length(30); gtk_entry_set_editable( GTK_ENTRY (mass_tag_title), FALSE ); gtk_widget_set_sensitive( GTK_WIDGET(mass_tag_title), FALSE); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_title, 1, 3, 0, 1); gtk_widget_show( mass_tag_title ); mass_tag_title_button = gtk_check_button_new_with_label( _("Write this field") ); gtk_signal_connect( GTK_OBJECT(mass_tag_title_button), "clicked", GTK_SIGNAL_FUNC(mass_write_field_button_toggled), "t" ); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_title_button, 3, 4, 0, 1); gtk_widget_show( mass_tag_title_button ); /* Artist */ mass_tag_label_artist=gtk_label_new( _("Artist: ") ); gtk_misc_set_alignment( GTK_MISC(mass_tag_label_artist), 1, 0.5 ); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_label_artist, 0, 1, 1, 2); gtk_widget_show( mass_tag_label_artist ); mass_tag_artist = gtk_entry_new_with_max_length(30); gtk_entry_set_editable( GTK_ENTRY (mass_tag_artist), FALSE ); gtk_widget_set_sensitive( GTK_WIDGET(mass_tag_artist), FALSE); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_artist, 1, 3, 1, 2); gtk_widget_show( mass_tag_artist ); mass_tag_artist_button = gtk_check_button_new_with_label( _("Write this field") ); gtk_signal_connect( GTK_OBJECT(mass_tag_artist_button), "clicked", GTK_SIGNAL_FUNC(mass_write_field_button_toggled), "a" ); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_artist_button, 3, 4, 1, 2); gtk_widget_show( mass_tag_artist_button ); /* Album */ mass_tag_label_album=gtk_label_new( _("Album: ") ); gtk_misc_set_alignment( GTK_MISC(mass_tag_label_album), 1, 0.5 ); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_label_album, 0, 1, 2, 3); gtk_widget_show( mass_tag_label_album ); mass_tag_album = gtk_entry_new_with_max_length(30); gtk_entry_set_editable( GTK_ENTRY (mass_tag_album), FALSE ); gtk_widget_set_sensitive( GTK_WIDGET(mass_tag_album), FALSE); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_album, 1, 3, 2, 3); gtk_widget_show( mass_tag_album ); mass_tag_album_button = gtk_check_button_new_with_label( _("Write this field") ); gtk_signal_connect( GTK_OBJECT(mass_tag_album_button), "clicked", GTK_SIGNAL_FUNC(mass_write_field_button_toggled), "b" ); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_album_button, 3, 4, 2, 3); gtk_widget_show( mass_tag_album_button ); /* Comment */ mass_tag_label_comment=gtk_label_new( _("Comment: ") ); gtk_misc_set_alignment( GTK_MISC(mass_tag_label_comment), 1, 0.5 ); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_label_comment, 0, 1, 3, 4); gtk_widget_show( mass_tag_label_comment ); mass_tag_comment = gtk_entry_new_with_max_length(30); gtk_entry_set_editable( GTK_ENTRY (mass_tag_comment), FALSE ); gtk_widget_set_sensitive( GTK_WIDGET(mass_tag_comment), FALSE); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_comment, 1, 3, 3, 4); gtk_widget_show( mass_tag_comment ); mass_tag_comment_button = gtk_check_button_new_with_label( _("Write this field") ); gtk_signal_connect( GTK_OBJECT(mass_tag_comment_button), "clicked", GTK_SIGNAL_FUNC(mass_write_field_button_toggled), "c" ); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_comment_button, 3, 4, 3, 4); gtk_widget_show( mass_tag_comment_button ); /* Year */ mass_tag_label_year=gtk_label_new( _("Year: ") ); gtk_misc_set_alignment( GTK_MISC(mass_tag_label_year), 1, 0.5 ); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_label_year, 0, 1, 4, 5); gtk_widget_show( mass_tag_label_year ); mass_tag_year = gtk_entry_new_with_max_length(4); gtk_entry_set_editable( GTK_ENTRY (mass_tag_year), FALSE ); gtk_widget_set_sensitive( GTK_WIDGET(mass_tag_year), FALSE); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_year, 1, 3, 4, 5); gtk_widget_show( mass_tag_year ); mass_tag_year_button = gtk_check_button_new_with_label( _("Write this field") ); gtk_signal_connect( GTK_OBJECT(mass_tag_year_button), "clicked", GTK_SIGNAL_FUNC(mass_write_field_button_toggled), "y" ); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_year_button, 3, 4, 4, 5); gtk_widget_show( mass_tag_year_button ); /* Genre */ mass_tag_label_genre=gtk_label_new( _("Genre: ") ); gtk_misc_set_alignment( GTK_MISC(mass_tag_label_genre), 1, 0.5 ); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_label_genre, 0, 1, 5, 6); gtk_widget_show( mass_tag_label_genre ); /* Create a new combo box */ mass_tag_genre = gtk_combo_new(); gtk_entry_set_editable( GTK_ENTRY (GTK_COMBO(mass_tag_genre)->entry), FALSE); /* Create the CList */ if (!mass_tag_genre_list) { for (i = 0; i < GENRE_MAX; i++) mass_tag_genre_list = g_list_append( mass_tag_genre_list, (gchar *) id3tag_genres_sorted[i]); mass_tag_genre_list = g_list_append(mass_tag_genre_list, ""); } /* Connect the combo and the list */ gtk_combo_set_popdown_strings(GTK_COMBO(mass_tag_genre), mass_tag_genre_list); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_genre, 1, 2, 5, 6); gtk_entry_set_text( GTK_ENTRY(GTK_COMBO (mass_tag_genre)->entry), " "); gtk_widget_set_sensitive( GTK_WIDGET(mass_tag_genre), FALSE); gtk_widget_show(mass_tag_genre); mass_tag_genre_button = gtk_check_button_new_with_label( _("Write this field") ); gtk_signal_connect( GTK_OBJECT(mass_tag_genre_button), "clicked", GTK_SIGNAL_FUNC(mass_write_field_button_toggled), "g" ); gtk_table_attach_defaults( GTK_TABLE (mass_tag_table), mass_tag_genre_button, 3, 4, 5, 6); gtk_widget_show( mass_tag_genre_button ); /* The Box for the buttons */ mass_buttons_box = gtk_hbox_new( TRUE, 10); gtk_container_set_border_width( GTK_CONTAINER (mass_buttons_box), 5); gtk_box_pack_start( GTK_BOX (box), mass_buttons_box, TRUE, FALSE, 0 ); gtk_widget_show( mass_buttons_box ); /* The Buttons */ mass_buttons_start = gnome_stock_or_ordinary_button( GNOME_STOCK_PIXMAP_EXEC ); gtk_signal_connect( GTK_OBJECT(mass_buttons_start), "clicked", GTK_SIGNAL_FUNC(mass_start), NULL ); gtk_box_pack_start( GTK_BOX (mass_buttons_box), mass_buttons_start, TRUE, TRUE, 0 ); gtk_widget_show( mass_buttons_start ); mass_buttons_quit = gnome_stock_or_ordinary_button( GNOME_STOCK_PIXMAP_QUIT ); gtk_signal_connect( GTK_OBJECT(mass_buttons_quit), "clicked", GTK_SIGNAL_FUNC(gtk_exit), NULL ); gtk_box_pack_start( GTK_BOX (mass_buttons_box), mass_buttons_quit, TRUE, TRUE, 0 ); gtk_widget_show( mass_buttons_quit ); return(box); } void mass_load_properties( void ) { gtk_label_set_text( GTK_LABEL (mass_directory), prop_mp3_dir ); } void mass_write_field_button_toggled( GtkWidget *widget, gchar *data ) { gboolean state; switch( data[0] ) { case 't': /* Get the current state of the button */ state = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(mass_tag_title_button) ); /* If the button is active make the entry editable, if not then not */ if( state == TRUE ) gtk_entry_set_editable( GTK_ENTRY (mass_tag_title), TRUE ); else gtk_entry_set_editable( GTK_ENTRY (mass_tag_title), FALSE ); gtk_widget_set_sensitive( GTK_WIDGET(mass_tag_title), state*-1); break; case 'a': state = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(mass_tag_artist_button) ); if( state == TRUE ) gtk_entry_set_editable( GTK_ENTRY (mass_tag_artist), TRUE); else gtk_entry_set_editable( GTK_ENTRY (mass_tag_artist), FALSE ); gtk_widget_set_sensitive( GTK_WIDGET(mass_tag_artist), state*-1); break; case 'b': state = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(mass_tag_album_button) ); if( state == TRUE ) gtk_entry_set_editable( GTK_ENTRY (mass_tag_album), TRUE ); else gtk_entry_set_editable( GTK_ENTRY (mass_tag_album), FALSE ); gtk_widget_set_sensitive( GTK_WIDGET(mass_tag_album), state*-1); break; case 'c': state = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(mass_tag_comment_button) ); if( state == TRUE ) gtk_entry_set_editable( GTK_ENTRY (mass_tag_comment), TRUE ); else gtk_entry_set_editable( GTK_ENTRY (mass_tag_comment), FALSE ); gtk_widget_set_sensitive( GTK_WIDGET(mass_tag_comment), state*-1); break; case 'y': state = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(mass_tag_year_button) ); if( state == TRUE ) gtk_entry_set_editable( GTK_ENTRY (mass_tag_year), TRUE ); else gtk_entry_set_editable( GTK_ENTRY (mass_tag_year), FALSE ); gtk_widget_set_sensitive( GTK_WIDGET(mass_tag_year), state*-1); break; case 'g': state = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(mass_tag_genre_button) ); /* if( state == TRUE ) */ /* g_print("Genre TRUE\n"); */ /* else */ /* g_print("Genre FALSE\n"); */ gtk_widget_set_sensitive( GTK_WIDGET(mass_tag_genre), state*-1); break; } } void mass_directory_select( void ) { GtkWidget *filew; gchar *buffer; gtk_label_get( GTK_LABEL (mass_directory), &buffer ); filew = gtk_file_selection_new( _("Select a Directory") ); gtk_file_selection_set_filename( GTK_FILE_SELECTION (filew), buffer ); gtk_signal_connect( GTK_OBJECT(filew), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroy), filew); /* Connect the ok buton to load_file */ gtk_signal_connect( GTK_OBJECT(GTK_FILE_SELECTION (filew)->ok_button), "clicked", GTK_SIGNAL_FUNC(mass_lf), filew); gtk_signal_connect( GTK_OBJECT(GTK_FILE_SELECTION (filew)->ok_button), "clicked", GTK_SIGNAL_FUNC(destroy), filew); /* Connect the cancel buton to destroy */ gtk_signal_connect( GTK_OBJECT(GTK_FILE_SELECTION (filew)->cancel_button), "clicked", GTK_SIGNAL_FUNC(destroy), filew); gtk_widget_show(filew); } /* I don't know how to pass the filename directly to load_file so I use this function */ void mass_lf( GtkWidget *widget, GtkFileSelection *file_selection ) { gchar *filename=gtk_file_selection_get_filename( GTK_FILE_SELECTION (file_selection)); mass_directory_load( filename ); } void mass_directory_load( gchar *dirname ) { gtk_label_set_text( GTK_LABEL (mass_directory),dirname); /* g_print("dir: %s\n", dirname ); */ } struct id3tag mass_get_tag( void ) { struct id3tag tag; gboolean active; gchar *buffer; active = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(mass_tag_title_button) ); if( active ) { buffer = gtk_entry_get_text( GTK_ENTRY (mass_tag_title) ); /* To get sure the tag will be deleted */ if( buffer[0] == '\0' ) { buffer[0]=' '; buffer[1]='\0'; } strcpy( tag.title, buffer ); } else tag.title[0]='\0'; active = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(mass_tag_artist_button) ); if( active ) { buffer = gtk_entry_get_text( GTK_ENTRY (mass_tag_artist) ); if( buffer[0] == '\0' ) { buffer[0]=' '; buffer[1]='\0'; } strcpy( tag.artist, buffer ); } else tag.artist[0]='\0'; active = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(mass_tag_album_button) ); if( active ) { buffer = gtk_entry_get_text( GTK_ENTRY (mass_tag_album) ); if( buffer[0] == '\0' ) { buffer[0]=' '; buffer[1]='\0'; } strcpy( tag.album, buffer ); } else tag.album[0]='\0'; active = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(mass_tag_comment_button) ); if( active ) { buffer = gtk_entry_get_text( GTK_ENTRY (mass_tag_comment) ); if( buffer[0] == '\0' ) { buffer[0]=' '; buffer[1]='\0'; } strcpy( tag.comment, buffer ); } else tag.comment[0]='\0'; active = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(mass_tag_year_button) ); if( active ) { buffer = gtk_entry_get_text( GTK_ENTRY (mass_tag_year) ); if( buffer[0] == '\0' ) { buffer[0]=' '; buffer[1]='\0'; } strcpy( tag.year, buffer ); } else tag.year[0]='\0'; active = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(mass_tag_genre_button) ); if( active ) tag.genre = id3tag_lookup_genre( gtk_entry_get_text( GTK_ENTRY(GTK_COMBO(mass_tag_genre)->entry))); else tag.genre = 0xFF; strcpy( tag.tag, "TAG" ); /* id3tag_show(tag); */ return(tag); } void mass_start( ) { struct id3tag tag; gchar *directory; gboolean recursive; tag = mass_get_tag(); gtk_label_get( GTK_LABEL (mass_directory), &directory ); yamtlog("%s %s", _("Mass-Directory: "), directory ); recursive = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(mass_buttons_recursive) ); yamtlog("%s %s", _("Rename-Recursive: "), recursive ? _("TRUE") : _("FALSE") ); mass_go( directory, 0, recursive, tag); } void mass_go( gchar *dir, gint depth, gboolean recursive, struct id3tag tag ) { DIR *dp; struct dirent *entry; struct stat statbuf; struct id3tag copy; id3tag_initialize( © ); if( (dp = opendir(dir))==NULL ) { yamtlog("%s %s", _("ERROR while opening "), dir); gnome_error_dialog( _("Could not open directory!") ); return; } chdir(dir); if(dir[strlen(dir)-1]=='/') dir[strlen(dir)-1]=0; while( (entry = readdir(dp)) != NULL ) { update_progress_bar(); stat( entry->d_name, &statbuf); if( S_ISDIR(statbuf.st_mode)) { /* Shall it be recursive ? */ if( recursive == 0 ) continue; /* Found a directory, ignore "." and ".." */ if( strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0 ) continue; /* printf("%*s%s/\n", depth, " ", entry->d_name ); */ /* Recurse but increase the indent level */ mass_go( entry->d_name, depth+4, recursive, tag ); } else { /* printf("%*s%s", depth, " ", entry->d_name ); */ if( !mp3_is_valid(entry->d_name) ) { yamtlog("%s %s", entry->d_name, _(" skipped")); continue; } /* Find variables and replace them (eg. %dir for the directory ) */ /* ( tag is the original tag and copy is the one with variables expanded ) */ copy = expand_variables( tag, dir, entry->d_name); id3tag_set( entry->d_name, copy ); yamtlog("%s %s", entry->d_name, _(" tagged")); } } chdir(".."); closedir(dp); }