Skip to content

Commit

Permalink
Services V2: Add GetGrabberList and GetFreqTableList to channel service
Browse files Browse the repository at this point in the history
These are needed by the webapp Video Source setup.
  • Loading branch information
bennettpeter committed Sep 28, 2022
1 parent 06da311 commit 21cb48c
Show file tree
Hide file tree
Showing 5 changed files with 233 additions and 0 deletions.
1 change: 1 addition & 0 deletions mythtv/programs/mythbackend/mythbackend.pro
Expand Up @@ -79,6 +79,7 @@ HEADERS += servicesv2/v2databaseStatus.h
HEADERS += servicesv2/v2dvr.h servicesv2/v2recording.h
HEADERS += servicesv2/v2programAndChannel.h servicesv2/v2programList.h
HEADERS += servicesv2/v2channelGroup.h servicesv2/v2channelGroupList.h
HEADERS += servicesv2/v2grabber.h servicesv2/v2freqtable.h
HEADERS += servicesv2/v2recRule.h
HEADERS += servicesv2/v2cutting.h servicesv2/v2cutList.h
HEADERS += servicesv2/v2markup.h servicesv2/v2markupList.h
Expand Down
86 changes: 86 additions & 0 deletions mythtv/programs/mythbackend/servicesv2/v2channel.cpp
Expand Up @@ -41,6 +41,8 @@
#include "libmythtv/sourceutil.h"
#include "libmythtv/cardutil.h"
#include "libmythbase/mythdate.h"
#include "libmythtv/frequencies.h"
#include "libmythbase/mythsystemlegacy.h"

// MythBackend
#include "v2artworkInfoList.h"
Expand All @@ -49,6 +51,8 @@
#include "v2programAndChannel.h"
#include "v2recording.h"
#include "v2serviceUtil.h"
#include "v2grabber.h"
#include "v2freqtable.h"

/////////////////////////////////////////////////////////////////////////////
//
Expand All @@ -73,6 +77,9 @@ void V2Channel::RegisterCustomTypes()
qRegisterMetaType<V2ArtworkInfo*>("V2ArtworkInfo");
qRegisterMetaType<V2CastMemberList*>("V2CastMemberList");
qRegisterMetaType<V2CastMember*>("V2CastMember");
qRegisterMetaType<V2Grabber*>("V2Grabber");
qRegisterMetaType<V2GrabberList*>("V2GrabberList");
qRegisterMetaType<V2FreqTableList*>("V2FreqTableList");
}

V2Channel::V2Channel() : MythHTTPService(s_service)
Expand Down Expand Up @@ -833,3 +840,82 @@ QStringList V2Channel::GetXMLTVIdList( uint SourceID )

return idList;
}

// Prevent concurrent access to tv_find_grabbers
static QMutex lockGrabber;

V2GrabberList* V2Channel::GetGrabberList ( )
{
// ----------------------------------------------------------------------
// Build Response
// ----------------------------------------------------------------------

QMutexLocker lock(&lockGrabber);

auto *pGrabberList = new V2GrabberList();

// Add default grabbers
V2Grabber *pGrabber = pGrabberList->AddNewGrabber();
pGrabber->setProgram("eitonly");
pGrabber->setDisplayName(QObject::tr("Transmitted guide only (EIT)"));
pGrabber = pGrabberList->AddNewGrabber();
pGrabber->setProgram("/bin/true");
pGrabber->setDisplayName(QObject::tr("No grabber"));

QStringList args;
args += "baseline";

MythSystemLegacy find_grabber_proc("tv_find_grabbers", args,
kMSStdOut | kMSRunShell);
find_grabber_proc.Run(25s);
LOG(VB_GENERAL, LOG_INFO,
"Running 'tv_find_grabbers " + args.join(" ") + "'.");
uint status = find_grabber_proc.Wait();

if (status == GENERIC_EXIT_OK)
{
QTextStream ostream(find_grabber_proc.ReadAll());
while (!ostream.atEnd())
{
QString grabber_list(ostream.readLine());
#if QT_VERSION < QT_VERSION_CHECK(5,14,0)
QStringList grabber_split =
grabber_list.split("|", QString::SkipEmptyParts);
#else
QStringList grabber_split =
grabber_list.split("|", Qt::SkipEmptyParts);
#endif
QString grabber_name = grabber_split[1];
QFileInfo grabber_file(grabber_split[0]);
QString program = grabber_file.fileName();

if (!pGrabberList->containsProgram(program))
{
pGrabber = pGrabberList->AddNewGrabber();
pGrabber->setProgram(program);
pGrabber->setDisplayName(grabber_name);
}
LOG(VB_GENERAL, LOG_DEBUG, "Found " + grabber_split[0]);
}
LOG(VB_GENERAL, LOG_INFO, "Finished running tv_find_grabbers");
}
else
{
LOG(VB_GENERAL, LOG_ERR, "Failed to run tv_find_grabbers");
}

return pGrabberList;
}

QStringList V2Channel::GetFreqTableList ( )
{
// Channel Frequency Table
QStringList freqList;
freqList.append("default");
for (const auto & freqEntry : gChanLists)
{
freqList.append(freqEntry.name);
}
return freqList;

}
4 changes: 4 additions & 0 deletions mythtv/programs/mythbackend/servicesv2/v2channel.h
Expand Up @@ -31,6 +31,7 @@
#include "v2videoSourceList.h"
#include "v2videoMultiplexList.h"
#include "v2lineup.h"
#include "v2grabber.h"

#define CHANNEL_SERVICE QString("/Channel/")
#define CHANNEL_HANDLE QString("Channel")
Expand Down Expand Up @@ -167,6 +168,9 @@ class V2Channel : public MythHTTPService

static QStringList GetXMLTVIdList ( uint SourceID );

static V2GrabberList* GetGrabberList ( );

static QStringList GetFreqTableList ( );

private:
Q_DISABLE_COPY(V2Channel)
Expand Down
44 changes: 44 additions & 0 deletions mythtv/programs/mythbackend/servicesv2/v2freqtable.h
@@ -0,0 +1,44 @@
//////////////////////////////////////////////////////////////////////////////
// Program Name: v2freqtable.h
// Created : Sep 22, 2022
//
// Copyright (c) 2022 Peter Bennett <pbennett@mythtv.org>
//
// Licensed under the GPL v2 or later, see COPYING for details
//
//////////////////////////////////////////////////////////////////////////////

#ifndef V2FREQTABLE_H_
#define V2FREQTABLE_H_

#include <QString>

#include "libmythbase/http/mythhttpservice.h"

/////////////////////////////////////////////////////////////////////////////


class V2FreqTableList : public QObject
{
Q_OBJECT
Q_CLASSINFO( "Version", "1.0" );

SERVICE_PROPERTY2( QStringList, FreqTables )

public:

Q_INVOKABLE V2FreqTableList(QObject *parent = nullptr)
: QObject( parent )
{
}

// Copy not needed


private:
Q_DISABLE_COPY(V2FreqTableList);
};

Q_DECLARE_METATYPE(V2FreqTableList*)

#endif
98 changes: 98 additions & 0 deletions mythtv/programs/mythbackend/servicesv2/v2grabber.h
@@ -0,0 +1,98 @@
//////////////////////////////////////////////////////////////////////////////
// Program Name: v2grabber.h
// Created : Sep 22, 2022
//
// Copyright (c) 2022 Peter Bennett <pbennett@mythtv.org>
//
// Licensed under the GPL v2 or later, see COPYING for details
//
//////////////////////////////////////////////////////////////////////////////

#ifndef V2GRABBER_H_
#define V2GRABBER_H_

#include <QString>

#include "libmythbase/http/mythhttpservice.h"

/////////////////////////////////////////////////////////////////////////////

class V2Grabber : public QObject
{
Q_OBJECT
Q_CLASSINFO( "Version" , "1.0" );

SERVICE_PROPERTY2( QString , Program )
SERVICE_PROPERTY2( QString , DisplayName )

public:

Q_INVOKABLE V2Grabber(QObject *parent = nullptr)
: QObject( parent )
{
}

void Copy( const V2Grabber *src )
{
m_Program = src->m_Program;
m_DisplayName = src->m_DisplayName;
}

private:
Q_DISABLE_COPY(V2Grabber);
};

Q_DECLARE_METATYPE(V2Grabber*)


class V2GrabberList : public QObject
{
Q_OBJECT
Q_CLASSINFO( "Version", "1.0" );
Q_CLASSINFO( "Grabbers", "type=V2Grabber");

SERVICE_PROPERTY2( QVariantList, Grabbers );

public:

Q_INVOKABLE V2GrabberList(QObject *parent = nullptr)
: QObject( parent )
{
}

// Copy not needed
// void Copy( const V2GrabberList *src )
// {
// CopyListContents< V2Grabber >( this, m_Grabbers, src->m_Grabbers );
// }

V2Grabber *AddNewGrabber()
{
// We must make sure the object added to the QVariantList has
// a parent of 'this'

auto *pObject = new V2Grabber( this );
m_Grabbers.append( QVariant::fromValue<QObject *>( pObject ));

return pObject;
}

bool containsProgram(QString &program)
{
for (const auto& entry : m_Grabbers)
{
V2Grabber *grabber = entry.value<V2Grabber*>();
if (grabber->GetProgram() == program)
return true;
}
return false;
}

private:
Q_DISABLE_COPY(V2GrabberList);
};

Q_DECLARE_METATYPE(V2GrabberList*)


#endif

0 comments on commit 21cb48c

Please sign in to comment.