4 #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(_WIN32)
7 #include <sys/sysmacros.h>
42 if ((pProgram ==
nullptr) || (pInfo ==
nullptr))
47 pProgram->setTitle ( pInfo->
GetTitle() );
51 pProgram->setRepeat ( pInfo->
IsRepeat() );
63 pProgram->setStars ( pInfo->
GetStars() );
81 pProgram->setAirdate( year );
86 pProgram->setSeason ( pInfo->
GetSeason() );
94 pProgram->enableCast(
false);
108 pProgram->enableChannel(
false);
127 pRecording->setFileName ( pRecInfo.
GetPathname() );
128 pRecording->setFileSize ( pRecInfo.
GetFilesize() );
129 pRecording->setHostName ( pRecInfo.
GetHostname() );
139 pRecording->setEncoderId ( pRecInfo.
GetInputID() );
145 pProgram->enableRecording(
false);
147 if ( bIncArtwork && !pInfo->
GetInetRef().isEmpty() )
150 pProgram->enableArtwork(
false);
162 if (channel.
Load(nChanID))
181 pChannel->setChanId(channelInfo.
m_chanId);
182 pChannel->setChanNum(channelInfo.
m_chanNum);
183 pChannel->setCallSign(channelInfo.
m_callSign);
184 if (!channelInfo.
m_icon.isEmpty())
186 QString sIconURL = QString(
"/Guide/GetChannelIcon?ChanId=%3")
188 pChannel->setIconURL( sIconURL );
190 pChannel->setChannelName(channelInfo.
m_name);
196 pChannel->setMplexId(channelInfo.
m_mplexId);
201 pChannel->setFineTune(channelInfo.
m_fineTune);
202 pChannel->setFrequencyId(channelInfo.
m_freqId);
204 pChannel->setSourceId(channelInfo.
m_sourceId);
207 pChannel->setXMLTVID(channelInfo.
m_xmltvId);
211 pChannel->setTimeOffset(channelInfo.
m_tmOffset);
216 for (
int x = 0; x < groupIds.size(); x++)
221 sGroupIds += QString::number(groupIds.at(x));
223 pChannel->setChannelGroups(sGroupIds);
227 for (
int x = 0; x < inputIds.size(); x++)
232 sInputIds += QString::number(inputIds.at(x));
234 pChannel->setInputs(sInputIds);
245 pGroup->setGroupId(pGroupItem.
m_grpId);
246 pGroup->setName(pGroupItem.
m_name);
247 pGroup->setPassword(
"");
257 if ((pRecRule ==
nullptr) || (pRule ==
nullptr))
263 pRecRule->setTitle ( pRule->
m_title );
266 pRecRule->setSeason ( pRule->
m_season );
267 pRecRule->setEpisode ( pRule->
m_episode );
269 pRecRule->setStartTime ( QDateTime(pRule->
m_startdate,
271 pRecRule->setEndTime ( QDateTime(pRule->
m_enddate,
275 pRecRule->setInetref ( pRule->
m_inetref );
277 pRecRule->setCallSign ( pRule->
m_station );
278 pRecRule->setFindDay ( pRule->
m_findday );
283 pRecRule->setPreferredInput ( pRule->
m_prefInput );
289 pRecRule->setFilter ( pRule->
m_filter );
313 const QString &sInetref,
317 for (
auto i = map.cbegin(); i != map.cend(); ++i)
320 pArtInfo->setFileName(i.value().url);
324 pArtInfo->setStorageGroup(
"Fanart");
325 pArtInfo->setType(
"fanart");
326 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
329 QString(QUrl::toPercentEncoding(
330 QUrl(i.value().url).path()))));
333 pArtInfo->setStorageGroup(
"Banners");
334 pArtInfo->setType(
"banner");
335 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
338 QString(QUrl::toPercentEncoding(
339 QUrl(i.value().url).path()))));
343 pArtInfo->setStorageGroup(
"Coverart");
344 pArtInfo->setType(
"coverart");
345 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
348 QString(QUrl::toPercentEncoding(
349 QUrl(i.value().url).path()))));
361 query.
prepare(
"SELECT genre from videogenre "
362 "LEFT JOIN videometadatagenre ON videometadatagenre.idgenre = videogenre.intid "
363 "WHERE idvideo = :ID "
367 if (query.
exec() && query.
size() > 0)
372 QString genre = query.
value(0).toString();
373 pGenre->setName(genre);
384 pVideoMetadataInfo->setId(pMetadata->GetID());
385 pVideoMetadataInfo->setTitle(pMetadata->GetTitle());
386 pVideoMetadataInfo->setSubTitle(pMetadata->GetSubtitle());
387 pVideoMetadataInfo->setTagline(pMetadata->GetTagline());
388 pVideoMetadataInfo->setDirector(pMetadata->GetDirector());
389 pVideoMetadataInfo->setStudio(pMetadata->GetStudio());
390 pVideoMetadataInfo->setDescription(pMetadata->GetPlot());
391 pVideoMetadataInfo->setCertification(pMetadata->GetRating());
392 pVideoMetadataInfo->setInetref(pMetadata->GetInetRef());
393 pVideoMetadataInfo->setCollectionref(pMetadata->GetCollectionRef());
394 pVideoMetadataInfo->setHomePage(pMetadata->GetHomepage());
395 pVideoMetadataInfo->setReleaseDate(
396 QDateTime(pMetadata->GetReleaseDate(),
397 QTime(0,0),Qt::LocalTime).toUTC());
398 pVideoMetadataInfo->setAddDate(
399 QDateTime(pMetadata->GetInsertdate(),
400 QTime(0,0),Qt::LocalTime).toUTC());
401 pVideoMetadataInfo->setUserRating(pMetadata->GetUserRating());
402 pVideoMetadataInfo->setChildID(pMetadata->GetChildID());
403 pVideoMetadataInfo->setLength(pMetadata->GetLength().count());
404 pVideoMetadataInfo->setPlayCount(pMetadata->GetPlayCount());
405 pVideoMetadataInfo->setSeason(pMetadata->GetSeason());
406 pVideoMetadataInfo->setEpisode(pMetadata->GetEpisode());
407 pVideoMetadataInfo->setParentalLevel(pMetadata->GetShowLevel());
408 pVideoMetadataInfo->setVisible(pMetadata->GetBrowse());
409 pVideoMetadataInfo->setWatched(pMetadata->GetWatched());
410 pVideoMetadataInfo->setProcessed(pMetadata->GetProcessed());
412 pMetadata->GetContentType()));
413 pVideoMetadataInfo->setFileName(pMetadata->GetFilename());
414 pVideoMetadataInfo->setHash(pMetadata->GetHash());
415 pVideoMetadataInfo->setHostName(pMetadata->GetHost());
416 pVideoMetadataInfo->setCoverart(pMetadata->GetCoverFile());
417 pVideoMetadataInfo->setFanart(pMetadata->GetFanart());
418 pVideoMetadataInfo->setBanner(pMetadata->GetBanner());
419 pVideoMetadataInfo->setScreenshot(pMetadata->GetScreenshot());
420 pVideoMetadataInfo->setTrailer(pMetadata->GetTrailer());
424 if (!pMetadata->GetFanart().isEmpty())
427 pVideoMetadataInfo->
Artwork()->AddNewArtworkInfo();
428 pArtInfo->setStorageGroup(
"Fanart");
429 pArtInfo->setType(
"fanart");
430 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
434 QUrl::toPercentEncoding(pMetadata->GetFanart()))));
436 if (!pMetadata->GetCoverFile().isEmpty())
439 pVideoMetadataInfo->
Artwork()->AddNewArtworkInfo();
440 pArtInfo->setStorageGroup(
"Coverart");
441 pArtInfo->setType(
"coverart");
442 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
446 QUrl::toPercentEncoding(pMetadata->GetCoverFile()))));
448 if (!pMetadata->GetBanner().isEmpty())
451 pVideoMetadataInfo->
Artwork()->AddNewArtworkInfo();
452 pArtInfo->setStorageGroup(
"Banners");
453 pArtInfo->setType(
"banner");
454 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
458 QUrl::toPercentEncoding(pMetadata->GetBanner()))));
460 if (!pMetadata->GetScreenshot().isEmpty())
463 pVideoMetadataInfo->
Artwork()->AddNewArtworkInfo();
464 pArtInfo->setStorageGroup(
"Screenshots");
465 pArtInfo->setType(
"screenshot");
466 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
470 QUrl::toPercentEncoding(pMetadata->GetScreenshot()))));
484 pVideoMetadataInfo->setId(pMetadata->
ID());
485 pVideoMetadataInfo->setArtist(pMetadata->
Artist());
487 pVideoMetadataInfo->setAlbum(pMetadata->
Album());
488 pVideoMetadataInfo->setTitle(pMetadata->
Title());
489 pVideoMetadataInfo->setTrackNo(pMetadata->
Track());
490 pVideoMetadataInfo->setGenre(pMetadata->
Genre());
491 pVideoMetadataInfo->setYear(pMetadata->
Year());
492 pVideoMetadataInfo->setPlayCount(pMetadata->
PlayCount());
493 pVideoMetadataInfo->setLength(pMetadata->
Length().count());
494 pVideoMetadataInfo->setRating(pMetadata->
Rating());
495 pVideoMetadataInfo->setFileName(pMetadata->
Filename());
496 pVideoMetadataInfo->setHostName(pMetadata->
Hostname());
497 pVideoMetadataInfo->setLastPlayed(pMetadata->
LastPlay());
498 pVideoMetadataInfo->setCompilation(pMetadata->
Compilation());
509 input->setInputName(inputInfo.
m_name);
524 if (!pCastMemberList || !pInfo)
531 table =
"recordedcredits";
535 query.
prepare(QString(
"SELECT role, people.name, roles.name FROM %1"
537 " LEFT JOIN people ON"
538 " credits.person = people.person"
539 " LEFT JOIN roles ON"
540 " credits.roleid = roles.roleid"
541 " WHERE credits.chanid = :CHANID"
542 " AND credits.starttime = :STARTTIME"
543 " ORDER BY role, priority;").arg(table));
548 if (query.
exec() && query.
size() > 0)
550 QMap<QString, QString> translations;
551 translations[
"ACTOR"] = QObject::tr(
"Actors");
552 translations[
"DIRECTOR"] = QObject::tr(
"Director");
553 translations[
"PRODUCER"] = QObject::tr(
"Producer");
554 translations[
"EXECUTIVE_PRODUCER"] = QObject::tr(
"Executive Producer");
555 translations[
"WRITER"] = QObject::tr(
"Writer");
556 translations[
"GUEST_STAR"] = QObject::tr(
"Guest Star");
557 translations[
"HOST"] = QObject::tr(
"Host");
558 translations[
"ADAPTER"] = QObject::tr(
"Adapter");
559 translations[
"PRESENTER"] = QObject::tr(
"Presenter");
560 translations[
"COMMENTATOR"] = QObject::tr(
"Commentator");
561 translations[
"GUEST"] = QObject::tr(
"Guest");
567 QString role = query.
value(0).toString();
568 pCastMember->setTranslatedRole(translations.value(role.toUpper()));
569 pCastMember->setRole(role);
585 pCastMember->setName(QString::fromUtf8(query.
value(1)
586 .toByteArray().constData()));
587 pCastMember->setCharacterName(QString::fromUtf8(query.
value(2)
588 .toByteArray().constData()));
598 frm_dir_map_t::const_iterator it;
604 for (it = markMap.cbegin(); it != markMap.cend(); ++it)
610 pCutting->setMark(*it);
611 pCutting->setOffset(it.key());
613 else if (marktype == 1)
619 pCutting->setMark(*it);
620 pCutting->setOffset(offset);
623 else if (marktype == 2)
629 pCutting->setMark(*it);
630 pCutting->setOffset(offset);
640 frm_dir_map_t::const_iterator it;
646 for (it = markMap.cbegin(); it != markMap.cend(); ++it)
652 pCutting->setMark(*it);
653 pCutting->setOffset(it.key());
655 else if (marktype == 1)
661 pCutting->setMark(*it);
662 pCutting->setOffset(offset);
665 else if (marktype == 2)
671 pCutting->setMark(*it);
672 pCutting->setOffset(offset);
686 frm_pos_map_t::const_iterator it;
692 for (it = markMap.cbegin(); it != markMap.cend(); ++it)
695 pCutting->setMark(it.key());
696 pCutting->setOffset(it.value());
705 for (
auto * elink : qAsConst(
gTVList))
707 if (elink !=
nullptr)
710 auto *pEncoder =
new V2Encoder( parent );
711 list.append( QVariant::fromValue<QObject *>( pEncoder ));
713 pEncoder->setId ( elink->GetInputID() );
714 pEncoder->setState ( elink->GetState() );
715 pEncoder->setLocal ( elink->IsLocal() );
716 pEncoder->setConnected ( elink->IsConnected() );
717 pEncoder->setSleepStatus ( elink->GetSleepStatus() );
719 if (pEncoder->GetLocal())
722 pEncoder->setHostName( elink->GetHostName() );
724 for (
const auto & inputInfo : qAsConst(inputInfoList))
726 if (inputInfo.m_inputId ==
static_cast<uint>(elink->GetInputID()))
728 V2Input *input = pEncoder->AddNewInput();
733 bool progFound =
false;
735 switch ( pEncoder->GetState() )
757 pProgram->setProperty(
"isNull",QVariant(
true));
789 for (
auto it = tmpList.begin(); it < tmpList.end(); ++it)
791 if ((nRecStatus == -999
792 && (*it)->GetRecordingStatus() >= 0)
793 || (nRecStatus != 0 && nRecStatus != -999
794 && (*it)->GetRecordingStatus() != nRecStatus))
823 nStartIndex = (nStartIndex > 0) ? std::min( nStartIndex, (
int)recordingList.
size() ) : 0;
824 nCount = (nCount > 0) ? std::min( nCount, (
int)recordingList.
size() ) : recordingList.
size();
825 int nEndIndex = std::min((nStartIndex + nCount), (
int)recordingList.
size() );
827 for(
int n = nStartIndex; n < nEndIndex; n++)
830 auto *pProgram =
new V2Program( parent );
831 list.append( QVariant::fromValue<QObject *>( pProgram ));
835 return recordingList.
size();
840 QMap<QString, Frontend*> frontends;
846 for (
auto * fe : qAsConst(frontends))
849 list.append( QVariant::fromValue<QObject *>( pFrontend ));
850 pFrontend->setName(fe->m_name);
851 pFrontend->setIP(fe->m_ip.toString());
854 pFrontend->setPort(port);
855 pFrontend->setOnLine(fe->m_connectionCount > 0);
865 query.
prepare(
"INSERT INTO recgroups SET recgroup = :NAME, "
866 "displayname = :DISPLAYNAME");
868 query.
bindValue(
":DISPLAYNAME", groupName);
874 LOG(VB_GENERAL, LOG_ERR, QString(
"Could not create recording group (%1). "
875 "Does it already exist?").arg(groupName));
885 QJsonArray members = cast[
"CastMembers"].toArray();
886 for (
const auto & m : members)
888 QJsonObject actor = m.toObject();
889 QString name = actor.value(
"Name").toString(
"");
890 QString character = actor.value(
"CharacterName").toString(
"");
891 QString role = actor.value(
"Role").toString(
"");
893 credits->emplace_back(role, name, priority++, character);
905 QString card = QString();
908 QDir dev(
"/dev/v4l",
"video*", QDir::Name, QDir::System);
910 card, driver,
false, pList, cardType);
915 card, driver,
false, pList, cardType);
918 dev.setPath(
"/dev/dtv");
920 card, driver,
false, pList, cardType);
924 dev.setNameFilters(QStringList(
"dtv*"));
926 card, driver,
false, pList, cardType);
933 const QString& card,
const QRegularExpression& driver,
935 const QString & cardType)
938 QMap<uint, uint> minorlist;
939 QFileInfoList entries = dir.entryInfoList();
940 for (
const auto & fi : qAsConst(entries))
943 QString filepath = fi.absoluteFilePath();
944 int err =
lstat(filepath.toLocal8Bit().constData(), &st);
948 LOG(VB_GENERAL, LOG_ERR,
949 QString(
"Could not stat file: %1").arg(filepath));
954 if (!S_ISCHR(st.st_mode))
959 if (minor_min > minor_num || minor_max < minor_num)
963 if (!allow_duplicates && minorlist[minor_num])
967 QByteArray
tmp = filepath.toLatin1();
968 int videofd = open(
tmp.constData(), O_RDWR);
975 auto match = driver.match(driver_name);
976 if ((!driver.pattern().isEmpty() || match.hasMatch()) &&
977 (card.isEmpty() || (card_name == card)))
980 pDev->setCardType (cardType);
981 pDev->setVideoDevice (filepath);
982 pDev->setFrontendName(card_name);
985 pDev->setInputNames(inputs);
987 pDev->setAudioDevices(inputs);
988 if (cardType ==
"HDPVR")
989 pDev->setChannelTimeout ( 15000 );
996 minorlist[minor_num] = 1;
1006 #ifdef USING_FIREWIRE
1008 for (
auto & info : list)
1010 auto* pDev = pList->AddCaptureDevice();
1011 pDev->setCardType (cardType);
1012 QString guid = info.GetGUIDString();
1013 pDev->setVideoDevice (guid);
1015 pDev->setFirewireModel(model);
1016 pDev->setDescription(info.m_product_name);
1017 pDev->setSignalTimeout ( 2000 );
1018 pDev->setChannelTimeout ( 9000 );
1020 #endif // USING_FIREWIRE