[mythtv] [PATCH] better playbackbox interactivity
Jason Rosson
etiam at pacbell.net
Fri Dec 19 00:15:30 EST 2003
Isaac Richards wrote:
>
>
> an even better way to do it would be to make the main query on the backend
> gather this information and transmit it along with the rest of the recorded
> program info, so there would be no db queries on the frontend at all =)
>
ok this is done. i also included another little bit of code to
cache the playbox thumbnails to a local .mythtv/imagecache directory.
makes remote frontends faster.
- jason
-------------- next part --------------
Index: mythtv/libs/libmyth/mythcontext.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmyth/mythcontext.cpp,v
retrieving revision 1.96
diff -u -r1.96 mythcontext.cpp
--- mythtv/libs/libmyth/mythcontext.cpp 11 Dec 2003 02:56:04 -0000 1.96
+++ mythtv/libs/libmyth/mythcontext.cpp 19 Dec 2003 05:00:42 -0000
@@ -965,6 +965,28 @@
return &(imageCache[url]);
}
+ QString thumbcachedir = QDir::homeDirPath() + "/.mythtv/imagecache/";
+ QDir d(thumbcachedir);
+ if (!d.exists())
+ d.mkdir(thumbcachedir);
+
+ QString cachefilepath = thumbcachedir + qurl.fileName();
+
+ QFileInfo fi(qurl.fileName());
+ if(fi.extension() == "nuv.png")
+ {
+ QFile cachecheck(cachefilepath);
+ if (cachecheck.exists())
+ {
+ QImage image(cachefilepath);
+ if (image.width() > 0)
+ {
+ imageCache[url] = image;
+ return &(imageCache[url]);
+ }
+ }
+ }
+
RemoteFile *rf = new RemoteFile(url, true);
QByteArray data;
@@ -977,6 +999,12 @@
QImage image(data);
if (image.width() > 0)
{
+ pid_t pid = fork();
+ if(pid == 0)
+ {
+ image.save(cachefilepath, "PNG");
+ exit(0);
+ }
imageCache[url] = image;
return &(imageCache[url]);
}
Index: mythtv/libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/NuppelVideoPlayer.cpp,v
retrieving revision 1.300
diff -u -r1.300 NuppelVideoPlayer.cpp
--- mythtv/libs/libmythtv/NuppelVideoPlayer.cpp 6 Dec 2003 00:01:45 -0000 1.300
+++ mythtv/libs/libmythtv/NuppelVideoPlayer.cpp 19 Dec 2003 05:00:43 -0000
@@ -3360,6 +3360,7 @@
decoder->SetPositionMap();
m_playbackinfo->SetMarkupFlag(MARK_PROCESSING, false, m_db);
+ m_playbackinfo->SetCommFlagged(true, m_db);
db_lock.unlock();
return(comms_found);
Index: mythtv/libs/libmythtv/dbcheck.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/dbcheck.cpp,v
retrieving revision 1.22
diff -u -r1.22 dbcheck.cpp
--- mythtv/libs/libmythtv/dbcheck.cpp 14 Dec 2003 23:56:41 -0000 1.22
+++ mythtv/libs/libmythtv/dbcheck.cpp 19 Dec 2003 05:00:43 -0000
@@ -8,7 +8,7 @@
#include "mythcontext.h"
-const QString currentDatabaseVersion = "1021";
+const QString currentDatabaseVersion = "1022";
void UpdateDBVersionNumber(const QString &newnumber)
{
@@ -460,6 +460,67 @@
performActualUpdate(updates, "1021", dbver);
}
+
+ if (dbver == "1021")
+ {
+ const QString updates[] = {
+"ALTER TABLE recorded ADD COLUMN commflagged int(10) unsigned NOT NULL default '0';",
+""
+};
+
+ performActualUpdate(updates, "1022", dbver);
+
+ VERBOSE(VB_ALL, QString("This could take a few minutes."));
+
+ QSqlDatabase *db = QSqlDatabase::database();
+
+ QString thequery, chanid, startts;
+ QSqlQuery query;
+ QDateTime recstartts;
+
+ thequery = QString("SELECT recorded.chanid, recorded.starttime "
+ "FROM recorded, recordedmarkup "
+ "WHERE recorded.chanid = recordedmarkup.chanid AND "
+ "recorded.starttime = recordedmarkup.starttime AND "
+ "(type = 4 OR type = 5) "
+ "GROUP BY chanid, starttime");
+ query = db->exec(thequery);
+
+ vector<QString*> cfList;
+
+ if (query.isActive() && query.numRowsAffected() > 0)
+ {
+ while (query.next())
+ {
+ chanid = query.value(0).toString();
+ recstartts = query.value(1).toDateTime();
+ startts = recstartts.toString("yyyyMMddhhmm");
+ startts += "00";
+
+ QString *tmp = new QString[2];
+ tmp[0] = chanid;
+ tmp[1] = startts;
+ cfList.push_back(tmp);
+ }
+ }
+
+ for (unsigned int i = 0; i < cfList.size(); i++)
+ {
+ chanid = cfList[i][0];
+ startts = cfList[i][1];
+
+ thequery = QString("UPDATE recorded "
+ "SET commflagged = 1, starttime = %2 "
+ "WHERE chanid = '%1' AND "
+ " starttime = '%3';").arg(chanid)
+ .arg(startts)
+ .arg(startts);
+
+ db->exec(thequery);
+ delete cfList[i];
+ }
+ }
+
}
void InitializeDatabase(void)
Index: mythtv/libs/libmythtv/programinfo.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/programinfo.cpp,v
retrieving revision 1.92
diff -u -r1.92 programinfo.cpp
--- mythtv/libs/libmythtv/programinfo.cpp 16 Dec 2003 22:58:54 -0000 1.92
+++ mythtv/libs/libmythtv/programinfo.cpp 19 Dec 2003 05:00:43 -0000
@@ -87,6 +87,7 @@
cardid = other.cardid;
schedulerid = other.schedulerid;
recpriority = other.recpriority;
+ programflags = other.programflags;
repeat = other.repeat;
@@ -133,6 +134,7 @@
list << recstartts.toString(Qt::ISODate);
list << recendts.toString(Qt::ISODate);
list << QString::number(repeat);
+ list << QString::number(programflags);
}
void ProgramInfo::FromStringList(QStringList &list, int offset)
@@ -177,6 +179,7 @@
recstartts = QDateTime::fromString(*(it++), Qt::ISODate);
recendts = QDateTime::fromString(*(it++), Qt::ISODate);
repeat = (*(it++)).toInt();
+ programflags = (*(it++)).toInt();
if (title == " ")
title = "";
@@ -255,6 +258,7 @@
progMap["type"] = progMap["rec_str"];
progMap["recpriority"] = recpriority;
+ progMap["programflags"] = programflags;
progMap["timedate"] = recstartts.date().toString(dateFormat) + ", " +
recstartts.time().toString(timeFormat) + " - " +
@@ -531,6 +535,8 @@
if (proginfo->channame == QString::null)
proginfo->channame = "";
+ proginfo->programflags = proginfo->getProgramFlags(db);
+
return proginfo;
}
@@ -949,6 +955,46 @@
MythContext::DBError("Edit status update", querystr);
}
+bool ProgramInfo::IsCommFlagged(QSqlDatabase *db)
+{
+ MythContext::KickDatabase(db);
+
+ bool result = false;
+
+ QString starts = recstartts.toString("yyyyMMddhhmm");
+ starts += "00";
+
+ QString querystr = QString("SELECT commflagged FROM recorded WHERE "
+ "chanid = '%1' AND starttime = '%2';")
+ .arg(chanid).arg(starts);
+
+ QSqlQuery query = db->exec(querystr);
+ if (query.isActive() && query.numRowsAffected() > 0)
+ {
+ query.next();
+
+ result = query.value(0).toInt();
+ }
+
+ return result;
+}
+
+void ProgramInfo::SetCommFlagged(bool flagged, QSqlDatabase *db)
+{
+ MythContext::KickDatabase(db);
+
+ QString starts = recstartts.toString("yyyyMMddhhmm");
+ starts += "00";
+
+ QString querystr = QString("UPDATE recorded SET commflagged = '%1', "
+ "starttime = '%2' WHERE chanid = '%3' AND "
+ "starttime = '%4';").arg(flagged).arg(starts)
+ .arg(chanid).arg(starts);
+ QSqlQuery query = db->exec(querystr);
+ if (!query.isActive())
+ MythContext::DBError("Commercial Flagged status update", querystr);
+}
+
void ProgramInfo::SetAutoExpire(bool autoExpire, QSqlDatabase *db)
{
MythContext::KickDatabase(db);
@@ -1704,6 +1750,35 @@
ScheduledRecording::signalChange(db);
}
+char ProgramInfo::getProgramFlags(QSqlDatabase *db)
+{
+ char flags = 0;
+
+ MythContext::KickDatabase(db);
+
+ QString starts = recstartts.toString("yyyyMMddhhmm");
+ starts += "00";
+
+ QString querystr = QString("SELECT commflagged, cutlist, autoexpire, "
+ "editing, bookmark FROM recorded WHERE "
+ "chanid = '%1' AND starttime = '%2';")
+ .arg(chanid).arg(starts);
+
+ QSqlQuery query = db->exec(querystr);
+ if (query.isActive() && query.numRowsAffected() > 0)
+ {
+ query.next();
+
+ flags |= query.value(0).toInt() ? FL_COMMFLAG : 0;
+ flags |= query.value(1).toString().length() > 1 ? FL_CUTLIST : 0;
+ flags |= query.value(2).toInt() ? FL_AUTOEXP : 0;
+ flags |= query.value(3).toInt() ? FL_EDITING : 0;
+ flags |= query.value(4).toString().length() > 1 ? FL_BOOKMARK : 0;
+ }
+
+ return flags;
+}
+
void ProgramInfo::handleRecording(QSqlDatabase *db)
{
QString message = title;
Index: mythtv/libs/libmythtv/programinfo.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/programinfo.h,v
retrieving revision 1.60
diff -u -r1.60 programinfo.h
--- mythtv/libs/libmythtv/programinfo.h 16 Dec 2003 22:58:55 -0000 1.60
+++ mythtv/libs/libmythtv/programinfo.h 19 Dec 2003 05:00:43 -0000
@@ -7,7 +7,7 @@
#include <qmap.h>
#include "scheduledrecording.h"
-#define NUMPROGRAMLINES 28
+#define NUMPROGRAMLINES 29
enum MarkTypes {
MARK_UPDATED_CUT = -3,
@@ -37,6 +37,14 @@
TRANSCODE_FLAGS = 0xF0
};
+enum FlagMask {
+ FL_COMMFLAG = 0x01,
+ FL_CUTLIST = 0x02,
+ FL_AUTOEXP = 0x04,
+ FL_EDITING = 0x08,
+ FL_BOOKMARK = 0x10,
+};
+
enum NoRecordType {
nrUnknown = 0,
nrManualOverride = 1,
@@ -113,6 +121,8 @@
long long GetBookmark(QSqlDatabase *db);
bool IsEditing(QSqlDatabase *db);
void SetEditing(bool edit, QSqlDatabase *db);
+ bool IsCommFlagged(QSqlDatabase *db);
+ void SetCommFlagged(bool edit, QSqlDatabase *db);
void SetAutoExpire(bool autoExpire, QSqlDatabase *db);
bool GetAutoExpireFromRecorded(QSqlDatabase *db);
@@ -150,6 +160,8 @@
void EditScheduled(QSqlDatabase *db);
void EditRecording(QSqlDatabase *db);
+ char getProgramFlags(QSqlDatabase *db);
+
static void GetProgramListByQuery(QSqlDatabase *db,
QPtrList<ProgramInfo> *proglist,
const QString &where);
@@ -191,6 +203,7 @@
QDateTime recstartts;
QDateTime recendts;
+
bool repeat;
int spread;
@@ -211,6 +224,8 @@
QString schedulerid;
+ int programflags;
+
private:
void handleRecording(QSqlDatabase *db);
void handleNotRecording(QSqlDatabase *db);
Index: mythtv/programs/mythbackend/mainserver.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythbackend/mainserver.cpp,v
retrieving revision 1.107
diff -u -r1.107 mainserver.cpp
--- mythtv/programs/mythbackend/mainserver.cpp 16 Dec 2003 05:23:39 -0000 1.107
+++ mythtv/programs/mythbackend/mainserver.cpp 19 Dec 2003 05:00:44 -0000
@@ -578,7 +578,8 @@
MythContext::KickDatabase(m_db);
thequery = "SELECT recorded.chanid,starttime,endtime,title,subtitle,"
- "description,hostname,channum,name,callsign FROM recorded "
+ "description,hostname,channum,name,callsign,commflagged,"
+ "cutlist,autoexpire,editing,bookmark FROM recorded "
"LEFT JOIN channel ON recorded.chanid = channel.chanid "
"ORDER BY starttime";
@@ -636,6 +637,8 @@
proginfo->chansign = "#" + proginfo->chanid;
}
+ proginfo->programflags = proginfo->getProgramFlags(m_db);
+
QString lpath = proginfo->GetRecordFilename(fileprefix);
PlaybackSock *slave = NULL;
QFile checkFile(lpath);
Index: mythtv/programs/mythfrontend/playbackbox.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythfrontend/playbackbox.cpp,v
retrieving revision 1.110
diff -u -r1.110 playbackbox.cpp
--- mythtv/programs/mythfrontend/playbackbox.cpp 16 Dec 2003 05:23:40 -0000 1.110
+++ mythtv/programs/mythfrontend/playbackbox.cpp 19 Dec 2003 05:00:45 -0000
@@ -346,13 +346,13 @@
container->ClearAllText();
container->SetTextByRegexp(regexpMap);
+ int flags = curitem->programflags;
+
UIImageType *itype;
itype = (UIImageType *)container->GetType("commflagged");
if (itype)
{
- QMap<long long, int> commbreaks;
- curitem->GetCommBreakList(commbreaks, m_db);
- if (commbreaks.size())
+ if (flags & FL_COMMFLAG)
itype->ResetFilename();
else
itype->SetImage("blank.png");
@@ -362,9 +362,7 @@
itype = (UIImageType *)container->GetType("cutlist");
if (itype)
{
- QMap<long long, int> cutlist;
- curitem->GetCutList(cutlist, m_db);
- if (cutlist.size())
+ if (flags & FL_CUTLIST)
itype->ResetFilename();
else
itype->SetImage("blank.png");
@@ -374,7 +372,7 @@
itype = (UIImageType *)container->GetType("autoexpire");
if (itype)
{
- if (curitem->GetAutoExpireFromRecorded(m_db))
+ if (flags & FL_AUTOEXP)
itype->ResetFilename();
else
itype->SetImage("blank.png");
@@ -384,8 +382,8 @@
itype = (UIImageType *)container->GetType("processing");
if (itype)
{
- if ((curitem->IsEditing(m_db)) ||
- (curitem->CheckMarkupFlag(MARK_PROCESSING, m_db)))
+ if ((flags & FL_EDITING) ||
+ curitem->CheckMarkupFlag(MARK_PROCESSING, m_db))
itype->ResetFilename();
else
itype->SetImage("blank.png");
@@ -395,7 +393,7 @@
itype = (UIImageType *)container->GetType("bookmark");
if (itype)
{
- if (curitem->GetBookmark(m_db))
+ if (flags & FL_BOOKMARK)
itype->ResetFilename();
else
itype->SetImage("blank.png");
More information about the mythtv-dev
mailing list