4 #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(_WIN32)
7 #include <sys/sysmacros.h>
13 #include <QFileInfoList>
15 #include <QJsonObject>
48 if ((pProgram ==
nullptr) || (pInfo ==
nullptr))
53 pProgram->setTitle ( pInfo->
GetTitle() );
57 pProgram->setRepeat ( pInfo->
IsRepeat() );
69 pProgram->setStars ( pInfo->
GetStars() );
87 pProgram->setAirdate( year );
92 pProgram->setSeason ( pInfo->
GetSeason() );
100 pProgram->enableCast(
false);
114 pProgram->enableChannel(
false);
133 pRecording->setFileName ( pRecInfo.
GetPathname() );
134 pRecording->setFileSize ( pRecInfo.
GetFilesize() );
135 pRecording->setHostName ( pRecInfo.
GetHostname() );
145 pRecording->setEncoderId ( pRecInfo.
GetInputID() );
151 pProgram->enableRecording(
false);
153 if ( bIncArtwork && !pInfo->
GetInetRef().isEmpty() )
156 pProgram->enableArtwork(
false);
168 if (channel.
Load(nChanID))
187 pChannel->setChanId(channelInfo.
m_chanId);
188 pChannel->setChanNum(channelInfo.
m_chanNum);
189 pChannel->setCallSign(channelInfo.
m_callSign);
190 if (!channelInfo.
m_icon.isEmpty())
192 QString sIconURL = QString(
"/Guide/GetChannelIcon?ChanId=%3")
194 pChannel->setIconURL( sIconURL );
195 pChannel->setIcon( channelInfo.
m_icon );
197 pChannel->setChannelName(channelInfo.
m_name);
203 pChannel->setMplexId(channelInfo.
m_mplexId);
208 pChannel->setFineTune(channelInfo.
m_fineTune);
209 pChannel->setFrequencyId(channelInfo.
m_freqId);
211 pChannel->setSourceId(channelInfo.
m_sourceId);
214 pChannel->setXMLTVID(channelInfo.
m_xmltvId);
218 pChannel->setTimeOffset(channelInfo.
m_tmOffset);
223 for (
int x = 0; x < groupIds.size(); x++)
228 sGroupIds += QString::number(groupIds.at(x));
230 pChannel->setChannelGroups(sGroupIds);
234 for (
int x = 0; x < inputIds.size(); x++)
239 sInputIds += QString::number(inputIds.at(x));
241 pChannel->setInputs(sInputIds);
252 pGroup->setGroupId(pGroupItem.
m_grpId);
253 pGroup->setName(pGroupItem.
m_name);
254 pGroup->setPassword(
"");
264 if ((pRecRule ==
nullptr) || (pRule ==
nullptr))
270 pRecRule->setTitle ( pRule->
m_title );
273 pRecRule->setSeason ( pRule->
m_season );
274 pRecRule->setEpisode ( pRule->
m_episode );
276 pRecRule->setStartTime ( QDateTime(pRule->
m_startdate,
278 pRecRule->setEndTime ( QDateTime(pRule->
m_enddate,
282 pRecRule->setInetref ( pRule->
m_inetref );
284 pRecRule->setCallSign ( pRule->
m_station );
285 pRecRule->setFindDay ( pRule->
m_findday );
290 pRecRule->setPreferredInput ( pRule->
m_prefInput );
296 pRecRule->setFilter ( pRule->
m_filter );
320 const QString &sInetref,
324 for (
auto i = map.cbegin(); i != map.cend(); ++i)
327 pArtInfo->setFileName(i.value().url);
331 pArtInfo->setStorageGroup(
"Fanart");
332 pArtInfo->setType(
"fanart");
333 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
336 QString(QUrl::toPercentEncoding(
337 QUrl(i.value().url).path()))));
340 pArtInfo->setStorageGroup(
"Banners");
341 pArtInfo->setType(
"banner");
342 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
345 QString(QUrl::toPercentEncoding(
346 QUrl(i.value().url).path()))));
350 pArtInfo->setStorageGroup(
"Coverart");
351 pArtInfo->setType(
"coverart");
352 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
355 QString(QUrl::toPercentEncoding(
356 QUrl(i.value().url).path()))));
368 query.
prepare(
"SELECT genre from videogenre "
369 "LEFT JOIN videometadatagenre ON videometadatagenre.idgenre = videogenre.intid "
370 "WHERE idvideo = :ID "
374 if (query.
exec() && query.
size() > 0)
379 QString genre = query.
value(0).toString();
380 pGenre->setName(genre);
391 pVideoMetadataInfo->setId(pMetadata->GetID());
392 pVideoMetadataInfo->setTitle(pMetadata->GetTitle());
393 pVideoMetadataInfo->setSubTitle(pMetadata->GetSubtitle());
394 pVideoMetadataInfo->setTagline(pMetadata->GetTagline());
395 pVideoMetadataInfo->setDirector(pMetadata->GetDirector());
396 pVideoMetadataInfo->setStudio(pMetadata->GetStudio());
397 pVideoMetadataInfo->setDescription(pMetadata->GetPlot());
398 pVideoMetadataInfo->setCertification(pMetadata->GetRating());
399 pVideoMetadataInfo->setInetref(pMetadata->GetInetRef());
400 pVideoMetadataInfo->setCollectionref(pMetadata->GetCollectionRef());
401 pVideoMetadataInfo->setHomePage(pMetadata->GetHomepage());
402 pVideoMetadataInfo->setReleaseDate(
403 QDateTime(pMetadata->GetReleaseDate(),
404 QTime(0,0),Qt::LocalTime).toUTC());
405 pVideoMetadataInfo->setAddDate(
406 QDateTime(pMetadata->GetInsertdate(),
407 QTime(0,0),Qt::LocalTime).toUTC());
408 pVideoMetadataInfo->setUserRating(pMetadata->GetUserRating());
409 pVideoMetadataInfo->setChildID(pMetadata->GetChildID());
410 pVideoMetadataInfo->setLength(pMetadata->GetLength().count());
411 pVideoMetadataInfo->setPlayCount(pMetadata->GetPlayCount());
412 pVideoMetadataInfo->setSeason(pMetadata->GetSeason());
413 pVideoMetadataInfo->setEpisode(pMetadata->GetEpisode());
414 pVideoMetadataInfo->setParentalLevel(pMetadata->GetShowLevel());
415 pVideoMetadataInfo->setVisible(pMetadata->GetBrowse());
416 pVideoMetadataInfo->setWatched(pMetadata->GetWatched());
417 pVideoMetadataInfo->setProcessed(pMetadata->GetProcessed());
419 pMetadata->GetContentType()));
420 pVideoMetadataInfo->setFileName(pMetadata->GetFilename());
421 pVideoMetadataInfo->setHash(pMetadata->GetHash());
422 pVideoMetadataInfo->setHostName(pMetadata->GetHost());
423 pVideoMetadataInfo->setCoverart(pMetadata->GetCoverFile());
424 pVideoMetadataInfo->setFanart(pMetadata->GetFanart());
425 pVideoMetadataInfo->setBanner(pMetadata->GetBanner());
426 pVideoMetadataInfo->setScreenshot(pMetadata->GetScreenshot());
427 pVideoMetadataInfo->setTrailer(pMetadata->GetTrailer());
431 if (!pMetadata->GetFanart().isEmpty())
434 pVideoMetadataInfo->
Artwork()->AddNewArtworkInfo();
435 pArtInfo->setStorageGroup(
"Fanart");
436 pArtInfo->setType(
"fanart");
437 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
441 QUrl::toPercentEncoding(pMetadata->GetFanart()))));
443 if (!pMetadata->GetCoverFile().isEmpty())
446 pVideoMetadataInfo->
Artwork()->AddNewArtworkInfo();
447 pArtInfo->setStorageGroup(
"Coverart");
448 pArtInfo->setType(
"coverart");
449 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
453 QUrl::toPercentEncoding(pMetadata->GetCoverFile()))));
455 if (!pMetadata->GetBanner().isEmpty())
458 pVideoMetadataInfo->
Artwork()->AddNewArtworkInfo();
459 pArtInfo->setStorageGroup(
"Banners");
460 pArtInfo->setType(
"banner");
461 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
465 QUrl::toPercentEncoding(pMetadata->GetBanner()))));
467 if (!pMetadata->GetScreenshot().isEmpty())
470 pVideoMetadataInfo->
Artwork()->AddNewArtworkInfo();
471 pArtInfo->setStorageGroup(
"Screenshots");
472 pArtInfo->setType(
"screenshot");
473 pArtInfo->setURL(QString(
"/Content/GetImageFile?StorageGroup=%1"
477 QUrl::toPercentEncoding(pMetadata->GetScreenshot()))));
491 pVideoMetadataInfo->setId(pMetadata->
ID());
492 pVideoMetadataInfo->setArtist(pMetadata->
Artist());
494 pVideoMetadataInfo->setAlbum(pMetadata->
Album());
495 pVideoMetadataInfo->setTitle(pMetadata->
Title());
496 pVideoMetadataInfo->setTrackNo(pMetadata->
Track());
497 pVideoMetadataInfo->setGenre(pMetadata->
Genre());
498 pVideoMetadataInfo->setYear(pMetadata->
Year());
499 pVideoMetadataInfo->setPlayCount(pMetadata->
PlayCount());
500 pVideoMetadataInfo->setLength(pMetadata->
Length().count());
501 pVideoMetadataInfo->setRating(pMetadata->
Rating());
502 pVideoMetadataInfo->setFileName(pMetadata->
Filename());
503 pVideoMetadataInfo->setHostName(pMetadata->
Hostname());
504 pVideoMetadataInfo->setLastPlayed(pMetadata->
LastPlay());
505 pVideoMetadataInfo->setCompilation(pMetadata->
Compilation());
516 input->setInputName(inputInfo.
m_name);
531 if (!pCastMemberList || !pInfo)
538 table =
"recordedcredits";
542 query.
prepare(QString(
"SELECT role, people.name, roles.name FROM %1"
544 " LEFT JOIN people ON"
545 " credits.person = people.person"
546 " LEFT JOIN roles ON"
547 " credits.roleid = roles.roleid"
548 " WHERE credits.chanid = :CHANID"
549 " AND credits.starttime = :STARTTIME"
550 " ORDER BY role, priority;").arg(table));
555 if (query.
exec() && query.
size() > 0)
557 QMap<QString, QString> translations;
558 translations[
"ACTOR"] = QObject::tr(
"Actors");
559 translations[
"DIRECTOR"] = QObject::tr(
"Director");
560 translations[
"PRODUCER"] = QObject::tr(
"Producer");
561 translations[
"EXECUTIVE_PRODUCER"] = QObject::tr(
"Executive Producer");
562 translations[
"WRITER"] = QObject::tr(
"Writer");
563 translations[
"GUEST_STAR"] = QObject::tr(
"Guest Star");
564 translations[
"HOST"] = QObject::tr(
"Host");
565 translations[
"ADAPTER"] = QObject::tr(
"Adapter");
566 translations[
"PRESENTER"] = QObject::tr(
"Presenter");
567 translations[
"COMMENTATOR"] = QObject::tr(
"Commentator");
568 translations[
"GUEST"] = QObject::tr(
"Guest");
574 QString role = query.
value(0).toString();
575 pCastMember->setTranslatedRole(translations.value(role.toUpper()));
576 pCastMember->setRole(role);
592 pCastMember->setName(QString::fromUtf8(query.
value(1)
593 .toByteArray().constData()));
594 pCastMember->setCharacterName(QString::fromUtf8(query.
value(2)
595 .toByteArray().constData()));
605 frm_dir_map_t::const_iterator it;
611 for (it = markMap.cbegin(); it != markMap.cend(); ++it)
617 pCutting->setMark(*it);
618 pCutting->setOffset(it.key());
620 else if (marktype == 1)
626 pCutting->setMark(*it);
627 pCutting->setOffset(offset);
630 else if (marktype == 2)
636 pCutting->setMark(*it);
637 pCutting->setOffset(offset);
647 frm_dir_map_t::const_iterator it;
653 for (it = markMap.cbegin(); it != markMap.cend(); ++it)
659 pCutting->setMark(*it);
660 pCutting->setOffset(it.key());
662 else if (marktype == 1)
668 pCutting->setMark(*it);
669 pCutting->setOffset(offset);
672 else if (marktype == 2)
678 pCutting->setMark(*it);
679 pCutting->setOffset(offset);
693 frm_pos_map_t::const_iterator it;
699 for (it = markMap.cbegin(); it != markMap.cend(); ++it)
702 pCutting->setMark(it.key());
703 pCutting->setOffset(it.value());
712 for (
auto * elink : std::as_const(
gTVList))
714 if (elink !=
nullptr)
717 auto *pEncoder =
new V2Encoder( parent );
718 list.append( QVariant::fromValue<QObject *>( pEncoder ));
720 pEncoder->setId ( elink->GetInputID() );
721 pEncoder->setState ( elink->GetState() );
722 pEncoder->setLocal ( elink->IsLocal() );
723 pEncoder->setConnected ( elink->IsConnected() );
724 pEncoder->setSleepStatus ( elink->GetSleepStatus() );
726 if (pEncoder->GetLocal())
729 pEncoder->setHostName( elink->GetHostName() );
731 for (
const auto & inputInfo : std::as_const(inputInfoList))
733 if (inputInfo.m_inputId ==
static_cast<uint>(elink->GetInputID()))
735 V2Input *input = pEncoder->AddNewInput();
740 bool progFound =
false;
742 switch ( pEncoder->GetState() )
764 pProgram->setProperty(
"isNull",QVariant(
true));
796 for (
auto it = tmpList.begin(); it < tmpList.end(); ++it)
798 if ((nRecStatus == -999
799 && (*it)->GetRecordingStatus() >= 0)
800 || (nRecStatus != 0 && nRecStatus != -999
801 && (*it)->GetRecordingStatus() != nRecStatus))
830 nStartIndex = (nStartIndex > 0) ? std::min( nStartIndex, (
int)recordingList.
size() ) : 0;
831 nCount = (nCount > 0) ? std::min( nCount, (
int)recordingList.
size() ) : recordingList.
size();
832 int nEndIndex = std::min((nStartIndex + nCount), (
int)recordingList.
size() );
834 for(
int n = nStartIndex; n < nEndIndex; n++)
837 auto *pProgram =
new V2Program( parent );
838 list.append( QVariant::fromValue<QObject *>( pProgram ));
842 return recordingList.
size();
847 QMap<QString, Frontend*> frontends;
853 for (
auto * fe : std::as_const(frontends))
856 list.append( QVariant::fromValue<QObject *>( pFrontend ));
857 pFrontend->setName(fe->m_name);
858 pFrontend->setIP(fe->m_ip.toString());
861 pFrontend->setPort(port);
862 pFrontend->setOnLine(fe->m_connectionCount > 0);
872 query.
prepare(
"INSERT INTO recgroups SET recgroup = :NAME, "
873 "displayname = :DISPLAYNAME");
875 query.
bindValue(
":DISPLAYNAME", groupName);
881 LOG(VB_GENERAL, LOG_ERR, QString(
"Could not create recording group (%1). "
882 "Does it already exist?").arg(groupName));
892 QJsonArray members = cast[
"CastMembers"].toArray();
893 for (
const auto & m : std::as_const(members))
895 QJsonObject actor = m.toObject();
896 QString name = actor.value(
"Name").toString(
"");
897 QString character = actor.value(
"CharacterName").toString(
"");
898 QString role = actor.value(
"Role").toString(
"");
900 credits->emplace_back(role, name, priority++, character);
912 QString card = QString();
915 QDir dev(
"/dev/v4l",
"video*", QDir::Name, QDir::System);
917 card, driver,
false, pList, cardType);
922 card, driver,
false, pList, cardType);
925 dev.setPath(
"/dev/dtv");
927 card, driver,
false, pList, cardType);
931 dev.setNameFilters(QStringList(
"dtv*"));
933 card, driver,
false, pList, cardType);
940 const QString& card,
const QRegularExpression& driver,
942 const QString & cardType)
945 QMap<uint, uint> minorlist;
946 QFileInfoList entries = dir.entryInfoList();
947 for (
const auto & fi : std::as_const(entries))
950 QString filepath = fi.absoluteFilePath();
951 int err =
lstat(filepath.toLocal8Bit().constData(), &st);
955 LOG(VB_GENERAL, LOG_ERR,
956 QString(
"Could not stat file: %1").arg(filepath));
961 if (!S_ISCHR(st.st_mode))
966 if (minor_min > minor_num || minor_max < minor_num)
970 if (!allow_duplicates && minorlist[minor_num])
974 QByteArray
tmp = filepath.toLatin1();
975 int videofd = open(
tmp.constData(), O_RDWR);
982 auto match = driver.match(driver_name);
983 if ((!driver.pattern().isEmpty() || match.hasMatch()) &&
984 (card.isEmpty() || (card_name == card)))
987 pDev->setCardType (cardType);
988 pDev->setVideoDevice (filepath);
989 pDev->setFrontendName(card_name);
992 pDev->setInputNames(inputs);
994 pDev->setAudioDevices(inputs);
995 if (cardType ==
"HDPVR")
996 pDev->setChannelTimeout ( 15000 );
1003 minorlist[minor_num] = 1;
1013 #ifdef USING_FIREWIRE
1015 for (
auto & info : list)
1017 auto* pDev = pList->AddCaptureDevice();
1018 pDev->setCardType (cardType);
1019 QString guid = info.GetGUIDString();
1020 pDev->setVideoDevice (guid);
1022 pDev->setFirewireModel(model);
1023 pDev->setDescription(info.m_product_name);
1024 pDev->setSignalTimeout ( 2000 );
1025 pDev->setChannelTimeout ( 9000 );
1027 #endif // USING_FIREWIRE