diff options
Diffstat (limited to 'plugins/converter/convgui.c')
-rw-r--r-- | plugins/converter/convgui.c | 137 |
1 files changed, 88 insertions, 49 deletions
diff --git a/plugins/converter/convgui.c b/plugins/converter/convgui.c index bd54eb0e..d229c811 100644 --- a/plugins/converter/convgui.c +++ b/plugins/converter/convgui.c @@ -1,6 +1,6 @@ /* DeaDBeeF - ultimate music player for GNU/Linux systems with X11 - Copyright (C) 2009-2011 Alexey Yakovenko <waker@users.sourceforge.net> + Copyright (C) 2009-2012 Alexey Yakovenko <waker@users.sourceforge.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -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,7 @@ typedef struct { char *outfolder; char *outfile; int preserve_folder_structure; - char *preserve_root_folder; + int write_to_source_folder; int output_bps; int output_is_float; int overwrite_action; @@ -121,6 +125,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 +164,8 @@ 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)); + + converter_plugin->get_output_path (conv->convert_items[n], conv->outfolder, conv->outfile, conv->encoder_preset, conv->preserve_folder_structure, root, conv->write_to_source_folder, outpath, sizeof (outpath)); int skip = 0; struct stat st; @@ -162,7 +198,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], outpath, conv->output_bps, conv->output_is_float, conv->encoder_preset, conv->dsp_preset, &conv->cancelled); } if (conv->cancelled) { for (; n < conv->convert_items_count; n++) { @@ -192,7 +228,7 @@ 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->write_to_source_folder = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lookup_widget (conv->converter, "write_to_source_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")); @@ -264,6 +300,10 @@ converter_process (converter_ctx_t *conv) return 0; } +void +on_write_to_source_folder_toggled (GtkToggleButton *togglebutton, + gpointer user_data); + static gboolean converter_show_cb (void *ctx) { converter_ctx_t *conv = malloc (sizeof (converter_ctx_t)); @@ -295,10 +335,22 @@ converter_show_cb (void *ctx) { conv->converter = create_converterdlg (); deadbeef->conf_lock (); - gtk_entry_set_text (GTK_ENTRY (lookup_widget (conv->converter, "output_folder")), deadbeef->conf_get_str_fast ("converter.output_folder", "")); + const char *out_folder = deadbeef->conf_get_str_fast ("converter.output_folder", ""); + if (!out_folder[0]) { + out_folder = getenv("HOME"); + } + gtk_entry_set_text (GTK_ENTRY (lookup_widget (conv->converter, "output_folder")), out_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)); + int write_to_source_folder = deadbeef->conf_get_int ("converter.write_to_source_folder", 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (conv->converter, "write_to_source_folder")), write_to_source_folder); + + g_signal_connect ((gpointer) lookup_widget (conv->converter, "write_to_source_folder"), "toggled", + G_CALLBACK (on_write_to_source_folder_toggled), + conv); + + gtk_widget_set_sensitive (lookup_widget (conv->converter, "output_folder"), !write_to_source_folder); + gtk_widget_set_sensitive (lookup_widget (conv->converter, "preserve_folders"), !write_to_source_folder); 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 (); @@ -397,7 +449,17 @@ on_converter_output_browse_clicked (GtkButton *button, 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 ("converter.lastdir", "")); + char dir[2000]; + deadbeef->conf_get_str ("converter.lastdir", "", dir, sizeof (dir)); + if (!dir[0]) { + const char *out_folder = deadbeef->conf_get_str_fast ("converter.output_folder", ""); + if (!out_folder[0]) { + out_folder = getenv("HOME"); + } + snprintf (dir, sizeof (dir), "file://%s", out_folder); + } + + gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dlg), dir); deadbeef->conf_unlock (); int response = gtk_dialog_run (GTK_DIALOG (dlg)); // store folder @@ -490,39 +552,6 @@ on_encoder_changed (GtkEditable *editable, } 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) { @@ -539,13 +568,17 @@ on_preserve_folders_toggled (GtkToggleButton *togglebutton, } void -on_preserve_root_folder_changed (GtkEntry *entry, +on_write_to_source_folder_toggled (GtkToggleButton *togglebutton, gpointer user_data) { - deadbeef->conf_set_str ("converter.preserve_root_folder", gtk_entry_get_text (entry)); - deadbeef->conf_save (); + int active = gtk_toggle_button_get_active (togglebutton); + converter_ctx_t *conv = user_data; + deadbeef->conf_set_int ("converter.write_to_source_folder", active); + gtk_widget_set_sensitive (lookup_widget (conv->converter, "output_folder"), !active); + gtk_widget_set_sensitive (lookup_widget (conv->converter, "preserve_folders"), !active); } + DB_decoder_t * plug_get_decoder_for_id (const char *id) { DB_decoder_t **plugins = deadbeef->plug_get_decoder_list (); @@ -690,11 +723,9 @@ on_encoder_preset_add (GtkButton *button, current_ctx->current_encoder_preset = converter_plugin->encoder_preset_alloc (); if (GTK_RESPONSE_OK == edit_encoder_preset (_("Add new encoder"), toplevel, 0)) { - printf ("added new enc preset\n"); converter_plugin->encoder_preset_append (current_ctx->current_encoder_preset); GtkComboBox *combo = GTK_COMBO_BOX (lookup_widget (current_ctx->converter, "encoder")); GtkWidget *list = lookup_widget (toplevel, "presets"); - printf ("refresh list\n"); refresh_encoder_lists (combo, GTK_TREE_VIEW (list)); } @@ -1253,7 +1284,7 @@ static DB_plugin_action_t convert_action = { .title = "Convert", .name = "convert", .flags = DB_ACTION_CAN_MULTIPLE_TRACKS | DB_ACTION_ALLOW_MULTIPLE_TRACKS | DB_ACTION_SINGLE_TRACK, - .callback = converter_show, + .callback = DDB_ACTION_CALLBACK(converter_show), .next = NULL }; @@ -1271,7 +1302,15 @@ convgui_connect (void) { gtkui_plugin = (ddb_gtkui_t *)deadbeef->plug_get_for_id ("gtkui"); #endif converter_plugin = (ddb_converter_t *)deadbeef->plug_get_for_id ("converter"); - if (!gtkui_plugin || !converter_plugin) { + if (!gtkui_plugin) { + fprintf (stderr, "convgui: gtkui plugin not found\n"); + return -1; + } + if (!converter_plugin) { + fprintf (stderr, "convgui: converter plugin not found\n"); + } + if (converter_plugin->misc.plugin.version_major != 1 || converter_plugin->misc.plugin.version_minor < 2) { + fprintf (stderr, "convgui: need converter>=1.2, but found %d.%d\n", converter_plugin->misc.plugin.version_major, converter_plugin->misc.plugin.version_minor); return -1; } return 0; @@ -1294,7 +1333,7 @@ DB_misc_t plugin = { " Reload DSP and encoder presets on every converter access\n" " Write 0 wave data size into waveheader when using pipe, for oggenc compatibility\n", .plugin.copyright = - "Copyright (C) 2009-2011 Alexey Yakovenko <waker@users.sourceforge.net>\n" + "Copyright (C) 2009-2012 Alexey Yakovenko <waker@users.sourceforge.net>\n" "\n" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" |