Implement basic plugin infrastructure

Add the bare minimum of what is required to become a Kodi PVR addon.

Signed-off-by: Julian Scheel <julian@jusst.de>
This commit is contained in:
Julian Scheel 2015-08-21 17:04:07 +02:00
parent bcbe782ccb
commit 7a5fa21d14
7 changed files with 415 additions and 0 deletions

24
CMakeLists.txt Normal file
View File

@ -0,0 +1,24 @@
project(pvr.octonet)
cmake_minimum_required(VERSION 2.6)
enable_language(CXX)
find_package(kodi REQUIRED)
find_package(kodiplatform REQUIRED)
find_package(platform REQUIRED)
include_directories(
${kodiplatform_INCLUDE_DIRS}
${platform_INCLUDE_DIRS}
${KODI_INCLUDE_DIR})
set(DEPLIBS
${platform_LIBRARIES})
set(OCTONET_SOURCES
src/client.cpp)
build_addon(pvr.octonet OCTONET DEPLIBS)
include(CPack)

23
pvr.octonet/addon.xml Normal file
View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon
id="pvr.octonet"
version="0.1"
name="PVR DigitalDevices Octonet Client"
provider-name="digitaldevices">
<requires>
<c-pluff version="0.1" />
<import addon="xbmc.pvr" version="1.9.6" />
</requires>
<extension
point="xbmc.pvrclient"
library_linux="pvr.octonet.so"
library_osx="pvr.octonet.dylib"
library_freebsd="pvr.octonet.so"
library_windx="pvr.octonet.dll"
library_android="libpvr.octonet.so" />
<extension point="xbmc.addon.metadata">
<summary lang="de_DE">Kodi PVR Addon für DigitalDevices Octonet Streams</summary>
<summary lang="en_US">Kodi PVR Addon for DigitalDevices Octonet Streams</summary>
<platform>all</platform>
</extension>
</addon>

View File

@ -0,0 +1,21 @@
# Kodi Media Center language file
# Addon Name: PVR Octonet Client
# Addon id: pvr.octonet
# Addon Provider: Julian Scheel
msgid ""
msgstr ""
"Project-Id-Version: KODI Main\n"
"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Kodi Translation Team\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgctxt "#30000"
msgid "Octonet Server Address"
msgstr ""

View File

@ -0,0 +1,21 @@
# Kodi Media Center language file
# Addon Name: PVR Octonet Client
# Addon id: pvr.octonet
# Addon Provider: Julian Scheel
msgid ""
msgstr ""
"Project-Id-Version: KODI Main\n"
"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Kodi Translation Team\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgctxt "#30000"
msgid "Octonet Server Address"
msgstr ""

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<settings>
<!-- Octonet Server Address -->
<setting id="octonetAddress" type="text" label="30000" default="" />
</settings>

290
src/client.cpp Normal file
View File

@ -0,0 +1,290 @@
/*
* Copyright (C) 2015 Julian Scheel <julian@jusst.de>
* Copyright (C) 2015 jusst technologies GmbH
* Copyright (C) 2015 Digital Devices GmbH
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*/
#include "client.h"
#include <kodi/xbmc_pvr_dll.h>
#include <kodi/libXBMC_addon.h>
#include <platform/util/util.h>
#include <kodi/libKODI_guilib.h>
using namespace ADDON;
/* setting variables with defaults */
std::string octonetAddress = "";
/* internal state variables */
ADDON_STATUS addonStatus = ADDON_STATUS_UNKNOWN;
CHelper_libXBMC_addon *kodi = NULL;
CHelper_libXBMC_pvr *pvr = NULL;
/* KODI Core Addon functions
* see xbmc_addon_dll.h */
extern "C" {
void ADDON_ReadSettings(void)
{
char buffer[2048];
if (kodi->GetSetting("octonetAddress", &buffer))
octonetAddress = buffer;
}
ADDON_STATUS ADDON_Create(void *callbacks, void* props)
{
if (callbacks == NULL || props == NULL)
return ADDON_STATUS_UNKNOWN;
PVR_PROPERTIES *pvrprops = (PVR_PROPERTIES*)props;
kodi = new CHelper_libXBMC_addon;
if (!kodi->RegisterMe(callbacks)) {
kodi->Log(LOG_ERROR, "%s: Failed to register octonet addon", __func__);
SAFE_DELETE(kodi);
return ADDON_STATUS_PERMANENT_FAILURE;
}
pvr = new CHelper_libXBMC_pvr;
if (!pvr->RegisterMe(callbacks)) {
kodi->Log(LOG_ERROR, "%s: Failed to register octonet pvr addon", __func__);
SAFE_DELETE(pvr);
SAFE_DELETE(kodi);
return ADDON_STATUS_PERMANENT_FAILURE;
}
kodi->Log(LOG_DEBUG, "%s: Creating octonet pvr addon", __func__);
ADDON_ReadSettings();
addonStatus = ADDON_STATUS_OK;
return addonStatus;
}
void ADDON_Stop() {} /* no-op */
void ADDON_Destroy()
{
delete pvr;
delete kodi;
addonStatus = ADDON_STATUS_UNKNOWN;
}
ADDON_STATUS ADDON_GetStatus()
{
return addonStatus;
}
bool ADDON_HasSettings()
{
return true;
}
unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet)
{
return 0;
}
ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue)
{
/* For simplicity do a full addon restart whenever settings are
* changed */
return ADDON_STATUS_NEED_RESTART;
}
void ADDON_FreeSettings() {} /* no-op */
void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) {} /* no-op */
}
/* KODI PVR Addon functions
* see xbmc_pvr_dll.h */
extern "C"
{
const char* GetPVRAPIVersion(void)
{
return XBMC_PVR_API_VERSION;
}
const char* GetMininumPVRAPIVersion(void)
{
return XBMC_PVR_MIN_API_VERSION;
}
const char* GetGUIAPIVersion(void)
{
return KODI_GUILIB_API_VERSION;
}
const char* GetMininumGUIAPIVersion(void)
{
return KODI_GUILIB_MIN_API_VERSION;
}
PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES *pCapabilities)
{
pCapabilities->bSupportsTV = true;
pCapabilities->bSupportsRadio = true;
return PVR_ERROR_NO_ERROR;
}
const char* GetBackendName(void)
{
return "DigitalDevice Octonet PVR Addon";
}
const char* GetBackendVersion(void)
{
return XBMC_PVR_API_VERSION;
}
const char* GetConnectionString(void)
{
return "connected"; // FIXME: translate?
}
PVR_ERROR GetDriveSpace(long long* iTotal, long long* iUsed) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR CallMenuHook(const PVR_MENUHOOK& menuhook, const PVR_MENUHOOK_DATA &item) { return PVR_ERROR_NOT_IMPLEMENTED; }
/* EPG */
PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL& channel, time_t iStart, time_t iEnd) { return PVR_ERROR_NOT_IMPLEMENTED; }
/* Channel groups */
int GetChannelGroupsAmount(void) { return -1; }
PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP& group) { return PVR_ERROR_NOT_IMPLEMENTED; }
/* Channels */
PVR_ERROR OpenDialogChannelScan(void) { return PVR_ERROR_NOT_IMPLEMENTED; }
int GetChannelsAmount(void)
{
// FIXME: This is a dummy
return 2;
}
PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio)
{
// FIXME: This is a dummy
if (!bRadio) {
PVR_CHANNEL chan;
memset(&chan, 0, sizeof(PVR_CHANNEL));
chan.iUniqueId = 1;
chan.bIsRadio = bRadio;
chan.iChannelNumber = 1;
snprintf(chan.strChannelName, sizeof(chan.strChannelName) - 1,
"Das Erste");
snprintf(chan.strStreamURL, sizeof(chan.strStreamURL) - 1,
"rtsp://172.27.1.40:8554/channel/1");
pvr->TransferChannelEntry(handle, &chan);
} else {
PVR_CHANNEL chan;
memset(&chan, 0, sizeof(PVR_CHANNEL));
chan.iUniqueId = 2;
chan.bIsRadio = bRadio;
chan.iChannelNumber = 2;
snprintf(chan.strChannelName, sizeof(chan.strChannelName) - 1,
"NDR 2");
snprintf(chan.strStreamURL, sizeof(chan.strStreamURL) - 1,
"rtsp://172.27.1.40:8554/channel/10");
pvr->TransferChannelEntry(handle, &chan);
}
return PVR_ERROR_NO_ERROR;
}
PVR_ERROR DeleteChannel(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR RenameChannel(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR MoveChannel(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR OpenDialogChannelSettings(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR OpenDialogChannelAdd(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
/* Recordings */
int GetRecordingsAmount(bool deleted) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetRecordings(ADDON_HANDLE handle, bool deleted) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR DeleteRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR UndeleteRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR DeleteAllRecordingsFromTrash() { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR RenameRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING& recording, int count) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING& recording, int lastplayedposition) { return PVR_ERROR_NOT_IMPLEMENTED; }
int GetRecordingLastPlayedPosition(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY edl[], int *size) { return PVR_ERROR_NOT_IMPLEMENTED; }
int GetTimersAmount(void) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetTimers(ADDON_HANDLE handle) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR AddTimer(const PVR_TIMER& timer) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR DeleteTimer(const PVR_TIMER& timer, bool bForceDelete) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR UpdateTimer(const PVR_TIMER& timer) { return PVR_ERROR_NOT_IMPLEMENTED; }
/* PVR stream handling */
/* entirely unused, as we use standard RTSP+TS mux, which can be handlded by
* Kodi core */
bool OpenLiveStream(const PVR_CHANNEL& channel) { return false; }
void CloseLiveStream(void) {}
int ReadLiveStream(unsigned char* pBuffer, unsigned int iBufferSize) { return -1; }
long long SeekLiveStream(long long iPosition, int iWhence) { return -1; }
long long PositionLiveStream(void) { return -1; }
long long LengthLiveStream(void) { return -1; }
int GetCurrentClientChannel(void) { return -1; }
bool SwitchChannel(const PVR_CHANNEL& channel) { return false; }
PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS& signalStatus) { return PVR_ERROR_NOT_IMPLEMENTED; }
const char* GetLiveStreamURL(const PVR_CHANNEL& channel) { return NULL; }
PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) { return PVR_ERROR_NOT_IMPLEMENTED; }
/* Recording stream handling */
bool OpenRecordedStream(const PVR_RECORDING& recording) { return false; }
void CloseRecordedStream(void) {}
int ReadRecordedStream(unsigned char* pBuffer, unsigned int iBufferSize) { return -1; }
long long SeekRecordedStream(long long iPosition, int iWhence) { return -1; }
long long PositionRecordedStream(void) { return -1; }
long long LengthRecordedStream(void) { return -1; }
/* PVR demuxer */
/* entirey unused, as we use TS */
void DemuxReset(void) {}
void DemuxAbort(void) {}
void DemuxFlush(void) {}
DemuxPacket* DemuxRead(void) { return NULL; }
/* Various helper functions */
unsigned int GetChannelSwitchDelay(void) { return 0; }
bool CanPauseStream() { return false; }
bool CanSeekStream() { return false; }
/* Callbacks */
void PauseStream(bool bPaused) {}
bool SeekTime(int time, bool backwards, double *startpts) { return false; }
void SetSpeed(int speed) {}
time_t GetPlayingTime() { return 0; }
time_t GetBufferTimeStart() { return 0; }
time_t GetBufferTimeEnd() { return 0; }
const char* GetBackendHostname()
{
return octonetAddress.c_str();
}
}

31
src/client.h Normal file
View File

@ -0,0 +1,31 @@
#pragma once
/*
* Copyright (C) 2015 Julian Scheel <julian@jusst.de>
* Copyright (C) 2015 jusst technologies GmbH
* Copyright (C) 2015 Digital Devices GmbH
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*/
#include "kodi/libXBMC_addon.h"
#include "kodi/libXBMC_pvr.h"
extern ADDON::CHelper_libXBMC_addon *kodi;
extern CHelper_libXBMC_pvr *pvr;
/* IP or hostname of the octonet to be connected to */
extern std::string octonetAddress;