mirror of
https://github.com/DigitalDevices/pvr.octonet.git
synced 2025-03-01 10:53:09 +00:00
Compare commits
59 Commits
0.3.3
...
1.2.4-Matr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
50386e13b2 | ||
|
|
cd1c5d4171 | ||
|
|
83fbcfb360 | ||
|
|
bed39d0575 | ||
|
|
0bdcb49d69 | ||
|
|
5024fd99c1 | ||
|
|
a19fef8af8 | ||
|
|
38f8f54c9f | ||
|
|
01c41d8ea1 | ||
|
|
237362e65a | ||
|
|
c3f4d61b38 | ||
|
|
c37cede8dc | ||
|
|
aa4f7c0b0d | ||
|
|
8032f085fd | ||
|
|
0f6cd141c4 | ||
|
|
d5ec59e00e | ||
|
|
e2a73af36e | ||
|
|
a55552e768 | ||
|
|
14d3e9d225 | ||
|
|
cf9ee98727 | ||
|
|
9d98f2bba4 | ||
|
|
ca692f14be | ||
|
|
69da8dbd0c | ||
|
|
6d4f3847c7 | ||
|
|
38e25e1f1c | ||
|
|
472dc2beae | ||
|
|
ec08c20540 | ||
|
|
63ef363522 | ||
|
|
c91061f84b | ||
|
|
414e756912 | ||
|
|
9de3166203 | ||
|
|
df1b033f14 | ||
|
|
0295717be2 | ||
|
|
203f800eaa | ||
|
|
153dfeb3d5 | ||
|
|
1e44819300 | ||
|
|
54680a38bd | ||
|
|
689afbf4cd | ||
|
|
c4af00a4fe | ||
|
|
f1f8d44b78 | ||
|
|
e9b4c05de5 | ||
|
|
a77cf111bb | ||
|
|
020dd98e7b | ||
|
|
d7bb865329 | ||
|
|
9bbd7cf3c4 | ||
|
|
7b9ec7d884 | ||
|
|
37abebb540 | ||
|
|
3494c4c470 | ||
|
|
ff41fc9acc | ||
|
|
1ced6b3fa4 | ||
|
|
cd774b6edc | ||
|
|
2a63777b6d | ||
|
|
e9f0d6bf76 | ||
|
|
8549a31c8d | ||
|
|
0a7fb087ac | ||
|
|
5c0f000a91 | ||
|
|
2b020cec9c | ||
|
|
96a19310ca | ||
|
|
3a6f4eb7b5 |
51
.gitignore
vendored
51
.gitignore
vendored
@@ -1 +1,50 @@
|
|||||||
/build
|
# build artifacts
|
||||||
|
build/
|
||||||
|
pvr.*/addon.xml
|
||||||
|
|
||||||
|
# Debian build files
|
||||||
|
debian/changelog
|
||||||
|
debian/files
|
||||||
|
debian/*.log
|
||||||
|
debian/*.substvars
|
||||||
|
debian/.debhelper/
|
||||||
|
debian/tmp/
|
||||||
|
debian/kodi-pvr-*/
|
||||||
|
obj-x86_64-linux-gnu/
|
||||||
|
|
||||||
|
# commonly used editors
|
||||||
|
# vim
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
# Eclipse
|
||||||
|
*.project
|
||||||
|
*.cproject
|
||||||
|
.classpath
|
||||||
|
*.sublime-*
|
||||||
|
.settings/
|
||||||
|
|
||||||
|
# KDevelop 4
|
||||||
|
*.kdev4
|
||||||
|
|
||||||
|
# gedit
|
||||||
|
*~
|
||||||
|
|
||||||
|
# CLion
|
||||||
|
/.idea
|
||||||
|
|
||||||
|
# clion
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# to prevent add after a "git format-patch VALUE" and "git add ." call
|
||||||
|
/*.patch
|
||||||
|
|
||||||
|
# Visual Studio Code
|
||||||
|
.vscode
|
||||||
|
|
||||||
|
# to prevent add if project code opened by Visual Studio over CMake file
|
||||||
|
.vs/
|
||||||
|
|
||||||
|
# General MacOS
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|||||||
30
.travis.yml
30
.travis.yml
@@ -7,28 +7,22 @@ language: cpp
|
|||||||
# Linux. We need Trusty in order to get up to date versions of
|
# Linux. We need Trusty in order to get up to date versions of
|
||||||
# cmake and g++.
|
# cmake and g++.
|
||||||
#
|
#
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- app_id=pvr.octonet
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: linux
|
- os: linux
|
||||||
dist: trusty
|
dist: xenial
|
||||||
sudo: required
|
sudo: required
|
||||||
compiler: gcc
|
compiler: gcc
|
||||||
- os: linux
|
- os: linux
|
||||||
dist: trusty
|
dist: xenial
|
||||||
sudo: required
|
sudo: required
|
||||||
compiler: clang
|
compiler: clang
|
||||||
- os: osx
|
- os: osx
|
||||||
osx_image: xcode7.3
|
osx_image: xcode10.2
|
||||||
- os: osx
|
|
||||||
osx_image: xcode6.1
|
|
||||||
|
|
||||||
#
|
|
||||||
# Some of the OS X images don't have cmake, contrary to what people
|
|
||||||
# on the Internet say
|
|
||||||
#
|
|
||||||
before_install:
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then which cmake || brew update ; fi
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then which cmake || brew install cmake ; fi
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# The addon source is automatically checked out in $TRAVIS_BUILD_DIR,
|
# The addon source is automatically checked out in $TRAVIS_BUILD_DIR,
|
||||||
@@ -36,10 +30,10 @@ before_install:
|
|||||||
#
|
#
|
||||||
before_script:
|
before_script:
|
||||||
- cd $TRAVIS_BUILD_DIR/..
|
- cd $TRAVIS_BUILD_DIR/..
|
||||||
- git clone --depth=1 https://github.com/xbmc/xbmc.git
|
- git clone --branch master --depth=1 https://github.com/xbmc/xbmc.git
|
||||||
- mkdir -p xbmc/project/cmake/addons/addons/pvr.octonet
|
- cd ${app_id} && mkdir build && cd build
|
||||||
- echo "pvr.octonet https://github.com/DigitalDevices/pvr.octonet master" > xbmc/project/cmake/addons/addons/pvr.octonet/pvr.octonet.txt
|
- mkdir -p definition/${app_id}
|
||||||
- cd $TRAVIS_BUILD_DIR && mkdir build && cd build
|
- echo ${app_id} $TRAVIS_BUILD_DIR $TRAVIS_COMMIT > definition/${app_id}/${app_id}.txt
|
||||||
- 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=${app_id} -DADDON_SRC_PREFIX=$TRAVIS_BUILD_DIR/.. -DADDONS_DEFINITION_DIR=$TRAVIS_BUILD_DIR/build/definition -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/../xbmc/addons -DPACKAGE_ZIP=1 $TRAVIS_BUILD_DIR/../xbmc/cmake/addons
|
||||||
|
|
||||||
script: make
|
script: make
|
||||||
|
|||||||
@@ -1,19 +1,15 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.5)
|
||||||
project(pvr.octonet)
|
project(pvr.octonet)
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 2.6)
|
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
|
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
|
||||||
enable_language(CXX)
|
|
||||||
|
|
||||||
find_package(Kodi REQUIRED)
|
find_package(Kodi REQUIRED)
|
||||||
find_package(kodiplatform REQUIRED)
|
|
||||||
find_package(p8-platform REQUIRED)
|
find_package(p8-platform REQUIRED)
|
||||||
find_package(JsonCpp REQUIRED)
|
find_package(JsonCpp REQUIRED)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
${kodiplatform_INCLUDE_DIRS}
|
|
||||||
${p8-platform_INCLUDE_DIRS}
|
${p8-platform_INCLUDE_DIRS}
|
||||||
${KODI_INCLUDE_DIR}
|
${KODI_INCLUDE_DIR}/.. # Hack way with "/..", need bigger Kodi cmake rework to match right include ways
|
||||||
${JSONCPP_INCLUDE_DIRS})
|
${JSONCPP_INCLUDE_DIRS})
|
||||||
|
|
||||||
set(DEPLIBS
|
set(DEPLIBS
|
||||||
@@ -26,10 +22,19 @@ set(OCTONET_SOURCES
|
|||||||
src/Socket.cpp
|
src/Socket.cpp
|
||||||
src/rtsp_client.cpp)
|
src/rtsp_client.cpp)
|
||||||
|
|
||||||
|
set(OCTONET_HEADERS
|
||||||
|
src/client.h
|
||||||
|
src/OctonetData.h
|
||||||
|
src/Socket.h)
|
||||||
|
|
||||||
build_addon(pvr.octonet OCTONET DEPLIBS)
|
build_addon(pvr.octonet OCTONET DEPLIBS)
|
||||||
|
|
||||||
if(WIN32)
|
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()
|
endif()
|
||||||
|
|
||||||
include(CPack)
|
include(CPack)
|
||||||
|
|||||||
1
Jenkinsfile
vendored
Normal file
1
Jenkinsfile
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
buildPlugin(version: "Matrix")
|
||||||
264
LICENSE.md
Normal file
264
LICENSE.md
Normal file
@@ -0,0 +1,264 @@
|
|||||||
|
The GNU General Public License, Version 2, June 1991 (GPLv2)
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
> Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
> 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||||
|
document, but changing it is not allowed.
|
||||||
|
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
--------
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your freedom to share
|
||||||
|
and change it. By contrast, the GNU General Public License is intended to
|
||||||
|
guarantee your freedom to share and change free software--to make sure the
|
||||||
|
software is free for all its users. This General Public License applies to most
|
||||||
|
of the Free Software Foundation's software and to any other program whose
|
||||||
|
authors commit to using it. (Some other Free Software Foundation software is
|
||||||
|
covered by the GNU Lesser General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not price. Our
|
||||||
|
General Public Licenses are designed to make sure that you have the freedom to
|
||||||
|
distribute copies of free software (and charge for this service if you wish),
|
||||||
|
that you receive source code or can get it if you want it, that you can change
|
||||||
|
the software or use pieces of it in new free programs; and that you know you can
|
||||||
|
do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid anyone to deny
|
||||||
|
you these rights or to ask you to surrender the rights. These restrictions
|
||||||
|
translate to certain responsibilities for you if you distribute copies of the
|
||||||
|
software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether gratis or for a
|
||||||
|
fee, you must give the recipients all the rights that you have. You must make
|
||||||
|
sure that they, too, receive or can get the source code. And you must show them
|
||||||
|
these terms so they know their rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and (2) offer
|
||||||
|
you this license which gives you legal permission to copy, distribute and/or
|
||||||
|
modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain that
|
||||||
|
everyone understands that there is no warranty for this free software. If the
|
||||||
|
software is modified by someone else and passed on, we want its recipients to
|
||||||
|
know that what they have is not the original, so that any problems introduced by
|
||||||
|
others will not reflect on the original authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software patents. We wish
|
||||||
|
to avoid the danger that redistributors of a free program will individually
|
||||||
|
obtain patent licenses, in effect making the program proprietary. To prevent
|
||||||
|
this, we have made it clear that any patent must be licensed for everyone's free
|
||||||
|
use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and modification
|
||||||
|
follow.
|
||||||
|
|
||||||
|
|
||||||
|
Terms And Conditions For Copying, Distribution And Modification
|
||||||
|
---------------------------------------------------------------
|
||||||
|
|
||||||
|
**0.** This License applies to any program or other work which contains a notice
|
||||||
|
placed by the copyright holder saying it may be distributed under the terms of
|
||||||
|
this General Public License. The "Program", below, refers to any such program or
|
||||||
|
work, and a "work based on the Program" means either the Program or any
|
||||||
|
derivative work under copyright law: that is to say, a work containing the
|
||||||
|
Program or a portion of it, either verbatim or with modifications and/or
|
||||||
|
translated into another language. (Hereinafter, translation is included without
|
||||||
|
limitation in the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not covered by
|
||||||
|
this License; they are outside its scope. The act of running the Program is not
|
||||||
|
restricted, and the output from the Program is covered only if its contents
|
||||||
|
constitute a work based on the Program (independent of having been made by
|
||||||
|
running the Program). Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
**1.** You may copy and distribute verbatim copies of the Program's source code
|
||||||
|
as you receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice and
|
||||||
|
disclaimer of warranty; keep intact all the notices that refer to this License
|
||||||
|
and to the absence of any warranty; and give any other recipients of the Program
|
||||||
|
a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and you may at
|
||||||
|
your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
**2.** You may modify your copy or copies of the Program or any portion of it,
|
||||||
|
thus forming a work based on the Program, and copy and distribute such
|
||||||
|
modifications or work under the terms of Section 1 above, provided that you also
|
||||||
|
meet all of these conditions:
|
||||||
|
|
||||||
|
* **a)** You must cause the modified files to carry prominent notices stating
|
||||||
|
that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
* **b)** You must cause any work that you distribute or publish, that in whole
|
||||||
|
or in part contains or is derived from the Program or any part thereof, to
|
||||||
|
be licensed as a whole at no charge to all third parties under the terms of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
* **c)** If the modified program normally reads commands interactively when
|
||||||
|
run, you must cause it, when started running for such interactive use in the
|
||||||
|
most ordinary way, to print or display an announcement including an
|
||||||
|
appropriate copyright notice and a notice that there is no warranty (or
|
||||||
|
else, saying that you provide a warranty) and that users may redistribute
|
||||||
|
the program under these conditions, and telling the user how to view a copy
|
||||||
|
of this License. (Exception: if the Program itself is interactive but does
|
||||||
|
not normally print such an announcement, your work based on the Program is
|
||||||
|
not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If identifiable
|
||||||
|
sections of that work are not derived from the Program, and can be reasonably
|
||||||
|
considered independent and separate works in themselves, then this License, and
|
||||||
|
its terms, do not apply to those sections when you distribute them as separate
|
||||||
|
works. But when you distribute the same sections as part of a whole which is a
|
||||||
|
work based on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the entire whole,
|
||||||
|
and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest your
|
||||||
|
rights to work written entirely by you; rather, the intent is to exercise the
|
||||||
|
right to control the distribution of derivative or collective works based on the
|
||||||
|
Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program with the
|
||||||
|
Program (or with a work based on the Program) on a volume of a storage or
|
||||||
|
distribution medium does not bring the other work under the scope of this
|
||||||
|
License.
|
||||||
|
|
||||||
|
**3.** You may copy and distribute the Program (or a work based on it, under
|
||||||
|
Section 2) in object code or executable form under the terms of Sections 1 and 2
|
||||||
|
above provided that you also do one of the following:
|
||||||
|
|
||||||
|
* **a)** Accompany it with the complete corresponding machine-readable source
|
||||||
|
code, which must be distributed under the terms of Sections 1 and 2 above on
|
||||||
|
a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
* **b)** Accompany it with a written offer, valid for at least three years, to
|
||||||
|
give any third party, for a charge no more than your cost of physically
|
||||||
|
performing source distribution, a complete machine-readable copy of the
|
||||||
|
corresponding source code, to be distributed under the terms of Sections 1
|
||||||
|
and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
* **c)** Accompany it with the information you received as to the offer to
|
||||||
|
distribute corresponding source code. (This alternative is allowed only for
|
||||||
|
noncommercial distribution and only if you received the program in object
|
||||||
|
code or executable form with such an offer, in accord with Subsection b
|
||||||
|
above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for making
|
||||||
|
modifications to it. For an executable work, complete source code means all the
|
||||||
|
source code for all modules it contains, plus any associated interface
|
||||||
|
definition files, plus the scripts used to control compilation and installation
|
||||||
|
of the executable. However, as a special exception, the source code distributed
|
||||||
|
need not include anything that is normally distributed (in either source or
|
||||||
|
binary form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component itself
|
||||||
|
accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering access to copy
|
||||||
|
from a designated place, then offering equivalent access to copy the source code
|
||||||
|
from the same place counts as distribution of the source code, even though third
|
||||||
|
parties are not compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
**4.** You may not copy, modify, sublicense, or distribute the Program except as
|
||||||
|
expressly provided under this License. Any attempt otherwise to copy, modify,
|
||||||
|
sublicense or distribute the Program is void, and will automatically terminate
|
||||||
|
your rights under this License. However, parties who have received copies, or
|
||||||
|
rights, from you under this License will not have their licenses terminated so
|
||||||
|
long as such parties remain in full compliance.
|
||||||
|
|
||||||
|
**5.** You are not required to accept this License, since you have not signed
|
||||||
|
it. However, nothing else grants you permission to modify or distribute the
|
||||||
|
Program or its derivative works. These actions are prohibited by law if you do
|
||||||
|
not accept this License. Therefore, by modifying or distributing the Program (or
|
||||||
|
any work based on the Program), you indicate your acceptance of this License to
|
||||||
|
do so, and all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
**6.** Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the original
|
||||||
|
licensor to copy, distribute or modify the Program subject to these terms and
|
||||||
|
conditions. You may not impose any further restrictions on the recipients'
|
||||||
|
exercise of the rights granted herein. You are not responsible for enforcing
|
||||||
|
compliance by third parties to this License.
|
||||||
|
|
||||||
|
**7.** If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues), conditions
|
||||||
|
are imposed on you (whether by court order, agreement or otherwise) that
|
||||||
|
contradict the conditions of this License, they do not excuse you from the
|
||||||
|
conditions of this License. If you cannot distribute so as to satisfy
|
||||||
|
simultaneously your obligations under this License and any other pertinent
|
||||||
|
obligations, then as a consequence you may not distribute the Program at all.
|
||||||
|
For example, if a patent license would not permit royalty-free redistribution of
|
||||||
|
the Program by all those who receive copies directly or indirectly through you,
|
||||||
|
then the only way you could satisfy both it and this License would be to refrain
|
||||||
|
entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under any
|
||||||
|
particular circumstance, the balance of the section is intended to apply and the
|
||||||
|
section as a whole is intended to apply in other circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any patents or
|
||||||
|
other property right claims or to contest validity of any such claims; this
|
||||||
|
section has the sole purpose of protecting the integrity of the free software
|
||||||
|
distribution system, which is implemented by public license practices. Many
|
||||||
|
people have made generous contributions to the wide range of software
|
||||||
|
distributed through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing to
|
||||||
|
distribute software through any other system and a licensee cannot impose that
|
||||||
|
choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to be a
|
||||||
|
consequence of the rest of this License.
|
||||||
|
|
||||||
|
**8.** If the distribution and/or use of the Program is restricted in certain
|
||||||
|
countries either by patents or by copyrighted interfaces, the original copyright
|
||||||
|
holder who places the Program under this License may add an explicit
|
||||||
|
geographical distribution limitation excluding those countries, so that
|
||||||
|
distribution is permitted only in or among countries not thus excluded. In such
|
||||||
|
case, this License incorporates the limitation as if written in the body of this
|
||||||
|
License.
|
||||||
|
|
||||||
|
**9.** The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the General Public License from time to time. Such new versions will be similar
|
||||||
|
in spirit to the present version, but may differ in detail to address new
|
||||||
|
problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program specifies
|
||||||
|
a version number of this License which applies to it and "any later version",
|
||||||
|
you have the option of following the terms and conditions either of that version
|
||||||
|
or of any later version published by the Free Software Foundation. If the
|
||||||
|
Program does not specify a version number of this License, you may choose any
|
||||||
|
version ever published by the Free Software Foundation.
|
||||||
|
|
||||||
|
**10.** If you wish to incorporate parts of the Program into other free programs
|
||||||
|
whose distribution conditions are different, write to the author to ask for
|
||||||
|
permission. For software which is copyrighted by the Free Software Foundation,
|
||||||
|
write to the Free Software Foundation; we sometimes make exceptions for this.
|
||||||
|
Our decision will be guided by the two goals of preserving the free status of
|
||||||
|
all derivatives of our free software and of promoting the sharing and reuse of
|
||||||
|
software generally.
|
||||||
|
|
||||||
|
|
||||||
|
No Warranty
|
||||||
|
-----------
|
||||||
|
|
||||||
|
**11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
|
||||||
|
THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
|
||||||
|
STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM
|
||||||
|
"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||||
|
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||||
|
PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
**12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
|
||||||
|
INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
|
||||||
|
BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||||
|
FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
|
||||||
|
OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
39
README.md
39
README.md
@@ -1,5 +1,5 @@
|
|||||||
# Octonet PVR
|
# Octonet PVR
|
||||||
Digital Devices [Octonet] (http://www.digital-devices.eu/shop/de/netzwerk-tv/) PVR client addon for [Kodi] (http://kodi.tv)
|
Digital Devices [Octonet](http://www.digital-devices.eu/shop/de/netzwerk-tv/) PVR client addon for [Kodi](http://kodi.tv)
|
||||||
|
|
||||||
| Platform | Status |
|
| Platform | Status |
|
||||||
|----------|--------|
|
|----------|--------|
|
||||||
@@ -8,25 +8,30 @@ Digital Devices [Octonet] (http://www.digital-devices.eu/shop/de/netzwerk-tv/) P
|
|||||||
|
|
||||||
# Building
|
# Building
|
||||||
|
|
||||||
## Windows
|
These instructions work on all supported platforms for the most part. Obviously, paths need to be
|
||||||
1. Create a file `project/cmake/addons/addons/kodi.pvr.octonet/kodi.pvr.octonet.txt` containing a
|
adjusted according to your OS (`/` vs `\`). We use Linux paths here as an example.
|
||||||
single line `kodi.pvr.octonet file://C:\some\path`. The path doesn't matter and doesn't need to
|
|
||||||
actually exist.
|
|
||||||
|
|
||||||
2. Use a shell that has environment variables setup by Visual Studio for the native x86 toolchain.
|
Clone the `pvr.octonet` repository:
|
||||||
Run the following in a new build directory and adjust paths accordingly:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
cmake -G "NMake Makefiles" ^
|
$ git clone https://github.com/DigitalDevices/pvr.octonet.git
|
||||||
-DCMAKE_BUILD_TYPE=Release ^
|
|
||||||
-DADDONS_TO_BUILD="kodi.pvr.octonet" ^
|
|
||||||
-DADDON_SRC_PREFIX="path_to_where_kodi.pvr.octonet_is" ^
|
|
||||||
-DCMAKE_INSTALL_PREFIX="some_subdirectory" ^
|
|
||||||
-DPACKAGE_ZIP=ON ^
|
|
||||||
"path_to_kodi\project\cmake\addons"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Make sure `ADDON_SRC_PREFIX` points to the parent directory of `kodi.pvr.octonet`.
|
Clone the Kodi repository:
|
||||||
|
|
||||||
4. Build the addon by running `nmake`. Run `nmake package-addons` to package a zip file of the
|
```
|
||||||
addon.
|
$ git clone --branch master https://github.com/xbmc/xbmc.git
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ 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/cmake/addons"
|
||||||
|
```
|
||||||
|
|
||||||
|
On Windows, you should add `-G "NMake Makefiles"` to the CMake invocation. Make sure that
|
||||||
|
`ADDON_SRC_PREFIX` does _not_ point directly to `pvr.octonet` but instead to its parent directory.
|
||||||
|
|
||||||
|
Finally, build the plugin with `make` (or `nmake` on Windows). The plugin should be in an `install`
|
||||||
|
subdirectory.
|
||||||
|
|||||||
13
appveyor.yml
13
appveyor.yml
@@ -21,15 +21,20 @@ environment:
|
|||||||
- GENERATOR: "Visual Studio 14"
|
- GENERATOR: "Visual Studio 14"
|
||||||
CONFIG: Release
|
CONFIG: Release
|
||||||
|
|
||||||
|
artifacts:
|
||||||
|
- path: build/install/
|
||||||
|
name: pvr.octonet
|
||||||
|
type: zip
|
||||||
|
|
||||||
build_script:
|
build_script:
|
||||||
- cd ..
|
- cd ..
|
||||||
- set ROOT=%cd%
|
- set ROOT=%cd%
|
||||||
- git clone --depth=1 https://github.com/xbmc/xbmc.git
|
- git clone --branch master --depth=1 https://github.com/xbmc/xbmc.git
|
||||||
- mkdir xbmc\project\cmake\addons\addons\pvr.octonet
|
- mkdir xbmc\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
|
- echo pvr.octonet https://github.com/DigitalDevices/pvr.octonet master > xbmc\cmake\addons\addons\pvr.octonet\pvr.octonet.txt
|
||||||
- cd %ADDON%
|
- cd %ADDON%
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- cd build
|
- cd build
|
||||||
# Must use absolute path for cmake to build depends correctly
|
# 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%
|
- cmake --build . --config %CONFIG%
|
||||||
|
|||||||
6
debian/control
vendored
6
debian/control
vendored
@@ -1,9 +1,9 @@
|
|||||||
Source: kodi-pvr-octonet
|
Source: kodi-pvr-octonet
|
||||||
Priority: extra
|
Priority: extra
|
||||||
Maintainer: Julian Scheel <julian@jusst.de>
|
Maintainer: Julian Scheel <julian@jusst.de>
|
||||||
Build-Depends: debhelper (>= 9.0.0), cmake, libjsoncpp-dev, kodi-pvr-dev,
|
Build-Depends: debhelper (>= 9.0.0), cmake, libjsoncpp-dev,
|
||||||
libkodiplatform-dev (>= 16.0.0), kodi-addon-dev
|
libp8-platform-dev, kodi-addon-dev
|
||||||
Standards-Version: 3.9.4
|
Standards-Version: 4.1.2
|
||||||
Section: libs
|
Section: libs
|
||||||
Homepage: https://github.com/DigitalDevices/pvr.octonet
|
Homepage: https://github.com/DigitalDevices/pvr.octonet
|
||||||
|
|
||||||
|
|||||||
5
debian/copyright
vendored
5
debian/copyright
vendored
@@ -5,7 +5,7 @@ Source: https://github.com/DigitalDevices/pvr.octonet
|
|||||||
Files: *
|
Files: *
|
||||||
Copyright: 2015-2016 Julian Scheel
|
Copyright: 2015-2016 Julian Scheel
|
||||||
2015-2016 jusst technologies GmbH
|
2015-2016 jusst technologies GmbH
|
||||||
2005-2013 Team XBMC
|
2005-2020 Team Kodi
|
||||||
License: GPL-2+
|
License: GPL-2+
|
||||||
This package is free software; you can redistribute it and/or modify
|
This package is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -24,7 +24,8 @@ License: GPL-2+
|
|||||||
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
|
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
|
||||||
|
|
||||||
Files: debian/*
|
Files: debian/*
|
||||||
Copyright: 2016 Julian Scheel <julian@jusst.de>
|
Copyright: 2020 Team Kodi
|
||||||
|
2016 Julian Scheel <julian@jusst.de>
|
||||||
2015 Jean-Luc Barriere
|
2015 Jean-Luc Barriere
|
||||||
2015 wsnipex <wsnipex@a1.net>
|
2015 wsnipex <wsnipex@a1.net>
|
||||||
License: GPL-2+
|
License: GPL-2+
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.5)
|
||||||
project(jsoncpp)
|
project(jsoncpp)
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 2.6)
|
SET(CMAKE_CXX_STANDARD 11)
|
||||||
enable_language(CXX)
|
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
SET(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
|
||||||
set(SOURCES src/lib_json/json_reader.cpp
|
set(SOURCES src/lib_json/json_reader.cpp
|
||||||
src/lib_json/json_value.cpp
|
src/lib_json/json_value.cpp
|
||||||
|
|||||||
1
depends/common/jsoncpp/jsoncpp.sha256
Normal file
1
depends/common/jsoncpp/jsoncpp.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
3671ba6051e0f30849942cc66d1798fdf0362d089343a83f704c09ee7156604f
|
||||||
@@ -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
|
||||||
|
|||||||
1
depends/common/p8-platform/p8-platform.txt
Normal file
1
depends/common/p8-platform/p8-platform.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
p8-platform https://github.com/xbmc/platform.git cee64e9dc0b69e8d286dc170a78effaabfa09c44
|
||||||
1
depends/windowsstore/p8-platform/p8-platform.txt
Normal file
1
depends/windowsstore/p8-platform/p8-platform.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
p8-platform https://github.com/afedchin/platform.git win10
|
||||||
@@ -1,23 +1,18 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<addon
|
<addon
|
||||||
id="pvr.octonet"
|
id="pvr.octonet"
|
||||||
version="0.3.2"
|
version="1.2.4"
|
||||||
name="Digital Devices Octopus NET Client"
|
name="Digital Devices Octopus NET Client"
|
||||||
provider-name="digitaldevices">
|
provider-name="digitaldevices">
|
||||||
<requires>
|
<requires>@ADDON_DEPENDS@</requires>
|
||||||
<c-pluff version="0.1" />
|
|
||||||
<import addon="xbmc.pvr" version="5.2.0" />
|
|
||||||
</requires>
|
|
||||||
<extension
|
<extension
|
||||||
point="xbmc.pvrclient"
|
point="xbmc.pvrclient"
|
||||||
library_linux="pvr.octonet.so"
|
library_@PLATFORM@="@LIBRARY_FILENAME@"/>
|
||||||
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">
|
<extension point="xbmc.addon.metadata">
|
||||||
<summary lang="de_DE">Kodi PVR Addon für Digital Devices Octopus NET Streams</summary>
|
<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>
|
<summary lang="en_US">Kodi PVR Addon for Digital Devices Octopus NET Streams</summary>
|
||||||
<platform>all</platform>
|
<platform>@PLATFORM@</platform>
|
||||||
|
<license>GPL-2.0+</license>
|
||||||
|
<source>https://github.com/DigitalDevices/pvr.octonet</source>
|
||||||
</extension>
|
</extension>
|
||||||
</addon>
|
</addon>
|
||||||
@@ -1,22 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2015 Julian Scheel <julian@jusst.de>
|
* Copyright (C) 2015 Julian Scheel <julian@jusst.de>
|
||||||
* Copyright (C) 2015 jusst technologies GmbH
|
* Copyright (C) 2015 jusst technologies GmbH
|
||||||
* Copyright (C) 2015 Digital Devices GmbH
|
* Copyright (C) 2015 Digital Devices GmbH
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
* modify it under the terms of the GNU General Public License
|
* See LICENSE.md for more information.
|
||||||
* 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.
|
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -26,7 +14,6 @@
|
|||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
|
|
||||||
#include "OctonetData.h"
|
#include "OctonetData.h"
|
||||||
#include "p8-platform/util/StringUtils.h"
|
|
||||||
|
|
||||||
#ifdef __WINDOWS__
|
#ifdef __WINDOWS__
|
||||||
#define timegm _mkgmtime
|
#define timegm _mkgmtime
|
||||||
@@ -42,7 +29,7 @@ OctonetData::OctonetData()
|
|||||||
lastEpgLoad = 0;
|
lastEpgLoad = 0;
|
||||||
|
|
||||||
if (!loadChannelList())
|
if (!loadChannelList())
|
||||||
kodi->QueueNotification(QUEUE_ERROR, kodi->GetLocalizedString(30001), channels.size());
|
libKodi->QueueNotification(QUEUE_ERROR, libKodi->GetLocalizedString(30001), channels.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
OctonetData::~OctonetData(void)
|
OctonetData::~OctonetData(void)
|
||||||
@@ -53,14 +40,8 @@ OctonetData::~OctonetData(void)
|
|||||||
|
|
||||||
int64_t OctonetData::parseID(std::string id)
|
int64_t OctonetData::parseID(std::string id)
|
||||||
{
|
{
|
||||||
int64_t nativeId;
|
std::hash<std::string> hash_fn;
|
||||||
size_t strip;
|
int64_t nativeId = hash_fn(id);
|
||||||
/* Strip colons from id */
|
|
||||||
while ((strip = id.find(":")) != std::string::npos)
|
|
||||||
id.erase(strip, 1);
|
|
||||||
|
|
||||||
std::stringstream ids(id);
|
|
||||||
ids >> nativeId;
|
|
||||||
|
|
||||||
return nativeId;
|
return nativeId;
|
||||||
}
|
}
|
||||||
@@ -68,15 +49,15 @@ int64_t OctonetData::parseID(std::string id)
|
|||||||
bool OctonetData::loadChannelList()
|
bool OctonetData::loadChannelList()
|
||||||
{
|
{
|
||||||
std::string jsonContent;
|
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)
|
if (!f)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
while (int read = kodi->ReadFile(f, buf, 1024))
|
while (int read = libKodi->ReadFile(f, buf, 1024))
|
||||||
jsonContent.append(buf, read);
|
jsonContent.append(buf, read);
|
||||||
|
|
||||||
kodi->CloseFile(f);
|
libKodi->CloseFile(f);
|
||||||
|
|
||||||
Json::Value root;
|
Json::Value root;
|
||||||
Json::Reader reader;
|
Json::Reader reader;
|
||||||
@@ -153,15 +134,15 @@ bool OctonetData::loadEPG(void)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::string jsonContent;
|
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)
|
if (!f)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
while (int read = kodi->ReadFile(f, buf, 1024))
|
while (int read = libKodi->ReadFile(f, buf, 1024))
|
||||||
jsonContent.append(buf, read);
|
jsonContent.append(buf, read);
|
||||||
|
|
||||||
kodi->CloseFile(f);
|
libKodi->CloseFile(f);
|
||||||
|
|
||||||
Json::Value root;
|
Json::Value root;
|
||||||
Json::Reader reader;
|
Json::Reader reader;
|
||||||
@@ -190,7 +171,7 @@ bool OctonetData::loadEPG(void)
|
|||||||
channel = findChannel(entry.channelId);
|
channel = findChannel(entry.channelId);
|
||||||
|
|
||||||
if (channel == NULL) {
|
if (channel == NULL) {
|
||||||
kodi->Log(LOG_ERROR, "EPG for unknown channel.");
|
libKodi->Log(LOG_ERROR, "EPG for unknown channel.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,12 +215,12 @@ PVR_ERROR OctonetData::getChannels(ADDON_HANDLE handle, bool bRadio)
|
|||||||
return PVR_ERROR_NO_ERROR;
|
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++)
|
for (unsigned int i = 0; i < channels.size(); i++)
|
||||||
{
|
{
|
||||||
OctonetChannel &chan = channels.at(i);
|
OctonetChannel &chan = channels.at(i);
|
||||||
if (channel.iUniqueId != chan.id)
|
if (iChannelUid != chan.id)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(chan.epg.empty()) {
|
if(chan.epg.empty()) {
|
||||||
@@ -260,8 +241,11 @@ PVR_ERROR OctonetData::getEPG(ADDON_HANDLE handle, const PVR_CHANNEL &channel, t
|
|||||||
|
|
||||||
EPG_TAG entry;
|
EPG_TAG entry;
|
||||||
memset(&entry, 0, sizeof(EPG_TAG));
|
memset(&entry, 0, sizeof(EPG_TAG));
|
||||||
|
entry.iSeriesNumber = EPG_TAG_INVALID_SERIES_EPISODE;
|
||||||
|
entry.iEpisodeNumber = EPG_TAG_INVALID_SERIES_EPISODE;
|
||||||
|
entry.iEpisodePartNumber = EPG_TAG_INVALID_SERIES_EPISODE;
|
||||||
|
|
||||||
entry.iChannelNumber = i;
|
entry.iUniqueChannelId = chan.id;
|
||||||
entry.iUniqueBroadcastId = it->id;
|
entry.iUniqueBroadcastId = it->id;
|
||||||
entry.strTitle = it->title.c_str();
|
entry.strTitle = it->title.c_str();
|
||||||
entry.strPlotOutline = it->subtitle.c_str();
|
entry.strPlotOutline = it->subtitle.c_str();
|
||||||
@@ -281,8 +265,11 @@ PVR_ERROR OctonetData::getEPG(ADDON_HANDLE handle, const PVR_CHANNEL &channel, t
|
|||||||
|
|
||||||
EPG_TAG entry;
|
EPG_TAG entry;
|
||||||
memset(&entry, 0, sizeof(EPG_TAG));
|
memset(&entry, 0, sizeof(EPG_TAG));
|
||||||
|
entry.iSeriesNumber = EPG_TAG_INVALID_SERIES_EPISODE;
|
||||||
|
entry.iEpisodeNumber = EPG_TAG_INVALID_SERIES_EPISODE;
|
||||||
|
entry.iEpisodePartNumber = EPG_TAG_INVALID_SERIES_EPISODE;
|
||||||
|
|
||||||
entry.iChannelNumber = i;
|
entry.iUniqueChannelId = chan.id;
|
||||||
entry.iUniqueBroadcastId = it->id;
|
entry.iUniqueBroadcastId = it->id;
|
||||||
entry.strTitle = it->title.c_str();
|
entry.strTitle = it->title.c_str();
|
||||||
entry.strPlotOutline = it->subtitle.c_str();
|
entry.strPlotOutline = it->subtitle.c_str();
|
||||||
|
|||||||
@@ -1,31 +1,18 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2015 Julian Scheel <julian@jusst.de>
|
* Copyright (C) 2015 Julian Scheel <julian@jusst.de>
|
||||||
* Copyright (C) 2015 jusst technologies GmbH
|
* Copyright (C) 2015 jusst technologies GmbH
|
||||||
* Copyright (C) 2015 Digital Devices GmbH
|
* Copyright (C) 2015 Digital Devices GmbH
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
* modify it under the terms of the GNU General Public License
|
* See LICENSE.md for more information.
|
||||||
* 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.
|
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "p8-platform/threads/threads.h"
|
#include "p8-platform/threads/threads.h"
|
||||||
#include "p8-platform/util/StdString.h"
|
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
|
||||||
struct OctonetEpgEntry
|
struct OctonetEpgEntry
|
||||||
@@ -69,7 +56,7 @@ class OctonetData : public P8PLATFORM::CThread
|
|||||||
virtual PVR_ERROR getGroups(ADDON_HANDLE handle, bool bRadio);
|
virtual PVR_ERROR getGroups(ADDON_HANDLE handle, bool bRadio);
|
||||||
virtual PVR_ERROR getGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group);
|
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& getUrl(int id) const;
|
||||||
const std::string& getName(int id) const;
|
const std::string& getName(int id) const;
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2011 Team XBMC
|
* Copyright (C) 2005-2020 Team Kodi
|
||||||
* http://www.xbmc.org
|
* https://kodi.tv
|
||||||
*
|
|
||||||
* 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
* See LICENSE.md for more information.
|
||||||
*/
|
*/
|
||||||
#include "libXBMC_addon.h"
|
|
||||||
|
#include "kodi/libXBMC_addon.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "p8-platform/os.h"
|
#include "p8-platform/os.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
@@ -196,13 +186,13 @@ int Socket::send ( const char* data, const unsigned int len )
|
|||||||
|
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
{
|
{
|
||||||
kodi->Log(LOG_ERROR, "Socket::send - select failed");
|
libKodi->Log(LOG_ERROR, "Socket::send - select failed");
|
||||||
close();
|
close();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (FD_ISSET(_sd, &set_w))
|
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();
|
close();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -212,7 +202,7 @@ int Socket::send ( const char* data, const unsigned int len )
|
|||||||
if (status == -1)
|
if (status == -1)
|
||||||
{
|
{
|
||||||
errormessage( getLastError(), "Socket::send");
|
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();
|
close();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -296,7 +286,7 @@ bool Socket::ReadLine (string& line)
|
|||||||
|
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
{
|
{
|
||||||
kodi->Log(LOG_DEBUG, "%s: select failed", __FUNCTION__);
|
libKodi->Log(LOG_DEBUG, "%s: select failed", __FUNCTION__);
|
||||||
errormessage(getLastError(), __FUNCTION__);
|
errormessage(getLastError(), __FUNCTION__);
|
||||||
close();
|
close();
|
||||||
return false;
|
return false;
|
||||||
@@ -306,11 +296,11 @@ bool Socket::ReadLine (string& line)
|
|||||||
{
|
{
|
||||||
if (retries != 0)
|
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--;
|
retries--;
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} 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;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -318,7 +308,7 @@ bool Socket::ReadLine (string& line)
|
|||||||
result = recv(_sd, buffer, sizeof(buffer) - 1, 0);
|
result = recv(_sd, buffer, sizeof(buffer) - 1, 0);
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
{
|
{
|
||||||
kodi->Log(LOG_DEBUG, "%s: recv failed", __FUNCTION__);
|
libKodi->Log(LOG_DEBUG, "%s: recv failed", __FUNCTION__);
|
||||||
errormessage(getLastError(), __FUNCTION__);
|
errormessage(getLastError(), __FUNCTION__);
|
||||||
close();
|
close();
|
||||||
return false;
|
return false;
|
||||||
@@ -389,7 +379,7 @@ bool Socket::connect ( const std::string& host, const unsigned short port )
|
|||||||
|
|
||||||
if ( !setHostname( host ) )
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
_port = port;
|
_port = port;
|
||||||
@@ -438,7 +428,7 @@ bool Socket::connect ( const std::string& host, const unsigned short port )
|
|||||||
|
|
||||||
if (address == NULL)
|
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");
|
errormessage(getLastError(), "Socket::connect");
|
||||||
close();
|
close();
|
||||||
return false;
|
return false;
|
||||||
@@ -474,7 +464,7 @@ bool Socket::set_non_blocking ( const bool b )
|
|||||||
|
|
||||||
if (ioctlsocket(_sd, FIONBIO, &iMode) == -1)
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -565,7 +555,7 @@ void Socket::errormessage( int errnum, const char* functionname) const
|
|||||||
default:
|
default:
|
||||||
errmsg = "WSA Error";
|
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
|
int Socket::getLastError() const
|
||||||
@@ -623,7 +613,7 @@ bool Socket::set_non_blocking ( const bool b )
|
|||||||
|
|
||||||
if(fcntl (_sd , F_SETFL, opts) == -1)
|
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 false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -699,7 +689,7 @@ void Socket::errormessage( int errnum, const char* functionname) const
|
|||||||
break;
|
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
|
int Socket::getLastError() const
|
||||||
|
|||||||
20
src/Socket.h
20
src/Socket.h
@@ -1,21 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2011 Team XBMC
|
* Copyright (C) 2005-2020 Team Kodi
|
||||||
* http://www.xbmc.org
|
* https://kodi.tv
|
||||||
*
|
|
||||||
* 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, 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
* See LICENSE.md for more information.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
//Include platform specific datatypes, header files, defines and constants:
|
//Include platform specific datatypes, header files, defines and constants:
|
||||||
|
|||||||
129
src/client.cpp
129
src/client.cpp
@@ -1,30 +1,18 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2015 Julian Scheel <julian@jusst.de>
|
* Copyright (C) 2015 Julian Scheel <julian@jusst.de>
|
||||||
* Copyright (C) 2015 jusst technologies GmbH
|
* Copyright (C) 2015 jusst technologies GmbH
|
||||||
* Copyright (C) 2015 Digital Devices GmbH
|
* Copyright (C) 2015 Digital Devices GmbH
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
* modify it under the terms of the GNU General Public License
|
* See LICENSE.md for more information.
|
||||||
* 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 "client.h"
|
||||||
#include <xbmc_pvr_dll.h>
|
#include <kodi/xbmc_pvr_dll.h>
|
||||||
#include <libXBMC_addon.h>
|
#include <kodi/libXBMC_addon.h>
|
||||||
#include <p8-platform/util/util.h>
|
#include <p8-platform/util/util.h>
|
||||||
#include <libKODI_guilib.h>
|
#include <kodi/libKODI_guilib.h>
|
||||||
|
|
||||||
#include "OctonetData.h"
|
#include "OctonetData.h"
|
||||||
#include "rtsp_client.hpp"
|
#include "rtsp_client.hpp"
|
||||||
@@ -36,7 +24,7 @@ std::string octonetAddress = "";
|
|||||||
|
|
||||||
/* internal state variables */
|
/* internal state variables */
|
||||||
ADDON_STATUS addonStatus = ADDON_STATUS_UNKNOWN;
|
ADDON_STATUS addonStatus = ADDON_STATUS_UNKNOWN;
|
||||||
CHelper_libXBMC_addon *kodi = NULL;
|
CHelper_libXBMC_addon *libKodi = NULL;
|
||||||
CHelper_libXBMC_pvr *pvr = NULL;
|
CHelper_libXBMC_pvr *pvr = NULL;
|
||||||
|
|
||||||
OctonetData *data = NULL;
|
OctonetData *data = NULL;
|
||||||
@@ -49,7 +37,7 @@ extern "C" {
|
|||||||
void ADDON_ReadSettings(void)
|
void ADDON_ReadSettings(void)
|
||||||
{
|
{
|
||||||
char buffer[2048];
|
char buffer[2048];
|
||||||
if (kodi->GetSetting("octonetAddress", &buffer))
|
if (libKodi->GetSetting("octonetAddress", &buffer))
|
||||||
octonetAddress = buffer;
|
octonetAddress = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,22 +47,22 @@ ADDON_STATUS ADDON_Create(void *callbacks, void* props)
|
|||||||
return ADDON_STATUS_UNKNOWN;
|
return ADDON_STATUS_UNKNOWN;
|
||||||
|
|
||||||
PVR_PROPERTIES *pvrprops = (PVR_PROPERTIES*)props;
|
PVR_PROPERTIES *pvrprops = (PVR_PROPERTIES*)props;
|
||||||
kodi = new CHelper_libXBMC_addon;
|
libKodi = new CHelper_libXBMC_addon;
|
||||||
if (!kodi->RegisterMe(callbacks)) {
|
if (!libKodi->RegisterMe(callbacks)) {
|
||||||
kodi->Log(LOG_ERROR, "%s: Failed to register octonet addon", __func__);
|
libKodi->Log(LOG_ERROR, "%s: Failed to register octonet addon", __func__);
|
||||||
SAFE_DELETE(kodi);
|
SAFE_DELETE(libKodi);
|
||||||
return ADDON_STATUS_PERMANENT_FAILURE;
|
return ADDON_STATUS_PERMANENT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
pvr = new CHelper_libXBMC_pvr;
|
pvr = new CHelper_libXBMC_pvr;
|
||||||
if (!pvr->RegisterMe(callbacks)) {
|
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(pvr);
|
||||||
SAFE_DELETE(kodi);
|
SAFE_DELETE(libKodi);
|
||||||
return ADDON_STATUS_PERMANENT_FAILURE;
|
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();
|
ADDON_ReadSettings();
|
||||||
|
|
||||||
data = new OctonetData;
|
data = new OctonetData;
|
||||||
@@ -83,12 +71,10 @@ ADDON_STATUS ADDON_Create(void *callbacks, void* props)
|
|||||||
return addonStatus;
|
return addonStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADDON_Stop() {} /* no-op */
|
|
||||||
|
|
||||||
void ADDON_Destroy()
|
void ADDON_Destroy()
|
||||||
{
|
{
|
||||||
delete pvr;
|
delete pvr;
|
||||||
delete kodi;
|
delete libKodi;
|
||||||
addonStatus = ADDON_STATUS_UNKNOWN;
|
addonStatus = ADDON_STATUS_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,16 +83,6 @@ ADDON_STATUS ADDON_GetStatus()
|
|||||||
return addonStatus;
|
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)
|
ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue)
|
||||||
{
|
{
|
||||||
/* For simplicity do a full addon restart whenever settings are
|
/* For simplicity do a full addon restart whenever settings are
|
||||||
@@ -114,9 +90,6 @@ ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue)
|
|||||||
return ADDON_STATUS_NEED_RESTART;
|
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 +98,16 @@ void ADDON_Announce(const char *flag, const char *sender, const char *message, c
|
|||||||
extern "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)
|
PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES *pCapabilities)
|
||||||
{
|
{
|
||||||
pCapabilities->bSupportsTV = true;
|
pCapabilities->bSupportsTV = true;
|
||||||
pCapabilities->bSupportsRadio = true;
|
pCapabilities->bSupportsRadio = true;
|
||||||
pCapabilities->bSupportsChannelGroups = true;
|
pCapabilities->bSupportsChannelGroups = true;
|
||||||
pCapabilities->bSupportsEPG = true;
|
pCapabilities->bSupportsEPG = true;
|
||||||
|
pCapabilities->bSupportsRecordings = false;
|
||||||
|
pCapabilities->bSupportsRecordingsRename = false;
|
||||||
|
pCapabilities->bSupportsRecordingsLifetimeChange = false;
|
||||||
|
pCapabilities->bSupportsDescrambleInfo = false;
|
||||||
|
|
||||||
return PVR_ERROR_NO_ERROR;
|
return PVR_ERROR_NO_ERROR;
|
||||||
}
|
}
|
||||||
@@ -162,7 +119,7 @@ const char* GetBackendName(void)
|
|||||||
|
|
||||||
const char* GetBackendVersion(void)
|
const char* GetBackendVersion(void)
|
||||||
{
|
{
|
||||||
return XBMC_PVR_API_VERSION;
|
return STR(OCTONET_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* GetConnectionString(void)
|
const char* GetConnectionString(void)
|
||||||
@@ -174,12 +131,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; }
|
PVR_ERROR CallMenuHook(const PVR_MENUHOOK& menuhook, const PVR_MENUHOOK_DATA &item) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
||||||
|
|
||||||
void OnSystemSleep() {
|
void OnSystemSleep() {
|
||||||
kodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
|
libKodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
|
||||||
// FIXME: Disconnect?
|
// FIXME: Disconnect?
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnSystemWake() {
|
void OnSystemWake() {
|
||||||
kodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
|
libKodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
|
||||||
// FIXME:Reconnect?
|
// FIXME:Reconnect?
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,11 +144,14 @@ void OnPowerSavingActivated() {}
|
|||||||
void OnPowerSavingDeactivated() {}
|
void OnPowerSavingDeactivated() {}
|
||||||
|
|
||||||
/* EPG */
|
/* 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 */
|
/* Channel groups */
|
||||||
int GetChannelGroupsAmount(void)
|
int GetChannelGroupsAmount(void)
|
||||||
{
|
{
|
||||||
@@ -223,7 +183,6 @@ PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio)
|
|||||||
|
|
||||||
PVR_ERROR DeleteChannel(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
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 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 OpenDialogChannelSettings(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
||||||
PVR_ERROR OpenDialogChannelAdd(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
PVR_ERROR OpenDialogChannelAdd(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
||||||
|
|
||||||
@@ -234,10 +193,12 @@ 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 UndeleteRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
||||||
PVR_ERROR DeleteAllRecordingsFromTrash() { 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 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 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; }
|
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; }
|
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; }
|
PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY edl[], int *size) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
||||||
|
PVR_ERROR GetRecordingSize(const PVR_RECORDING* recording, int64_t* sizeInBytes) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
||||||
PVR_ERROR GetTimerTypes(PVR_TIMER_TYPE types[], int *size) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
PVR_ERROR GetTimerTypes(PVR_TIMER_TYPE types[], int *size) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
||||||
int GetTimersAmount(void) { 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 GetTimers(ADDON_HANDLE handle) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
||||||
@@ -245,6 +206,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 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_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 */
|
/* PVR stream handling */
|
||||||
/* entirely unused, as we use standard RTSP+TS mux, which can be handlded by
|
/* entirely unused, as we use standard RTSP+TS mux, which can be handlded by
|
||||||
* Kodi core */
|
* Kodi core */
|
||||||
@@ -261,30 +229,24 @@ void CloseLiveStream(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
long long SeekLiveStream(long long iPosition, int iWhence) { return -1; }
|
long long SeekLiveStream(long long iPosition, int iWhence) { return -1; }
|
||||||
long long PositionLiveStream(void) { return -1; }
|
|
||||||
long long LengthLiveStream(void) { return -1; }
|
long long LengthLiveStream(void) { return -1; }
|
||||||
bool IsRealTimeStream(void) { return true; }
|
bool IsRealTimeStream(void) { return true; }
|
||||||
|
|
||||||
bool SwitchChannel(const PVR_CHANNEL& channel) {
|
|
||||||
CloseLiveStream();
|
|
||||||
return OpenLiveStream(channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS& signalStatus) {
|
PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS& signalStatus) {
|
||||||
memset(&signalStatus, 0, sizeof(PVR_SIGNAL_STATUS));
|
memset(&signalStatus, 0, sizeof(PVR_SIGNAL_STATUS));
|
||||||
rtsp_fill_signal_status(signalStatus);
|
rtsp_fill_signal_status(signalStatus);
|
||||||
return PVR_ERROR_NO_ERROR;
|
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 GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
||||||
|
PVR_ERROR GetDescrambleInfo(PVR_DESCRAMBLE_INFO*) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
||||||
|
|
||||||
/* Recording stream handling */
|
/* Recording stream handling */
|
||||||
bool OpenRecordedStream(const PVR_RECORDING& recording) { return false; }
|
bool OpenRecordedStream(const PVR_RECORDING& recording) { return false; }
|
||||||
void CloseRecordedStream(void) {}
|
void CloseRecordedStream(void) {}
|
||||||
int ReadRecordedStream(unsigned char* pBuffer, unsigned int iBufferSize) { return -1; }
|
int ReadRecordedStream(unsigned char* pBuffer, unsigned int iBufferSize) { return -1; }
|
||||||
long long SeekRecordedStream(long long iPosition, int iWhence) { return -1; }
|
long long SeekRecordedStream(long long iPosition, int iWhence) { return -1; }
|
||||||
long long PositionRecordedStream(void) { return -1; }
|
|
||||||
long long LengthRecordedStream(void) { return -1; }
|
long long LengthRecordedStream(void) { return -1; }
|
||||||
|
|
||||||
/* PVR demuxer */
|
/* PVR demuxer */
|
||||||
@@ -293,23 +255,18 @@ void DemuxReset(void) {}
|
|||||||
void DemuxAbort(void) {}
|
void DemuxAbort(void) {}
|
||||||
void DemuxFlush(void) {}
|
void DemuxFlush(void) {}
|
||||||
DemuxPacket* DemuxRead(void) { return NULL; }
|
DemuxPacket* DemuxRead(void) { return NULL; }
|
||||||
|
void FillBuffer(bool mode) {}
|
||||||
|
|
||||||
/* Various helper functions */
|
/* Various helper functions */
|
||||||
unsigned int GetChannelSwitchDelay(void) { return 0; }
|
|
||||||
bool IsTimeshifting(void) { return false; }
|
|
||||||
bool CanPauseStream() { return false; }
|
bool CanPauseStream() { return false; }
|
||||||
bool CanSeekStream() { return false; }
|
bool CanSeekStream() { return false; }
|
||||||
|
|
||||||
/* Callbacks */
|
/* Callbacks */
|
||||||
void PauseStream(bool bPaused) {}
|
void PauseStream(bool bPaused) {}
|
||||||
bool SeekTime(int time, bool backwards, double *startpts) { return false; }
|
bool SeekTime(double time, bool backwards, double *startpts) { return false; }
|
||||||
void SetSpeed(int speed) {}
|
void SetSpeed(int speed) {}
|
||||||
PVR_ERROR SetEPGTimeFrame(int) { return PVR_ERROR_NOT_IMPLEMENTED; }
|
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()
|
const char* GetBackendHostname()
|
||||||
{
|
{
|
||||||
return octonetAddress.c_str();
|
return octonetAddress.c_str();
|
||||||
|
|||||||
31
src/client.h
31
src/client.h
@@ -1,34 +1,23 @@
|
|||||||
#pragma once
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2015 Julian Scheel <julian@jusst.de>
|
* Copyright (C) 2015 Julian Scheel <julian@jusst.de>
|
||||||
* Copyright (C) 2015 jusst technologies GmbH
|
* Copyright (C) 2015 jusst technologies GmbH
|
||||||
* Copyright (C) 2015 Digital Devices GmbH
|
* Copyright (C) 2015 Digital Devices GmbH
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
* modify it under the terms of the GNU General Public License
|
* See LICENSE.md for more information.
|
||||||
* 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 "libXBMC_addon.h"
|
#pragma once
|
||||||
#include "libXBMC_pvr.h"
|
|
||||||
|
#include "kodi/libXBMC_addon.h"
|
||||||
|
#include "kodi/libXBMC_pvr.h"
|
||||||
|
|
||||||
#ifndef __func__
|
#ifndef __func__
|
||||||
#define __func__ __FUNCTION__
|
#define __func__ __FUNCTION__
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern ADDON::CHelper_libXBMC_addon *kodi;
|
extern ADDON::CHelper_libXBMC_addon *libKodi;
|
||||||
extern CHelper_libXBMC_pvr *pvr;
|
extern CHelper_libXBMC_pvr *pvr;
|
||||||
|
|
||||||
/* IP or hostname of the octonet to be connected to */
|
/* IP or hostname of the octonet to be connected to */
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include "Socket.h"
|
#include "Socket.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include <p8-platform/util/util.h>
|
#include <p8-platform/util/util.h>
|
||||||
#include <libXBMC_addon.h>
|
#include <kodi/libXBMC_addon.h>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
@@ -309,13 +309,13 @@ bool rtsp_open(const string& name, const string& url_str)
|
|||||||
rtsp->level = 0;
|
rtsp->level = 0;
|
||||||
rtsp->quality = 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);
|
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)) {
|
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;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -353,7 +353,7 @@ bool rtsp_open(const string& name, const string& url_str)
|
|||||||
rtsp->tcp_sock.send(setup_ss.str());
|
rtsp->tcp_sock.send(setup_ss.str());
|
||||||
|
|
||||||
if (rtsp_handle() != RTSP_RESULT_OK) {
|
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;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -368,7 +368,7 @@ bool rtsp_open(const string& name, const string& url_str)
|
|||||||
rtsp->tcp_sock.send(play_ss.str());
|
rtsp->tcp_sock.send(play_ss.str());
|
||||||
|
|
||||||
if (rtsp_handle() != RTSP_RESULT_OK) {
|
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;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -453,7 +453,7 @@ static void rtsp_teardown() {
|
|||||||
rtsp->tcp_sock.send(ss.str());
|
rtsp->tcp_sock.send(ss.str());
|
||||||
|
|
||||||
if (rtsp_handle() != RTSP_RESULT_OK) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#define _RTSP_CLIENT_HPP_
|
#define _RTSP_CLIENT_HPP_
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <xbmc_pvr_types.h>
|
#include <kodi/xbmc_pvr_types.h>
|
||||||
|
|
||||||
bool rtsp_open(const std::string& name, const std::string& url_str);
|
bool rtsp_open(const std::string& name, const std::string& url_str);
|
||||||
void rtsp_close();
|
void rtsp_close();
|
||||||
|
|||||||
Reference in New Issue
Block a user