diff options
author | 2012-04-08 20:06:12 +0200 | |
---|---|---|
committer | 2012-04-08 20:06:12 +0200 | |
commit | da6a525031fd2a8bb1577220c1a2191834edfcca (patch) | |
tree | 459818d840d4da14118e9fc713c7856679ee2fd1 /plugins | |
parent | a8da758bc87d335036588644d3d03ca0418486ac (diff) |
converter: added support for writing files to source track folders
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/converter/converter.c | 25 | ||||
-rw-r--r-- | plugins/converter/converter.glade | 42 | ||||
-rw-r--r-- | plugins/converter/converter.h | 9 | ||||
-rw-r--r-- | plugins/converter/convgui.c | 38 | ||||
-rw-r--r-- | plugins/converter/interface.c | 20 |
5 files changed, 94 insertions, 40 deletions
diff --git a/plugins/converter/converter.c b/plugins/converter/converter.c index 3d571f64..4ffe4433 100644 --- a/plugins/converter/converter.c +++ b/plugins/converter/converter.c @@ -737,7 +737,7 @@ check_dir (const char *dir, mode_t mode) } int -convert (DB_playItem_t *it, const char *outfolder, const char *outfile, int output_bps, int output_is_float, int preserve_folder_structure, const char *root_folder, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort) { +convert (DB_playItem_t *it, const char *outfolder, const char *outfile, int output_bps, int output_is_float, int preserve_folder_structure, const char *root_folder, int write_to_source_folder, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort) { if (deadbeef->pl_get_item_duration (it) <= 0) { deadbeef->pl_lock (); const char *fname = deadbeef->pl_find_meta (it, ":URI"); @@ -774,8 +774,21 @@ convert (DB_playItem_t *it, const char *outfolder, const char *outfile, int outp output_bps = fileinfo->fmt.bps; output_is_float = fileinfo->fmt.is_float; } + const char *outpath; - get_output_path (it, preserve_folder_structure ? root_folder : outfolder, outfile, encoder_preset, out, sizeof (out)); + if (write_to_source_folder) { + char *path = strdupa (deadbeef->pl_find_meta (it, ":URI")); + char *sep = strrchr (path, '/'); + if (sep) { + *sep = 0; + } + outpath = path; + } + else { + outpath = preserve_folder_structure ? root_folder : outfolder; + } + + get_output_path (it, outpath, outfile, encoder_preset, out, sizeof (out)); if (encoder_preset->method == DDB_ENCODER_METHOD_FILE) { const char *tmp = getenv ("TMPDIR"); if (!tmp) { @@ -1090,6 +1103,11 @@ error: } int +convert_1_0 (DB_playItem_t *it, const char *outfolder, const char *outfile, int output_bps, int output_is_float, int preserve_folder_structure, const char *root_folder, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort) { + return convert (it, outfolder, outfile, output_bps, output_is_float, preserve_folder_structure, root_folder, 0, encoder_preset, dsp_preset, abort); +} + +int converter_cmd (int cmd, ...) { return -1; } @@ -1114,7 +1132,7 @@ static ddb_converter_t plugin = { .misc.plugin.api_vmajor = 1, .misc.plugin.api_vminor = 0, .misc.plugin.version_major = 1, - .misc.plugin.version_minor = 1, + .misc.plugin.version_minor = 2, .misc.plugin.type = DB_PLUGIN_MISC, .misc.plugin.name = "Converter", .misc.plugin.id = "converter", @@ -1162,6 +1180,7 @@ static ddb_converter_t plugin = { .dsp_preset_remove = dsp_preset_remove, .dsp_preset_replace = dsp_preset_replace, .get_output_path = get_output_path, + .convert_1_0 = convert_1_0, .convert = convert, // 1.1 entry points .load_encoder_presets = load_encoder_presets, diff --git a/plugins/converter/converter.glade b/plugins/converter/converter.glade index 521b1c2c..667dbcf8 100644 --- a/plugins/converter/converter.glade +++ b/plugins/converter/converter.glade @@ -162,6 +162,7 @@ <child> <widget class="GtkCheckButton" id="write_to_source_folder"> + <property name="visible">True</property> <property name="can_focus">True</property> <property name="label" translatable="yes">Write to source track folder</property> <property name="use_underline">True</property> @@ -170,7 +171,26 @@ <property name="active">False</property> <property name="inconsistent">False</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_write_to_source_folder_toggled" last_modification_time="Sun, 08 Apr 2012 12:54:30 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <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</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_preserve_folders_toggled" last_modification_time="Sun, 13 Mar 2011 12:34:49 GMT"/> </widget> <packing> <property name="padding">0</property> @@ -620,26 +640,6 @@ Overwrite</property> <property name="fill">True</property> </packing> </child> - - <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</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <property name="active">False</property> - <property name="inconsistent">False</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_preserve_folders_toggled" last_modification_time="Sun, 13 Mar 2011 12:34:49 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> diff --git a/plugins/converter/converter.h b/plugins/converter/converter.h index 19e3d172..1bad0449 100644 --- a/plugins/converter/converter.h +++ b/plugins/converter/converter.h @@ -142,8 +142,9 @@ typedef struct { void (*get_output_path) (DB_playItem_t *it, const char *outfolder, const char *outfile, ddb_encoder_preset_t *encoder_preset, char *out, int sz); + // this function is deprecated, please don't use directly int - (*convert) (DB_playItem_t *it, const char *outfolder, const char *outfile, int output_bps, int output_is_float, int preserve_folder_structure, const char *root_folder, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort); + (*convert_1_0) (DB_playItem_t *it, const char *outfolder, const char *outfile, int output_bps, int output_is_float, int preserve_folder_structure, const char *root_folder, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort); ///////////////////////////// // new APIs for converter-1.1 @@ -157,6 +158,12 @@ typedef struct { (*free_encoder_presets) (void); void (*free_dsp_presets) (void); + + ///////////////////////////// + // new APIs for converter-1.2 + ///////////////////////////// + int + (*convert) (DB_playItem_t *it, const char *outfolder, const char *outfile, int output_bps, int output_is_float, int preserve_folder_structure, const char *root_folder, int write_to_source_folder, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort); } ddb_converter_t; #endif diff --git a/plugins/converter/convgui.c b/plugins/converter/convgui.c index 2827c087..1a931ba0 100644 --- a/plugins/converter/convgui.c +++ b/plugins/converter/convgui.c @@ -178,7 +178,21 @@ converter_worker (void *ctx) { } } - 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)); + const char *outfolder; + + if (conv->write_to_source_folder) { + char *path = strdupa (info->text); + char *sep = strrchr (path, '/'); + if (sep) { + *sep = 0; + } + outfolder = path; + } + else { + outfolder = conv->preserve_folder_structure ? outfolder_preserve : conv->outfolder; + } + + converter_plugin->get_output_path (conv->convert_items[n], outfolder, conv->outfile, conv->encoder_preset, outpath, sizeof (outpath)); int skip = 0; struct stat st; @@ -211,7 +225,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, outfolder_preserve, 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->write_to_source_folder, conv->encoder_preset, conv->dsp_preset, &conv->cancelled); } if (conv->cancelled) { for (; n < conv->convert_items_count; n++) { @@ -313,6 +327,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)); @@ -347,7 +365,15 @@ converter_show_cb (void *ctx) { 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_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (conv->converter, "preserve_folders")), deadbeef->conf_get_int ("converter.preserve_folder_structure", 0)); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (conv->converter, "write_to_source_folder")), deadbeef->conf_get_int ("converter.write_to_source_folder", 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 (); @@ -558,7 +584,11 @@ void on_write_to_source_folder_toggled (GtkToggleButton *togglebutton, gpointer user_data) { - deadbeef->conf_set_int ("converter.write_to_source_folder", gtk_toggle_button_get_active (togglebutton)); + 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); } diff --git a/plugins/converter/interface.c b/plugins/converter/interface.c index a24de750..dc17c11f 100644 --- a/plugins/converter/interface.c +++ b/plugins/converter/interface.c @@ -38,6 +38,7 @@ create_converterdlg (void) GtkWidget *output_folder; GtkWidget *converter_output_browse; GtkWidget *write_to_source_folder; + GtkWidget *preserve_folders; GtkWidget *hbox100; GtkWidget *label122; GtkWidget *hbox101; @@ -65,7 +66,6 @@ create_converterdlg (void) GtkWidget *hbox99; GtkWidget *label121; GtkWidget *overwrite_action; - GtkWidget *preserve_folders; GtkWidget *dialog_action_area5; GtkWidget *converter_cancel; GtkWidget *converter_ok; @@ -107,8 +107,13 @@ create_converterdlg (void) gtk_box_pack_start (GTK_BOX (hbox68), converter_output_browse, FALSE, FALSE, 0); write_to_source_folder = gtk_check_button_new_with_mnemonic (_("Write to source track folder")); + gtk_widget_show (write_to_source_folder); gtk_box_pack_start (GTK_BOX (vbox26), write_to_source_folder, FALSE, FALSE, 0); + 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); + hbox100 = gtk_hbox_new (FALSE, 8); gtk_widget_show (hbox100); gtk_box_pack_start (GTK_BOX (vbox26), hbox100, TRUE, TRUE, 0); @@ -225,10 +230,6 @@ 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")); - gtk_widget_show (preserve_folders); - gtk_box_pack_start (GTK_BOX (vbox26), preserve_folders, 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); @@ -249,8 +250,8 @@ create_converterdlg (void) g_signal_connect ((gpointer) converter_output_browse, "clicked", G_CALLBACK (on_converter_output_browse_clicked), NULL); - g_signal_connect ((gpointer) write_to_source_folder, "toggled", - G_CALLBACK (on_write_to_source_folder_toggled), + g_signal_connect ((gpointer) preserve_folders, "toggled", + G_CALLBACK (on_preserve_folders_toggled), NULL); g_signal_connect ((gpointer) output_file, "changed", G_CALLBACK (on_output_file_changed), @@ -276,9 +277,6 @@ create_converterdlg (void) g_signal_connect ((gpointer) overwrite_action, "changed", G_CALLBACK (on_overwrite_action_changed), NULL); - g_signal_connect ((gpointer) preserve_folders, "toggled", - G_CALLBACK (on_preserve_folders_toggled), - NULL); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (converterdlg, converterdlg, "converterdlg"); @@ -290,6 +288,7 @@ create_converterdlg (void) GLADE_HOOKUP_OBJECT (converterdlg, output_folder, "output_folder"); GLADE_HOOKUP_OBJECT (converterdlg, converter_output_browse, "converter_output_browse"); GLADE_HOOKUP_OBJECT (converterdlg, write_to_source_folder, "write_to_source_folder"); + GLADE_HOOKUP_OBJECT (converterdlg, preserve_folders, "preserve_folders"); GLADE_HOOKUP_OBJECT (converterdlg, hbox100, "hbox100"); GLADE_HOOKUP_OBJECT (converterdlg, label122, "label122"); GLADE_HOOKUP_OBJECT (converterdlg, hbox101, "hbox101"); @@ -316,7 +315,6 @@ create_converterdlg (void) GLADE_HOOKUP_OBJECT (converterdlg, hbox99, "hbox99"); 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_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"); |