Support for channel logos
authorMarten Richter <marten.richter@freenet.de>
Sat, 27 Sep 2014 18:01:00 +0000 (20:01 +0200)
committerMarten Richter <marten.richter@freenet.de>
Sat, 27 Sep 2014 18:01:00 +0000 (20:01 +0200)
vdrcommand.h
vompclient.c
vompclient.h
vompclientrrproc.c
vompclientrrproc.h
vompserver.c

index de3d29f1318f6f5316aeac215528de7e254dc7fc..c9e4032d6307532fda14f5c988c438aa0f9f3f57 100644 (file)
@@ -76,6 +76,7 @@ const static ULONG VDR_LOADTVMEDIA          =41;
 const static ULONG VDR_LOADTVMEDIARECTHUMB  =42;
 const static ULONG VDR_GETEVENTSCRAPEREVENTTYPE = 43;
 const static ULONG VDR_LOADTVMEDIAEVENTTHUMB  =44;
+const static ULONG VDR_LOADCHANNELLOGO = 45;
 
 const static ULONG VDR_SHUTDOWN            = 666;
 
index fb36de7a4fcc8d9cf3d093aa4bb78d5a9c986785..bc15aefe64f38f790c489adac5ac86c414ab7690 100644 (file)
 pthread_mutex_t threadClientMutex;
 int VompClient::nr_clients = 0;
 cPlugin *VompClient::scraper = NULL;
+time_t  VompClient::lastScrapQuery = 0;
 
-VompClient::VompClient(Config* cfgBase, char* tconfigDir, int tsocket)
+VompClient::VompClient(Config* cfgBase, char* tconfigDir, char* tlogoDir, 
+           char *tresourceDir, int tsocket)
  : rrproc(*this), tcp(tsocket), i18n(tconfigDir)
 {
 #ifndef VOMPSTANDALONE
   lp = NULL;
   recplayer = NULL;
   recordingManager = NULL;
-  if (!scraper) scraper = cPluginManager::GetPlugin("scraper2vdr");
   pict = new PictureReader(this);
+  if (!scraper) scrapQuery();
+  logoDir = tlogoDir;
+  resourceDir = tresourceDir;
 #endif
   log = Log::getInstance();
   loggedIn = false;
@@ -107,6 +111,16 @@ VompClient::~VompClient()
   }
 }
 
+cPlugin *VompClient::scrapQuery()
+{
+    if (scraper) return scraper;
+    if ((time(NULL)-lastScrapQuery) > 5*60) {
+       lastScrapQuery = time(NULL); 
+         if (!scraper) scraper = cPluginManager::GetPlugin("scraper2vdr");
+   }
+   return scraper;
+}
+
 void VompClient::setCharset(int charset)
 {
    charcoding=charset;
@@ -401,7 +415,7 @@ cChannel* VompClient::channelFromNumber(ULONG channelNumber)
   {
     if (!channel->GroupSep())
     {
-      log->log("Client", Log::DEBUG, "Looking for channel %lu::: number: %i name: '%s'", channelNumber, channel->Number(), channel->Name());
+//      log->log("Client", Log::DEBUG, "Looking for channel %lu::: number: %i name: '%s'", channelNumber, channel->Number(), channel->Name());
 
       if (channel->Number() == (int)channelNumber)
       {
@@ -411,7 +425,7 @@ cChannel* VompClient::channelFromNumber(ULONG channelNumber)
 #else
         int apid1 = channel->Apid(0);
 #endif
-        log->log("Client", Log::DEBUG, "Found channel number %lu, vpid = %i, apid1 = %i", channelNumber, vpid, apid1);
+//        log->log("Client", Log::DEBUG, "Found channel number %lu, vpid = %i, apid1 = %i", channelNumber, vpid, apid1);
         return channel;
       }
     }
index 8c54b8479b8bdb43f3265dc46186bed1011d2079..1856cdda90bb6652dceafa334b1dc17374e616da 100644 (file)
@@ -71,7 +71,8 @@ class VompClient
   friend class PictureReader;
 
   public:
-    VompClient(Config* baseConfig, char* configDir, int tsocket);
+    VompClient(Config* baseConfig, char* configDir, char* logoDir, 
+       char* resourceDir,  int tsocket);
     ~VompClient();
 
     int run();
@@ -111,7 +112,11 @@ class VompClient
     cRecordings* recordingManager;
     RecPlayer* recplayer;
     static cPlugin * scraper;
+    static time_t lastScrapQuery;
+    static cPlugin*  scrapQuery();
     PictureReader * pict;
+    char *logoDir;
+    char *resourceDir;
 
 #endif
     MediaPlayer *media;
index f45fa29233e75dcdb0dea35d9e89a4db4ea89b5a..5af35da0460c3a3e571b34ce92ced342c73655ae 100644 (file)
@@ -296,7 +296,9 @@ bool VompClientRRProc::processPacket()
     case VDR_LOADTVMEDIAEVENTTHUMB:
       result = processLoadTvMediaEventThumb();
     break;
-
+    case VDR_LOADCHANNELLOGO:
+      result = processLoadChannelLogo();
+    break;
 #endif
     case VDR_GETMEDIALIST:
       result = processGetMediaList();
@@ -2021,7 +2023,7 @@ int VompClientRRProc::processGetRecScraperEventType()
   ScraperGetEventType call;
   call.type = tNone;
 
-  if (recording && x.scraper
+  if (recording && x.scrapQuery()
   {
      call.recording = recording;
      x.scraper->Service("GetEventType",&call);
@@ -2066,7 +2068,7 @@ int VompClientRRProc::processGetEventScraperEventType()
     }
   }
     
-  if (event && x.scraper
+  if (event && x.scrapQuery()
   {
      call.event = event;
      x.scraper->Service("GetEventType",&call);
@@ -2092,7 +2094,7 @@ int VompClientRRProc::processGetScraperMovieInfo()
    
    cMovie movie;
    movie.movieId = ntohl(*(ULONG*)req->data);
-   if (!x.scraper) {
+   if (!x.scrapQuery()) {
       log->log("RRProc", Log::DEBUG, "No Scraper, get SeriesInfo");
       return 0; //stupid, I have no scraper why are you still asking
    }
@@ -2143,7 +2145,7 @@ int VompClientRRProc::processGetScraperSeriesInfo()
    cSeries series;
    series.seriesId = ntohl(*(ULONG*)req->data);
    series.episodeId = ntohl(*(ULONG*)(req->data+4));
-   if (!x.scraper) {
+   if (!x.scrapQuery()) {
       log->log("RRProc", Log::DEBUG, "No Scraper, get SeriesInfo");
       return 0; //stupid, I have no scraper why are you still asking
    }
@@ -2275,6 +2277,31 @@ int VompClientRRProc::processLoadTvMediaEventThumb()
    return 1;
 }
 
+int VompClientRRProc::processLoadChannelLogo()
+{
+   TVMediaRequest tvreq;
+   tvreq.streamID = req->requestID;
+   tvreq.type = 5; // channel logo
+   UINT channelid = ntohl(*(ULONG*)req->data);
+   tvreq.primary_id = channelid;
+   tvreq.secondary_id = 0;
+   cChannel* channel = x.channelFromNumber(channelid);
+
+   if (channel) tvreq.primary_name = std::string((const char*)channel->Name());
+   tvreq.type_pict = 1;
+   tvreq.container = 0;
+   tvreq.container_member = 0;
+   log->log("RRProc", Log::DEBUG, "TVMedia request %d %d %s",req->requestID,channelid, channel->Name());
+   x.pict->addTVMediaRequest(tvreq);
+
+   
+   resp->finalise();
+
+   x.tcp.sendPacket(resp->getPtr(), resp->getLen());
+   
+   return 1;
+}
+
  
 
 
index e59fddf8b1bbff0e8a82a7292ac8cdbc68dc7e58..1c0fb6b40d259c7cfa37269d46c234be72965cce 100644 (file)
@@ -90,6 +90,7 @@ class VompClientRRProc : public Thread
     int processLoadTvMediaRecThumb();
     int processGetEventScraperEventType();
     int processLoadTvMediaEventThumb();
+    int processLoadChannelLogo();
 
 #endif
     int processLogin();
index b59a03795455ab080c4b71338342e081193e770e..3ded2b0bb491bb4603616b393afdc91c32e945b5 100644 (file)
@@ -74,6 +74,7 @@ cPluginVompserver::~cPluginVompserver()
   // Clean up after yourself!
   mvpserver.stop();
   if (configDir) delete[] configDir;  
+
 }
 
 const char *cPluginVompserver::CommandLineHelp(void)
@@ -91,15 +92,15 @@ bool cPluginVompserver::ProcessArgs(int argc, char *argv[])
   {
     if (c == 'c')
     {
-      const char* vdrdeveldevelret = cPlugin::ConfigDirectory(optarg);
-      if (!vdrdeveldevelret)
+      const char* vdrret = cPlugin::ConfigDirectory(optarg);
+      if (!vdrret)
       {
         dsyslog("VOMP: Could not get config dir from VDR");
         return false;
       }
       
-      configDir = new char[strlen(vdrdeveldevelret)+1];
-      strcpy(configDir, vdrdeveldevelret);
+      configDir = new char[strlen(vdrret)+1];
+      strcpy(configDir, vdrret);
     }
     else
     {
@@ -122,14 +123,14 @@ bool cPluginVompserver::Start(void)
   
   if (!configDir)
   {
-    const char* vdrdeveldevelret = cPlugin::ConfigDirectory("vompserver");
-    if (!vdrdeveldevelret)
+    const char* vdrret = cPlugin::ConfigDirectory("vompserver");
+    if (!vdrret)
     {
       dsyslog("VOMP: Could not get config dir from VDR");
       return false;
     }
-    configDir = new char[strlen(vdrdeveldevelret)+1];
-    strcpy(configDir, vdrdeveldevelret);
+    configDir = new char[strlen(vdrret)+1];
+    strcpy(configDir, vdrret);
   }
   
   int success = mvpserver.run(configDir);