+ extension = "mp4";
+ audio_list = ghb_settings_get_value(ud->settings, "audio_list");
+ if (ghb_ac3_in_audio_list (audio_list))
+ {
+ extension = "m4v";
+ }
+ else if (ghb_settings_get_boolean(ud->settings, "ChapterMarkers"))
+ {
+ extension = "m4v";
+ }
+ else if (ghb_settings_get_boolean(ud->settings, "UseM4v"))
+ {
+ extension = "m4v";
+ }
+ }
+ else if (container == HB_MUX_MKV)
+ {
+ extension = "mkv";
+ }
+ return extension;
+}
+
+static void
+set_destination(signal_user_data_t *ud)
+{
+ g_debug("set_destination");
+ if (ghb_settings_get_boolean(ud->settings, "use_source_name"))
+ {
+ GString *str = g_string_new("");
+ gchar *vol_name, *filename;
+ const gchar *extension;
+ gchar *new_name;
+ gint title;
+
+ filename = ghb_settings_get_string(ud->settings, "dest_file");
+ extension = get_extension(ud);
+ vol_name = ghb_settings_get_string(ud->settings, "volume_label");
+ g_string_append_printf(str, "%s", vol_name);
+ title = ghb_settings_combo_int(ud->settings, "title");
+ if (title >= 0)
+ {
+ if (ghb_settings_get_boolean(
+ ud->settings, "title_no_in_destination"))
+ {
+
+ title = ghb_settings_combo_int(ud->settings, "title");
+ g_string_append_printf(str, " - %d", title+1);
+ }
+ if (ghb_settings_get_boolean(
+ ud->settings, "chapters_in_destination"))
+ {
+ gint start, end;
+
+ if (!ghb_settings_get_boolean(
+ ud->settings, "title_no_in_destination"))
+ {
+ g_string_append_printf(str, " -");
+ }
+ start = ghb_settings_get_int(ud->settings, "start_chapter");
+ end = ghb_settings_get_int(ud->settings, "end_chapter");
+ if (start == end)
+ g_string_append_printf(str, " Ch %d", start);
+ else
+ g_string_append_printf(str, " Ch %d-%d", start, end);
+ }
+ }
+ g_string_append_printf(str, ".%s", extension);
+ new_name = g_string_free(str, FALSE);
+ ghb_ui_update(ud, "dest_file", ghb_string_value(new_name));
+ g_free(filename);
+ g_free(vol_name);
+ g_free(new_name);
+ }
+}
+
+static gchar*
+get_file_label(const gchar *filename)
+{
+ static gchar *containers[] =
+ {".vob", ".mpg", ".m2ts", ".mkv", ".mp4", ".m4v", ".avi", ".ogm", NULL};
+ gchar *base;
+ gint ii;
+
+ base = g_path_get_basename(filename);
+ for (ii = 0; containers[ii] != NULL; ii++)
+ {
+ if (g_str_has_suffix(base, containers[ii]))
+ {
+ gchar *pos;
+ pos = strrchr(base, '.');
+ *pos = 0;
+ break;
+ }
+ }
+ return base;
+}
+
+static gchar*
+resolve_drive_name(gchar *filename)
+{
+#if defined(_WIN32)
+ if (filename[1] == ':')
+ {
+ gchar drive[4];
+ gchar *name;
+ gint dtype;
+
+ g_strlcpy(drive, filename, 4);
+ dtype = GetDriveType(drive);
+ if (dtype == DRIVE_CDROM)
+ {
+ gchar vname[51], fsname[51];
+ GetVolumeInformation(drive, vname, 50, NULL,
+ NULL, NULL, fsname, 50);
+ name = g_strdup(vname);
+ return name;
+ }
+ }
+ return NULL;
+#else
+ return NULL;
+#endif
+}
+
+static gboolean
+update_source_label(signal_user_data_t *ud, const gchar *source)
+{
+ gchar *label = NULL;
+ gint len;
+ gchar **path;
+ gchar *start;
+ gchar *filename = g_strdup(source);
+
+ len = strlen(filename);
+ if (filename[len-1] == G_DIR_SEPARATOR) filename[len-1] = 0;
+ if (g_file_test(filename, G_FILE_TEST_IS_DIR))
+ {
+ // Skip dos drive letters
+ start = strchr(filename, ':');
+ label = resolve_drive_name(filename);
+ if (label != NULL)
+ {
+ if (uppers_and_unders(label))
+ {
+ camel_convert(label);
+ }
+ }
+ else
+ {
+ if (start != NULL)
+ start++;
+ else
+ start = filename;
+
+ path = g_strsplit(start, G_DIR_SEPARATOR_S, -1);
+ len = g_strv_length (path);
+ if ((len > 1) && (strcmp("VIDEO_TS", path[len-1]) == 0))
+ {
+ label = g_strdup(path[len-2]);
+ if (uppers_and_unders(label))
+ {
+ camel_convert(label);
+ }
+ }
+ else if (len > 0)
+ {
+ if (path[len-1][0] != 0)
+ {
+ label = g_strdup(path[len-1]);
+ if (uppers_and_unders(label))
+ {
+ camel_convert(label);
+ }
+ }
+ else
+ label = g_strdup("new_video");
+ }
+ else
+ label = g_strdup("new_video");
+ g_strfreev (path);
+ }
+ }
+ else
+ {
+ // Is regular file or block dev.
+ // Check to see if it is a dvd image
+ label = ghb_dvd_volname (filename);
+ if (label == NULL)
+ {
+ label = get_file_label(filename);
+ }
+ else
+ {
+ if (uppers_and_unders(label))
+ {
+ camel_convert(label);
+ }
+ }
+ }
+ g_free(filename);
+ GtkWidget *widget = GHB_WIDGET (ud->builder, "source_title");
+ if (label != NULL)
+ {
+ gtk_label_set_text (GTK_LABEL(widget), label);
+ ghb_settings_set_string(ud->settings, "volume_label", label);
+ g_free(label);
+ set_destination(ud);
+ }
+ else
+ {
+ label = "No Title Found";
+ gtk_label_set_text (GTK_LABEL(widget), label);
+ ghb_settings_set_string(ud->settings, "volume_label", label);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+G_MODULE_EXPORT void
+chooser_file_selected_cb(GtkFileChooser *dialog, signal_user_data_t *ud)
+{
+ gchar *name = gtk_file_chooser_get_filename (dialog);
+ GtkTreeModel *store;
+ GtkTreeIter iter;
+ const gchar *device;
+ gboolean foundit = FALSE;
+ GtkComboBox *combo;
+
+ if (name == NULL) return;
+ combo = GTK_COMBO_BOX(GHB_WIDGET(ud->builder, "source_device"));
+ store = gtk_combo_box_get_model(combo);
+ if (gtk_tree_model_get_iter_first(store, &iter))
+ {
+ do
+ {
+ gtk_tree_model_get(store, &iter, 0, &device, -1);
+ if (strcmp(name, device) == 0)
+ {
+ foundit = TRUE;
+ break;
+ }
+ } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter));
+ }
+ if (foundit)
+ gtk_combo_box_set_active_iter (combo, &iter);
+ else
+ gtk_combo_box_set_active (combo, 0);
+
+ g_free(name);
+}
+
+G_MODULE_EXPORT void
+dvd_device_changed_cb(GtkComboBox *combo, signal_user_data_t *ud)
+{
+ GtkWidget *dialog;
+ gint ii;
+
+ ii = gtk_combo_box_get_active (combo);
+ if (ii > 0)
+ {
+ const gchar *device;
+ gchar *name;
+
+ dialog = GHB_WIDGET(ud->builder, "source_dialog");
+ device = gtk_combo_box_get_active_text (combo);
+ name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog));
+ if (name == NULL || strcmp(name, device) != 0)
+ gtk_file_chooser_select_filename (GTK_FILE_CHOOSER(dialog), device);
+ if (name != NULL)
+ g_free(name);
+ }
+}
+
+G_MODULE_EXPORT void
+source_type_changed_cb(GtkToggleButton *toggle, signal_user_data_t *ud)
+{
+ gchar *folder;
+ GtkFileChooser *chooser;
+ GtkWidget *dvd_device_combo;
+
+ g_debug("source_type_changed_cb ()");
+ chooser = GTK_FILE_CHOOSER(GHB_WIDGET(ud->builder, "source_dialog"));
+ dvd_device_combo = GHB_WIDGET(ud->builder, "source_device");
+ folder = gtk_file_chooser_get_current_folder (chooser);
+ if (gtk_toggle_button_get_active (toggle))
+ {
+ gtk_file_chooser_set_action (chooser,
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+ gtk_widget_set_sensitive (dvd_device_combo, FALSE);
+ gtk_combo_box_set_active (GTK_COMBO_BOX(dvd_device_combo), 0);
+ }
+ else
+ {
+ gtk_file_chooser_set_action (chooser, GTK_FILE_CHOOSER_ACTION_OPEN);
+ gtk_widget_set_sensitive (dvd_device_combo, TRUE);
+ }
+ if (folder != NULL)
+ {
+ gtk_file_chooser_set_current_folder(chooser, folder);
+ g_free(folder);
+ }
+}
+
+static void
+source_dialog_extra_widgets(
+ signal_user_data_t *ud,
+ GtkWidget *dialog,
+ gboolean checkbutton_active)
+{
+ GtkToggleButton *checkbutton;
+ GtkComboBox *combo;
+ GList *drives, *link;
+
+ checkbutton = GTK_TOGGLE_BUTTON(
+ GHB_WIDGET(ud->builder, "source_folder_flag"));
+ gtk_toggle_button_set_active(checkbutton, checkbutton_active);
+ combo = GTK_COMBO_BOX(GHB_WIDGET(ud->builder, "source_device"));
+ gtk_list_store_clear(GTK_LIST_STORE(
+ gtk_combo_box_get_model(combo)));
+
+ link = drives = dvd_device_list();
+ gtk_combo_box_append_text (combo, "Not Selected");
+ while (link != NULL)
+ {
+ gchar *name = get_dvd_device_name(link->data);
+ gtk_combo_box_append_text(combo, name);
+ g_free(name);
+ free_drive(link->data);
+ link = link->next;
+ }
+ g_list_free(drives);
+}
+
+extern GValue *ghb_queue_edit_settings;
+static gchar *last_scan_file = NULL;
+
+static void
+show_scan_progress(signal_user_data_t *ud)
+{
+ GtkProgressBar *progress;
+ GtkLabel *label;
+
+ progress = GTK_PROGRESS_BAR(GHB_WIDGET(ud->builder, "scan_prog"));
+ gtk_progress_bar_set_fraction (progress, 0);
+ gtk_widget_show(GTK_WIDGET(progress));
+
+ label = GTK_LABEL(GHB_WIDGET(ud->builder, "source_title"));
+ gtk_label_set_text( label, "Scanning ..." );
+}
+
+void
+ghb_do_scan(
+ signal_user_data_t *ud,
+ const gchar *filename,
+ gint titlenum,
+ gboolean force)
+{
+ if (!force && last_scan_file != NULL &&
+ strcmp(last_scan_file, filename) == 0)
+ {
+ if (ghb_queue_edit_settings)