Changeset 4332
- Timestamp:
- 03/16/10 20:54:45 (6 months ago)
- Location:
- trunk/tvheadend
- Files:
-
- 8 modified
-
debian/changelog (modified) (1 diff)
-
src/dvr/dvr.h (modified) (4 diffs)
-
src/dvr/dvr_autorec.c (modified) (11 diffs)
-
src/dvr/dvr_db.c (modified) (9 diffs)
-
src/epg.c (modified) (2 diffs)
-
src/htsp.c (modified) (1 diff)
-
src/webui/extjs.c (modified) (2 diffs)
-
src/webui/simpleui.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/tvheadend/debian/changelog
r4274 r4332 8 8 written to disk as Tvheadend tunes to it. This should aid a lot when 9 9 it comes to debugging 10 11 * Inject entries in DVR schedule as soon as we know about an EPG 12 entry that matches an autorecording rule. Previously Tvheadend 13 would scan the EPG continously and just grab shows as they neared 14 air time. The drawbacks of this approach was that it's a bit hard 15 to understand what is happening. It also makes (more) correct 16 wakeup from suspend hard to do. 10 17 11 18 hts-tvheadend (2.10) hts; urgency=high -
trunk/tvheadend/src/dvr/dvr.h
r4315 r4332 21 21 22 22 #include <libavformat/avformat.h> 23 #include <regex.h> 23 24 #include "epg.h" 24 25 #include "channels.h" … … 98 99 99 100 /** 101 * Autorec linkage 102 */ 103 LIST_ENTRY(dvr_entry) de_autorec_link; 104 struct dvr_autorec_entry *de_autorec; 105 106 /** 100 107 * Fields for recording 101 108 */ … … 130 137 } dvr_entry_t; 131 138 139 140 /** 141 * Autorec entry 142 */ 143 typedef struct dvr_autorec_entry { 144 TAILQ_ENTRY(dvr_autorec_entry) dae_link; 145 char *dae_id; 146 147 int dae_enabled; 148 char *dae_creator; 149 char *dae_comment; 150 151 char *dae_title; 152 regex_t dae_title_preg; 153 154 epg_content_group_t *dae_ecg; 155 156 int dae_weekdays; 157 158 channel_t *dae_channel; 159 LIST_ENTRY(dvr_autorec_entry) dae_channel_link; 160 161 channel_tag_t *dae_channel_tag; 162 LIST_ENTRY(dvr_autorec_entry) dae_channel_tag_link; 163 164 struct dvr_entry_list dae_spawns; 165 166 } dvr_autorec_entry_t; 167 168 132 169 /** 133 170 * Prototypes 134 171 */ 135 dvr_entry_t *dvr_entry_create_by_event(event_t *e, const char *creator); 172 void dvr_entry_create_by_autorec(event_t *e, dvr_autorec_entry_t *dae); 173 174 dvr_entry_t *dvr_entry_create_by_event(event_t *e, const char *creator, 175 dvr_autorec_entry_t *dae); 136 176 137 177 dvr_entry_t *dvr_entry_create(channel_t *ch, time_t start, time_t stop, 138 178 const char *title, const char *description, 139 const char *creator );179 const char *creator, dvr_autorec_entry_t *dae); 140 180 141 181 void dvr_init(void); … … 191 231 const char *creator, const char *comment); 192 232 193 void dvr_autorec_check (event_t *e);233 void dvr_autorec_check_event(event_t *e); 194 234 195 235 void autorec_destroy_by_channel(channel_t *ch); 196 236 237 dvr_autorec_entry_t *autorec_entry_find(const char *id, int create); 238 197 239 #endif /* DVR_H */ -
trunk/tvheadend/src/dvr/dvr_autorec.c
r4183 r4332 26 26 #include <stdarg.h> 27 27 #include <errno.h> 28 #include <regex.h>29 30 28 31 29 #include "tvhead.h" … … 42 40 struct dvr_autorec_entry_queue autorec_entries; 43 41 44 typedef struct dvr_autorec_entry { 45 TAILQ_ENTRY(dvr_autorec_entry) dae_link; 46 char *dae_id; 47 48 int dae_enabled; 49 char *dae_creator; 50 char *dae_comment; 51 52 char *dae_title; 53 regex_t dae_title_preg; 54 55 epg_content_group_t *dae_ecg; 56 57 int dae_weekdays; 58 59 channel_t *dae_channel; 60 LIST_ENTRY(dvr_autorec_entry) dae_channel_link; 61 62 channel_tag_t *dae_channel_tag; 63 LIST_ENTRY(dvr_autorec_entry) dae_channel_tag_link; 64 65 } dvr_autorec_entry_t; 66 67 static void dvr_autorec_check_just_enabled(dvr_autorec_entry_t *dae); 68 42 static void dvr_autorec_changed(dvr_autorec_entry_t *dae); 43 44 /** 45 * 46 */ 47 static void 48 dvr_autorec_purge_spawns(dvr_autorec_entry_t *dae) 49 { 50 dvr_entry_t *de; 51 52 while((de = LIST_FIRST(&dae->dae_spawns)) != NULL) { 53 LIST_REMOVE(de, de_autorec_link); 54 de->de_autorec = NULL; 55 dvr_entry_cancel(de); 56 } 57 } 69 58 70 59 … … 99 88 } 100 89 101 if(dae->dae_title != NULL && e->e_title != NULL && 102 regexec(&dae->dae_title_preg, e->e_title, 0, NULL, 0)) 90 if(dae->dae_title != NULL) { 91 if(e->e_title == NULL || 92 regexec(&dae->dae_title_preg, e->e_title, 0, NULL, 0)) 103 93 return 0; 94 } 104 95 105 96 if(dae->dae_weekdays != 0x7f) { … … 116 107 * 117 108 */ 118 staticdvr_autorec_entry_t *109 dvr_autorec_entry_t * 119 110 autorec_entry_find(const char *id, int create) 120 111 { … … 155 146 autorec_entry_destroy(dvr_autorec_entry_t *dae) 156 147 { 148 dvr_autorec_purge_spawns(dae); 149 157 150 free(dae->dae_id); 158 151 … … 294 287 return NULL; 295 288 296 tvh_str_set(&dae->dae_creator, htsmsg_get_str(values, "creator")); 297 tvh_str_set(&dae->dae_comment, htsmsg_get_str(values, "comment")); 289 printf("autorec_record_update\n"); 290 htsmsg_print(values); 291 292 tvh_str_update(&dae->dae_creator, htsmsg_get_str(values, "creator")); 293 tvh_str_update(&dae->dae_comment, htsmsg_get_str(values, "comment")); 298 294 299 295 if((s = htsmsg_get_str(values, "channel")) != NULL) { … … 341 337 dae->dae_enabled = u32; 342 338 343 if(dae->dae_enabled) 344 dvr_autorec_check_just_enabled(dae); 339 dvr_autorec_changed(dae); 345 340 346 341 return autorec_record_build(dae); … … 436 431 notify_by_msg("autorec", m); 437 432 438 dvr_autorec_check_just_enabled(dae); 439 } 440 441 /** 442 * 443 */ 444 static void 445 autorec_schedule(event_t *e, dvr_autorec_entry_t *dae) 446 { 447 char buf[200]; 448 449 snprintf(buf, sizeof(buf), "Auto recording by: %s", dae->dae_creator); 450 dvr_entry_create_by_event(e, buf); 433 dvr_autorec_changed(dae); 451 434 } 452 435 … … 456 439 */ 457 440 void 458 dvr_autorec_check (event_t *e)441 dvr_autorec_check_event(event_t *e) 459 442 { 460 443 dvr_autorec_entry_t *dae; … … 462 445 TAILQ_FOREACH(dae, &autorec_entries, dae_link) 463 446 if(autorec_cmp(dae, e)) 464 autorec_schedule(e, dae); 465 466 if((e = RB_NEXT(e, e_channel_link)) == NULL) 467 return; 468 469 /* Check next event too */ 470 TAILQ_FOREACH(dae, &autorec_entries, dae_link) 471 if(autorec_cmp(dae, e)) 472 autorec_schedule(e, dae); 447 dvr_entry_create_by_autorec(e, dae); 473 448 } 474 449 … … 477 452 */ 478 453 static void 479 dvr_autorec_ch eck_just_enabled(dvr_autorec_entry_t *dae)454 dvr_autorec_changed(dvr_autorec_entry_t *dae) 480 455 { 481 456 channel_t *ch; 457 event_t *e; 458 459 dvr_autorec_purge_spawns(dae); 482 460 483 461 RB_FOREACH(ch, &channel_name_tree, ch_name_link) { 484 if(ch->ch_epg_current == NULL) 485 continue; 486 487 if(autorec_cmp(dae, ch->ch_epg_current)) 488 autorec_schedule(ch->ch_epg_current, dae); 462 RB_FOREACH(e, &ch->ch_epg_events, e_channel_link) { 463 if(autorec_cmp(dae, e)) 464 dvr_entry_create_by_autorec(e, dae); 465 } 489 466 } 490 467 } -
trunk/tvheadend/src/dvr/dvr_db.c
r4315 r4332 138 138 dvr_entry_create(channel_t *ch, time_t start, time_t stop, 139 139 const char *title, const char *description, 140 const char *creator )140 const char *creator, dvr_autorec_entry_t *dae) 141 141 { 142 142 dvr_entry_t *de; … … 175 175 strftime(tbuf, sizeof(tbuf), "%c", &tm); 176 176 177 de->de_autorec = dae; 178 LIST_INSERT_HEAD(&dae->dae_spawns, de, de_autorec_link); 179 177 180 tvhlog(LOG_INFO, "dvr", "\"%s\" on \"%s\" starting at %s, " 178 181 "scheduled for recording by \"%s\"", … … 189 192 */ 190 193 dvr_entry_t * 191 dvr_entry_create_by_event(event_t *e, const char *creator) 194 dvr_entry_create_by_event(event_t *e, const char *creator, 195 dvr_autorec_entry_t *dae) 192 196 { 193 197 if(e->e_channel == NULL || e->e_title == NULL) … … 195 199 196 200 return dvr_entry_create(e->e_channel, e->e_start, e->e_stop, 197 e->e_title, e->e_desc, creator); 201 e->e_title, e->e_desc, creator, dae); 202 } 203 204 205 /** 206 * 207 */ 208 void 209 dvr_entry_create_by_autorec(event_t *e, dvr_autorec_entry_t *dae) 210 { 211 char buf[200]; 212 213 snprintf(buf, sizeof(buf), "Auto recording by: %s", dae->dae_creator); 214 dvr_entry_create_by_event(e, buf, dae); 198 215 } 199 216 … … 211 228 return; 212 229 } 230 231 if(de->de_autorec != NULL) 232 LIST_REMOVE(de, de_autorec_link); 213 233 214 234 free(de->de_creator); … … 302 322 303 323 htsmsg_get_u32(c, "noresched", &de->de_dont_reschedule); 324 325 s = htsmsg_get_str(c, "autorec"); 326 if(s != NULL) { 327 dvr_autorec_entry_t *dae = autorec_entry_find(s, 0); 328 329 if(dae != NULL) { 330 de->de_autorec = dae; 331 LIST_INSERT_HEAD(&dae->dae_spawns, de, de_autorec_link); 332 } 333 } 334 304 335 dvr_entry_link(de); 305 336 } … … 359 390 360 391 htsmsg_add_u32(m, "noresched", de->de_dont_reschedule); 392 393 if(de->de_autorec != NULL) 394 htsmsg_add_str(m, "autorec", de->de_autorec->dae_id); 361 395 362 396 hts_settings_save(m, "dvr/log/%d", de->de_id); … … 590 624 } 591 625 626 dvr_autorec_init(); 627 592 628 dvr_db_load(); 593 594 dvr_autorec_init();595 596 629 } 597 630 … … 612 645 htsmsg_add_u32(m, "date-in-title", !!(dvr_flags & DVR_DATE_IN_TITLE)); 613 646 htsmsg_add_u32(m, "time-in-title", !!(dvr_flags & DVR_TIME_IN_TITLE)); 614 htsmsg_add_u32(m, "whitespace-in-title", !!(dvr_flags & DVR_WHITESPACE_IN_TITLE));647 htsmsg_add_u32(m, "whitespace-in-title", !!(dvr_flags & DVR_WHITESPACE_IN_TITLE)); 615 648 if(dvr_postproc != NULL) 616 649 htsmsg_add_str(m, "postproc", dvr_postproc); -
trunk/tvheadend/src/epg.c
r4331 r4332 58 58 59 59 ch->ch_epg_current = e; 60 if(e != NULL) {60 if(e != NULL) 61 61 gtimer_arm_abs(&ch->ch_epg_timer_current, epg_ch_check_current_event, 62 62 ch, MAX(e->e_stop, dispatch_clock + 1)); 63 dvr_autorec_check(e);64 }65 63 htsp_event_update(ch, e); 66 64 } … … 114 112 epg_event_changed(event_t *e) 115 113 { 116 /* nothing atm */114 dvr_autorec_check_event(e); 117 115 } 118 116 -
trunk/tvheadend/src/htsp.c
r4205 r4332 498 498 499 499 //create the dvr entry 500 de = dvr_entry_create_by_event(e, (htsp->htsp_username) ? htsp->htsp_username:"anonymous"); 500 de = dvr_entry_create_by_event(e, 501 htsp->htsp_username ? 502 htsp->htsp_username : "anonymous", 503 NULL); 501 504 502 505 dvr_status = de != NULL ? de->de_sched_state : DVR_NOSTATE; -
trunk/tvheadend/src/webui/extjs.c
r4315 r4332 725 725 } 726 726 727 dvr_entry_create_by_event(e, hc->hc_representative );727 dvr_entry_create_by_event(e, hc->hc_representative, NULL); 728 728 729 729 out = htsmsg_create_map(); … … 778 778 stop += 86400; 779 779 780 dvr_entry_create(ch, start, stop, title, NULL, hc->hc_representative );780 dvr_entry_create(ch, start, stop, title, NULL, hc->hc_representative, NULL); 781 781 782 782 out = htsmsg_create_map(); -
trunk/tvheadend/src/webui/simpleui.c
r3612 r4332 210 210 211 211 if((http_arg_get(&hc->hc_req_args, "rec")) != NULL) { 212 de = dvr_entry_create_by_event(e, hc->hc_username ?: "anonymous" );212 de = dvr_entry_create_by_event(e, hc->hc_username ?: "anonymous", NULL); 213 213 } else if(de != NULL && (http_arg_get(&hc->hc_req_args, "cancel")) != NULL) { 214 214 de = dvr_entry_cancel(de);