OSDN Git Service

RTMP to VLC
[porridge/main.git] / gui.c
1 #include <gtk/gtk.h>
2
3 #include <stdio.h>
4 #include <string.h>
5 #include <stdlib.h>
6 #include <signal.h>
7
8 #include "http.h"
9 #include "cookie.h"
10 #include "chrome.h"
11 #include "playerstatus.h"
12
13 #include "nicolive_comment.h"
14 #include "rtmpstream.h"
15
16 GtkWidget *comment_view;
17
18 typedef struct {
19     gint no;
20     gchar *user;
21     gboolean premium;
22     gchar *comment;
23 } Comment;
24
25 enum
26 {
27     COMMENT_NO,
28     USER,
29     PREMIUM,
30     COMMENT,
31     N_COLUMNS
32 };
33
34 CHAT_INFO *info;
35
36 int comment_callback(CHAT_COMMENT* cmt, void *data)
37 {
38 //    printf("[%d-%s] %s\n",(*cmt).no,(*cmt).user_id,(*cmt).contents);
39     GtkListStore *store;
40     GtkTreeIter iter;
41     
42     
43     
44     store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(comment_view)));
45     
46     gtk_list_store_append(store, &iter);
47     gtk_list_store_set(store, &iter,
48                        COMMENT_NO, (*cmt).no,
49                        USER, (*cmt).user_id,
50                        PREMIUM, TRUE,
51                        COMMENT, (*cmt).contents,
52                        -1);//例外発生箇所
53 }
54
55 static void
56 send (GtkWidget *widget,
57          gpointer   data)
58 {
59     nicolive_comment_send( info, (char*) gtk_entry_get_text(GTK_ENTRY(data)));
60     //printf("[SEND] %s\n", );
61 }
62
63 static void
64 connect (GtkWidget *widget,
65              gpointer   data)
66 {
67     const char* host = "watch.live.nicovideo.jp";
68     /*const*/ char path[64] = "/api/getplayerstatus?v="; //34文字かな?余裕を持って64。
69
70     strcat(path, (char*) gtk_entry_get_text(GTK_ENTRY(data)));
71
72     
73     char * user_session = get_user_session(0);
74     char usr_s_cookie[128] = "user_session=";
75     strcat(usr_s_cookie, user_session);
76     
77     HTTP *session = http_open(host, path, 80);
78     
79     http_request(session, HTTP_GET, usr_s_cookie, "Mozilla/5.0", 0);
80     
81     //http_retrieve(session);
82     char* header;
83     char* contents;
84     
85     //領域確保
86     header = (char *)malloc(sizeof(char) * 1024);
87     contents = (char *)malloc(sizeof(char) * 8192);
88     
89     http_retrieve_text(session, header, contents);
90     
91     http_close(session);
92     
93     //    printf("HTTP done\n");
94     
95     NICO_LIVE *broadcast = new_nico_live(contents);
96     
97     //
98     
99     printf("放送タイトル:%s\n説明:%s\n放送主:%s\n",(*broadcast).title,(*broadcast).description,(*broadcast).owner_name);
100     //printf("コメ鯖:%s\nポート:%d\nスレッド:%d\n",(*broadcast).msg_addr,(*broadcast).msg_port,(*broadcast).thread);
101     
102     /*外部プレーヤー*/
103     
104     RtmpStream* stream = n_RtmpStream(broadcast->url, broadcast->contents, broadcast->ticket);
105     open_Stream(stream);
106     
107     //一旦クリア
108     memset(path, 0, sizeof(char)*64);
109     memset(header, 0, malloc_size(header));
110     memset(contents, 0, malloc_size(contents));
111     //
112     
113     info = nicolive_comment_open((*broadcast).msg_addr, (*broadcast).msg_port, (*broadcast).thread, comment_callback, broadcast);
114     
115     
116     sprintf(path, "/api/getpostkey?thread=%d&block_no=%d", (*broadcast).thread, 1);
117     
118     session = http_open("live.nicovideo.jp", path, 80);
119     http_request(session, HTTP_GET, usr_s_cookie, "Mozilla/5.0", 0);
120     http_retrieve_text(session, header, contents);
121     
122     printf("%s\n", contents + 8);
123     (*info).postkey = contents + 8;
124     http_close(session);
125     
126
127 //    d_RtmpStream(stream);
128     
129  /*   sleep(1000);
130     
131     nicolive_comment_close(info);
132     
133     
134     nico_live_close(broadcast);
135     
136     free(header);
137     free(contents);
138  */
139     //接続後はボタン無効
140     gtk_widget_set_sensitive(widget, FALSE);
141
142 }
143
144
145 static GtkTreeViewColumn*
146 create_column(gint column_id, gchar *title, gboolean is_checkbox)
147 {
148     GtkCellRenderer *renderer;
149     GtkTreeViewColumn *column;
150     gchar *data_attrname;
151     
152     if (is_checkbox) {
153         renderer = gtk_cell_renderer_toggle_new();
154         data_attrname = "active";
155     }
156     else {
157         renderer = gtk_cell_renderer_text_new();
158         data_attrname = "text";
159     }
160     column = gtk_tree_view_column_new_with_attributes(title, renderer,
161                                                       data_attrname, column_id, NULL);
162     gtk_tree_view_column_set_sort_indicator(column, TRUE);
163     gtk_tree_view_column_set_sort_column_id(column, column_id);
164     
165     return column;
166 }
167
168 static GtkWidget*
169 create_comment_list_view(GtkListStore *store)
170 {
171     GtkWidget *list_view;
172     GtkTreeViewColumn *column;
173     
174     list_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
175     
176     column = create_column(COMMENT_NO, "コメ番", FALSE);
177     gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);
178     column = create_column(USER, "ユーザ", FALSE);
179     gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);
180     column = create_column(PREMIUM, "P", TRUE);
181     gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);
182     column = create_column(COMMENT, "コメント", FALSE);
183     gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);
184     
185     return list_view;
186 }
187
188 int
189 main(int argc, char *argv[])
190 {
191     GtkWidget *window, *scrolled_win;
192     GtkListStore *store;
193     
194     GtkWidget *hbox_initial_connect;
195     GtkWidget *button_connect;
196     GtkWidget *textbox_live_id;
197     GtkWidget *vbox;
198     GtkWidget *hbox_comment;
199     GtkWidget *button_send;
200     GtkWidget *textbox_comment;
201     
202     gtk_init(&argc, &argv);
203     
204     //ignore abort 6
205     signal(SIGABRT, SIG_IGN);
206     signal(SIGSEGV, SIG_IGN);
207     
208     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
209     gtk_window_set_title(GTK_WINDOW(window), "ぱぁりっぢ+遞信機 α1");
210     // ウィンドウのx押されたらプログラム終了
211     g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
212     
213     /* box作成 */
214     vbox = gtk_vbox_new(FALSE, 3);
215     gtk_container_add(GTK_CONTAINER(window), vbox);
216
217     
218 //放送ID入力部
219     hbox_initial_connect = gtk_hbox_new(FALSE, 2);
220     gtk_box_pack_start(GTK_BOX(vbox), hbox_initial_connect, TRUE, TRUE, 0);
221
222     textbox_live_id = gtk_entry_new ();
223     gtk_box_pack_start(GTK_BOX(hbox_initial_connect), textbox_live_id, TRUE, TRUE, 0);
224
225     //接続ボタン
226     button_connect = gtk_button_new_with_label ("接続");
227     g_signal_connect (button_connect, "clicked", G_CALLBACK (connect), textbox_live_id);
228     gtk_box_pack_start(GTK_BOX(hbox_initial_connect), button_connect, TRUE, FALSE, 0);
229 //放送ID入力部 おしまい
230     
231 //コメビュ部
232     scrolled_win = gtk_scrolled_window_new (NULL, NULL);
233     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
234                                     GTK_POLICY_AUTOMATIC,
235                                     GTK_POLICY_AUTOMATIC);
236     gtk_widget_set_usize (scrolled_win, 512, 384);
237     gtk_box_pack_start(GTK_BOX(vbox), scrolled_win, TRUE, TRUE, 0);
238
239     
240     store = gtk_list_store_new(N_COLUMNS, G_TYPE_INT, G_TYPE_STRING,
241                                G_TYPE_BOOLEAN, G_TYPE_STRING);
242     comment_view = create_comment_list_view(store);
243     
244     gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW(scrolled_win),
245                                            comment_view);
246 //コメビュ部 おしまい
247     
248     
249     //放送ID入力部
250     hbox_comment = gtk_hbox_new(FALSE, 2);
251     gtk_box_pack_start(GTK_BOX(vbox), hbox_comment, TRUE, TRUE, 0);
252     
253     textbox_comment = gtk_entry_new ();
254     gtk_box_pack_start(GTK_BOX(hbox_comment), textbox_comment, TRUE, TRUE, 0);
255     
256     //接続ボタン
257     button_send = gtk_button_new_with_label ("送信");
258     g_signal_connect (button_send, "clicked", G_CALLBACK (send), textbox_comment);
259     gtk_box_pack_start(GTK_BOX(hbox_comment), button_send, TRUE, FALSE, 0);
260     //放送ID入力部 おしまい
261     
262
263     gtk_widget_show_all(window);
264     gtk_main();
265     return 0;
266 }