Skip to content

Instantly share code, notes, and snippets.

@krofna
Created November 8, 2014 15:10
Show Gist options
  • Save krofna/3e38c416eb981f43298a to your computer and use it in GitHub Desktop.
Save krofna/3e38c416eb981f43298a to your computer and use it in GitHub Desktop.
Quick hack I was asked to make. Converts & Burns subtitles to movies. NOTE: See line 38
/*
Copyright © 2014 Mislav Blažević <[email protected]>
This work is free. You can redistribute it and/or modify it under the
terms of the Do What The Fuck You Want To Public License, Version 2,
as published by Sam Hocevar. See the COPYING file for more details.
*/
#include <gtk/gtk.h>
#include <vte/vte.h>
GtkWidget *buttonvid, *buttonsub, *term;
pid_t spawn_recode(gchar* subfile)
{
gchar* recode_argv[4];
recode_argv[0] = "recode";
recode_argv[1] = "windows-1250..utf8";
recode_argv[2] = subfile;
recode_argv[3] = NULL;
return vte_terminal_fork_command(VTE_TERMINAL(term), "recode", recode_argv, NULL, NULL, FALSE, FALSE, FALSE);
}
void spawn_ffmpeg(gchar* vidfile, gchar* subfile)
{
gchar* ffmpeg_argv[15];
ffmpeg_argv[0] = "ffmpeg";
ffmpeg_argv[1] = "-i";
ffmpeg_argv[2] = vidfile;
ffmpeg_argv[3] = "-acodec";
ffmpeg_argv[4] = "copy";
ffmpeg_argv[5] = "-vcodec";
ffmpeg_argv[6] = "libx264";
ffmpeg_argv[7] = "-crf";
ffmpeg_argv[8] = "18";
ffmpeg_argv[9] = "-preset";
ffmpeg_argv[10] = "medium";
ffmpeg_argv[11] = "-vf";
ffmpeg_argv[12] = g_strdup_printf("subtitles=%s", subfile);
ffmpeg_argv[13] = "/home/krofna/converted.avi";
ffmpeg_argv[14] = NULL;
vte_terminal_fork_command(VTE_TERMINAL(term), "ffmpeg", ffmpeg_argv, NULL, NULL, FALSE, FALSE, FALSE);
g_free(ffmpeg_argv[12]);
}
void watch_callback(GPid pid, gint status, gpointer user_data)
{
gchar* subfile = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(buttonsub));
gchar* vidfile = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(buttonvid));
spawn_ffmpeg(vidfile, subfile);
}
void magic(bool recode)
{
gchar* subfile = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(buttonsub));
gchar* vidfile = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(buttonvid));
if (!(subfile && vidfile))
goto cleanup;
if (recode)
g_child_watch_add(spawn_recode(subfile), &watch_callback, 0);
else
spawn_ffmpeg(vidfile, subfile);
cleanup:
g_free(subfile);
g_free(vidfile);
}
void conv(GtkWidget* button, void*)
{
magic(true);
}
void burn(GtkWidget* button, void*)
{
magic(false);
}
int main(int argc, char* argv[])
{
GtkWidget* window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Krofnikator");
gtk_container_set_border_width(GTK_CONTAINER(window), 15);
g_signal_connect(window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
GtkWidget* box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
GtkWidget* vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
GtkWidget* labelvid = gtk_label_new("Video");
gtk_box_pack_start(GTK_BOX(box), labelvid, TRUE, TRUE, 5);
buttonvid = gtk_file_chooser_button_new(0, GTK_FILE_CHOOSER_ACTION_OPEN);
gtk_widget_set_size_request(buttonvid, 200, 30);
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(buttonvid), "/home/dunja");
gtk_box_pack_start(GTK_BOX(box), buttonvid, TRUE, TRUE, 5);
GtkWidget* labelsub = gtk_label_new("Subtitles");
gtk_box_pack_start(GTK_BOX(box), labelsub, TRUE, TRUE, 5);
buttonsub = gtk_file_chooser_button_new(0, GTK_FILE_CHOOSER_ACTION_OPEN);
gtk_widget_set_size_request(buttonsub, 200, 30);
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(buttonsub), "/home/dunja");
gtk_box_pack_start(GTK_BOX(box), buttonsub, TRUE, TRUE, 5);
GtkWidget* buttonconv = gtk_button_new_with_label("Convert & Burn");
g_signal_connect(buttonconv, "clicked", G_CALLBACK(conv), 0);
gtk_box_pack_start(GTK_BOX(box), buttonconv, TRUE, TRUE, 5);
GtkWidget* buttonburn = gtk_button_new_with_label("Burn");
g_signal_connect(buttonburn, "clicked", G_CALLBACK(burn), 0);
gtk_box_pack_start(GTK_BOX(box), buttonburn, TRUE, TRUE, 5);
term = vte_terminal_new();
gtk_box_pack_start(GTK_BOX(vbox), box, TRUE, TRUE, 5);
gtk_box_pack_start(GTK_BOX(vbox), term, TRUE, TRUE, 5);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment