X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/4510fa62a33b31fec442fd0d77eb682d93ebf7e6..556d6244747ea2b4b3590e682948e9f708b0a069:/lib/service/servicedvbrecord.cpp diff --git a/lib/service/servicedvbrecord.cpp b/lib/service/servicedvbrecord.cpp index 5b7b5d8c..294315e9 100644 --- a/lib/service/servicedvbrecord.cpp +++ b/lib/service/servicedvbrecord.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include /* for cutlist */ @@ -83,7 +84,7 @@ void eDVBServiceRecord::serviceEvent(int event) } } -RESULT eDVBServiceRecord::prepare(const char *filename, time_t begTime, time_t endTime, int eit_event_id) +RESULT eDVBServiceRecord::prepare(const char *filename, time_t begTime, time_t endTime, int eit_event_id, const char *name, const char *descr, const char *tags) { m_filename = filename; m_streaming = 0; @@ -93,51 +94,89 @@ RESULT eDVBServiceRecord::prepare(const char *filename, time_t begTime, time_t e int ret = doPrepare(); if (!ret) { - eEPGCache::getInstance()->Lock(); - const eit_event_struct *event = 0; eServiceReferenceDVB ref = m_ref.getParentServiceReference(); + ePtr res_mgr; + eDVBMetaParser meta; + std::string service_data; if (!ref.valid()) ref = m_ref; - if ( eit_event_id != -1 ) + if (!eDVBResourceManager::getInstance(res_mgr)) { - eDebug("query epg event id %d", eit_event_id); - eEPGCache::getInstance()->lookupEventId(ref, eit_event_id, event); - } - if ( !event && (begTime != -1 && endTime != -1) ) - { - time_t queryTime = begTime + ((endTime-begTime)/2); - tm beg, end, query; - localtime_r(&begTime, &beg); - localtime_r(&endTime, &end); - localtime_r(&queryTime, &query); - eDebug("query stime %d:%d:%d, etime %d:%d:%d, qtime %d:%d:%d", - beg.tm_hour, beg.tm_min, beg.tm_sec, - end.tm_hour, end.tm_min, end.tm_sec, - query.tm_hour, query.tm_min, query.tm_sec); - eEPGCache::getInstance()->lookupEventTime(ref, queryTime, event); + ePtr db; + if (!res_mgr->getChannelList(db)) + { + ePtr service; + if (!db->getService(ref, service)) + { + char tmp[255]; + sprintf(tmp, "f:%x", service->m_flags); + service_data += tmp; + // cached pids + for (int x=0; x < eDVBService::cacheMax; ++x) + { + int entry = service->getCacheEntry((eDVBService::cacheID)x); + if (entry != -1) + { + sprintf(tmp, ",c:%02d%04x", x, entry); + service_data += tmp; + } + } + } + } } - if ( event ) + meta.m_time_create = begTime; + meta.m_ref = m_ref; + meta.m_data_ok = 1; + meta.m_service_data = service_data; + if (name) + meta.m_name = name; + if (descr) + meta.m_description = descr; + ret = meta.updateMeta(filename) ? -255 : 0; + if (!ret) { - eDebug("found event.. store to disc"); - std::string fname = filename; - fname.erase(fname.length()-2, 2); - fname+="eit"; - int fd = open(fname.c_str(), O_CREAT|O_WRONLY, 0777); - if (fd>-1) + const eit_event_struct *event = 0; + eEPGCache::getInstance()->Lock(); + if ( eit_event_id != -1 ) { - int evLen=HILO(event->descriptors_loop_length)+12/*EIT_LOOP_SIZE*/; - int wr = ::write( fd, (unsigned char*)event, evLen ); - if ( wr != evLen ) - eDebug("eit write error (%m)"); - ::close(fd); + eDebug("query epg event id %d", eit_event_id); + eEPGCache::getInstance()->lookupEventId(ref, eit_event_id, event); } + if ( !event && (begTime != -1 && endTime != -1) ) + { + time_t queryTime = begTime + ((endTime-begTime)/2); + tm beg, end, query; + localtime_r(&begTime, &beg); + localtime_r(&endTime, &end); + localtime_r(&queryTime, &query); + eDebug("query stime %d:%d:%d, etime %d:%d:%d, qtime %d:%d:%d", + beg.tm_hour, beg.tm_min, beg.tm_sec, + end.tm_hour, end.tm_min, end.tm_sec, + query.tm_hour, query.tm_min, query.tm_sec); + eEPGCache::getInstance()->lookupEventTime(ref, queryTime, event); + } + if ( event ) + { + eDebug("found event.. store to disc"); + std::string fname = filename; + fname.erase(fname.length()-2, 2); + fname+="eit"; + int fd = open(fname.c_str(), O_CREAT|O_WRONLY, 0777); + if (fd>-1) + { + int evLen=HILO(event->descriptors_loop_length)+12/*EIT_LOOP_SIZE*/; + int wr = ::write( fd, (unsigned char*)event, evLen ); + if ( wr != evLen ) + eDebug("eit write error (%m)"); + ::close(fd); + } + } + eEPGCache::getInstance()->Unlock(); } - eEPGCache::getInstance()->Unlock(); } return ret; } - else - return -1; + return -1; } RESULT eDVBServiceRecord::prepareStreaming()