Compare commits

..

31 Commits

Author SHA1 Message Date
Kai Sommerfeld
69da8dbd0c Merge pull request #28 from ksooo/fixWindows-matrix
Fix windows matrix
2019-05-10 23:37:27 +02:00
Rechi
6d4f3847c7 [cleanup] remove unused includes
this fixes windows build failures
2019-05-10 23:36:06 +02:00
Rechi
38e25e1f1c [depends] jsoncpp: add checksum file 2019-05-10 23:36:06 +02:00
Kai Sommerfeld
472dc2beae Merge pull request #27 from olafhering/kodiplatform
[cmake] remove usage of kodi-platform
2019-05-10 23:31:20 +02:00
Olaf Hering
ec08c20540 [cmake] remove usage of kodi-platform
The pvr.octonet binary addon does not use kodi-platform.
Remove existing references from CMakeLists.txt and debian/control.
Add dependency to libp8-platform-dev because libkodiplatform-dev
pulled that dependency in as a side effect. Fix that bug too by
adding an explicit dependency.

Signed-off-by: Olaf Hering <olaf@aepfle.de>
2019-04-28 12:34:56 +00:00
Kai Sommerfeld
63ef363522 Merge pull request #26 from ksooo/pvr-api-6-0-0
Implement PVR addon API v6.0.0
2019-04-24 21:05:25 +02:00
Kai Sommerfeld
c91061f84b Implement PVR addon API v6.0.0 2019-04-23 23:30:46 +02:00
Kai Sommerfeld
414e756912 build with Kodi master API 2019-04-21 17:40:25 +02:00
Kai Sommerfeld
9de3166203 build with Kodi Matrix API 2019-04-21 17:25:16 +02:00
Kai Sommerfeld
df1b033f14 Merge pull request #25 from ksooo/Leia
build with Kodi Leia API
2019-04-16 06:39:23 +02:00
ksooo
0295717be2 build with Kodi Leia API 2019-04-16 06:37:32 +02:00
Kai Sommerfeld
203f800eaa Merge pull request #22 from ksooo/jenkinsfile
Add Jenkinsfile to allow Kodi CI to build this addon.
2018-10-16 13:50:33 +02:00
Kai Sommerfeld
153dfeb3d5 Add Jenkinsfile to allow Kodi CI to build this addon. 2018-10-16 13:44:19 +02:00
Kai Sommerfeld
1e44819300 PVR API 5.10.0 2018-06-09 11:07:51 +02:00
René Bühlmann
54680a38bd PVR API 5.9.0 2018-04-11 14:42:04 +02:00
Kai Sommerfeld
689afbf4cd PVR API 5.8.0 2018-01-15 07:27:07 +01:00
Rechi
c4af00a4fe [depends] bump jsoncpp to 1.8.3 2017-11-15 12:41:33 +01:00
Anton Fedchin
f1f8d44b78 win10: fix linkage to deprecated wsock32 api. 2017-11-02 09:06:58 +01:00
Kai Sommerfeld
e9b4c05de5 Update to PVR API version 5.7.0 2017-09-26 14:17:23 +02:00
Kai Sommerfeld
a77cf111bb Added minimalistic support for PVR Addon API 5.3.0 2017-07-10 08:55:26 +02:00
Julian Scheel
020dd98e7b OctonetData: Use hash for channel nativeId
We previously assumed that the channelId provided by the Octonet would
only contain numbers and colons, which unfortunately is not true. The
satellite names could contain arbitrary characters, which then caused
the conversion to a numeric value to fail, stopping channels from being
distinguishable. This caused all EPG events to be mapped to the first
channel.

Signed-off-by: Julian Scheel <julian@jusst.de>
2017-07-06 14:32:14 +02:00
Julian Scheel
d7bb865329 AppVeyor: Provide built addon as artifact
Allow users to fetch the builds generated by AppVeyor.

Signed-off-by: Julian Scheel <julian@jusst.de>
2017-07-06 14:32:04 +02:00
Julian Scheel
9bbd7cf3c4 README: Update build path
Reflect relocation of cmake script in Kodi master.

Signed-off-by: Julian Scheel <julian@jusst.de>
2017-05-26 11:04:27 +02:00
Julian Scheel
7b9ec7d884 Travis: Update build instructions for Kodi master
The cmake build files for addons have been moved inside the kodi tree.
Update the Travis build script to reflect this.

Signed-off-by: Julian Scheel <julian@jusst.de>
2017-05-26 10:59:36 +02:00
Julian Scheel
37abebb540 AppVeyor: Update build instructions for Kodi master
The cmake build files for addons have been moved inside the kodi tree.
Update the AppVeyor build script to reflect this.

Signed-off-by: Julian Scheel <julian@jusst.de>
2017-05-26 10:58:35 +02:00
Alwin Esch
3494c4c470 Update on kodi to addon interface 2017-05-23 12:23:33 +02:00
Alwin Esch
ff41fc9acc update debian control 2017-05-18 12:04:46 +02:00
Alwin Esch
1ced6b3fa4 remove no more needed version functions 2017-05-18 12:04:46 +02:00
Alwin Esch
cd774b6edc change to automatic depends set on addon.xml 2017-05-18 12:04:46 +02:00
Alwin Esch
2a63777b6d libXBMC_codec.h removed and changed to libXBMC_pvr.h also fix compile fault after last request 2017-05-03 09:48:00 +02:00
Alwin Esch
e9f0d6bf76 Remove not used part 2017-05-03 09:47:39 +02:00
17 changed files with 107 additions and 139 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
/build
pvr.octonet/addon.xml

View File

@@ -36,10 +36,10 @@ before_install:
#
before_script:
- cd $TRAVIS_BUILD_DIR/..
- git clone --depth=1 https://github.com/xbmc/xbmc.git
- mkdir -p xbmc/project/cmake/addons/addons/pvr.octonet
- echo "pvr.octonet https://github.com/DigitalDevices/pvr.octonet master" > xbmc/project/cmake/addons/addons/pvr.octonet/pvr.octonet.txt
- git clone --branch master --depth=1 https://github.com/xbmc/xbmc.git
- mkdir -p xbmc/cmake/addons/addons/pvr.octonet
- echo "pvr.octonet https://github.com/DigitalDevices/pvr.octonet master" > xbmc/cmake/addons/addons/pvr.octonet/pvr.octonet.txt
- cd $TRAVIS_BUILD_DIR && mkdir build && cd build
- cmake -DADDONS_TO_BUILD=pvr.octonet -DADDON_SRC_PREFIX=$TRAVIS_BUILD_DIR/.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/../xbmc/addons -DPACKAGE_ZIP=1 $TRAVIS_BUILD_DIR/../xbmc/project/cmake/addons
- cmake -DADDONS_TO_BUILD=pvr.octonet -DADDON_SRC_PREFIX=$TRAVIS_BUILD_DIR/.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/../xbmc/addons -DPACKAGE_ZIP=1 $TRAVIS_BUILD_DIR/../xbmc/cmake/addons
script: make

View File

@@ -6,12 +6,10 @@ list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
enable_language(CXX)
find_package(Kodi REQUIRED)
find_package(kodiplatform REQUIRED)
find_package(p8-platform REQUIRED)
find_package(JsonCpp REQUIRED)
include_directories(
${kodiplatform_INCLUDE_DIRS}
${p8-platform_INCLUDE_DIRS}
${KODI_INCLUDE_DIR}
${JSONCPP_INCLUDE_DIRS})
@@ -26,10 +24,19 @@ set(OCTONET_SOURCES
src/Socket.cpp
src/rtsp_client.cpp)
set(OCTONET_HEADERS
src/client.h
src/OctonetData.h
src/Socket.h)
build_addon(pvr.octonet OCTONET DEPLIBS)
if(WIN32)
target_link_libraries(pvr.octonet wsock32 ws2_32)
if(NOT CMAKE_SYSTEM_NAME STREQUAL WindowsStore)
target_link_libraries(pvr.octonet wsock32 ws2_32)
else()
target_link_libraries(pvr.octonet ws2_32)
endif()
endif()
include(CPack)

1
Jenkinsfile vendored Normal file
View File

@@ -0,0 +1 @@
buildPlugin(version: "Matrix")

View File

@@ -20,17 +20,14 @@ $ git clone https://github.com/DigitalDevices/pvr.octonet.git
Clone the Kodi repository:
```
$ git clone https://github.com/xbmc/xbmc.git
$ git clone --branch master https://github.com/xbmc/xbmc.git
```
If you already have a local Kodi checkout, you can use that one. Just make sure it is recent enough
(Kodi 17 Beta 5 or later should work).
```
$ cd pvr.octonet
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release -DADDONS_TO_BUILD="pvr.octonet" -DADDON_SRC_PREFIX="path to parent of pvr.octonet" -DCMAKE_INSTALL_PREFIX="install" -DPACKAGE_ZIP=ON "path to kodi/project/cmake/addons"
$ cmake -DCMAKE_BUILD_TYPE=Release -DADDONS_TO_BUILD="pvr.octonet" -DADDON_SRC_PREFIX="path to parent of pvr.octonet" -DCMAKE_INSTALL_PREFIX="install" -DPACKAGE_ZIP=ON "path to kodi/cmake/addons"
```
On Windows, you should add `-G "NMake Makefiles"` to the CMake invocation. Make sure that

View File

@@ -21,15 +21,20 @@ environment:
- GENERATOR: "Visual Studio 14"
CONFIG: Release
artifacts:
- path: build/install/
name: pvr.octonet
type: zip
build_script:
- cd ..
- set ROOT=%cd%
- git clone --depth=1 https://github.com/xbmc/xbmc.git
- mkdir xbmc\project\cmake\addons\addons\pvr.octonet
- echo pvr.octonet https://github.com/DigitalDevices/pvr.octonet master > xbmc\project\cmake\addons\addons\pvr.octonet\pvr.octonet.txt
- git clone --branch master --depth=1 https://github.com/xbmc/xbmc.git
- mkdir xbmc\cmake\addons\addons\pvr.octonet
- echo pvr.octonet https://github.com/DigitalDevices/pvr.octonet master > xbmc\cmake\addons\addons\pvr.octonet\pvr.octonet.txt
- cd %ADDON%
- mkdir build
- cd build
# Must use absolute path for cmake to build depends correctly
- cmake -G "%GENERATOR%" -DADDONS_TO_BUILD=%ADDON% -DCMAKE_BUILD_TYPE=%CONFIG% -DADDON_SRC_PREFIX=%ROOT% -DCMAKE_INSTALL_PREFIX=%ROOT%\xbmc\addons -DPACKAGE_ZIP=1 %ROOT%\xbmc\project\cmake\addons
- cmake -G "%GENERATOR%" -DADDONS_TO_BUILD=%ADDON% -DCMAKE_BUILD_TYPE=%CONFIG% -DADDON_SRC_PREFIX=%ROOT% -DCMAKE_INSTALL_PREFIX=install -DPACKAGE_ZIP=1 %ROOT%\xbmc\cmake\addons
- cmake --build . --config %CONFIG%

4
debian/control vendored
View File

@@ -1,8 +1,8 @@
Source: kodi-pvr-octonet
Priority: extra
Maintainer: Julian Scheel <julian@jusst.de>
Build-Depends: debhelper (>= 9.0.0), cmake, libjsoncpp-dev, kodi-pvr-dev,
libkodiplatform-dev (>= 16.0.0), kodi-addon-dev
Build-Depends: debhelper (>= 9.0.0), cmake, libjsoncpp-dev,
libp8-platform-dev, kodi-addon-dev
Standards-Version: 3.9.4
Section: libs
Homepage: https://github.com/DigitalDevices/pvr.octonet

View File

@@ -1,7 +1,10 @@
project(jsoncpp)
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION 3.1)
enable_language(CXX)
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
SET(CMAKE_CXX_EXTENSIONS OFF)
set(SOURCES src/lib_json/json_reader.cpp
src/lib_json/json_value.cpp

View File

@@ -0,0 +1 @@
3671ba6051e0f30849942cc66d1798fdf0362d089343a83f704c09ee7156604f

View File

@@ -1 +1 @@
jsoncpp http://mirrors.kodi.tv/build-deps/sources/jsoncpp-src-0.5.0.tar.gz
jsoncpp http://mirrors.kodi.tv/build-deps/sources/jsoncpp-1.8.3.tar.gz

View File

@@ -1,23 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon
id="pvr.octonet"
version="0.3.6"
version="1.0.0"
name="Digital Devices Octopus NET Client"
provider-name="digitaldevices">
<requires>
<c-pluff version="0.1" />
<import addon="xbmc.pvr" version="5.2.1" />
</requires>
<requires>@ADDON_DEPENDS@</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" />
library_@PLATFORM@="@LIBRARY_FILENAME@"/>
<extension point="xbmc.addon.metadata">
<summary lang="de_DE">Kodi PVR Addon für Digital Devices Octopus NET Streams</summary>
<summary lang="en_US">Kodi PVR Addon for Digital Devices Octopus NET Streams</summary>
<platform>all</platform>
<platform>@PLATFORM@</platform>
</extension>
</addon>

View File

@@ -26,7 +26,6 @@
#include <json/json.h>
#include "OctonetData.h"
#include "p8-platform/util/StringUtils.h"
#ifdef __WINDOWS__
#define timegm _mkgmtime
@@ -42,7 +41,7 @@ OctonetData::OctonetData()
lastEpgLoad = 0;
if (!loadChannelList())
kodi->QueueNotification(QUEUE_ERROR, kodi->GetLocalizedString(30001), channels.size());
libKodi->QueueNotification(QUEUE_ERROR, libKodi->GetLocalizedString(30001), channels.size());
}
OctonetData::~OctonetData(void)
@@ -53,14 +52,8 @@ OctonetData::~OctonetData(void)
int64_t OctonetData::parseID(std::string id)
{
int64_t nativeId;
size_t strip;
/* Strip colons from id */
while ((strip = id.find(":")) != std::string::npos)
id.erase(strip, 1);
std::stringstream ids(id);
ids >> nativeId;
std::hash<std::string> hash_fn;
int64_t nativeId = hash_fn(id);
return nativeId;
}
@@ -68,15 +61,15 @@ int64_t OctonetData::parseID(std::string id)
bool OctonetData::loadChannelList()
{
std::string jsonContent;
void *f = kodi->OpenFile(("http://" + serverAddress + "/channellist.lua?select=json").c_str(), 0);
void *f = libKodi->OpenFile(("http://" + serverAddress + "/channellist.lua?select=json").c_str(), 0);
if (!f)
return false;
char buf[1024];
while (int read = kodi->ReadFile(f, buf, 1024))
while (int read = libKodi->ReadFile(f, buf, 1024))
jsonContent.append(buf, read);
kodi->CloseFile(f);
libKodi->CloseFile(f);
Json::Value root;
Json::Reader reader;
@@ -153,15 +146,15 @@ bool OctonetData::loadEPG(void)
return false;
std::string jsonContent;
void *f = kodi->OpenFile(("http://" + serverAddress + "/epg.lua?;#|encoding=gzip").c_str(), 0);
void *f = libKodi->OpenFile(("http://" + serverAddress + "/epg.lua?;#|encoding=gzip").c_str(), 0);
if (!f)
return false;
char buf[1024];
while (int read = kodi->ReadFile(f, buf, 1024))
while (int read = libKodi->ReadFile(f, buf, 1024))
jsonContent.append(buf, read);
kodi->CloseFile(f);
libKodi->CloseFile(f);
Json::Value root;
Json::Reader reader;
@@ -190,7 +183,7 @@ bool OctonetData::loadEPG(void)
channel = findChannel(entry.channelId);
if (channel == NULL) {
kodi->Log(LOG_ERROR, "EPG for unknown channel.");
libKodi->Log(LOG_ERROR, "EPG for unknown channel.");
continue;
}
@@ -234,12 +227,12 @@ PVR_ERROR OctonetData::getChannels(ADDON_HANDLE handle, bool bRadio)
return PVR_ERROR_NO_ERROR;
}
PVR_ERROR OctonetData::getEPG(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t start, time_t end)
PVR_ERROR OctonetData::getEPG(ADDON_HANDLE handle, int iChannelUid, time_t start, time_t end)
{
for (unsigned int i = 0; i < channels.size(); i++)
{
OctonetChannel &chan = channels.at(i);
if (channel.iUniqueId != chan.id)
if (iChannelUid != chan.id)
continue;
if(chan.epg.empty()) {
@@ -261,7 +254,7 @@ PVR_ERROR OctonetData::getEPG(ADDON_HANDLE handle, const PVR_CHANNEL &channel, t
EPG_TAG entry;
memset(&entry, 0, sizeof(EPG_TAG));
entry.iChannelNumber = i;
entry.iUniqueChannelId = chan.id;
entry.iUniqueBroadcastId = it->id;
entry.strTitle = it->title.c_str();
entry.strPlotOutline = it->subtitle.c_str();
@@ -282,7 +275,7 @@ PVR_ERROR OctonetData::getEPG(ADDON_HANDLE handle, const PVR_CHANNEL &channel, t
EPG_TAG entry;
memset(&entry, 0, sizeof(EPG_TAG));
entry.iChannelNumber = i;
entry.iUniqueChannelId = chan.id;
entry.iUniqueBroadcastId = it->id;
entry.strTitle = it->title.c_str();
entry.strPlotOutline = it->subtitle.c_str();

View File

@@ -25,7 +25,6 @@
#include <vector>
#include "p8-platform/threads/threads.h"
#include "p8-platform/util/StdString.h"
#include "client.h"
struct OctonetEpgEntry
@@ -69,7 +68,7 @@ class OctonetData : public P8PLATFORM::CThread
virtual PVR_ERROR getGroups(ADDON_HANDLE handle, bool bRadio);
virtual PVR_ERROR getGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group);
virtual PVR_ERROR getEPG(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t start, time_t end);
virtual PVR_ERROR getEPG(ADDON_HANDLE handle, int iChannelUid, time_t start, time_t end);
const std::string& getUrl(int id) const;
const std::string& getName(int id) const;

View File

@@ -196,13 +196,13 @@ int Socket::send ( const char* data, const unsigned int len )
if (result < 0)
{
kodi->Log(LOG_ERROR, "Socket::send - select failed");
libKodi->Log(LOG_ERROR, "Socket::send - select failed");
close();
return 0;
}
if (FD_ISSET(_sd, &set_w))
{
kodi->Log(LOG_ERROR, "Socket::send - failed to send data");
libKodi->Log(LOG_ERROR, "Socket::send - failed to send data");
close();
return 0;
}
@@ -212,7 +212,7 @@ int Socket::send ( const char* data, const unsigned int len )
if (status == -1)
{
errormessage( getLastError(), "Socket::send");
kodi->Log(LOG_ERROR, "Socket::send - failed to send data");
libKodi->Log(LOG_ERROR, "Socket::send - failed to send data");
close();
return 0;
}
@@ -296,7 +296,7 @@ bool Socket::ReadLine (string& line)
if (result < 0)
{
kodi->Log(LOG_DEBUG, "%s: select failed", __FUNCTION__);
libKodi->Log(LOG_DEBUG, "%s: select failed", __FUNCTION__);
errormessage(getLastError(), __FUNCTION__);
close();
return false;
@@ -306,11 +306,11 @@ bool Socket::ReadLine (string& line)
{
if (retries != 0)
{
kodi->Log(LOG_DEBUG, "%s: timeout waiting for response, retrying... (%i)", __FUNCTION__, retries);
libKodi->Log(LOG_DEBUG, "%s: timeout waiting for response, retrying... (%i)", __FUNCTION__, retries);
retries--;
continue;
} else {
kodi->Log(LOG_DEBUG, "%s: timeout waiting for response. Aborting after 10 retries.", __FUNCTION__);
libKodi->Log(LOG_DEBUG, "%s: timeout waiting for response. Aborting after 10 retries.", __FUNCTION__);
return false;
}
}
@@ -318,7 +318,7 @@ bool Socket::ReadLine (string& line)
result = recv(_sd, buffer, sizeof(buffer) - 1, 0);
if (result < 0)
{
kodi->Log(LOG_DEBUG, "%s: recv failed", __FUNCTION__);
libKodi->Log(LOG_DEBUG, "%s: recv failed", __FUNCTION__);
errormessage(getLastError(), __FUNCTION__);
close();
return false;
@@ -389,7 +389,7 @@ bool Socket::connect ( const std::string& host, const unsigned short port )
if ( !setHostname( host ) )
{
kodi->Log(LOG_ERROR, "Socket::setHostname(%s) failed.\n", host.c_str());
libKodi->Log(LOG_ERROR, "Socket::setHostname(%s) failed.\n", host.c_str());
return false;
}
_port = port;
@@ -438,7 +438,7 @@ bool Socket::connect ( const std::string& host, const unsigned short port )
if (address == NULL)
{
kodi->Log(LOG_ERROR, "Socket::connect %s:%u\n", host.c_str(), port);
libKodi->Log(LOG_ERROR, "Socket::connect %s:%u\n", host.c_str(), port);
errormessage(getLastError(), "Socket::connect");
close();
return false;
@@ -474,7 +474,7 @@ bool Socket::set_non_blocking ( const bool b )
if (ioctlsocket(_sd, FIONBIO, &iMode) == -1)
{
kodi->Log(LOG_ERROR, "Socket::set_non_blocking - Can't set socket condition to: %i", iMode);
libKodi->Log(LOG_ERROR, "Socket::set_non_blocking - Can't set socket condition to: %i", iMode);
return false;
}
@@ -565,7 +565,7 @@ void Socket::errormessage( int errnum, const char* functionname) const
default:
errmsg = "WSA Error";
}
kodi->Log(LOG_ERROR, "%s: (Winsock error=%i) %s\n", functionname, errnum, errmsg);
libKodi->Log(LOG_ERROR, "%s: (Winsock error=%i) %s\n", functionname, errnum, errmsg);
}
int Socket::getLastError() const
@@ -623,7 +623,7 @@ bool Socket::set_non_blocking ( const bool b )
if(fcntl (_sd , F_SETFL, opts) == -1)
{
kodi->Log(LOG_ERROR, "Socket::set_non_blocking - Can't set socket flags to: %i", opts);
libKodi->Log(LOG_ERROR, "Socket::set_non_blocking - Can't set socket flags to: %i", opts);
return false;
}
return true;
@@ -699,7 +699,7 @@ void Socket::errormessage( int errnum, const char* functionname) const
break;
}
kodi->Log(LOG_ERROR, "%s: (errno=%i) %s\n", functionname, errnum, errmsg);
libKodi->Log(LOG_ERROR, "%s: (errno=%i) %s\n", functionname, errnum, errmsg);
}
int Socket::getLastError() const

View File

@@ -36,7 +36,7 @@ std::string octonetAddress = "";
/* internal state variables */
ADDON_STATUS addonStatus = ADDON_STATUS_UNKNOWN;
CHelper_libXBMC_addon *kodi = NULL;
CHelper_libXBMC_addon *libKodi = NULL;
CHelper_libXBMC_pvr *pvr = NULL;
OctonetData *data = NULL;
@@ -49,7 +49,7 @@ extern "C" {
void ADDON_ReadSettings(void)
{
char buffer[2048];
if (kodi->GetSetting("octonetAddress", &buffer))
if (libKodi->GetSetting("octonetAddress", &buffer))
octonetAddress = buffer;
}
@@ -59,22 +59,22 @@ ADDON_STATUS ADDON_Create(void *callbacks, void* props)
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);
libKodi = new CHelper_libXBMC_addon;
if (!libKodi->RegisterMe(callbacks)) {
libKodi->Log(LOG_ERROR, "%s: Failed to register octonet addon", __func__);
SAFE_DELETE(libKodi);
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__);
libKodi->Log(LOG_ERROR, "%s: Failed to register octonet pvr addon", __func__);
SAFE_DELETE(pvr);
SAFE_DELETE(kodi);
SAFE_DELETE(libKodi);
return ADDON_STATUS_PERMANENT_FAILURE;
}
kodi->Log(LOG_DEBUG, "%s: Creating octonet pvr addon", __func__);
libKodi->Log(LOG_DEBUG, "%s: Creating octonet pvr addon", __func__);
ADDON_ReadSettings();
data = new OctonetData;
@@ -83,12 +83,10 @@ ADDON_STATUS ADDON_Create(void *callbacks, void* props)
return addonStatus;
}
void ADDON_Stop() {} /* no-op */
void ADDON_Destroy()
{
delete pvr;
delete kodi;
delete libKodi;
addonStatus = ADDON_STATUS_UNKNOWN;
}
@@ -97,16 +95,6 @@ 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
@@ -114,9 +102,6 @@ ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue)
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 */
}
@@ -125,32 +110,16 @@ void ADDON_Announce(const char *flag, const char *sender, const char *message, c
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;
pCapabilities->bSupportsChannelGroups = true;
pCapabilities->bSupportsEPG = true;
pCapabilities->bSupportsRecordings = false;
pCapabilities->bSupportsRecordingsRename = false;
pCapabilities->bSupportsRecordingsLifetimeChange = false;
pCapabilities->bSupportsDescrambleInfo = false;
return PVR_ERROR_NO_ERROR;
}
@@ -162,7 +131,7 @@ const char* GetBackendName(void)
const char* GetBackendVersion(void)
{
return XBMC_PVR_API_VERSION;
return STR(OCTONET_VERSION);
}
const char* GetConnectionString(void)
@@ -174,12 +143,12 @@ PVR_ERROR GetDriveSpace(long long* iTotal, long long* iUsed) { return PVR_ERROR_
PVR_ERROR CallMenuHook(const PVR_MENUHOOK& menuhook, const PVR_MENUHOOK_DATA &item) { return PVR_ERROR_NOT_IMPLEMENTED; }
void OnSystemSleep() {
kodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
libKodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
// FIXME: Disconnect?
}
void OnSystemWake() {
kodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
libKodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
// FIXME:Reconnect?
}
@@ -187,11 +156,14 @@ void OnPowerSavingActivated() {}
void OnPowerSavingDeactivated() {}
/* EPG */
PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL& channel, time_t iStart, time_t iEnd)
PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, int iChannelUid, time_t iStart, time_t iEnd)
{
return data->getEPG(handle, channel, iStart, iEnd);
return data->getEPG(handle, iChannelUid, iStart, iEnd);
}
PVR_ERROR IsEPGTagRecordable(const EPG_TAG*, bool*) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR IsEPGTagPlayable(const EPG_TAG*, bool*) { return PVR_ERROR_NOT_IMPLEMENTED; }
/* Channel groups */
int GetChannelGroupsAmount(void)
{
@@ -223,7 +195,6 @@ PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio)
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; }
@@ -234,6 +205,7 @@ PVR_ERROR DeleteRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT
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 SetRecordingLifetime(const PVR_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; }
@@ -245,6 +217,13 @@ 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 properties handling */
PVR_ERROR GetStreamReadChunkSize(int* chunksize) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetChannelStreamProperties(const PVR_CHANNEL*, PVR_NAMED_VALUE*, unsigned int*) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetRecordingStreamProperties(const PVR_RECORDING*, PVR_NAMED_VALUE*, unsigned int*) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetEPGTagStreamProperties(const EPG_TAG*, PVR_NAMED_VALUE*, unsigned int*) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetEPGTagEdl(const EPG_TAG* epgTag, PVR_EDL_ENTRY edl[], int *size) { return PVR_ERROR_NOT_IMPLEMENTED; }
/* PVR stream handling */
/* entirely unused, as we use standard RTSP+TS mux, which can be handlded by
* Kodi core */
@@ -261,30 +240,24 @@ void CloseLiveStream(void) {
}
long long SeekLiveStream(long long iPosition, int iWhence) { return -1; }
long long PositionLiveStream(void) { return -1; }
long long LengthLiveStream(void) { return -1; }
bool IsRealTimeStream(void) { return true; }
bool SwitchChannel(const PVR_CHANNEL& channel) {
CloseLiveStream();
return OpenLiveStream(channel);
}
PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS& signalStatus) {
memset(&signalStatus, 0, sizeof(PVR_SIGNAL_STATUS));
rtsp_fill_signal_status(signalStatus);
return PVR_ERROR_NO_ERROR;
}
const char* GetLiveStreamURL(const PVR_CHANNEL& channel) { return NULL; }
PVR_ERROR GetStreamTimes(PVR_STREAM_TIMES *times) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetDescrambleInfo(PVR_DESCRAMBLE_INFO*) { 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 */
@@ -293,10 +266,9 @@ void DemuxReset(void) {}
void DemuxAbort(void) {}
void DemuxFlush(void) {}
DemuxPacket* DemuxRead(void) { return NULL; }
void FillBuffer(bool mode) {}
/* Various helper functions */
unsigned int GetChannelSwitchDelay(void) { return 0; }
bool IsTimeshifting(void) { return false; }
bool CanPauseStream() { return false; }
bool CanSeekStream() { return false; }
@@ -306,10 +278,6 @@ bool SeekTime(double time, bool backwards, double *startpts) { return false; }
void SetSpeed(int speed) {}
PVR_ERROR SetEPGTimeFrame(int) { return PVR_ERROR_NOT_IMPLEMENTED; }
time_t GetPlayingTime() { return 0; }
time_t GetBufferTimeStart() { return 0; }
time_t GetBufferTimeEnd() { return 0; }
const char* GetBackendHostname()
{
return octonetAddress.c_str();

View File

@@ -28,7 +28,7 @@
#define __func__ __FUNCTION__
#endif
extern ADDON::CHelper_libXBMC_addon *kodi;
extern ADDON::CHelper_libXBMC_addon *libKodi;
extern CHelper_libXBMC_pvr *pvr;
/* IP or hostname of the octonet to be connected to */

View File

@@ -309,13 +309,13 @@ bool rtsp_open(const string& name, const string& url_str)
rtsp->level = 0;
rtsp->quality = 0;
kodi->Log(LOG_DEBUG, "try to open '%s'", url_str.c_str());
libKodi->Log(LOG_DEBUG, "try to open '%s'", url_str.c_str());
url dst = parse_url(url_str);
kodi->Log(LOG_DEBUG, "connect to host '%s'", dst.host.c_str());
libKodi->Log(LOG_DEBUG, "connect to host '%s'", dst.host.c_str());
if(!rtsp->tcp_sock.connect(dst.host, dst.port)) {
kodi->Log(LOG_ERROR, "Failed to connect to RTSP server %s:%d", dst.host.c_str(), dst.port);
libKodi->Log(LOG_ERROR, "Failed to connect to RTSP server %s:%d", dst.host.c_str(), dst.port);
goto error;
}
@@ -353,7 +353,7 @@ bool rtsp_open(const string& name, const string& url_str)
rtsp->tcp_sock.send(setup_ss.str());
if (rtsp_handle() != RTSP_RESULT_OK) {
kodi->Log(LOG_ERROR, "Failed to setup RTSP session");
libKodi->Log(LOG_ERROR, "Failed to setup RTSP session");
goto error;
}
@@ -368,7 +368,7 @@ bool rtsp_open(const string& name, const string& url_str)
rtsp->tcp_sock.send(play_ss.str());
if (rtsp_handle() != RTSP_RESULT_OK) {
kodi->Log(LOG_ERROR, "Failed to play RTSP session");
libKodi->Log(LOG_ERROR, "Failed to play RTSP session");
goto error;
}
@@ -453,7 +453,7 @@ static void rtsp_teardown() {
rtsp->tcp_sock.send(ss.str());
if (rtsp_handle() != RTSP_RESULT_OK) {
kodi->Log(LOG_ERROR, "Failed to teardown RTSP session");
libKodi->Log(LOG_ERROR, "Failed to teardown RTSP session");
return;
}
}