summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2012-04-08 14:22:46 +0200
committerGravatar waker <wakeroid@gmail.com>2012-04-08 14:22:46 +0200
commit8ea040c539bb7a7d5da19559e744d6c70f2993d2 (patch)
tree38dc1088674df26350c5bdd2c46a786d3db03835 /plugins
parent3a669ae3939bd0350880233cc37758c6ef27ef73 (diff)
converter: added reconstruction of folder structure based on the largest common root
Diffstat (limited to 'plugins')
-rw-r--r--plugins/converter/converter.c4
-rw-r--r--plugins/converter/converter.glade52
-rw-r--r--plugins/converter/convgui.c97
-rw-r--r--plugins/converter/interface.c27
4 files changed, 57 insertions, 123 deletions
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</property>
<child>
<widget class="GtkCheckButton" id="preserve_folders">
+ <property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="label" translatable="yes">Preserve folder structure, starting from:</property>
+ <property name="label" translatable="yes">Preserve folder structure</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
@@ -620,55 +621,6 @@ Overwrite</property>
<property name="fill">False</property>
</packing>
</child>
-
- <child>
- <widget class="GtkHBox" id="hbox102">
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkEntry" id="preserve_root_folder">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">•</property>
- <property name="activates_default">False</property>
- <signal name="changed" handler="on_preserve_root_folder_changed" last_modification_time="Mon, 14 Mar 2011 21:00:54 GMT"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="preserve_folder_browse">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label">...</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal name="clicked" handler="on_preserve_folder_browse_clicked" last_modification_time="Sun, 13 Mar 2011 12:29:48 GMT"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
</widget>
<packing>
<property name="padding">0</property>
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 ();
@@ -490,39 +536,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)
{
@@ -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");