[mythtv-users] Re: Per-channel time offset?
Joel Feenstra
joelf at altelco.net
Wed Jul 30 11:30:21 EDT 2003
I've got a patch that used to work (it doesn't apply cleanly to current
cvs), but I don't have a need for it at the moment. Eventually I'll need
it for an incorrect timezone when I go back to school, I'll fix it then
and submit it to the list. If anyone wants to try their hand, the patch
is attached. Good luck.
BTW, I already send a message like this once, but I'm not sure if it
made it to the list.
Joel Feenstra
Tako Schotanus wrote:
> I was thinking of implementing this some time ago, but I have the
> feeling I now hear two different kind of problems:
>
> 1. an offset because the times for some channels are from a different
> timezone
> 2. per channel preroll and overtime settings
>
> Maybe both should just be implemented? If Isaac has no problems with
> this idea I'll see if I can find some time to do this.
>
> (Personally I need option 2 because there are some channels which really
> seem to take their begin and end times as only an indication and
> sometimes start 15 minutes early or late. But I don't want a half hour
> leeway on the 10 minute cartoons I record from another channel that
> _does_ adhere strictly to the times they give)
>
>
>
>>-----Original Message-----
>>From: mythtv-users-bounces at snowman.net
>>[mailto:mythtv-users-bounces at snowman.net] On Behalf Of Omer Shenker
>>Sent: woensdag 30 juli 2003 3:28
>>To: mythtv-users at snowman.net
>>Subject: [mythtv-users] Re: Per-channel time offset?
>>
>>
>>On Tue, 29 Jul 2003 18:42:37 -0400 Will Dormann <wd at pobox.com> wrote:
>>
>>>Running MythTV 0.10
>>>
>>>Is it possible to have a time offset for a particular channel. One
>>>particular channel is a couple of minutes behind schedule
>>
>>and I always miss
>>
>>>the end of the show.
>>>
>>>thanks
>>>-WD
>>
>>ME TOO! :)
>>
>>No seriously, this should ideally be available either through the
>>mythfilldatabase interface somehow, or through the same sort
>>of interface as
>>for changing hue and saturation. I live in US CST, but about
>>a quarter of my
>>stations provide listings in EST.
>>
>>If someone were to tell me where in the code to do this, I
>>could probably
>>produce a patch.
>>
>>--
>>Omer Shenker http://omershenker.net/
>>
>>
>>
>>
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> mythtv-users mailing list
> mythtv-users at snowman.net
> http://lists.snowman.net/cgi-bin/mailman/listinfo/mythtv-users
-------------- next part --------------
Index: database/0-8-to-0-9.sql
===================================================================
RCS file: MC/database/0-8-to-0-9.sql,v
retrieving revision 1.2
diff -u -w -r1.2 0-8-to-0-9.sql
--- database/0-8-to-0-9.sql 19 Apr 2003 03:59:50 -0000 1.2
+++ database/0-8-to-0-9.sql 21 Apr 2003 23:24:40 -0000
@@ -22,6 +22,8 @@
ALTER TABLE videosource ADD COLUMN userid VARCHAR(128) NOT NULL default '';
+ALTER TABLE channel ADD COLUMN timeoffset VARCHAR(128) NOT NULL default '';
+
CREATE INDEX progid ON record (chanid, starttime);
CREATE INDEX title ON record (title(10));
CREATE INDEX title ON program (title(10));
Index: programs/mythfilldatabase/filldata.cpp
===================================================================
RCS file: /var/lib/cvs/MC/programs/mythfilldatabase/filldata.cpp,v
retrieving revision 1.55
diff -u -w -r1.55 filldata.cpp
--- programs/mythfilldatabase/filldata.cpp 20 Apr 2003 01:13:51 -0000 1.55
+++ programs/mythfilldatabase/filldata.cpp 21 Apr 2003 23:24:44 -0000
@@ -43,6 +43,7 @@
xmltvid = other.xmltvid;
name = other.name;
finetune = other.finetune;
+ timeoffset = other.timeoffset;
}
QString callsign;
@@ -51,6 +52,7 @@
QString xmltvid;
QString name;
QString finetune;
+ QString timeoffset;
};
struct ProgRating
@@ -169,8 +171,44 @@
return "";
}
-ChanInfo *parseChannel(QDomElement &element, QUrl baseUrl)
+int getChannelTimeOffset(QString xmltvid, int sourceid)
{
+ QString default_offset = gContext->GetSetting("TimeOffset");
+
+ int offset = 0;
+ int offset_sign = 1;
+
+ if (default_offset != "")
+ offset = default_offset.left(1).toInt() *
+ (default_offset.mid(1,2).toInt() * 60 + default_offset.right(2).toInt());
+
+
+ // Check to see if an offset in the db exists that is different than the given offset
+ QString querystr;
+ querystr.sprintf("SELECT timeoffset FROM channel "
+ "WHERE xmltvid = \"%s\" AND sourceid = %d"
+ , xmltvid.ascii(), sourceid);
+
+ QSqlQuery query;
+ query.exec(querystr);
+
+ if (query.isActive() && query.numRowsAffected() > 0)
+ {
+ query.next();
+ if (query.value(0).toString() != "")
+ if (query.value(0).toString().left(1) == "-")
+ offset_sign = -1;
+
+ offset = query.value(0).toString().left(3).toInt() * 60 +
+ (offset_sign * query.value(0).toString().right(2).toInt());
+ }
+
+ return offset;
+}
+
+ChanInfo *parseChannel(QDomElement &element, QUrl baseUrl, int sourceid)
+{
+
ChanInfo *chaninfo = new ChanInfo;
QString xmltvid = element.attribute("id", "");
@@ -232,35 +270,35 @@
}
}
+ chaninfo->timeoffset = getChannelTimeOffset(chaninfo->xmltvid, sourceid);
+
return chaninfo;
}
-void addTimeOffset(QString ×tr, int config_off, QString offset )
+void addTimeOffset(QString ×tr, int offset)
{
- bool ok;
- int off = offset.stripWhiteSpace().left(3).toInt(&ok, 10);
+ bool ok = true;
- if (ok && (off != config_off))
+ if (ok)
{
- int diff = config_off - off;
int year = 0, month = 0, day = 0, hour = 0, min = 0, sec = 0;
if (timestr.length() == 14)
{
- year = timestr.left(4).toInt(&ok, 10);
- month = timestr.mid(4,2).toInt(&ok, 10);
- day = timestr.mid(6,2).toInt(&ok, 10);
- hour = timestr.mid(8,2).toInt(&ok, 10);
- min = timestr.mid(10,2).toInt(&ok, 10);
- sec = timestr.mid(12,2).toInt(&ok, 10);
+ year = timestr.left(4).toInt();
+ month = timestr.mid(4,2).toInt();
+ day = timestr.mid(6,2).toInt();
+ hour = timestr.mid(8,2).toInt();
+ min = timestr.mid(10,2).toInt();
+ sec = timestr.mid(12,2).toInt();
}
else if (timestr.length() == 12)
{
- year = timestr.left(4).toInt(&ok, 10);
- month = timestr.mid(4,2).toInt(&ok, 10);
- day = timestr.mid(6,2).toInt(&ok, 10);
- hour = timestr.mid(8,2).toInt(&ok, 10);
- min = timestr.mid(10,2).toInt(&ok, 10);
+ year = timestr.left(4).toInt();
+ month = timestr.mid(4,2).toInt();
+ day = timestr.mid(6,2).toInt();
+ hour = timestr.mid(8,2).toInt();
+ min = timestr.mid(10,2).toInt();
sec = 0;
}
else
@@ -269,11 +307,12 @@
}
QDateTime dt = QDateTime(QDate(year, month, day),QTime(hour, min, sec));
- dt = dt.addSecs(diff * 60 * 60);
+ dt = dt.addSecs(offset * 60);
timestr = dt.toString("yyyyMMddhhmmss");
}
else if (isgist)
{
+ // Note, this doesn't work anymore. Specifically offset is a different offset now
#if 0
int year = 0, month = 0, day = 0, hour = 0, min = 0, sec = 0;
@@ -314,61 +353,41 @@
}
}
-ProgInfo *parseProgram(QDomElement &element)
+ProgInfo *parseProgram(QDomElement &element, int sourceid)
{
- QString config_offset = gContext->GetSetting("TimeOffset");
-
- bool ok;
- int config_off = 0;
-
- if (config_offset != "")
- config_off = config_offset.left(3).toInt(&ok, 10);
ProgInfo *pginfo = new ProgInfo;
QString text = element.attribute("start", "");
QStringList split = QStringList::split(" ", text);
- QString st = split[0];
- QString offset;
- if (split.size() > 1)
- offset = split[1];
- else
- offset = config_offset;
-
- if (config_off >= 0 && config_off <= 24 && offset != "")
- addTimeOffset(st, config_off, offset);
-
- pginfo->startts = st;
+ pginfo->startts = split[0];
text = element.attribute("stop", "");
split = QStringList::split(" ", text);
- QString et;
-
if (split.size() > 0)
{
- et = split[0];
- if (split.size() > 1)
- offset = split[1];
- else
- offset = config_offset;
+ pginfo->endts = split[0];
}
else
- et = "";
-
- if (config_off >= 0 && config_off <= 24 && offset != "")
- addTimeOffset(et, config_off, offset);
-
- pginfo->endts = et;
+ pginfo->endts = "";
text = element.attribute("channel", "");
split = QStringList::split(" ", text);
pginfo->channel = split[0];
- pginfo->start = fromXMLTVDate(pginfo->startts);
- pginfo->end = fromXMLTVDate(pginfo->endts);
+ QString st = pginfo->startts;
+ QString et = pginfo->endts;
+
+ addTimeOffset(st, getChannelTimeOffset(pginfo->channel, sourceid));
+ if (et.length() > 0)
+ addTimeOffset(et, getChannelTimeOffset(pginfo->channel, sourceid));
+
+
+ pginfo->start = fromXMLTVDate(st);
+ pginfo->end = fromXMLTVDate(et);
pginfo->subtitle = pginfo->title = pginfo->desc = pginfo->category = "";
pginfo->repeat = false;
@@ -454,7 +473,7 @@
}
void parseFile(QString filename, QValueList<ChanInfo> *chanlist,
- QMap<QString, QValueList<ProgInfo> > *proglist)
+ QMap<QString, QValueList<ProgInfo> > *proglist, int sourceid)
{
QDomDocument doc;
QFile f(filename);
@@ -494,13 +513,13 @@
{
if (e.tagName() == "channel")
{
- ChanInfo *chinfo = parseChannel(e, baseUrl);
+ ChanInfo *chinfo = parseChannel(e, baseUrl, sourceid);
chanlist->push_back(*chinfo);
delete chinfo;
}
else if (e.tagName() == "programme")
{
- ProgInfo *pginfo = parseProgram(e);
+ ProgInfo *pginfo = parseProgram(e, sourceid);
(*proglist)[pginfo->channel].push_back(*pginfo);
delete pginfo;
}
@@ -629,6 +648,8 @@
(*chaninfo).iconpath = getResponse("Choose a channel icon image (any path "
"name) ",(*chaninfo).iconpath);
+ (*chaninfo).timeoffset = getResponse("Choose a time offset (eg -0100 or "
+ " +0200 ect.) ",(*chaninfo).timeoffset);
return(chanid);
}
@@ -674,7 +695,7 @@
QSqlQuery query;
QString querystr;
- querystr.sprintf("SELECT chanid,name,callsign,channum,finetune,icon "
+ querystr.sprintf("SELECT chanid,name,callsign,channum,finetune,icon,timeoffset "
"FROM channel WHERE xmltvid = \"%s\" AND "
"sourceid = %d;", (*i).xmltvid.ascii(), id);
@@ -691,6 +712,7 @@
QString chanstr = QString::fromUtf8(query.value(3).toString());
QString finetune = QString::fromUtf8(query.value(4).toString());
QString icon = QString::fromUtf8(query.value(5).toString());
+ QString timeoffset = QString::fromUtf8(query.value(6).toString());
cout << "### " << endl;
cout << "### Existing channel found" << endl;
@@ -702,12 +724,14 @@
cout << "### channum = " << chanstr.ascii() << endl;
cout << "### finetune = " << finetune.ascii() << endl;
cout << "### icon = " << icon.ascii() << endl;
+ cout << "### timeoffset = " << timeoffset.ascii() << endl;
cout << "### " << endl;
(*i).name = name;
(*i).callsign = callsign;
(*i).chanstr = chanstr;
(*i).finetune = finetune;
+ (*i).timeoffset = timeoffset;
promptForChannelUpdates(i, atoi(chanid.ascii()));
@@ -715,12 +739,13 @@
callsign != (*i).callsign ||
chanstr != (*i).chanstr ||
finetune != (*i).finetune ||
+ timeoffset != (*i).timeoffset ||
icon != localfile)
{
querystr.sprintf("UPDATE channel SET chanid = %s, "
"name = \"%s\", callsign = \"%s\", "
"channum = \"%s\", finetune = %d, "
- "icon = \"%s\" WHERE xmltvid = \"%s\" "
+ "icon = \"%s\", timeoffset = \"%s\" WHERE xmltvid = \"%s\" "
"AND sourceid = %d;",
chanid.ascii(),
(*i).name.ascii(),
@@ -728,6 +753,7 @@
(*i).chanstr.ascii(),
atoi((*i).finetune.ascii()),
localfile.ascii(),
+ (*i).timeoffset.ascii(),
(*i).xmltvid.ascii(),
id);
@@ -780,6 +806,7 @@
cout << "### channum = " << (*i).chanstr.ascii() << endl;
cout << "### finetune = " << (*i).finetune.ascii() << endl;
cout << "### icon = " << localfile.ascii() << endl;
+ cout << "### timeoffset = " << (*i).timeoffset.ascii() << endl;
cout << "### " << endl;
unsigned int chanid = promptForChannelUpdates(i,0);
@@ -787,15 +814,16 @@
if (chanid > 0)
{
querystr.sprintf("INSERT INTO channel (chanid,name,"
- "callsign,channum,finetune,icon,"
+ "callsign,channum,finetune,icon,timeoffset,"
"xmltvid,sourceid) VALUES(%d,\"%s\","
- "\"%s\",\"%s\",%d,\"%s\",\"%s\",%d);",
+ "\"%s\",\"%s\",%d,\"%s\",\"%s\",\"%s\",%d);",
chanid,
(*i).name.ascii(),
(*i).callsign.ascii(),
(*i).chanstr.ascii(),
atoi((*i).finetune.ascii()),
localfile.ascii(),
+ (*i).timeoffset.ascii(),
(*i).xmltvid.ascii(),
id);
@@ -842,8 +870,8 @@
}
querystr.sprintf("INSERT INTO channel (chanid,name,callsign,"
- "channum,finetune,icon,xmltvid,sourceid) "
- "VALUES(%d,\"%s\",\"%s\",\"%s\",%d,\"%s\","
+ "channum,finetune,icon,timeoffset,xmltvid,sourceid) "
+ "VALUES(%d,\"%s\",\"%s\",\"%s\",\"%s\",%d,\"%s\","
"\"%s\",%d);",
chanid,
(*i).name.ascii(),
@@ -851,6 +879,7 @@
(*i).chanstr.ascii(),
atoi((*i).finetune.ascii()),
localfile.ascii(),
+ (*i).timeoffset.ascii(),
(*i).xmltvid.ascii(),
id);
@@ -1090,7 +1119,7 @@
QValueList<ChanInfo> chanlist;
QMap<QString, QValueList<ProgInfo> > proglist;
- parseFile(filename, &chanlist, &proglist);
+ parseFile(filename, &chanlist, &proglist, id);
handleChannels(id, &chanlist);
handlePrograms(id, offset, &proglist);
@@ -1275,7 +1304,7 @@
if (query.isActive() && query.numRowsAffected() > 0) {
query.next();
- if (query.value(0).toInt() < 60)
+ if (query.value(0).toInt() < 20)
grabData(*it, i);
} else {
@@ -1331,7 +1360,7 @@
return (failures == 0);
}
-ChanInfo *xawtvChannel(QString &id, QString &channel, QString &fine)
+ChanInfo *xawtvChannel(QString &id, QString &channel, QString &fine, int sourceid)
{
ChanInfo *chaninfo = new ChanInfo;
chaninfo->xmltvid = id;
@@ -1342,6 +1371,9 @@
chaninfo->iconpath = "";
+
+ chaninfo->timeoffset = getChannelTimeOffset(chaninfo->xmltvid, sourceid);
+
return chaninfo;
}
@@ -1371,7 +1403,7 @@
{
if ((xawid != "") && (channel != ""))
{
- ChanInfo *chinfo = xawtvChannel(xawid, channel, fine);
+ ChanInfo *chinfo = xawtvChannel(xawid, channel, fine, id);
chanlist.push_back(*chinfo);
delete chinfo;
}
@@ -1400,7 +1432,7 @@
if ((xawid != "") && (channel != ""))
{
- ChanInfo *chinfo = xawtvChannel(xawid, channel, fine);
+ ChanInfo *chinfo = xawtvChannel(xawid, channel, fine, id);
chanlist.push_back(*chinfo);
delete chinfo;
}
More information about the mythtv-users
mailing list