Adjust htsclient interface slightly to match showtime updates

This commit is contained in:
Andreas Öman 2007-08-18 11:38:42 +00:00
parent c2adc6bde7
commit 52ca361649
3 changed files with 88 additions and 57 deletions

View file

@ -36,6 +36,7 @@
#include "teletext.h"
#include "dispatch.h"
#include "dvb.h"
#include "strtab.h"
struct client_list all_clients;
@ -303,24 +304,6 @@ cr_show(client_t *c, char **argv, int argc)
}
/*
*
*/
static int
cr_channel_reftag(client_t *c, char **argv, int argc)
{
th_channel_t *ch;
if(argc != 1 || (ch = channel_by_index(atoi(argv[0]))) == NULL)
return 1;
cprintf(c, "%u\n", ch->ch_tag);
return 0;
}
/*
*
*/
@ -412,6 +395,23 @@ cr_channel_subscribe(client_t *c, char **argv, int argc)
return 0;
}
/*
*
*/
int
cr_channels_list(client_t *c, char **argv, int argc)
{
th_channel_t *ch;
TAILQ_FOREACH(ch, &channels, ch_global_link)
cprintf(c, "channel = %d\n", ch->ch_index);
return 0;
}
/*
*
*/
@ -441,15 +441,23 @@ cr_streamport(client_t *c, char **argv, int argc)
static int
cr_event_info(client_t *c, char **argv, int argc)
{
event_t *e, *x;
event_t *e = NULL, *x;
uint32_t tag, prev, next;
th_channel_t *ch;
if(argc < 1)
if(argc < 2)
return 1;
epg_lock();
e = epg_event_find_by_tag(atoi(argv[0]));
if(!strcasecmp(argv[0], "tag"))
e = epg_event_find_by_tag(atoi(argv[1]));
if(!strcasecmp(argv[0], "now"))
if((ch = channel_by_index(atoi(argv[1]))) != NULL)
e = epg_event_get_current(ch);
if(!strcasecmp(argv[0], "at") && argc == 3)
if((ch = channel_by_index(atoi(argv[1]))) != NULL)
e = epg_event_find_by_time(ch, atoi(argv[2]));
if(e == NULL) {
epg_unlock();
@ -493,53 +501,38 @@ cr_event_info(client_t *c, char **argv, int argc)
*
*/
static int
cr_event_bytime(client_t *c, char **argv, int argc)
{
th_channel_t *ch;
event_t *e;
if(argc < 2)
return 1;
if((ch = channel_by_index(atoi(argv[0]))) == NULL)
return 1;
epg_lock();
e = epg_event_find_by_time(ch, atoi(argv[1]));
if(e == NULL) {
epg_unlock();
return 1;
}
cprintf(c, "%u\n", e->e_tag);
epg_unlock();
return 0;
}
/*
*
*/
static struct strtab recoptab[] = {
{ "once", RECOP_ONCE },
{ "daily", RECOP_DAILY },
{ "weekly", RECOP_WEEKLY },
{ "cancel", RECOP_CANCEL },
{ "toggle", RECOP_TOGGLE }
};
static int
cr_event_record(client_t *c, char **argv, int argc)
{
event_t *e;
recop_t op;
if(argc < 1)
if(argc < 2)
return 1;
op = str2val(argv[1], recoptab);
printf("op = %d\n", op);
if(op == -1)
return 1;
epg_lock();
e = epg_event_find_by_tag(atoi(argv[0]));
printf("e[%d] = %p\n", atoi(argv[0]), e);
if(e == NULL) {
epg_unlock();
return 1;
}
pvr_add_recording_by_event(e->e_ch, e);
pvr_event_record_op(e->e_ch, e, op);
epg_unlock();
return 0;
@ -626,12 +619,11 @@ const struct {
} cr_cmds[] = {
{ "show", cr_show },
{ "streamport", cr_streamport },
{ "channel.reftag", cr_channel_reftag },
{ "channels.list", cr_channels_list },
{ "channel.info", cr_channel_info },
{ "channel.subscribe", cr_channel_subscribe },
{ "channel.unsubscribe", cr_channel_unsubscribe },
{ "event.info", cr_event_info },
{ "event.bytime", cr_event_bytime },
{ "event.record", cr_event_record },
{ "pvr.getlog", cr_pvr_getlog },
{ "pvr.gettag", cr_pvr_gettag },
@ -809,6 +801,9 @@ client_connect_callback(int events, void *opaque, int fd)
val = 5;
setsockopt(newfd, SOL_TCP, TCP_KEEPCNT, &val, sizeof(val));
val = 1;
setsockopt(newfd, SOL_TCP, TCP_NODELAY, &val, sizeof(val));
c = calloc(1, sizeof(client_t));
c->c_fd = newfd;
c->c_pkt_maxsiz = 188 * 7;

32
pvr.c
View file

@ -258,15 +258,21 @@ pvr_link_pvrr(pvr_rec_t *pvrr)
void
pvr_add_recording_by_event(th_channel_t *ch, event_t *e)
pvr_event_record_op(th_channel_t *ch, event_t *e, recop_t op)
{
time_t start = e->e_start;
time_t stop = e->e_start + e->e_duration;
time_t now;
pvr_rec_t *pvrr;
char buf[100];
time(&now);
event_time_txt(start, e->e_duration, buf, sizeof(buf));
syslog(LOG_NOTICE, "Got recording command %d for %s", op, buf);
if(stop < now)
return;
@ -274,10 +280,32 @@ pvr_add_recording_by_event(th_channel_t *ch, event_t *e)
LIST_FOREACH(pvrr, &pvrr_global_list, pvrr_global_link) {
if(pvrr->pvrr_channel == ch && pvrr->pvrr_start == start &&
pvrr->pvrr_stop == stop) {
pvrr->pvrr_stop == stop)
break;
}
switch(op) {
case RECOP_TOGGLE:
if(pvrr != NULL) {
pvr_unrecord(pvrr);
return;
}
break;
case RECOP_CANCEL:
if(pvrr != NULL)
pvr_unrecord(pvrr);
return;
case RECOP_ONCE:
if(pvrr != NULL)
return;
break;
case RECOP_DAILY:
case RECOP_WEEKLY:
syslog(LOG_ERR,"Recording type not supported yet");
return;
}
pvrr = calloc(1, sizeof(pvr_rec_t));

10
pvr.h
View file

@ -24,9 +24,17 @@ extern pthread_mutex_t pvr_mutex;
extern struct pvr_rec_list pvrr_work_list[PVRR_WORK_MAX];
extern struct pvr_rec_list pvrr_global_list;
typedef enum {
RECOP_TOGGLE,
RECOP_ONCE,
RECOP_DAILY,
RECOP_WEEKLY,
RECOP_CANCEL,
} recop_t;
void pvr_init(void);
void pvr_add_recording_by_event(th_channel_t *ch, event_t *e);
void pvr_event_record_op(th_channel_t *ch, event_t *e, recop_t op);
char pvr_prog_status(event_t *e);