19 #define LOC QString("ProgramData: ")
21 static const std::array<const std::string,DBPerson::kGuest+1>
roles
24 "actor",
"director",
"producer",
"executive_producer",
25 "writer",
"guest_star",
"host",
"adapter",
26 "presenter",
"commentator",
"guest",
31 return str.isNull() ?
"" : str;
36 return dt.isNull() ? QVariant(
"0000-00-00 00:00:00") : QVariant(dt);
40 uint chanid,
const QDateTime &starttime)
42 QString relevance = QString(
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
43 for (
auto it = genres.constBegin(); (it != genres.constEnd()) &&
44 ((it - genres.constBegin()) < relevance.size()); ++it)
47 "INSERT INTO programgenres "
48 " ( chanid, starttime, genre, relevance) "
49 "VALUES (:CHANID, :START, :genre, :relevance)");
53 query.
bindValue(
":relevance", relevance.at(it - genres.constBegin()));
61 : m_role(other.m_role)
62 , m_name(other.m_name)
63 , m_priority(other.m_priority)
64 , m_character(other.m_character)
86 , m_name(
std::move(name))
87 , m_priority(priority)
88 , m_character(
std::move(character))
95 int priority, QString character)
97 , m_name(
std::move(name))
98 , m_priority(priority)
99 , m_character(
std::move(character))
103 std::string rolestr = role.toLower().toStdString();
104 for (
size_t i = 0; i <
roles.size(); ++i)
106 if (rolestr ==
roles[i])
127 const QDateTime &starttime,
128 bool recording)
const
143 starttime, recording);
151 "WHERE name = :NAME");
156 else if (query.
next())
157 return query.
value(0).toUInt();
165 "INSERT IGNORE INTO people (name) "
181 "WHERE name = :NAME");
185 return query.
value(0).toUInt();
193 "INSERT IGNORE INTO roles (name) "
205 uint chanid,
const QDateTime &starttime,
206 bool recording)
const
211 QString table = recording ?
"recordedcredits" :
"credits";
213 query.
prepare(QString(
"REPLACE INTO %1 "
214 " ( person, roleid, chanid, starttime, role, priority) "
215 "VALUES (:PERSON, :ROLEID, :CHANID, :STARTTIME, :ROLE, :PRIORITY);")
220 query.
bindValue(
":STARTTIME", starttime);
299 int priority,
const QString &character)
305 priority, character.simplified()));
309 int priority,
const QString &character)
315 priority, character.simplified()));
329 LOG(VB_EIT, LOG_DEBUG,
330 QString(
"EIT: new program: %1 %2 '%3' chanid %4")
334 QString::number(chanid)));
337 QDateTime now = QDateTime::currentDateTimeUtc();
340 LOG(VB_EIT, LOG_DEBUG,
341 QString(
"EIT: skip '%1' endtime is in the past")
348 std::vector<DBEvent> programs;
359 for (
uint j=0; j<count; ++j)
361 LOG(VB_EIT, LOG_DEBUG,
362 QString(
"EIT: overlap[%1] : %2 %3 '%4'")
363 .arg(QString::number(j),
366 programs[j].m_title.left(35)));
376 if (match >= match_threshold)
381 LOG(VB_EIT, LOG_DEBUG,
382 QString(
"EIT: accept match[%1]: %2 '%3' vs. '%4'")
385 programs[i].m_title.left(35)));
386 return UpdateDB(query, chanid, programs, i);
394 LOG(VB_EIT, LOG_DEBUG,
395 QString(
"EIT: reject match[%1]: %2 '%3' vs. '%4'")
398 programs[i].m_title.left(35)));
403 return UpdateDB(query, chanid, programs, -1);
430 MSqlQuery &query,
uint chanid, std::vector<DBEvent> &programs)
const
434 "SELECT title, subtitle, description, "
435 " category, category_type, "
436 " starttime, endtime, "
437 " subtitletypes+0,audioprop+0, videoprop+0, "
438 " seriesid, programid, "
439 " partnumber, parttotal, "
440 " syndicatedepisodenumber, "
441 " airdate, originalairdate, "
442 " previouslyshown,listingsource, "
444 " season, episode, totalepisodes, "
447 "WHERE chanid = :CHANID AND "
449 " ( ( starttime >= :STIME1 AND starttime < :ETIME1 ) OR "
450 " ( endtime > :STIME2 AND endtime <= :ETIME2 ) OR "
451 " ( starttime < :STIME3 AND endtime > :ETIME3 ) )");
472 query.
value(0).toString(),
473 query.
value(1).toString(),
474 query.
value(2).toString(),
475 query.
value(3).toString(),
479 query.
value(7).toUInt(),
480 query.
value(8).toUInt(),
481 query.
value(9).toUInt(),
482 query.
value(19).toDouble(),
483 query.
value(10).toString(),
484 query.
value(11).toString(),
485 query.
value(18).toUInt(),
486 query.
value(20).toUInt(),
487 query.
value(21).toUInt(),
488 query.
value(22).toUInt());
498 programs.push_back(prog);
506 static int score_words(
const QStringList &al,
const QStringList &bl)
508 QStringList::const_iterator ait = al.begin();
509 QStringList::const_iterator bit = bl.begin();
511 for (; (ait != al.end()) && (bit != bl.end()); ++ait)
513 QStringList::const_iterator bit2 = bit;
516 for (; bit2 != bl.end(); ++bit2)
520 bscore = std::max(1000, 2000 - (dist * 500));
522 if (ait->length() < 5)
523 bscore /= 5 - ait->length();
528 if (bscore && dist < 3)
530 for (
int i = 0; (i < dist) && bit != bl.end(); ++i)
536 return score / al.size();
541 if (a.isEmpty() || b.isEmpty())
546 QString A = a.simplified().toUpper();
547 QString B = b.simplified().toUpper();
551 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
552 QStringList al = A.split(
" ", QString::SkipEmptyParts);
554 QStringList al = A.split(
" ", Qt::SkipEmptyParts);
559 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
560 QStringList bl = B.split(
" ", QString::SkipEmptyParts);
562 QStringList bl = B.split(
" ", Qt::SkipEmptyParts);
570 return std::min(900, score);
576 int match_val = INT_MIN;
579 for (
size_t i = 0; i < programs.size(); ++i)
582 int duration_loop = programs[i].m_starttime.secsTo(programs[i].
m_endtime);
584 mv -= qAbs(
m_starttime.secsTo(programs[i].m_starttime));
585 mv -= qAbs(
m_endtime.secsTo(programs[i].m_endtime));
586 mv -= qAbs(duration - duration_loop);
595 overlap = programs[i].m_starttime.secsTo(
m_endtime);
614 int min_dur = std::max(2, std::min(duration, duration_loop));
615 overlap = std::min(overlap, min_dur/2);
621 LOG(VB_GENERAL, LOG_ERR,
622 QString(
"Unexpected result: shows don't "
623 "overlap\n\t%1: %2 - %3\n\t%4: %5 - %6")
627 .arg(programs[i].m_title.left(35), 35)
628 .arg(programs[i].m_starttime.toString(
Qt::ISODate),
635 LOG(VB_EIT, LOG_DEBUG,
636 QString(
"GM : '%1' new best match '%2' with score %3")
638 programs[i].m_title.left(35),
639 QString::number(mv)));
649 MSqlQuery &q,
uint chanid,
const std::vector<DBEvent> &
p,
int match)
const
653 for (
size_t i = 0; i <
p.size(); ++i)
655 if (i != (
uint)match)
662 LOG(VB_EIT, LOG_DEBUG,
663 QString(
"EIT: cannot insert '%1' MoveOutOfTheWayDB failed")
669 if ((match < 0) || ((
uint)match >=
p.size()))
671 LOG(VB_EIT, LOG_DEBUG,
672 QString(
"EIT: insert '%1'")
683 QDateTime now = QDateTime::currentDateTimeUtc();
686 LOG(VB_EIT, LOG_DEBUG,
687 QString(
"EIT: skip '%1' starttime is in the past")
694 LOG(VB_EIT, LOG_DEBUG,
695 QString(
"EIT: update '%1' with '%2'")
709 const QDateTime &old_starttime,
710 const QDateTime &new_starttime)
713 "SET starttime = :NEWSTARTTIME, "
714 " startdate = :NEWSTARTDATE "
715 "WHERE chanid = :CHANID "
717 "AND search = :SEARCH "
718 "AND starttime = :OLDSTARTTIME "
719 "AND startdate = :OLDSTARTDATE ");
723 query.
bindValue(
":OLDSTARTTIME", old_starttime.time());
724 query.
bindValue(
":OLDSTARTDATE", old_starttime.date());
725 query.
bindValue(
":NEWSTARTTIME", new_starttime.time());
726 query.
bindValue(
":NEWSTARTDATE", new_starttime.date());
739 LOG(VB_EIT, LOG_DEBUG,
740 QString(
"EIT: Updated record: chanid:%1 old:%3 new:%4 rows:%5")
741 .arg(QString::number(chanid),
744 QString::number(rows)));
768 QDateTime
const &old_starttime = match.
m_starttime;
772 LOG(VB_EIT, LOG_DEBUG,
773 QString(
"EIT: (U) change starttime from %1 to %2 for chanid:%3 program '%4' ")
776 QString::number(chanid),
780 if (ltitle.isEmpty() && !match.
m_title.isEmpty())
783 if (lsubtitle.isEmpty() && !match.
m_subtitle.isEmpty())
789 if (lcategory.isEmpty() && !match.
m_category.isEmpty())
798 if (lprogramId.isEmpty() && !match.
m_programId.isEmpty())
801 if (lseriesId.isEmpty() && !match.
m_seriesId.isEmpty())
804 if (linetref.isEmpty() && !match.
m_inetref.isEmpty())
842 if (lsyndicatedepisodenumber.isEmpty() &&
848 "SET title = :TITLE, subtitle = :SUBTITLE, "
849 " description = :DESC, "
850 " category = :CATEGORY, category_type = :CATTYPE, "
851 " starttime = :STARTTIME, endtime = :ENDTIME, "
852 " closecaptioned = :CC, subtitled = :HASSUBTITLES, "
853 " stereo = :STEREO, hdtv = :HDTV, "
854 " subtitletypes = :SUBTYPE, "
855 " audioprop = :AUDIOPROP, videoprop = :VIDEOPROP, "
856 " season = :SEASON, "
857 " episode = :EPISODE, totalepisodes = :TOTALEPS, "
858 " partnumber = :PARTNO, parttotal = :PARTTOTAL, "
859 " syndicatedepisodenumber = :SYNDICATENO, "
860 " airdate = :AIRDATE, originalairdate=:ORIGAIRDATE, "
861 " listingsource = :LSOURCE, "
862 " seriesid = :SERIESID, programid = :PROGRAMID, "
863 " previouslyshown = :PREVSHOWN, inetref = :INETREF "
864 "WHERE chanid = :CHANID AND "
865 " starttime = :OLDSTART ");
876 query.
bindValue(
":CC", (lsubtype & SUB_HARDHEAR) != 0);
877 query.
bindValue(
":HASSUBTITLES",(lsubtype & SUB_NORMAL) != 0);
878 query.
bindValue(
":STEREO", (laudio & AUD_STEREO) != 0);
879 query.
bindValue(
":HDTV", (lvideo & VID_HDTV) != 0);
885 query.
bindValue(
":TOTALEPS", lepisodeTotal);
887 query.
bindValue(
":PARTTOTAL", lparttotal);
889 query.
bindValue(
":AIRDATE", lairdate ? QString::number(lairdate) :
"0000");
890 query.
bindValue(
":ORIGAIRDATE", loriginalairdate);
891 query.
bindValue(
":LSOURCE", llistingsource);
894 query.
bindValue(
":PREVSHOWN", lpreviouslyshown);
912 "INSERT IGNORE INTO programrating "
913 " ( chanid, starttime, `system`, rating) "
914 "VALUES (:CHANID, :START, :SYS, :RATING)");
932 "DELETE from program "
933 "WHERE chanid = :CHANID AND "
934 " starttime = :STARTTIME");
946 "DELETE from credits "
947 "WHERE chanid = :CHANID AND "
948 " starttime = :STARTTIME");
960 "DELETE from programrating "
961 "WHERE chanid = :CHANID AND "
962 " starttime = :STARTTIME");
974 "DELETE from programgenres "
975 "WHERE chanid = :CHANID AND "
976 " starttime = :STARTTIME");
993 "SELECT title FROM program "
994 "WHERE chanid = :CHANID AND "
995 " starttime = :OLDSTART");
1002 return query.
next();
1006 const QDateTime &new_st,
const QDateTime &new_end)
1010 "SET starttime = :NEWSTART, "
1011 " endtime = :NEWEND "
1012 "WHERE chanid = :CHANID AND "
1013 " starttime = :OLDSTART");
1028 "SET starttime = :NEWSTART "
1029 "WHERE chanid = :CHANID AND "
1030 " starttime = :OLDSTART");
1043 "UPDATE programrating "
1044 "SET starttime = :NEWSTART "
1045 "WHERE chanid = :CHANID AND "
1046 " starttime = :OLDSTART");
1059 "UPDATE programgenres "
1060 "SET starttime = :NEWSTART "
1061 "WHERE chanid = :CHANID AND "
1062 " starttime = :OLDSTART");
1086 LOG(VB_EIT, LOG_DEBUG,
1087 QString(
"EIT: delete '%1' %2 - %3")
1100 LOG(VB_EIT, LOG_DEBUG,
1101 QString(
"EIT: change '%1' endtime to %2")
1118 LOG(VB_EIT, LOG_DEBUG,
1119 QString(
"EIT: delete '%1' %2 - %3")
1125 LOG(VB_EIT, LOG_DEBUG,
1126 QString(
"EIT: (M) change starttime from %1 to %2 for chanid:%3 program '%4' ")
1129 QString::number(chanid),
1146 bool recording)
const
1148 QString table = recording ?
"recordedprogram" :
"program";
1152 " chanid, title, subtitle, description, "
1153 " category, category_type, "
1154 " starttime, endtime, "
1155 " closecaptioned, stereo, hdtv, subtitled, "
1156 " subtitletypes, audioprop, videoprop, "
1157 " stars, partnumber, parttotal, "
1158 " syndicatedepisodenumber, "
1159 " airdate, originalairdate,listingsource, "
1160 " seriesid, programid, previouslyshown, "
1161 " season, episode, totalepisodes, "
1164 " :CHANID, :TITLE, :SUBTITLE, :DESCRIPTION, "
1165 " :CATEGORY, :CATTYPE, "
1166 " :STARTTIME, :ENDTIME, "
1167 " :CC, :STEREO, :HDTV, :HASSUBTITLES, "
1168 " :SUBTYPES, :AUDIOPROP, :VIDEOPROP, "
1169 " :STARS, :PARTNUMBER, :PARTTOTAL, "
1171 " :AIRDATE, :ORIGAIRDATE, :LSOURCE, "
1172 " :SERIESID, :PROGRAMID, :PREVSHOWN, "
1173 " :SEASON, :EPISODE, :TOTALEPISODES, "
1174 " :INETREF ) ").arg(table));
1213 table = recording ?
"recordedrating" :
"programrating";
1217 "INSERT IGNORE INTO %1 "
1218 " ( chanid, starttime, `system`, rating) "
1219 "VALUES (:CHANID, :START, :SYS, :RATING)").arg(table));
1232 credit.InsertDB(query, chanid,
m_starttime, recording);
1241 DBEvent(other.m_listingsource)
1301 bool recording)
const
1303 QString table = recording ?
"recordedprogram" :
"program";
1305 LOG(VB_XMLTV, LOG_DEBUG,
1306 QString(
"Inserting new %1 : %2 - %3 %4 %5")
1314 " chanid, title, subtitle, description, "
1315 " category, category_type, "
1316 " starttime, endtime, "
1317 " closecaptioned, stereo, hdtv, subtitled, "
1318 " subtitletypes, audioprop, videoprop, "
1319 " partnumber, parttotal, "
1320 " syndicatedepisodenumber, "
1321 " airdate, originalairdate,listingsource, "
1322 " seriesid, programid, previouslyshown, "
1323 " stars, showtype, title_pronounce, colorcode, "
1324 " season, episode, totalepisodes, "
1327 " :CHANID, :TITLE, :SUBTITLE, :DESCRIPTION, "
1328 " :CATEGORY, :CATTYPE, "
1329 " :STARTTIME, :ENDTIME, "
1330 " :CC, :STEREO, :HDTV, :HASSUBTITLES, "
1331 " :SUBTYPES, :AUDIOPROP, :VIDEOPROP, "
1332 " :PARTNUMBER, :PARTTOTAL, "
1334 " :AIRDATE, :ORIGAIRDATE, :LSOURCE, "
1335 " :SERIESID, :PROGRAMID, :PREVSHOWN, "
1336 " :STARS, :SHOWTYPE, :TITLEPRON, :COLORCODE, "
1337 " :SEASON, :EPISODE, :TOTALEPISODES, "
1338 " :INETREF )").arg(table));
1385 table = recording ?
"recordedrating" :
"programrating";
1388 query.
prepare(QString(
"INSERT IGNORE INTO %1 "
1389 " ( chanid, starttime, `system`, rating) "
1390 "VALUES (:CHANID, :START, :SYS, :RATING)")
1404 credit.InsertDB(query, chanid,
m_starttime, recording);
1413 uint chanid,
const QDateTime &from,
const QDateTime &to,
1414 bool use_channel_time_offset)
1416 std::chrono::seconds secs = 0s;
1417 if (use_channel_time_offset)
1420 QDateTime newFrom = from.addSecs(secs.count());
1421 QDateTime newTo = to.addSecs(secs.count());
1424 query.
prepare(
"DELETE FROM program "
1425 "WHERE starttime >= :FROM AND starttime < :TO "
1426 "AND chanid = :CHANID ;");
1430 bool ok = query.
exec();
1432 query.
prepare(
"DELETE FROM programrating "
1433 "WHERE starttime >= :FROM AND starttime < :TO "
1434 "AND chanid = :CHANID ;");
1440 query.
prepare(
"DELETE FROM credits "
1441 "WHERE starttime >= :FROM AND starttime < :TO "
1442 "AND chanid = :CHANID ;");
1448 query.
prepare(
"DELETE FROM programgenres "
1449 "WHERE starttime >= :FROM AND starttime < :TO "
1450 "AND chanid = :CHANID ;");
1460 uint sourceid,
const QDateTime &from,
const QDateTime &to,
1461 bool use_channel_time_offset)
1466 auto cleardata = [&](
uint chanid)
1468 std::for_each(chanids.cbegin(), chanids.cend(), cleardata);
1481 QList<ProgInfo*>::iterator it = fixlist.begin();
1484 QList<ProgInfo*>::iterator cur = it;
1488 if ((*cur)->m_endts.isEmpty() || (*cur)->m_startts > (*cur)->m_endts)
1490 if (it != fixlist.end())
1492 (*cur)->m_endts = (*it)->m_startts;
1493 (*cur)->m_endtime = (*it)->m_starttime;
1500 if (it == fixlist.end())
1504 if ((*cur)->HasTimeConflict(**it))
1506 QList<ProgInfo*>::iterator tokeep;
1507 QList<ProgInfo*>::iterator todelete;
1509 if ((*cur)->m_endtime <= (*cur)->m_starttime)
1510 tokeep = it, todelete = cur;
1511 else if ((*it)->m_endtime <= (*it)->m_starttime)
1512 tokeep = cur, todelete = it;
1513 else if (!(*cur)->m_subtitle.isEmpty() &&
1514 (*it)->m_subtitle.isEmpty())
1515 tokeep = cur, todelete = it;
1516 else if (!(*it)->m_subtitle.isEmpty() &&
1517 (*cur)->m_subtitle.isEmpty())
1518 tokeep = it, todelete = cur;
1519 else if (!(*cur)->m_description.isEmpty() &&
1520 (*it)->m_description.isEmpty())
1521 tokeep = cur, todelete = it;
1523 tokeep = it, todelete = cur;
1526 LOG(VB_XMLTV, LOG_DEBUG,
1527 QString(
"Removing conflicting program: %1 - %2 %3 %4")
1528 .arg((*todelete)->m_starttime.toString(
Qt::ISODate),
1530 (*todelete)->m_channel,
1531 (*todelete)->m_title));
1533 LOG(VB_XMLTV, LOG_DEBUG,
1534 QString(
"Conflicted with : %1 - %2 %3 %4")
1535 .arg((*tokeep)->m_starttime.toString(
Qt::ISODate),
1537 (*tokeep)->m_channel,
1538 (*tokeep)->m_title));
1540 bool step_back = todelete == it;
1541 it = fixlist.erase(todelete);
1557 uint sourceid, QMap<QString, QList<ProgInfo> > &proglist)
1564 QMap<QString, QList<ProgInfo> >::const_iterator mapiter;
1565 for (mapiter = proglist.cbegin(); mapiter != proglist.cend(); ++mapiter)
1567 if (mapiter.key().isEmpty())
1573 "WHERE deleted IS NULL AND "
1574 " sourceid = :ID AND "
1575 " xmltvid = :XMLTVID");
1577 query.
bindValue(
":XMLTVID", mapiter.key());
1585 std::vector<uint> chanids;
1586 while (query.
next())
1587 chanids.push_back(query.
value(0).toUInt());
1589 if (chanids.empty())
1591 LOG(VB_GENERAL, LOG_NOTICE,
1592 QString(
"Unknown xmltv channel identifier: %1"
1593 " - Skipping channel.").arg(mapiter.key()));
1597 QList<ProgInfo> &list = proglist[mapiter.key()];
1598 QList<ProgInfo*> sortlist;
1600 for (
auto it = list.begin(); it != list.end(); ++it)
1601 sortlist.push_back(&(*it));
1605 for (
uint chanid : chanids)
1609 LOG(VB_GENERAL, LOG_INFO,
1610 QString(
"Updated programs: %1 Unchanged programs: %2")
1611 .arg(updated) .arg(unchanged));
1627 const QList<ProgInfo*> &sortlist,
1631 for (
auto *pinfo : qAsConst(sortlist))
1642 updated += pinfo->InsertDB(query, chanid);
1656 querystr =
"SELECT chanid, starttime, endtime FROM program "
1657 "WHERE endtime = '0000-00-00 00:00:00' "
1658 "ORDER BY chanid, starttime;";
1660 if (!query1.
exec(querystr))
1662 LOG(VB_GENERAL, LOG_ERR,
1663 QString(
"fix_end_times query failed: %1").arg(querystr));
1667 while (query1.
next())
1669 starttime = query1.
value(1).toString();
1670 chanid = query1.
value(0).toString();
1671 endtime = query1.
value(2).toString();
1673 querystr = QString(
"SELECT chanid, starttime, endtime FROM program "
1674 "WHERE starttime > '%1' "
1675 "AND chanid = '%2' "
1676 "ORDER BY starttime LIMIT 1;")
1677 .arg(starttime, chanid);
1679 if (!query2.
exec(querystr))
1681 LOG(VB_GENERAL, LOG_ERR,
1682 QString(
"fix_end_times query failed: %1").arg(querystr));
1686 if (query2.
next() && (endtime != query2.
value(1).toString()))
1689 endtime = query2.
value(1).toString();
1690 querystr = QString(
"UPDATE program SET "
1691 "endtime = '%2' WHERE (chanid = '%3' AND "
1692 "starttime = '%4');")
1693 .arg(endtime, chanid, starttime);
1695 if (!query2.
exec(querystr))
1697 LOG(VB_GENERAL, LOG_ERR,
1698 QString(
"fix_end_times query failed: %1").arg(querystr));
1713 "WHERE chanid = :CHANID AND "
1714 " starttime = :START AND "
1715 " endtime = :END AND "
1716 " title = :TITLE AND "
1717 " subtitle = :SUBTITLE AND "
1718 " description = :DESC AND "
1719 " category = :CATEGORY AND "
1720 " category_type = :CATEGORY_TYPE AND "
1721 " airdate = :AIRDATE AND "
1722 " stars >= (:STARS1 - 0.001) AND "
1723 " stars <= (:STARS2 + 0.001) AND "
1724 " previouslyshown = :PREVIOUSLYSHOWN AND "
1725 " title_pronounce = :TITLE_PRONOUNCE AND "
1726 " audioprop = :AUDIOPROP AND "
1727 " videoprop = :VIDEOPROP AND "
1728 " subtitletypes = :SUBTYPES AND "
1729 " partnumber = :PARTNUMBER AND "
1730 " parttotal = :PARTTOTAL AND "
1731 " seriesid = :SERIESID AND "
1732 " showtype = :SHOWTYPE AND "
1733 " colorcode = :COLORCODE AND "
1734 " syndicatedepisodenumber = :SYNDICATEDEPISODENUMBER AND "
1735 " programid = :PROGRAMID AND "
1736 " season = :SEASON AND "
1737 " episode = :EPISODE AND "
1738 " totalepisodes = :TOTALEPISODES AND "
1739 " inetref = :INETREF");
1750 query.
bindValue(
":CATEGORY_TYPE", cattype);
1764 query.
bindValue(
":SYNDICATEDEPISODENUMBER",
1773 return query.
value(0).toUInt() > 0;
1785 "SELECT title,starttime,endtime "
1787 "WHERE chanid = :CHANID AND "
1788 " starttime >= :START AND "
1789 " starttime < :END;");
1802 LOG(VB_XMLTV, LOG_DEBUG,
1803 QString(
"Removing existing program: %1 - %2 %3 %4")
1807 query.
value(0).toString()));
1808 }
while (query.
next());
1813 LOG(VB_XMLTV, LOG_ERR,
1814 QString(
"Program delete failed : %1 - %2 %3 %4")