OSDN Git Service

RTMP to VLC
[porridge/main.git] / playerstatus.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <libxml/xmlreader.h>
5
6 #include "playerstatus.h"
7
8 #if 0
9 static int readfile(char *contents)
10 {
11     FILE *fp;
12     char *fname = "/Users/yoshi/Downloads/getplayerstatus.xml";
13     char s[100];
14     
15     fp = fopen( fname, "r" );
16     if( fp == NULL ){
17         printf( "%sファイルが開けません\n", fname );
18         return -1;
19     }
20     
21     printf( "\n-- fgets() --\n" );
22     while( fgets( s, 100, fp ) != NULL ){
23         strcat(contents, s);
24     }
25     printf( "\n-- fgets() done --\n" );
26     fclose( fp );
27     return 0;
28 }
29 #endif
30
31
32
33
34 //  現在パース中のノード名
35 typedef enum {
36     STATE_NONE,
37     STATE_GETPLAYERSTATUS,//getplayerstatus
38     STATE_ERROR,//error
39     STATE_TITLE,//title
40     STATE_DESCRIPTION,//description
41     STATE_PROVIDER_TYPE,//provider_type
42     STATE_COMMUNITY,//default_community
43     STATE_IS_OWNER,//is_owner
44     STATE_OWNER,//owner_id
45     STATE_OWNER_NAME,//owner_name
46     STATE_IS_RESERVED,//is_reserved 予約枠
47     STATE_START_TIME,//start_time
48     STATE_END_TIME,//end_time
49     STATE_CONTENTS,//contents
50     STATE_RTMP,//rtmp
51     STATE_URL,//url
52     STATE_TICKET,//ticket
53     STATE_MS,//ms
54     STATE_ADDR,//addr コメ鯖
55     STATE_PORT,//port ポート
56     STATE_THREAD,//thread
57     STATE_USER_ID,
58     STATE_IS_PREMIUM
59 } parsingStatus;
60
61
62 //  1つのノードを処理する
63 void processNode(xmlTextReaderPtr reader, NICO_LIVE* session)
64 {
65     static parsingStatus state = STATE_NONE;
66     xmlElementType nodeType;
67     xmlChar *name, *value;
68     
69     //  ノード情報の取得
70     nodeType = xmlTextReaderNodeType(reader);       //  ノードタイプ
71     name = xmlTextReaderName(reader);               //  ノード名
72     if (!name)
73         name = xmlStrdup(BAD_CAST "---");
74     //printf("Node name:%s\n", name);
75     if (nodeType == XML_READER_TYPE_ELEMENT) {              //  開始
76         if ( xmlStrcmp(name, BAD_CAST "getplayerstatus") == 0 ) {
77             state = STATE_GETPLAYERSTATUS;
78         } else if ( xmlStrcmp(name, BAD_CAST "title") == 0 ) {
79             state = STATE_TITLE;
80         } else if ( xmlStrcmp(name, BAD_CAST "description") == 0 ) {
81             state = STATE_DESCRIPTION;
82         } else if ( xmlStrcmp(name, BAD_CAST "provider_type") == 0 ) {
83             state = STATE_PROVIDER_TYPE;
84         } else if ( xmlStrcmp(name, BAD_CAST "default_community") == 0 ) {
85             state = STATE_COMMUNITY;
86         } else if ( xmlStrcmp(name, BAD_CAST "is_owner") == 0 ) {
87             state = STATE_IS_OWNER;
88         } else if ( xmlStrcmp(name, BAD_CAST "owner_id") == 0 ) {
89             state = STATE_OWNER;
90         } else if ( xmlStrcmp(name, BAD_CAST "owner_name") == 0 ) {
91             state = STATE_OWNER_NAME;
92         } else if ( xmlStrcmp(name, BAD_CAST "is_reserved") == 0 ) {
93             state = STATE_IS_RESERVED;
94         } else if ( xmlStrcmp(name, BAD_CAST "start_time") == 0 ) {
95             state = STATE_START_TIME;
96         } else if ( xmlStrcmp(name, BAD_CAST "end_time") == 0 ) {
97             state = STATE_END_TIME;
98         } else if ( xmlStrcmp(name, BAD_CAST "contents") == 0 ) {
99             state = STATE_CONTENTS;
100         } else if ( xmlStrcmp(name, BAD_CAST "rtmp") == 0 ) {
101             state = STATE_RTMP;
102         } else if ( xmlStrcmp(name, BAD_CAST "url") == 0 ) {
103             state = STATE_URL;
104         } else if ( xmlStrcmp(name, BAD_CAST "ticket") == 0 ) {
105             state = STATE_TICKET;
106         } else if ( xmlStrcmp(name, BAD_CAST "ms") == 0 ) {
107             state = STATE_MS;
108         } else if ( xmlStrcmp(name, BAD_CAST "addr") == 0 ) {
109             state = STATE_ADDR;
110         } else if ( xmlStrcmp(name, BAD_CAST "port") == 0 ) {
111             state = STATE_PORT;
112         } else if ( xmlStrcmp(name, BAD_CAST "thread") == 0 ) {
113             state = STATE_THREAD;
114         } else if ( xmlStrcmp(name, BAD_CAST "user_id") == 0 ) {
115             state = STATE_USER_ID;
116         } else if ( xmlStrcmp(name, BAD_CAST "is_premium") == 0 ) {
117             state = STATE_IS_PREMIUM;
118         }
119         
120     } else if (nodeType == XML_READER_TYPE_END_ELEMENT) {   //  終了
121         if ( xmlStrcmp(name, BAD_CAST "getplayerstatus") == 0 ) {
122             printf("-----------------------\n");
123         }
124
125         state = STATE_NONE;
126         
127     } else if (nodeType == XML_READER_TYPE_TEXT) {          //  テキスト
128         //  テキストを取得する
129         value = xmlTextReaderValue(reader);
130         
131         if (!value)
132             value = xmlStrdup(BAD_CAST "---");
133         
134         if ( state == STATE_ERROR ) {/////////// ToDo: switch-caseに書き換え
135             printf("[ERROR] Reason: %s\n", value);
136             return;
137         } else if ( state == STATE_TITLE ) {
138             //printf("STATE_TITLE: %s\n", value);
139             (*session).title = (char*)malloc( strlen(value) + 1 );
140             strcpy((*session).title, (const char *)value);
141         } else if ( state == STATE_DESCRIPTION ) {
142             //printf("STATE_DESCRIPTION: %s\n", value);
143             (*session).description = (char*)malloc( strlen(value) + 1 );
144             strcpy((*session).description, (const char *)value);
145         } else if ( state == STATE_PROVIDER_TYPE ) {
146             // "official" "community"
147             //printf("STATE_PROVIDER_TYPE: %s\n", value);
148             (*session).provider_type = (char*)malloc( strlen(value) + 1 );
149             strcpy((*session).provider_type, (const char *)value);
150         } else if ( state == STATE_COMMUNITY ) {
151             //owner_id
152             //(*session).owner_id = (char*)malloc( strlen(value) + 1 );
153             //strcpy((*session).owner_id, (const char *)value);
154         } else if ( state == STATE_IS_OWNER ) {
155             //printf("STATE_IS_OWNER: %s\n", value);
156             (*session).is_owner = value[0] - '0';
157         } else if ( state == STATE_OWNER ) {
158             //
159         } else if ( state == STATE_OWNER_NAME ) {
160             //printf("STATE_OWNER_NAME: %s\n", value);
161             (*session).owner_name = (char*)malloc( strlen(value) + 1 );
162             strcpy((*session).owner_name, (const char *)value);
163         } else if ( state == STATE_IS_RESERVED ) {
164             //
165         } else if ( state == STATE_START_TIME ) {
166             //
167         } else if ( state == STATE_END_TIME ) {
168             //
169         } else if ( state == STATE_CONTENTS ) {
170             //printf("N: %s\n", value);
171             (*session).contents = (char*)malloc( strlen(value) + 1 - 5);
172             strcpy((*session).contents, (const char *)value + 5);
173         } else if ( state == STATE_RTMP ) {
174             //
175         } else if ( state == STATE_URL ) {
176             //printf("STATE_URL: %s\n", value);
177             (*session).url = (char*)malloc( strlen(value) + 1 );
178             strcpy((*session).url, (const char *)value);
179         } else if ( state == STATE_TICKET ) {
180             //printf("STATE_TICKET: %s\n", value);
181             (*session).ticket = (char*)malloc( strlen(value) + 1 );
182             strcpy((*session).ticket, (const char *)value);
183         } else if ( state == STATE_MS ) {
184             //
185         } else if ( state == STATE_ADDR ) {
186             //printf("STATE_ADDR: %s\n", value);
187             (*session).msg_addr = (char*)malloc( strlen(value) + 1 );
188             strcpy((*session).msg_addr, (const char *)value);
189         } else if ( state == STATE_PORT ) {
190             //printf("STATE_PORT: %s\n", value);
191             sscanf((const char *)value,"%d",&((*session).msg_port));
192         } else if ( state == STATE_THREAD ) {
193             //printf("STATE_THREAD: %s\n", value);
194             //(*session).thread = (char*)malloc( strlen(value) + 1 );
195             sscanf((const char *)value,"%d",&((*session).thread));
196         } else if ( state == STATE_USER_ID ) {
197             printf("USER ID = %s\n",value);
198             (*session).user_id = (char*)malloc( strlen(value) + 1 );
199             strcpy((*session).user_id, (const char *)value);
200         } else if ( state == STATE_IS_PREMIUM ) {
201             //printf("Premium = %s\n",(value[0]=='1')?"yes":"no");
202             (*session).is_premium = (value[0]=='1');
203         }
204        
205         xmlFree(value);
206     }
207     
208     xmlFree(name);
209 }
210
211 NICO_LIVE *new_nico_live(char* playerstatus)
212 {
213     
214     xmlTextReaderPtr reader;
215     int ret;
216     NICO_LIVE *session = (NICO_LIVE*)malloc( sizeof(NICO_LIVE) );
217     
218     //  Readerの作成
219     reader = xmlReaderForDoc((xmlChar*)playerstatus, NULL, NULL, 1);
220     if ( !reader ) {
221         printf("Failed to open XML\n");
222         return (NICO_LIVE*)-1;
223     }
224     
225     
226     //  次のノードに移動
227     ret = xmlTextReaderRead(reader);
228     while (ret == 1) {
229         //  現在のノードを処理
230         processNode(reader, session);
231         
232         //  次のノードに移動
233         ret = xmlTextReaderRead(reader);
234     }
235     
236     //  Reader のすべてのリソースを開放
237     xmlFreeTextReader(reader);
238     
239     //  xmlTextReaderRead の戻り値が -1 だった場合はパースエラー
240     if (ret == -1) {
241         printf("Parse error.\n");
242         return (NICO_LIVE*)-1;
243     }
244     
245     return session;
246     
247 }
248
249 int nico_live_close(NICO_LIVE* broadcast)
250 {
251     free(broadcast);
252     return 0;
253 }
254
255 #if 0
256 int main (int argc, char *argv[])
257 {
258     char* contents = (char *)malloc(sizeof(char) * 8192);
259     
260     readfile(contents);
261     
262     // XML処理
263
264     NICO_LIVE *broadcast = new_nico_live(contents);
265     
266  //
267     printf("放送タイトル:%s\n説明:%s\n放送主:%s\n",(*broadcast).title,(*broadcast).description,(*broadcast).owner_name);
268     printf("コメ鯖:%s\nポート:%d\nスレッド:%d\n",(*broadcast).msg_addr,(*broadcast).msg_port,(*broadcast).thread);
269     
270     nico_live_close(broadcast);
271     
272     // XML処理完了
273     
274     free(contents);
275     
276     return 0;
277 }
278 #endif