4 #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(_WIN32)
7 #include <sys/sysmacros.h>
41 if ((pProgram ==
nullptr) || (pInfo ==
nullptr))
46 pProgram->setTitle ( pInfo->
GetTitle() );
50 pProgram->setRepeat ( pInfo->
IsRepeat() );
62 pProgram->setStars ( pInfo->
GetStars() );
80 pProgram->setAirdate( year );
85 pProgram->setSeason ( pInfo->
GetSeason() );
93 pProgram->enableCast(
false);
107 pProgram->enableChannel(
false);
126 pRecording->setFileName ( pRecInfo.
GetPathname() );
127 pRecording->setFileSize ( pRecInfo.
GetFilesize() );
128 pRecording->setHostName ( pRecInfo.
GetHostname() );
138 pRecording->setEncoderId ( pRecInfo.
GetInputID() );
144 pProgram->enableRecording(
false);
146 if ( bIncArtwork && !pInfo->
GetInetRef().isEmpty() )
149 pProgram->enableArtwork(
false);
161 if (channel.
Load(nChanID))
180 pChannel->setChanId(channelInfo.
m_chanId);
181 pChannel->setChanNum(channelInfo.
m_chanNum);
182 pChannel->setCallSign(channelInfo.
m_callSign);
183 if (!channelInfo.
m_icon.isEmpty())
185 QString sIconURL = QString(
"/Guide/GetChannelIcon?ChanId=%3")
187 pChannel->setIconURL( sIconURL );
189 pChannel->setChannelName(channelInfo.
m_name);
195 pChannel->setMplexId(channelInfo.
m_mplexId);
200 pChannel->setFineTune(channelInfo.
m_fineTune);
201 pChannel->setFrequencyId(channelInfo.
m_freqId);
203 pChannel->setSourceId(channelInfo.
m_sourceId);
206 pChannel->setXMLTVID(channelInfo.
m_xmltvId);
210 pChannel->setTimeOffset(channelInfo.
m_tmOffset);
215 for (
int x = 0; x < groupIds.size(); x++)
220 sGroupIds += QString::number(groupIds.at(x));
222 pChannel->setChannelGroups(sGroupIds);
226 for (
int x = 0; x < inputIds.size(); x++)
231 sInputIds += QString::number(inputIds.at(x));
233 pChannel->setInputs(sInputIds);
244 pGroup->setGroupId(pGroupItem.
m_grpId);
245 pGroup->setName(pGroupItem.
m_name);
246 pGroup->setPassword(
"");
256 if ((pRecRule ==
nullptr) || (pRule ==
nullptr))
262 pRecRule->setTitle ( pRule->
m_title );
265 pRecRule->setSeason ( pRule->
m_season );
266 pRecRule->setEpisode ( pRule->
m_episode );
268 pRecRule->setStartTime ( QDateTime(pRule->
m_startdate,
270 pRecRule->setEndTime ( QDateTime(pRule->
m_enddate,
274 pRecRule->setInetref ( pRule->
m_inetref );
276 pRecRule->setCallSign ( pRule->
m_station );
277 pRecRule->setFindDay ( pRule->
m_findday );
282 pRecRule->setPreferredInput ( pRule->
m_prefInput );
288 pRecRule->setFilter ( pRule->
m_filter );
311 const QString &sInetref,
315 for (
auto i = map.cbegin(); i != map.cend(); ++i)
318 pArtInfo->setFileName(i.value().url);
322 pArtInfo->setStorageGroup(
"Fanart");
323 pArtInfo->setType(
"fanart");
324 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
327 QString(QUrl::toPercentEncoding(
328 QUrl(i.value().url).path()))));
331 pArtInfo->setStorageGroup(
"Banners");
332 pArtInfo->setType(
"banner");
333 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
336 QString(QUrl::toPercentEncoding(
337 QUrl(i.value().url).path()))));
341 pArtInfo->setStorageGroup(
"Coverart");
342 pArtInfo->setType(
"coverart");
343 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
346 QString(QUrl::toPercentEncoding(
347 QUrl(i.value().url).path()))));
359 query.
prepare(
"SELECT genre from videogenre "
360 "LEFT JOIN videometadatagenre ON videometadatagenre.idgenre = videogenre.intid "
361 "WHERE idvideo = :ID "
365 if (query.
exec() && query.
size() > 0)
370 QString genre = query.
value(0).toString();
371 pGenre->setName(genre);
382 pVideoMetadataInfo->setId(pMetadata->GetID());
383 pVideoMetadataInfo->setTitle(pMetadata->GetTitle());
384 pVideoMetadataInfo->setSubTitle(pMetadata->GetSubtitle());
385 pVideoMetadataInfo->setTagline(pMetadata->GetTagline());
386 pVideoMetadataInfo->setDirector(pMetadata->GetDirector());
387 pVideoMetadataInfo->setStudio(pMetadata->GetStudio());
388 pVideoMetadataInfo->setDescription(pMetadata->GetPlot());
389 pVideoMetadataInfo->setCertification(pMetadata->GetRating());
390 pVideoMetadataInfo->setInetref(pMetadata->GetInetRef());
391 pVideoMetadataInfo->setCollectionref(pMetadata->GetCollectionRef());
392 pVideoMetadataInfo->setHomePage(pMetadata->GetHomepage());
393 pVideoMetadataInfo->setReleaseDate(
394 QDateTime(pMetadata->GetReleaseDate(),
395 QTime(0,0),Qt::LocalTime).toUTC());
396 pVideoMetadataInfo->setAddDate(
397 QDateTime(pMetadata->GetInsertdate(),
398 QTime(0,0),Qt::LocalTime).toUTC());
399 pVideoMetadataInfo->setUserRating(pMetadata->GetUserRating());
400 pVideoMetadataInfo->setChildID(pMetadata->GetChildID());
401 pVideoMetadataInfo->setLength(pMetadata->GetLength().count());
402 pVideoMetadataInfo->setPlayCount(pMetadata->GetPlayCount());
403 pVideoMetadataInfo->setSeason(pMetadata->GetSeason());
404 pVideoMetadataInfo->setEpisode(pMetadata->GetEpisode());
405 pVideoMetadataInfo->setParentalLevel(pMetadata->GetShowLevel());
406 pVideoMetadataInfo->setVisible(pMetadata->GetBrowse());
407 pVideoMetadataInfo->setWatched(pMetadata->GetWatched());
408 pVideoMetadataInfo->setProcessed(pMetadata->GetProcessed());
410 pMetadata->GetContentType()));
411 pVideoMetadataInfo->setFileName(pMetadata->GetFilename());
412 pVideoMetadataInfo->setHash(pMetadata->GetHash());
413 pVideoMetadataInfo->setHostName(pMetadata->GetHost());
414 pVideoMetadataInfo->setCoverart(pMetadata->GetCoverFile());
415 pVideoMetadataInfo->setFanart(pMetadata->GetFanart());
416 pVideoMetadataInfo->setBanner(pMetadata->GetBanner());
417 pVideoMetadataInfo->setScreenshot(pMetadata->GetScreenshot());
418 pVideoMetadataInfo->setTrailer(pMetadata->GetTrailer());
422 if (!pMetadata->GetFanart().isEmpty())
425 pVideoMetadataInfo->
Artwork()->AddNewArtworkInfo();
426 pArtInfo->setStorageGroup(
"Fanart");
427 pArtInfo->setType(
"fanart");
428 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
432 QUrl::toPercentEncoding(pMetadata->GetFanart()))));
434 if (!pMetadata->GetCoverFile().isEmpty())
437 pVideoMetadataInfo->
Artwork()->AddNewArtworkInfo();
438 pArtInfo->setStorageGroup(
"Coverart");
439 pArtInfo->setType(
"coverart");
440 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
444 QUrl::toPercentEncoding(pMetadata->GetCoverFile()))));
446 if (!pMetadata->GetBanner().isEmpty())
449 pVideoMetadataInfo->
Artwork()->AddNewArtworkInfo();
450 pArtInfo->setStorageGroup(
"Banners");
451 pArtInfo->setType(
"banner");
452 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
456 QUrl::toPercentEncoding(pMetadata->GetBanner()))));
458 if (!pMetadata->GetScreenshot().isEmpty())
461 pVideoMetadataInfo->
Artwork()->AddNewArtworkInfo();
462 pArtInfo->setStorageGroup(
"Screenshots");
463 pArtInfo->setType(
"screenshot");
464 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
468 QUrl::toPercentEncoding(pMetadata->GetScreenshot()))));
482 pVideoMetadataInfo->setId(pMetadata->
ID());
483 pVideoMetadataInfo->setArtist(pMetadata->
Artist());
485 pVideoMetadataInfo->setAlbum(pMetadata->
Album());
486 pVideoMetadataInfo->setTitle(pMetadata->
Title());
487 pVideoMetadataInfo->setTrackNo(pMetadata->
Track());
488 pVideoMetadataInfo->setGenre(pMetadata->
Genre());
489 pVideoMetadataInfo->setYear(pMetadata->
Year());
490 pVideoMetadataInfo->setPlayCount(pMetadata->
PlayCount());
491 pVideoMetadataInfo->setLength(pMetadata->
Length().count());
492 pVideoMetadataInfo->setRating(pMetadata->
Rating());
493 pVideoMetadataInfo->setFileName(pMetadata->
Filename());
494 pVideoMetadataInfo->setHostName(pMetadata->
Hostname());
495 pVideoMetadataInfo->setLastPlayed(pMetadata->
LastPlay());
496 pVideoMetadataInfo->setCompilation(pMetadata->
Compilation());
507 input->setInputName(inputInfo.
m_name);
522 if (!pCastMemberList || !pInfo)
529 table =
"recordedcredits";
533 query.
prepare(QString(
"SELECT role, people.name, roles.name FROM %1"
535 " LEFT JOIN people ON"
536 " credits.person = people.person"
537 " LEFT JOIN roles ON"
538 " credits.roleid = roles.roleid"
539 " WHERE credits.chanid = :CHANID"
540 " AND credits.starttime = :STARTTIME"
541 " ORDER BY role, priority;").arg(table));
546 if (query.
exec() && query.
size() > 0)
548 QMap<QString, QString> translations;
549 translations[
"ACTOR"] = QObject::tr(
"Actors");
550 translations[
"DIRECTOR"] = QObject::tr(
"Director");
551 translations[
"PRODUCER"] = QObject::tr(
"Producer");
552 translations[
"EXECUTIVE_PRODUCER"] = QObject::tr(
"Executive Producer");
553 translations[
"WRITER"] = QObject::tr(
"Writer");
554 translations[
"GUEST_STAR"] = QObject::tr(
"Guest Star");
555 translations[
"HOST"] = QObject::tr(
"Host");
556 translations[
"ADAPTER"] = QObject::tr(
"Adapter");
557 translations[
"PRESENTER"] = QObject::tr(
"Presenter");
558 translations[
"COMMENTATOR"] = QObject::tr(
"Commentator");
559 translations[
"GUEST"] = QObject::tr(
"Guest");
565 QString role = query.
value(0).toString();
566 pCastMember->setTranslatedRole(translations.value(role.toUpper()));
567 pCastMember->setRole(role);
583 pCastMember->setName(QString::fromUtf8(query.
value(1)
584 .toByteArray().constData()));
585 pCastMember->setCharacterName(QString::fromUtf8(query.
value(2)
586 .toByteArray().constData()));
596 frm_dir_map_t::const_iterator it;
602 for (it = markMap.cbegin(); it != markMap.cend(); ++it)
608 pCutting->setMark(*it);
609 pCutting->setOffset(it.key());
611 else if (marktype == 1)
617 pCutting->setMark(*it);
618 pCutting->setOffset(offset);
621 else if (marktype == 2)
627 pCutting->setMark(*it);
628 pCutting->setOffset(offset);
638 frm_dir_map_t::const_iterator it;
644 for (it = markMap.cbegin(); it != markMap.cend(); ++it)
650 pCutting->setMark(*it);
651 pCutting->setOffset(it.key());
653 else if (marktype == 1)
659 pCutting->setMark(*it);
660 pCutting->setOffset(offset);
663 else if (marktype == 2)
669 pCutting->setMark(*it);
670 pCutting->setOffset(offset);
684 frm_pos_map_t::const_iterator it;
690 for (it = markMap.cbegin(); it != markMap.cend(); ++it)
693 pCutting->setMark(it.key());
694 pCutting->setOffset(it.value());
703 for (
auto * elink : qAsConst(
gTVList))
705 if (elink !=
nullptr)
708 auto *pEncoder =
new V2Encoder( parent );
709 list.append( QVariant::fromValue<QObject *>( pEncoder ));
711 pEncoder->setId ( elink->GetInputID() );
712 pEncoder->setState ( elink->GetState() );
713 pEncoder->setLocal ( elink->IsLocal() );
714 pEncoder->setConnected ( elink->IsConnected() );
715 pEncoder->setSleepStatus ( elink->GetSleepStatus() );
717 if (pEncoder->GetLocal())
720 pEncoder->setHostName( elink->GetHostName() );
722 for (
const auto & inputInfo : qAsConst(inputInfoList))
724 if (inputInfo.m_inputId ==
static_cast<uint>(elink->GetInputID()))
726 V2Input *input = pEncoder->AddNewInput();
731 bool progFound =
false;
733 switch ( pEncoder->GetState() )
755 pProgram->setProperty(
"isNull",QVariant(
true));
783 for (
auto it = tmpList.begin(); it < tmpList.end(); ++it)
785 if ((nRecStatus == -999
786 && (*it)->GetRecordingStatus() >= 0)
787 || (nRecStatus != 0 && nRecStatus != -999
788 && (*it)->GetRecordingStatus() != nRecStatus))
817 nStartIndex = (nStartIndex > 0) ? std::min( nStartIndex, (
int)recordingList.
size() ) : 0;
818 nCount = (nCount > 0) ? std::min( nCount, (
int)recordingList.
size() ) : recordingList.
size();
819 int nEndIndex = std::min((nStartIndex + nCount), (
int)recordingList.
size() );
821 for(
int n = nStartIndex; n < nEndIndex; n++)
824 auto *pProgram =
new V2Program( parent );
825 list.append( QVariant::fromValue<QObject *>( pProgram ));
829 return recordingList.
size();
834 QMap<QString, Frontend*> frontends;
840 for (
auto * fe : qAsConst(frontends))
843 list.append( QVariant::fromValue<QObject *>( pFrontend ));
844 pFrontend->setName(fe->m_name);
845 pFrontend->setIP(fe->m_ip.toString());
848 pFrontend->setPort(port);
849 pFrontend->setOnLine(fe->m_connectionCount > 0);
859 query.
prepare(
"INSERT INTO recgroups SET recgroup = :NAME, "
860 "displayname = :DISPLAYNAME");
862 query.
bindValue(
":DISPLAYNAME", groupName);
868 LOG(VB_GENERAL, LOG_ERR, QString(
"Could not create recording group (%1). "
869 "Does it already exist?").arg(groupName));
879 QJsonArray members = cast[
"CastMembers"].toArray();
880 for (
const auto & m : members)
882 QJsonObject actor = m.toObject();
883 QString name = actor.value(
"Name").toString(
"");
884 QString character = actor.value(
"CharacterName").toString(
"");
885 QString role = actor.value(
"Role").toString(
"");
887 credits->push_back(
DBPerson(role, name, priority++, character));
899 QString card = QString();
902 QDir dev(
"/dev/v4l",
"video*", QDir::Name, QDir::System);
904 card, driver,
false, pList, cardType);
909 card, driver,
false, pList, cardType);
912 dev.setPath(
"/dev/dtv");
914 card, driver,
false, pList, cardType);
918 dev.setNameFilters(QStringList(
"dtv*"));
920 card, driver,
false, pList, cardType);
927 const QString& card,
const QRegularExpression& driver,
929 const QString & cardType)
932 QMap<uint, uint> minorlist;
933 QFileInfoList entries = dir.entryInfoList();
934 for (
const auto & fi : qAsConst(entries))
937 QString filepath = fi.absoluteFilePath();
938 int err =
lstat(filepath.toLocal8Bit().constData(), &st);
942 LOG(VB_GENERAL, LOG_ERR,
943 QString(
"Could not stat file: %1").arg(filepath));
948 if (!S_ISCHR(st.st_mode))
953 if (minor_min > minor_num || minor_max < minor_num)
957 if (!allow_duplicates && minorlist[minor_num])
961 QByteArray
tmp = filepath.toLatin1();
962 int videofd = open(
tmp.constData(), O_RDWR);
969 auto match = driver.match(driver_name);
970 if ((!driver.pattern().isEmpty() || match.hasMatch()) &&
971 (card.isEmpty() || (card_name == card)))
974 pDev->setCardType (cardType);
975 pDev->setVideoDevice (filepath);
976 pDev->setFrontendName(card_name);
979 pDev->setInputNames(inputs);
981 pDev->setAudioDevices(inputs);
982 if (cardType ==
"HDPVR")
983 pDev->setChannelTimeout ( 15000 );
990 minorlist[minor_num] = 1;
1000 #ifdef USING_FIREWIRE
1002 for (
auto & info : list)
1004 auto* pDev = pList->AddCaptureDevice();
1005 pDev->setCardType (cardType);
1006 QString guid = info.GetGUIDString();
1007 pDev->setVideoDevice (guid);
1009 pDev->setFirewireModel(model);
1010 pDev->setDescription(info.m_product_name);
1011 pDev->setSignalTimeout ( 2000 );
1012 pDev->setChannelTimeout ( 9000 );
1014 #endif // USING_FIREWIRE