[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