const gchar* ghb_dict_get_string(const GhbValue *dict, const gchar *key) { const GhbValue* value; value = ghb_dict_get_value(dict, key); return ghb_value_get_string(value); }
void ghb_subtitle_set_pref_lang(GhbValue *settings) { GhbValue *lang_list; gboolean set = FALSE; lang_list = ghb_dict_get_value(settings, "SubtitleLanguageList"); if (ghb_array_len(lang_list) > 0) { GhbValue *glang = ghb_array_get(lang_list, 0); if (glang != NULL) { ghb_dict_set_string(settings, "PreferredLanguage", ghb_value_get_string(glang)); set = TRUE; } } if (!set) { ghb_dict_set_string(settings, "PreferredLanguage", "und"); } }
static void gval_write(FILE *file, GhbValue *gval) { static gint indent = 0; gint ii; GhbType gtype; if (gval == NULL) return; gtype = ghb_value_type(gval); if (gtype == GHB_ARRAY) { GhbValue *val; gint count; indent_fprintf(file, indent, "<array>\n"); indent++; count = ghb_array_len(gval); for (ii = 0; ii < count; ii++) { val = ghb_array_get(gval, ii); gval_write(file, val); } indent--; indent_fprintf(file, indent, "</array>\n"); } else if (gtype == GHB_DICT) { const char *key; GhbValue *val; GhbDictIter iter; indent_fprintf(file, indent, "<dict>\n"); indent++; iter = ghb_dict_iter_init(gval); while (ghb_dict_iter_next(gval, &iter, &key, &val)) { indent_fprintf(file, indent, "<key>%s</key>\n", key); gval_write(file, val); } indent--; indent_fprintf(file, indent, "</dict>\n"); } else if (gtype == GHB_BOOL) { gchar *tag; if (ghb_value_get_bool(gval)) { tag = "true"; } else { tag = "false"; } indent_fprintf(file, indent, "<%s />\n", tag); } else if (gtype == GHB_DOUBLE) { gdouble val = ghb_value_get_double(gval); indent_fprintf(file, indent, "<real>%.17g</real>\n", val); } else if (gtype == GHB_INT) { gint64 val = ghb_value_get_int(gval); indent_fprintf(file, indent, "<integer>%"PRId64"</integer>\n", val); } else if (gtype == GHB_STRING) { const gchar *str = ghb_value_get_string(gval); gchar *esc = g_markup_escape_text(str, -1); indent_fprintf(file, indent, "<string>%s</string>\n", esc); g_free(esc); } else { // Try to make anything thats unrecognized into a string g_warning("Unhandled data type %d", gtype); } }
void ghb_set_pref_subtitle_settings(signal_user_data_t *ud, const hb_title_t *title, GhbValue *settings) { gint track; gboolean *used; const gchar *audio_lang, *pref_lang = NULL; gboolean foreign_audio_search, foreign_audio_subs; gboolean burn_foreign, burn_first, burn_dvd, burn_bd; gboolean one_burned = FALSE; const GhbValue *lang_list; gint lang_count, sub_count, ii; int behavior; behavior = ghb_settings_combo_int(settings, "SubtitleTrackSelectionBehavior"); // Clear the subtitle list ghb_clear_subtitle_list_settings(settings); if (title == NULL) { // no source title return; } sub_count = hb_list_count(title->list_subtitle); if (sub_count == 0) { // No source subtitles return; } const char *mux_id; const hb_container_t *mux; mux_id = ghb_dict_get_string(settings, "FileFormat"); mux = ghb_lookup_container_by_name(mux_id); // Check to see if we need to add a subtitle track for foreign audio // language films. A subtitle track will be added if: // // The first (default) audio track language does NOT match the users // chosen Preferred Language AND the Preferred Language is NOT Any (und). // audio_lang = ghb_get_user_audio_lang(settings, title, 0); foreign_audio_search = ghb_dict_get_bool( settings, "SubtitleAddForeignAudioSearch"); foreign_audio_subs = ghb_dict_get_bool( settings, "SubtitleAddForeignAudioSubtitle"); lang_list = ghb_dict_get_value(settings, "SubtitleLanguageList"); lang_count = ghb_array_len(lang_list); if (lang_count > 0) { GhbValue *glang = ghb_array_get(lang_list, 0); pref_lang = ghb_value_get_string(glang); } if (pref_lang == NULL || !strncmp(pref_lang, "und", 4)) { foreign_audio_search = foreign_audio_subs = FALSE; pref_lang = NULL; } used = g_malloc0(sub_count * sizeof(gboolean)); int burn_behavior; burn_behavior = ghb_settings_combo_int(settings, "SubtitleBurnBehavior"); burn_foreign = burn_behavior == 1 || burn_behavior == 3; burn_first = burn_behavior == 2 || burn_behavior == 3; burn_dvd = ghb_dict_get_bool(settings, "SubtitleBurnDVDSub"); burn_bd = ghb_dict_get_bool(settings, "SubtitleBurnBDSub"); if (foreign_audio_subs && (audio_lang == NULL || strncmp(audio_lang, pref_lang, 4))) { // Add preferred language subtitle since first audio track // is foreign language. foreign_audio_search = FALSE; track = ghb_find_subtitle_track(title, pref_lang, 0); if (track >= 0) { gboolean burn; hb_subtitle_t *subtitle; subtitle = hb_list_item(title->list_subtitle, track); burn = (subtitle->source == VOBSUB && burn_dvd) || (subtitle->source == PGSSUB && burn_bd) || burn_foreign || burn_first; used[track] = TRUE; subtitle_add_track(ud, settings, title, track, mux->format, !burn, FALSE, burn, &one_burned); burn_first &= !burn; } } if (foreign_audio_search && (audio_lang != NULL && !strncmp(audio_lang, pref_lang, 4))) { // Add search for foreign audio segments gboolean burn = burn_foreign || burn_first; subtitle_add_track(ud, settings, title, -1, mux->format, !burn, FALSE, burn, &one_burned); burn_first &= !burn; } if (behavior != 0) { // Find "best" subtitle based on subtitle preferences for (ii = 0; ii < lang_count; ii++) { GhbValue *glang = ghb_array_get(lang_list, ii); const gchar *lang = ghb_value_get_string(glang); int next_track = 0; track = ghb_find_subtitle_track(title, lang, next_track); while (track >= 0) { if (!used[track]) { gboolean burn; hb_subtitle_t *subtitle; subtitle = hb_list_item(title->list_subtitle, track); burn = (subtitle->source == VOBSUB && burn_dvd) || (subtitle->source == PGSSUB && burn_bd) || burn_first; used[track] = TRUE; subtitle_add_track(ud, settings, title, track, mux->format, FALSE, FALSE, burn, &one_burned); burn_first &= !burn; } next_track = track + 1; if (behavior == 2) { track = ghb_find_subtitle_track(title, lang, next_track); } else { break; } } } } if (ghb_dict_get_bool(settings, "SubtitleAddCC")) { for (track = 0; track < sub_count; track++) { hb_subtitle_t *subtitle = hb_list_item(title->list_subtitle, track); if (subtitle->source == CC608SUB || subtitle->source == CC708SUB) break; } if (track < sub_count && !used[track]) { used[track] = TRUE; subtitle_add_track(ud, settings, title, track, mux->format, FALSE, FALSE, burn_first, &one_burned); } } g_free(used); }