source: titan/titan/stream.h

Last change on this file was 46584, checked in by aafsvn, 9 months ago

fix stream_zapping

File size: 10.5 KB
Line 
1#ifndef STREAM_H
2#define STREAM_H
3
4void screenstreaming()
5{
6        int count = 0;
7        char* tmpstr = NULL;
8        struct service* servicenode = service;
9        struct menulist* mlist = NULL, *mbox = NULL;
10
11        while(servicenode != NULL)
12        {
13                if(servicenode->type == RECORDSTREAM && servicenode->recname != NULL)
14                {
15                        tmpstr = ostrcat(tmpstr, _("stop"), 1, 0);
16                        tmpstr = ostrcat(tmpstr, " ", 1, 0);
17                        tmpstr = ostrcat(tmpstr, servicenode->recname, 1, 0);
18                        tmpstr = ostrcat(tmpstr, " (", 1, 0);
19                        if(servicenode->channel != NULL && servicenode->channel->name != NULL)
20                                tmpstr = ostrcat(tmpstr, servicenode->channel->name, 1, 0);
21                        else
22                                tmpstr = ostrcat(tmpstr, _("unknown"), 1, 0);
23                        tmpstr = ostrcat(tmpstr, ")", 1, 0);
24
25                        count++;
26                        addmenulist(&mlist, tmpstr, NULL, NULL, 0, 0);
27                        free(tmpstr); tmpstr = NULL;
28                }
29                servicenode = servicenode->next;
30        }
31
32        if(count == 0)
33                textbox(_("Message"), _("No Live Stream running"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0);
34        else
35        {
36                mbox = menulistbox(mlist, "menulist", _("Streaming"), _("Choose your Streaming link from the following list"), NULL, NULL, 0, 0);
37                if(mbox != NULL && ostrstr(mbox->name, _("stop")) == mbox->name)
38                {
39                        servicenode = getrecordbyname(mbox->name, RECORDSTREAM);
40                        if(servicenode != NULL)
41                                servicenode->recendtime = 1;
42                }
43        }
44
45        freemenulist(mlist, 1); mlist = NULL;
46}
47
48void streamthreadfunc(struct stimerthread* timernode)
49{
50        struct timeval timeout;
51        fd_set rfds;
52        int ret = 0, streamfd = -1, connfd = -1, filefd = -1, serviceid = 0, zap = 0;
53        uint64_t transponderid = 0;
54        unsigned char* buf = NULL;
55        char* tmpstr = NULL, *filename = NULL;
56        struct channel* chnode = NULL;
57
58        debug(250, "Starting Stream thread");
59
60        while(timernode->aktion != STOP)
61        {
62                if(streamfd < 0)
63                {
64                        sockportcreate(&streamfd, getconfigint("stream_port", NULL), 5);
65                        if(streamfd < 0) break;
66
67                        //set nonblocking
68                        fcntl(streamfd, F_SETFL, fcntl(streamfd, F_GETFL) | O_NONBLOCK);
69                }
70
71                timeout.tv_sec = 1;
72                timeout.tv_usec = 0;
73                FD_ZERO(&rfds);
74                FD_SET(streamfd, &rfds);
75
76                ret = TEMP_FAILURE_RETRY(select(streamfd + 1, &rfds , NULL, NULL, &timeout));
77
78                if(ret < 0)
79                {
80                        perr("stream listen socket fd=%d", streamfd);
81                        sleep(1);
82                        continue;
83                }
84                if(ret == 0) continue; //timeout
85
86                if(FD_ISSET(streamfd, &rfds))
87                {
88                        connfd = sockaccept(&streamfd, 1);
89                        if(connfd < 0) continue;
90                        debug(250, "accept stream connection connfd=%d", connfd);
91
92                        buf = calloc(1, MINMALLOC);
93                        if(buf == NULL)
94                        {
95                                err("no mem");
96                                sockclose(&connfd);
97                                continue;
98                        }
99
100                        debug(250, "get client data");
101
102                        //read one line
103                        unsigned char* pbuf = buf;
104                        while(pbuf - buf < MINMALLOC)
105                        {
106                                unsigned char c;
107
108                                ret = sockreceive(&connfd, &c, 1, 5000 * 1000);
109                                if(ret != 0)
110                                {
111                                        err("no client data in buffer");
112                                        break;
113                                }
114
115                                *pbuf = c;
116                                if(c == '\n') break;
117                                pbuf++;
118                        }
119
120                        if(buf != NULL)
121                                tmpstr = ostrstr((char*)buf, "GET /");
122
123                        if(tmpstr != NULL)
124                        {
125                                tmpstr += 5;
126
127                                filename = malloc(512);
128                                if(filename == NULL)
129                                {
130                                        err("no mem");
131                                        sockclose(&connfd);
132                                        free(buf); buf = NULL;
133                                        tmpstr = NULL;
134                                        continue;
135                                }
136                                memset(filename, 0, 512);
137
138                                ret = sscanf(tmpstr, "%d,%llu,%s", &serviceid, &transponderid, filename);
139                                if(ret < 2)
140                                        ret = sscanf(tmpstr, "%d%%2c%llu%%2c%s", &serviceid, &transponderid, filename);
141                                if(ret == 2 || ret == 3)
142                                {
143                                        if(ret == 2)
144                                        {
145                                                debug(250, "stream serviceid = %d, transponderid = %llu", serviceid, transponderid);
146                                                chnode = getchannel(serviceid, transponderid);
147
148                                                zap = 0;
149                                                if(ostrncmp("http://127.0.0.1:17999/", chnode->streamurl, 23) == 0)
150                                                {
151                                                        if(fegetfree(chnode->transponder, 2, NULL, chnode) == NULL)
152                                                        {
153                                                                printf("kein freier Tuner... zwangszap\n");
154                                                                servicecheckret(servicestart(chnode, NULL, NULL, 5), 0);
155                                                                zap = 1;
156                                                        }
157                                                }
158                                                if(status.aktservice->channel != chnode && getconfigint("stream_zapping", NULL) == 1 && zap == 0)
159                                                        servicecheckret(servicestart(chnode, NULL, NULL, 5), 0);
160#ifndef MIPSEL
161                                                ret = recordstart(chnode, -1, connfd, RECSTREAM, 0, NULL);
162#else
163                                                if(status.webencode == 0)
164                                                        ret = recordstart(chnode, -1, connfd, RECSTREAM, 0, NULL);
165                                                else
166                                                {
167                                                                status.webencode = 0;
168                                                                ret = recordstartencode(chnode, -1, connfd, RECSTREAMENC, 0, NULL,      0, 0, 0, 0, 0, 0);
169                                                }
170#endif
171                                        }
172                                        if(ret == 3)
173                                        {
174                                                htmldecode(filename, filename);
175                                                debug(250, "stream filename=%s", filename);
176                                                if(filename != NULL && ostrstr(filename, getconfig("rec_streampath", NULL)) != filename)
177                                                {
178                                                        filename = ostrcat("/", filename, 0, 1);
179                                                        filename = ostrcat(getconfig("rec_streampath", NULL), filename, 0, 1);
180                                                }
181                                                filefd = open(filename, O_RDONLY | O_LARGEFILE);
182                                                if(filefd > -1)
183                                                        ret = recordstart(NULL, filefd, connfd, RECSTREAM, 0, NULL);
184                                                else
185                                                {
186                                                        perr("open stream filename=%s", filename);
187                                                        socksend(&connfd, (unsigned char*)"HTTP/1.1 500 \"open file\"\r\n\r\n", 28, 5000 * 1000);
188                                                        sockclose(&connfd);
189                                                        free(buf); buf = NULL;
190                                                        free(filename); filename = NULL;
191                                                        tmpstr = NULL;
192                                                        continue;
193                                                }
194                                        }
195                                        if(ret != 0)
196                                        {
197                                                char* retstr = recordcheckret(NULL, ret, 12);
198                                                retstr = ostrcat("-", retstr, 0, 1);
199                                                retstr = ostrcat(oitoa(ret), retstr, 1, 1);
200                                                retstr = ostrcat("HTTP/1.1 500 \"", retstr, 0, 1);
201                                                retstr = ostrcat(retstr, "\"\r\n\r\n", 1, 0);
202                                                socksend(&connfd, (unsigned char*)retstr, strlen(retstr), 5000 * 1000);
203                                                free(retstr); retstr = NULL;
204                                                sockclose(&connfd);
205                                                free(buf); buf = NULL;
206                                                free(filename); filename = NULL;
207                                                tmpstr = NULL;
208                                                continue;
209                                        }
210                                        debug(250, "sende OK response to client");
211                                        ret = socksend(&connfd, (unsigned char*)"HTTP/1.1 200 OK\r\nServer: stream (ts)\r\n\r\n", 40, 5000 * 1000);
212                                        if(ret != 0)
213                                        {
214                                                sockclose(&connfd);
215                                                free(buf); buf = NULL;
216                                                free(filename); filename = NULL;
217                                                tmpstr = NULL;
218                                                continue;
219                                        }
220                                }
221                                else
222                                {
223                                        err("bad response from client");
224                                        sockclose(&connfd);
225                                        free(buf); buf = NULL;
226                                        free(filename); filename = NULL;
227                                        tmpstr = NULL;
228                                        continue;
229                                }
230                        }
231                        else
232                        {
233                                err("bad response from client");
234                                sockclose(&connfd);
235                                free(buf); buf = NULL;
236                                tmpstr = NULL;
237                                continue;
238                        }
239
240                        free(buf); buf = NULL;
241                        free(filename); filename = NULL;
242                        tmpstr = NULL;
243                }
244        }
245        debug(250, "Stopping stream thread");
246        sockclose(&streamfd);
247        return;
248}
249
250int streamrecordrun(struct stimerthread* timernode, struct service* servicenode, char* link)
251{   
252        char* cmd = NULL;
253        char* token;
254        char* token2;
255        char* ret = NULL;
256
257        ret = strstr(link, "|User-Agent=");
258        if(ret != NULL)
259        {
260                ret = ret + 12;
261                token2 = strtok( ret, "&" );
262                printf("Token2: %s\n", token2);
263                token = strtok( link, "|" );
264                printf("Token: %s\n", token);
265        }
266         
267        struct sigaction sigchld_action = {
268                .sa_handler = SIG_DFL,
269                .sa_flags = SA_NOCLDWAIT
270        };
271        sigaction( SIGCHLD, &sigchld_action, NULL ) ;
272
273        debug(250, "start streamrecordrun");
274
275        int pid = fork() ;
276        if( pid < 0 )
277        {
278                printf( "Fork failed\n" ) ;
279                return 1 ;
280        }
281        //------------------------------Child process----------------------------------------------------------------           
282        debug(250, "start PID: %d",pid);
283        if( pid == 0 )
284        {
285                debug(250, "link: %s", link);
286                debug(250, "recname: %s", servicenode->recname);
287
288                while( 1 )
289                {
290                        if(ret == NULL)
291                        {
292//                              string_remove_whitechars(link);                         
293                                link = string_replace_all(" ", "%20", link, 1);
294                                debug(250, "found streamrelay link: %s", link);
295                                execl("/usr/bin/curl", "curl", link, "-o", servicenode->recname, NULL);
296                        }
297                        else
298                        {
299                                debug(250, "found vavoo");
300                                debug(250, "found vavoo token: %s", token);
301                                debug(250, "found vavoo token2: %s", token2);
302                                execl("/usr/bin/curl", "curl", token, "-A", token2, "-o", servicenode->recname, NULL);
303                        }
304                        debug(250, "ERROR start curl");
305                        break;
306                }
307                return -1 ;
308        }
309        //-------------------------------Parent process---------------------------------------------------------------
310        printf( "Main program\n" ) ;
311        while(timernode->aktion != STOP && servicenode->recendtime != 2)
312        {
313                if(servicenode->recendtime > 2 && servicenode->recendtime < time(NULL)) break;
314                sleep(1);
315        }
316
317        printf( "\nKilling record\n" ) ;
318        debug(250, "kill PID: %d",pid);
319        kill( pid, SIGTERM ) ;
320        free(cmd), cmd = NULL;
321        if(servicenode->type == RECORDTIMER)
322        {
323                sleep(3);  //waiting for the decryption process to finish
324                recordstop(servicenode, 0);
325        }
326        else
327        {
328                delservice(servicenode, 0);
329                status.recording--;
330        }
331        debug(250, "ende streamrecordrun");
332        return 0 ;
333}
334
335
336int streamrecord(int art, struct channel* chnode, int type, time_t endtime, struct rectimer* rectimernode)
337{
338        char* path = NULL, *chname = NULL, *filename = NULL, *moviename = NULL, *link = NULL;
339        struct epg* epgnode = NULL;
340        struct service* servicenode = NULL;
341       
342        link = chnode->streamurl;
343       
344        if(rectimernode == NULL)
345        {
346                path = getconfig("rec_path", NULL);
347                if(chnode != NULL)
348                {
349                        chname = strstrip(chnode->name);
350                        delspezchar(chname, 2);
351                }
352                epgnode = getepgbytime(status.aktservice->channel, time(NULL) + 60);
353                if(epgnode != NULL)
354                {
355                        moviename = strstrip(epgnode->title);
356                        delspezchar(moviename, 2);
357                }
358        }
359        else
360        {
361                if(rectimernode != NULL && rectimernode->recpath != NULL)
362                        path = rectimernode->recpath;
363                else
364                        path = getconfig("rec_timerpath", NULL);
365                if(chnode != NULL)
366                {
367                        chname = strstrip(chnode->name);
368                        delspezchar(chname, 2);
369                }
370                if(rectimernode != NULL && rectimernode->name != NULL)
371                {
372                        moviename = strstrip(rectimernode->name);
373                        delspezchar(moviename, 2);
374                }
375        }
376        filename = recordcreatefilename(path, chname, moviename, RECORDSTREAM);
377        servicenode = addservice(NULL);
378        if(rectimernode != NULL) rectimernode->servicenode = servicenode;
379        servicenode->recname = ostrcat(filename, NULL, 0, 0);
380        servicenode->type = type;
381       
382        if(art == 1)
383        {
384                debug(250, "start record.. stop after current event");
385                servicenode->recendtime = endtime;
386                servicenode->reccount = 1;
387                status.recording++;
388                addtimer(&streamrecordrun, START, 1000, 1, (void*)servicenode, (void*)link, NULL);
389        }
390        else if(art == 2)
391        {
392                debug(250, "start record.. direct");
393                servicenode->recendtime = 1;
394                status.recording++;
395                addtimer(&streamrecordrun, START, 1000, 1, (void*)servicenode, (void*)link, NULL);
396        }
397        else if(art == 3)
398        {
399                debug(250, "start record.. enter duration");
400                servicenode->recendtime = endtime;
401                servicenode->reccount = 1;
402                status.recording++;
403                addtimer(&streamrecordrun, START, 1000, 1, (void*)servicenode, (void*)link, NULL);
404        }
405               
406        return 0;
407}
408
409
410
411#endif
Note: See TracBrowser for help on using the repository browser.