if (ee->age_rating)
htsmsg_add_u32(m, "ageRating", ee->age_rating);
+ if (ee->copyright_year)
+ htsmsg_add_u32(m, "copyrightYear", ee->copyright_year);
+
/* Content Type */
m2 = NULL;
LIST_FOREACH(eg, &ee->genre, link) {
save |= epg_episode_set_age_rating(episode, 0, NULL);
if (!(changes & EPG_CHANGED_FIRST_AIRED))
save |= epg_episode_set_first_aired(episode, 0, NULL);
+ if (!(changes & EPG_CHANGED_COPYRIGHT_YEAR))
+ save |= epg_episode_set_copyright_year(episode, 0, NULL);
return save;
}
changed, EPG_CHANGED_STAR_RATING);
}
+int epg_episode_set_copyright_year
+ ( epg_episode_t *episode, uint16_t year, uint32_t *changed )
+{
+ if (!episode) return 0;
+ return _epg_object_set_u16(episode, &episode->copyright_year, year,
+ changed, EPG_CHANGED_COPYRIGHT_YEAR);
+}
+
int epg_episode_set_age_rating
( epg_episode_t *episode, uint8_t age, uint32_t *changed )
{
htsmsg_add_u32(m, "is_bw", 1);
if (episode->star_rating)
htsmsg_add_u32(m, "star_rating", episode->star_rating);
+ if (episode->copyright_year)
+ htsmsg_add_u32(m, "copyright_year", episode->copyright_year);
if (episode->age_rating)
htsmsg_add_u32(m, "age_rating", episode->age_rating);
if (episode->first_aired)
if (!htsmsg_get_u32(m, "star_rating", &u32))
*save |= epg_episode_set_star_rating(ee, u32, &changes);
+ if (!htsmsg_get_u32(m, "copyright_year", &u32))
+ *save |= epg_episode_set_copyright_year(ee, u32, &changes);
+
if (!htsmsg_get_u32(m, "age_rating", &u32))
*save |= epg_episode_set_age_rating(ee, u32, &changes);
#define EPG_CHANGED_FIRST_AIRED (1<<(EPG_CHANGED_SLAST+12))
#define EPG_CHANGED_BRAND (1<<(EPG_CHANGED_SLAST+13))
#define EPG_CHANGED_SEASON (1<<(EPG_CHANGED_SLAST+14))
+#define EPG_CHANGED_COPYRIGHT_YEAR (1<<(EPG_CHANGED_SLAST+15))
/* Episode numbering object - this is for some back-compat and also
* to allow episode information to be "collated" into easy to use object
uint8_t star_rating; ///< Star rating
uint8_t age_rating; ///< Age certificate
time_t first_aired; ///< Original airdate
-
+ uint16_t copyright_year; ///< xmltv DTD gives a tag "date" (separate to previously-shown/first aired).
+ ///< This is the date programme was "finished...probably the copyright date."
+ ///< We'll call it copyright_year since words like "complete" and "finished"
+ ///< sound too similar to dvr recorded functionality. We'll only store the
+ ///< year since we only get year not month and day.
LIST_ENTRY(epg_episode) blink; ///< Brand link
LIST_ENTRY(epg_episode) slink; ///< Season link
epg_brand_t *brand; ///< (Grand-)Parent brand
int epg_episode_set_star_rating
( epg_episode_t *e, uint8_t stars, uint32_t *changed )
__attribute__((warn_unused_result));
+int epg_episode_set_copyright_year
+ ( epg_episode_t *e, uint16_t stars, uint32_t *changed )
+ __attribute__((warn_unused_result));
int epg_episode_set_age_rating
( epg_episode_t *e, uint8_t age, uint32_t *changed )
__attribute__((warn_unused_result));
return ret;
}
+/*
+ * Date finished, typically copyright date.
+ */
+static int _xmltv_parse_date_finished
+ ( epg_episode_t *ee,
+ htsmsg_t *tag, uint32_t *changes )
+{
+ if (!ee || !tag) return 0;
+ const char *str = htsmsg_xml_get_cdata_str(tag, "date");
+ if (str) {
+ /* Technically the date could contain information about month
+ * and even second it was completed. We only want the four
+ * digit year.
+ */
+ const size_t len = strlen(str);
+ if (len >= 4) {
+ char year_buf[32];
+ strncpy(year_buf, str, 4);
+ year_buf[5] = 0;
+ const uint16_t year = atoi(year_buf);
+ /* Sanity check the year before copying it over. */
+ if (year && year > 1800 && year < 2500) {
+ return epg_episode_set_copyright_year(ee, year, changes);
+ }
+ }
+ }
+ return 0;
+}
+
+
/*
* Star rating
* <star-rating>
save3 |= _xmltv_parse_star_rating(ee, tags, &changes3);
+ save3 |= _xmltv_parse_date_finished(ee, tags, &changes3);
+
save3 |= _xmltv_parse_age_rating(ee, tags, &changes3);
if (icon)
htsmsg_add_u32(out, "ageRating", ee->age_rating);
if (ee->star_rating)
htsmsg_add_u32(out, "starRating", ee->star_rating);
+ if (ee->copyright_year)
+ htsmsg_add_u32(out, "copyrightYear", ee->copyright_year);
if (ee->first_aired)
htsmsg_add_s64(out, "firstAired", ee->first_aired);
epg_episode_get_epnum(ee, &epnum);
content += '<div class="x-epg-title">' + event.title;
if (event.subtitle)
content += " : " + event.subtitle;
+ if (event.copyrightYear)
+ content += " (" + event.copyrightYear + ")";
content += '</div>';
if (event.episodeOnscreen)
content += '<div class="x-epg-title">' + event.episodeOnscreen + '</div>';
{ name: 'category' },
{ name: 'keyword' },
{ name: 'ageRating' },
+ { name: 'copyrightYear' },
{ name: 'genre' },
{ name: 'dvrUuid' },
{ name: 'dvrState' },