From 0212dfcf809a0c061dbb8fe3bb043f15f053f0a2 Mon Sep 17 00:00:00 2001 From: Marten Richter Date: Sun, 5 Oct 2014 17:02:03 +0200 Subject: [PATCH] Support for epgimages added --- mvpserver.c | 60 +++++++++++++++++++++++++++- mvpserver.h | 4 ++ picturereader.c | 97 ++++++++++++++++++++++++++++++++++++++++++++-- picturereader.h | 1 + vomp.conf.sample | 10 +++++ vompclient.c | 4 +- vompclient.h | 4 +- vompclientrrproc.c | 6 +++ 8 files changed, 179 insertions(+), 7 deletions(-) diff --git a/mvpserver.c b/mvpserver.c index 8ae63b8..bbf8fbd 100644 --- a/mvpserver.c +++ b/mvpserver.c @@ -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(); } } diff --git a/mvpserver.h b/mvpserver.h index 80cc211..ed29c65 100644 --- a/mvpserver.h +++ b/mvpserver.h @@ -54,6 +54,10 @@ class MVPServer : public Thread MVPRelay mvprelay; int listeningSocket; char* configDir; + char* logoDir; + char* imageDir; + char* resourceDir; + char* cacheDir; USHORT tcpServerPort; }; diff --git a/picturereader.c b/picturereader.c index 1e6eaf4..d2a7a66 100644 --- a/picturereader.c +++ b/picturereader.c @@ -2,6 +2,7 @@ #include #include #include +#include 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<cacheDir)<cacheDir)<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<cacheDir)<cacheDir)<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(""); } diff --git a/picturereader.h b/picturereader.h index f734d65..5cbbaec 100644 --- a/picturereader.h +++ b/picturereader.h @@ -50,6 +50,7 @@ class PictureReader : public Thread int init(TCP* tcp); void detachMVPReceiver(); void addTVMediaRequest(TVMediaRequest&); + bool epgImageExists(int event); private: diff --git a/vomp.conf.sample b/vomp.conf.sample index e83756a..49b6caf 100644 --- a/vomp.conf.sample +++ b/vomp.conf.sample @@ -34,3 +34,13 @@ # 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 diff --git a/vompclient.c b/vompclient.c index bc15aef..6724231 100644 --- a/vompclient.c +++ b/vompclient.c @@ -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; diff --git a/vompclient.h b/vompclient.h index 1856cdd..77f7fcb 100644 --- a/vompclient.h +++ b/vompclient.h @@ -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; diff --git a/vompclientrrproc.c b/vompclientrrproc.c index 5af35da..d342b3a 100644 --- a/vompclientrrproc.c +++ b/vompclientrrproc.c @@ -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()); -- 2.39.2