From 8ea040c539bb7a7d5da19559e744d6c70f2993d2 Mon Sep 17 00:00:00 2001 From: waker Date: Sun, 8 Apr 2012 14:22:46 +0200 Subject: converter: added reconstruction of folder structure based on the largest common root --- plugins/converter/converter.c | 4 +- plugins/converter/converter.glade | 52 +-------------------- plugins/converter/convgui.c | 97 ++++++++++++++++++++------------------- plugins/converter/interface.c | 27 +---------- 4 files changed, 57 insertions(+), 123 deletions(-) (limited to 'plugins/converter') diff --git a/plugins/converter/converter.c b/plugins/converter/converter.c index bdeab06a..62cbcf39 100644 --- a/plugins/converter/converter.c +++ b/plugins/converter/converter.c @@ -746,7 +746,7 @@ convert (DB_playItem_t *it, const char *outfolder, const char *outfile, int outp return -1; } - char *path = outfolder[0] ? strdupa (outfolder) : strdupa (getenv("HOME")); + char *path = preserve_folder_structure ? strdupa (root_folder) : (outfolder[0] ? strdupa (outfolder) : strdupa (getenv("HOME"))); if (!check_dir (path, 0755)) { fprintf (stderr, "converter: failed to create output folder: %s\n", outfolder); return -1; @@ -775,7 +775,7 @@ convert (DB_playItem_t *it, const char *outfolder, const char *outfile, int outp output_is_float = fileinfo->fmt.is_float; } - get_output_path (it, outfolder, outfile, encoder_preset, out, sizeof (out)); + get_output_path (it, preserve_folder_structure ? root_folder : outfolder, outfile, encoder_preset, out, sizeof (out)); if (encoder_preset->method == DDB_ENCODER_METHOD_FILE) { const char *tmp = getenv ("TMPDIR"); if (!tmp) { diff --git a/plugins/converter/converter.glade b/plugins/converter/converter.glade index 8ad62319..0bc30b3a 100644 --- a/plugins/converter/converter.glade +++ b/plugins/converter/converter.glade @@ -604,8 +604,9 @@ Overwrite + True True - Preserve folder structure, starting from: + Preserve folder structure True GTK_RELIEF_NORMAL True @@ -620,55 +621,6 @@ Overwrite False - - - - False - 0 - - - - True - True - True - True - 0 - - True - - False - - - - 0 - True - True - - - - - - True - True - ... - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - 0 - True - True - - 0 diff --git a/plugins/converter/convgui.c b/plugins/converter/convgui.c index 64000aee..cfd217ae 100644 --- a/plugins/converter/convgui.c +++ b/plugins/converter/convgui.c @@ -27,6 +27,10 @@ #include "interface.h" #include "../gtkui/gtkui_api.h" +#ifndef PATH_MAX +#define PATH_MAX 1024 /* max # of characters in a path name */ +#endif + DB_functions_t *deadbeef; ddb_converter_t *converter_plugin; @@ -42,7 +46,6 @@ typedef struct { char *outfolder; char *outfile; int preserve_folder_structure; - char *preserve_root_folder; int output_bps; int output_is_float; int overwrite_action; @@ -121,6 +124,37 @@ static void converter_worker (void *ctx) { converter_ctx_t *conv = ctx; + char root[2000] = ""; + int rootlen = 0; + // prepare for preserving folder struct + if (conv->preserve_folder_structure && conv->convert_items_count >= 1) { + // start with the 1st track path + strncpy (root, deadbeef->pl_find_meta (conv->convert_items[0], ":URI"), sizeof (root)); + char *sep = strrchr (root, '/'); + if (sep) { + *sep = 0; + } + // reduce + rootlen = strlen (root); + for (int n = 1; n < conv->convert_items_count; n++) { + const char *path = deadbeef->pl_find_meta (conv->convert_items[n], ":URI"); + if (strncmp (path, root, rootlen)) { + // find where path splits + char *r = root; + while (*path && *r) { + if (*path != *r) { + *r = 0; + rootlen = r-root; + break; + } + path++; + r++; + } + } + } +// fprintf (stderr, "common root path: %s\n", root); + } + for (int n = 0; n < conv->convert_items_count; n++) { update_progress_info_t *info = malloc (sizeof (update_progress_info_t)); info->entry = conv->progress_entry; @@ -129,7 +163,21 @@ converter_worker (void *ctx) { g_idle_add (update_progress_cb, info); char outpath[2000]; - converter_plugin->get_output_path (conv->convert_items[n], conv->outfolder, conv->outfile, conv->encoder_preset, outpath, sizeof (outpath)); + + char outfolder_preserve[2000]; + if (conv->preserve_folder_structure) { + // generate new outfolder + const char *e = strrchr (info->text, '/'); + if (e) { + const char *s = info->text + rootlen; + char subpath[e-s+1]; + memcpy (subpath, s, e-s); + subpath[e-s] = 0; + snprintf (outfolder_preserve, sizeof (outfolder_preserve), "%s/%s", conv->outfolder, subpath); + } + } + + converter_plugin->get_output_path (conv->convert_items[n], conv->preserve_folder_structure ? outfolder_preserve : conv->outfolder, conv->outfile, conv->encoder_preset, outpath, sizeof (outpath)); int skip = 0; struct stat st; @@ -162,7 +210,7 @@ converter_worker (void *ctx) { } if (!skip) { - converter_plugin->convert (conv->convert_items[n], conv->outfolder, conv->outfile, conv->output_bps, conv->output_is_float, conv->preserve_folder_structure, conv->preserve_root_folder, conv->encoder_preset, conv->dsp_preset, &conv->cancelled); + converter_plugin->convert (conv->convert_items[n], conv->outfolder, conv->outfile, conv->output_bps, conv->output_is_float, conv->preserve_folder_structure, outfolder_preserve, conv->encoder_preset, conv->dsp_preset, &conv->cancelled); } if (conv->cancelled) { for (; n < conv->convert_items_count; n++) { @@ -192,7 +240,6 @@ converter_process (converter_ctx_t *conv) } conv->outfile = strdup (outfile); conv->preserve_folder_structure = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lookup_widget (conv->converter, "preserve_folders"))); - conv->preserve_root_folder = strdup (gtk_entry_get_text (GTK_ENTRY (lookup_widget (conv->converter, "preserve_root_folder")))); conv->overwrite_action = gtk_combo_box_get_active (GTK_COMBO_BOX (lookup_widget (conv->converter, "overwrite_action"))); GtkComboBox *combo = GTK_COMBO_BOX (lookup_widget (conv->converter, "output_format")); @@ -297,7 +344,6 @@ converter_show_cb (void *ctx) { deadbeef->conf_lock (); gtk_entry_set_text (GTK_ENTRY (lookup_widget (conv->converter, "output_folder")), deadbeef->conf_get_str_fast ("converter.output_folder", "")); gtk_entry_set_text (GTK_ENTRY (lookup_widget (conv->converter, "output_file")), deadbeef->conf_get_str_fast ("converter.output_file", "")); - gtk_entry_set_text (GTK_ENTRY (lookup_widget (conv->converter, "preserve_root_folder")), deadbeef->conf_get_str_fast ("converter.preserve_root_folder", "")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (conv->converter, "preserve_folders")), deadbeef->conf_get_int ("converter.preserve_folder_structure", 0)); gtk_combo_box_set_active (GTK_COMBO_BOX (lookup_widget (conv->converter, "overwrite_action")), deadbeef->conf_get_int ("converter.overwrite_action", 0)); deadbeef->conf_unlock (); @@ -489,39 +535,6 @@ on_encoder_changed (GtkEditable *editable, gtk_widget_set_tooltip_text (GTK_WIDGET (editable), enc); } -void -on_preserve_folder_browse_clicked (GtkButton *button, - gpointer user_data) -{ - GtkWidget *dlg = gtk_file_chooser_dialog_new (_("Select folder..."), GTK_WINDOW (current_ctx->converter), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); - gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (current_ctx->converter)); - - gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dlg), FALSE); - // restore folder - deadbeef->conf_lock (); - gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dlg), deadbeef->conf_get_str_fast ("filechooser.lastdir", "")); - deadbeef->conf_unlock (); - int response = gtk_dialog_run (GTK_DIALOG (dlg)); - // store folder - gchar *folder = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (dlg)); - if (folder) { - deadbeef->conf_set_str ("filechooser.lastdir", folder); - g_free (folder); - } - if (response == GTK_RESPONSE_OK) { - folder = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dlg)); - gtk_widget_destroy (dlg); - if (folder) { - GtkWidget *entry = lookup_widget (current_ctx->converter, "preserve_root_folder"); - gtk_entry_set_text (GTK_ENTRY (entry), folder); - g_free (folder); - } - } - else { - gtk_widget_destroy (dlg); - } -} - void on_output_file_changed (GtkEntry *entry, gpointer user_data) @@ -538,14 +551,6 @@ on_preserve_folders_toggled (GtkToggleButton *togglebutton, deadbeef->conf_save (); } -void -on_preserve_root_folder_changed (GtkEntry *entry, - gpointer user_data) -{ - deadbeef->conf_set_str ("converter.preserve_root_folder", gtk_entry_get_text (entry)); - deadbeef->conf_save (); -} - DB_decoder_t * plug_get_decoder_for_id (const char *id) { DB_decoder_t **plugins = deadbeef->plug_get_decoder_list (); diff --git a/plugins/converter/interface.c b/plugins/converter/interface.c index 76044196..18509346 100644 --- a/plugins/converter/interface.c +++ b/plugins/converter/interface.c @@ -65,9 +65,6 @@ create_converterdlg (void) GtkWidget *label121; GtkWidget *overwrite_action; GtkWidget *preserve_folders; - GtkWidget *hbox102; - GtkWidget *preserve_root_folder; - GtkWidget *preserve_folder_browse; GtkWidget *dialog_action_area5; GtkWidget *converter_cancel; GtkWidget *converter_ok; @@ -224,21 +221,10 @@ create_converterdlg (void) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (overwrite_action), _("Prompt")); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (overwrite_action), _("Overwrite")); - preserve_folders = gtk_check_button_new_with_mnemonic (_("Preserve folder structure, starting from:")); + preserve_folders = gtk_check_button_new_with_mnemonic (_("Preserve folder structure")); + gtk_widget_show (preserve_folders); gtk_box_pack_start (GTK_BOX (vbox26), preserve_folders, FALSE, FALSE, 0); - hbox102 = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox26), hbox102, TRUE, TRUE, 0); - - preserve_root_folder = gtk_entry_new (); - gtk_widget_show (preserve_root_folder); - gtk_box_pack_start (GTK_BOX (hbox102), preserve_root_folder, TRUE, TRUE, 0); - gtk_entry_set_invisible_char (GTK_ENTRY (preserve_root_folder), 8226); - - preserve_folder_browse = gtk_button_new_with_mnemonic ("..."); - gtk_widget_show (preserve_folder_browse); - gtk_box_pack_start (GTK_BOX (hbox102), preserve_folder_browse, FALSE, FALSE, 0); - dialog_action_area5 = gtk_dialog_get_action_area (GTK_DIALOG (converterdlg)); gtk_widget_show (dialog_action_area5); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area5), GTK_BUTTONBOX_END); @@ -286,12 +272,6 @@ create_converterdlg (void) g_signal_connect ((gpointer) preserve_folders, "toggled", G_CALLBACK (on_preserve_folders_toggled), NULL); - g_signal_connect ((gpointer) preserve_root_folder, "changed", - G_CALLBACK (on_preserve_root_folder_changed), - NULL); - g_signal_connect ((gpointer) preserve_folder_browse, "clicked", - G_CALLBACK (on_preserve_folder_browse_clicked), - NULL); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (converterdlg, converterdlg, "converterdlg"); @@ -329,9 +309,6 @@ create_converterdlg (void) GLADE_HOOKUP_OBJECT (converterdlg, label121, "label121"); GLADE_HOOKUP_OBJECT (converterdlg, overwrite_action, "overwrite_action"); GLADE_HOOKUP_OBJECT (converterdlg, preserve_folders, "preserve_folders"); - GLADE_HOOKUP_OBJECT (converterdlg, hbox102, "hbox102"); - GLADE_HOOKUP_OBJECT (converterdlg, preserve_root_folder, "preserve_root_folder"); - GLADE_HOOKUP_OBJECT (converterdlg, preserve_folder_browse, "preserve_folder_browse"); GLADE_HOOKUP_OBJECT_NO_REF (converterdlg, dialog_action_area5, "dialog_action_area5"); GLADE_HOOKUP_OBJECT (converterdlg, converter_cancel, "converter_cancel"); GLADE_HOOKUP_OBJECT (converterdlg, converter_ok, "converter_ok"); -- cgit v1.2.3