]> git.vomp.tv Git - vompserver.git/commitdiff
Support for epgimages added
authorMarten Richter <marten.richter@freenet.de>
Sun, 5 Oct 2014 15:02:03 +0000 (17:02 +0200)
committerMarten Richter <marten.richter@freenet.de>
Sun, 5 Oct 2014 15:02:03 +0000 (17:02 +0200)
mvpserver.c
mvpserver.h
picturereader.c
picturereader.h
vomp.conf.sample
vompclient.c
vompclient.h
vompclientrrproc.c

index 8ae63b83028683f37a75fc8f69757920f314418b..bbf8fbd3828bd27f65afe14bf1744fb5d4e46b56 100644 (file)
@@ -30,10 +30,18 @@ MVPServer::MVPServer()
   // MH in case anbody has a better position :-)
   pthread_mutex_init(&threadClientMutex, NULL);
   tcpServerPort = 0;
+  logoDir = NULL;
+  resourceDir = NULL;
+  imageDir = NULL;
+  cacheDir = NULL;
 }
 
 MVPServer::~MVPServer()
 {
+  if (logoDir) delete[] logoDir;
+  if (resourceDir) delete[] resourceDir;
+  if (imageDir) delete[] imageDir;
+  if (cacheDir) delete[] cacheDir;
   stop();
 }
 
@@ -92,6 +100,56 @@ int MVPServer::run(char* tconfigDir)
     dsyslog("VOMP: Logging disabled");
   }
 
+  const char *bigresdir = cPlugin::ResourceDirectory();  
+  const char *bigcachedir = cPlugin::CacheDirectory();  
+  // get logo directory
+  logoDir =  config.getValueString("General", "Channel logo directory");
+  
+  if (logoDir) 
+  {
+    log.log("Main", Log::INFO, "LogoDir set %s", logoDir);
+  } else {
+    if (bigresdir) {
+       logoDir = new char[strlen(bigresdir)+1+7];
+       sprintf(logoDir,"%s/logos/",bigresdir);    
+       log.log("Main", Log::INFO, "No LogoDir set, default %s",logoDir);
+     } else {
+       log.log("Main", Log::INFO, "No LogoDir set, no res dir");
+     }
+        
+  }
+
+  // get epg Image directory
+  imageDir =  config.getValueString("General", "Epg image directory");
+  
+  if (imageDir) 
+  {
+    log.log("Main", Log::INFO, "ImageDir set %s", imageDir);
+  } else {
+    if (bigcachedir) {
+       imageDir = new char[strlen(bigcachedir)+1+11+3];
+       sprintf(imageDir,"%s/../epgimages/",bigcachedir);    
+       log.log("Main", Log::INFO, "No ImageDir set, default %s",imageDir);
+    } else {
+       log.log("Main", Log::INFO, "No ImageDir set, no cache dir");
+    }
+  }
+
+  if (bigresdir) {
+    resourceDir = new char[strlen(bigresdir)+1];
+    strcpy(resourceDir,bigresdir);
+    log.log("Main", Log::INFO, "Resource directory is  %s",bigresdir);
+  } else {
+    log.log("Main", Log::INFO, "Resource directory is  not set");
+  }
+  
+  if (bigcachedir) {
+    cacheDir = new char[strlen(bigcachedir)+1];
+    strcpy(cacheDir,bigcachedir);
+    log.log("Main", Log::INFO, "Cache directory is  %s",bigcachedir);
+  } else {
+    log.log("Main", Log::INFO, "Cache directory is  not set");
+  }
   // Get UDP port number for discovery service
 
   int fail = 1;
@@ -272,7 +330,7 @@ void MVPServer::threadMethod()
   while(1)
   {
     clientSocket = accept(listeningSocket,(struct sockaddr *)&address, &length);
-    VompClient* m = new VompClient(&config, configDir, clientSocket);
+    VompClient* m = new VompClient(&config, configDir, logoDir, resourceDir, imageDir, cacheDir, clientSocket);
     m->run();
   }
 }
index 80cc211755e3adc0a9e168ffc5a1783322a4e611..ed29c6570e2f0d56ebd30c28ad82bb3d91c5de6c 100644 (file)
@@ -54,6 +54,10 @@ class MVPServer : public Thread
     MVPRelay mvprelay;
     int listeningSocket;
     char* configDir;
+    char* logoDir;
+    char* imageDir;
+    char* resourceDir;
+    char* cacheDir;
     USHORT tcpServerPort;
 };
 
index 1e6eaf4fba7fac6ed96d7a792e040df05ba3068b..d2a7a66a03d0e8af9beb3f22dad0ab2239878241 100644 (file)
@@ -2,6 +2,7 @@
 #include <vdr/plugin.h>
 #include <vdr/channels.h>
 #include <sstream>
+#include <algorithm>
 
 
 PictureReader::PictureReader(VompClient *client)
@@ -37,6 +38,42 @@ void PictureReader::addTVMediaRequest(TVMediaRequest& req)
     pthread_mutex_unlock(&pictureLock);
 }
 
+bool PictureReader::epgImageExists(int event)
+{
+    if (x->imageDir) {
+        std::ostringstream file;
+        file<< std::string(x->imageDir)<< event << std::string(".jpg");
+       if (!access(file.str().c_str() ,F_OK))
+       {
+           return true;
+       }
+
+       std::ostringstream file2;
+       file2 << std::string(x->imageDir) << event << std::string("_0.jpg");
+       if (!access(file2.str().c_str() ,F_OK))
+       {
+           return true;
+       }
+    } else if (x->cacheDir) {
+
+        std::ostringstream file;
+        file<<std::string(x->cacheDir)<<std::string("/../epgimages/")
+               << event << std::string(".jpg");
+       if (!access(file.str().c_str() ,F_OK))
+       {
+           return true;
+       }
+       std::ostringstream file2;
+       file2<<std::string(x->cacheDir)<<std::string("/../epgimages/")<<
+            event <<std::string("_0.jpg");
+       if (!access(file2.str().c_str() ,F_OK))
+       {
+           return true;
+       }
+    }
+    return false; 
+}
+
 std::string PictureReader::getPictName(TVMediaRequest & req)
 {
    logger->log("PictRead",Log::DEBUG,
@@ -186,17 +223,69 @@ std::string PictureReader::getPictName(TVMediaRequest & req)
 
       if (x->scraper && event) {
         x->scraper->Service("GetPosterThumb",&getter);
-        return getter.poster.path;
-      } else {
-         return std::string("");
+        if (getter.poster.width) return getter.poster.path;
       }
+      if (x->imageDir) {
+        std::ostringstream file;
+        file<< std::string(x->imageDir)<< req.primary_id << std::string(".jpg");
+       if (!access(file.str().c_str() ,F_OK))
+       {
+           return file.str();
+       }
+
+       std::ostringstream file2;
+       file2 << std::string(x->imageDir) << req.primary_id << std::string("_0.jpg");
+       if (!access(file2.str().c_str() ,F_OK))
+       {
+           return file2.str();
+       }
+      } else if (x->cacheDir) {
+
+        std::ostringstream file;
+        file<<std::string(x->cacheDir)<<std::string("/../epgimages/")
+               <<req.primary_id << std::string(".jpg");
+       if (!access(file.str().c_str() ,F_OK))
+       {
+           return file.str();
+       }
+       std::ostringstream file2;
+       file2<<std::string(x->cacheDir)<<std::string("/../epgimages/")<<
+            req.primary_id<<std::string("_0.jpg");
+       if (!access(file2.str().c_str() ,F_OK))
+       {
+           return file2.str();
+       }
+      } 
+      return std::string("");
    }; break;
+   case 5: { // Channel logo
+       std::transform(req.primary_name.begin(),req.primary_name.end(),
+           req.primary_name.begin(),::tolower);
+       if (x->logoDir) {
+          std::string file=std::string(x->logoDir)+req.primary_name+std::string(".png");
+          if (!access(file.c_str() ,F_OK))
+          {
+             return file;
+          }
+       }
+       // if noopacity is there steal the logos
+       if (x->resourceDir) {
+           std::string file=std::string(x->resourceDir)
+                               +std::string("/skinnopacity/logos/")+req.primary_name+std::string(".png");
+           if (!access(file.c_str() ,F_OK))
+           {
+               return file;
+           }
+       }
+       return std::string("");
+
    
+   }; break;
    default:
      return std::string("");
      break;
    };
-     
+   return std::string("");
    
 }
 
index f734d65621d2cbb020f55b7d2e6e0b410b0a413d..5cbbaeca9b464b85780114ee704d04fbcac29dc7 100644 (file)
@@ -50,6 +50,7 @@ class PictureReader : public Thread
     int init(TCP* tcp);
     void detachMVPReceiver();
     void addTVMediaRequest(TVMediaRequest&);
+    bool epgImageExists(int event);
 
   private:
 
index e83756abc094023b2fbd4cf1777076b204ff1c19..49b6caf9af1899bedc4a5f4ccfd783320d083ee2 100644 (file)
 
 # MVPRelay enabled = yes
 
+# Change the following to the directory, where the channel logos reside,
+# all png and the channel name in lower case
+# if not set a logo directory below the plugin directory is used
+
+# Channel logo directory = /logodir
+
+# Change the following to the directory, where the EPG image reside,
+# if not set a image directory is try to be set automatically
+
+# Epg image directory = /EpgImage
index bc15aefe64f38f790c489adac5ac86c414ab7690..6724231dc32c2b209756141ba4392d532420c6dc 100644 (file)
@@ -43,7 +43,7 @@ cPlugin *VompClient::scraper = NULL;
 time_t  VompClient::lastScrapQuery = 0;
 
 VompClient::VompClient(Config* cfgBase, char* tconfigDir, char* tlogoDir, 
-           char *tresourceDir, int tsocket)
+           char *tresourceDir, char * timageDir, char * tcacheDir, int tsocket)
  : rrproc(*this), tcp(tsocket), i18n(tconfigDir)
 {
 #ifndef VOMPSTANDALONE
@@ -54,6 +54,8 @@ VompClient::VompClient(Config* cfgBase, char* tconfigDir, char* tlogoDir,
   if (!scraper) scrapQuery();
   logoDir = tlogoDir;
   resourceDir = tresourceDir;
+  imageDir = timageDir;
+  cacheDir = tcacheDir;
 #endif
   log = Log::getInstance();
   loggedIn = false;
index 1856cdda90bb6652dceafa334b1dc17374e616da..77f7fcb6d29a3dad90c420e4d745bd1e1520012e 100644 (file)
@@ -72,7 +72,7 @@ class VompClient
 
   public:
     VompClient(Config* baseConfig, char* configDir, char* logoDir, 
-       char* resourceDir,  int tsocket);
+       char* resourceDir, char* imageDir, char*cacheDir,  int tsocket);
     ~VompClient();
 
     int run();
@@ -116,7 +116,9 @@ class VompClient
     static cPlugin*  scrapQuery();
     PictureReader * pict;
     char *logoDir;
+    char *imageDir;
     char *resourceDir;
+    char *cacheDir;
 
 #endif
     MediaPlayer *media;
index 5af35da0460c3a3e571b34ce92ced342c73655ae..d342b3a8facf2b4abb2ed8427fd199b76559e2ea 100644 (file)
@@ -2081,6 +2081,12 @@ int VompClientRRProc::processGetEventScraperEventType()
      resp->addLONG(call.seriesId);
      resp->addLONG(call.episodeId);
   }
+  if (x.pict->epgImageExists(eventid)) {
+     resp->addLONG(1);
+  } else {
+     resp->addLONG(0);
+  }
+    
   resp->finalise();
   x.tcp.sendPacket(resp->getPtr(), resp->getLen());