diff -Nru kodi-inputstream-rtmp-2.0.9/appveyor.yml kodi-inputstream-rtmp-3.4.0/appveyor.yml --- kodi-inputstream-rtmp-2.0.9/appveyor.yml 2020-02-09 10:13:36.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/appveyor.yml 2013-05-31 22:59:22.000000000 +0000 @@ -16,14 +16,14 @@ CONFIG: Release - GENERATOR: "Visual Studio 15 Win64" CONFIG: Release - WINSTORE: -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0.16299.0" + WINSTORE: -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0.17763.0" - GENERATOR: "Visual Studio 15 ARM" CONFIG: Release - WINSTORE: -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0.16299.0" + WINSTORE: -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0.17763.0" build_script: - cd .. - - git clone --branch Leia --depth=1 https://github.com/xbmc/xbmc.git + - git clone --branch master --depth=1 https://github.com/xbmc/xbmc.git - cd %app_id% - mkdir build - cd build diff -Nru kodi-inputstream-rtmp-2.0.9/azure-pipelines.yml kodi-inputstream-rtmp-3.4.0/azure-pipelines.yml --- kodi-inputstream-rtmp-2.0.9/azure-pipelines.yml 2020-02-09 10:13:36.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/azure-pipelines.yml 2013-05-31 22:59:22.000000000 +0000 @@ -4,7 +4,7 @@ trigger: branches: include: - - Leia + - Matrix - releases/* paths: include: @@ -32,12 +32,12 @@ GENERATOR: "Visual Studio 15 2017" ARCHITECTURE: x64 CONFIGURATION: Release - WINSTORE: -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0.16299.0" + WINSTORE: -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0.17763.0" ARM64-UWP: GENERATOR: "Visual Studio 15 2017" ARCHITECTURE: ARM64 CONFIGURATION: Release - WINSTORE: -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0.16299.0" + WINSTORE: -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0.17763.0" workspace: clean: all @@ -46,7 +46,7 @@ - script: | cd .. - git clone --branch Leia --depth=1 https://github.com/xbmc/xbmc.git kodi + git clone --branch master --depth=1 https://github.com/xbmc/xbmc.git kodi cd $(Build.SourcesDirectory) mkdir build cd build diff -Nru kodi-inputstream-rtmp-2.0.9/build-install-mac.sh kodi-inputstream-rtmp-3.4.0/build-install-mac.sh --- kodi-inputstream-rtmp-2.0.9/build-install-mac.sh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/build-install-mac.sh 2013-05-31 22:59:22.000000000 +0000 @@ -0,0 +1,59 @@ +#!/bin/bash + +set -e + +if [ "$#" -ne 1 ] || ! [ -d "$1" ]; then + echo "Usage: $0 " >&2 + exit 1 +fi + +if [[ "$OSTYPE" != "darwin"* ]]; then + echo "Error: Script only for use on MacOSX" >&2 + exit 1 +fi + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +if [[ "$1" = /* ]] +then + #absolute path + SCRIPT_DIR="" +else + #relative + SCRIPT_DIR="$SCRIPT_DIR/" +fi + +BINARY_ADDONS_TARGET_DIR="$1/tools/depends/target/binary-addons" +MACOSX_BINARY_ADDONS_TARGET_DIR="" +KODI_ADDONS_DIR="$HOME/Library/Application Support/Kodi/addons" +ADDON_NAME=`basename -s .git \`git config --get remote.origin.url\`` + +if [ ! -d "$BINARY_ADDONS_TARGET_DIR" ]; then + echo "Error: Could not find binary addons directory at: $BINARY_ADDONS_TARGET_DIR" >&2 + exit 1 +fi + +for DIR in "$BINARY_ADDONS_TARGET_DIR/"macosx*; do + if [ -d "${DIR}" ]; then + MACOSX_BINARY_ADDONS_TARGET_DIR="${DIR}" + break + fi +done + +if [ -z "$MACOSX_BINARY_ADDONS_TARGET_DIR" ]; then + echo "Error: Could not find binary addons build directory at: $BINARY_ADDONS_TARGET_DIR/macosx*" >&2 + exit 1 +fi + +if [ ! -d "$KODI_ADDONS_DIR" ]; then + echo "Error: Kodi addons dir does not exist at: $KODI_ADDONS_DIR" >&2 + exit 1 +fi + +cd "$MACOSX_BINARY_ADDONS_TARGET_DIR" +make + +XBMC_BUILD_ADDON_INSTALL_DIR=$(cd "$SCRIPT_DIR$1/addons/$ADDON_NAME" 2> /dev/null && pwd -P) +rm -rf "$KODI_ADDONS_DIR/$ADDON_NAME" +echo "Removed previous addon build from: $KODI_ADDONS_DIR" +cp -rf "$XBMC_BUILD_ADDON_INSTALL_DIR" "$KODI_ADDONS_DIR" +echo "Copied new addon build to: $KODI_ADDONS_DIR" diff -Nru kodi-inputstream-rtmp-2.0.9/CMakeLists.txt kodi-inputstream-rtmp-3.4.0/CMakeLists.txt --- kodi-inputstream-rtmp-2.0.9/CMakeLists.txt 2020-02-09 10:13:36.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/CMakeLists.txt 2013-05-31 22:59:22.000000000 +0000 @@ -9,7 +9,12 @@ find_package(ZLIB REQUIRED) find_package(RTMP REQUIRED) -set(RTMP_SOURCES src/RTMPStream.cpp) +set(RTMP_SOURCES src/RTMPStream.cpp + src/timer/Timer.cpp) + +set(RTMP_HEADERS src/utils/Log.h + src/timer/Timer.h + src/timer/TimerHelper.h) include_directories(${INCLUDES} ${RTMP_INCLUDE_DIRS} diff -Nru kodi-inputstream-rtmp-2.0.9/debian/changelog kodi-inputstream-rtmp-3.4.0/debian/changelog --- kodi-inputstream-rtmp-2.0.9/debian/changelog 2013-05-31 22:59:22.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/debian/changelog 2013-05-31 22:59:22.000000000 +0000 @@ -1,4 +1,4 @@ -kodi-inputstream-rtmp (2.0.9-1~focal) focal; urgency=low +kodi-inputstream-rtmp (3.4.0-1~focal) focal; urgency=low [ kodi ] * autogenerated dummy changelog diff -Nru kodi-inputstream-rtmp-2.0.9/debian/rules kodi-inputstream-rtmp-3.4.0/debian/rules --- kodi-inputstream-rtmp-2.0.9/debian/rules 2013-05-31 22:59:22.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/debian/rules 2013-05-31 22:59:22.000000000 +0000 @@ -13,10 +13,7 @@ dh $@ --parallel override_dh_auto_configure: - dh_auto_configure -- -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=1 -DUSE_LTO=1 - -override_dh_strip: - dh_strip -pkodi-inputstream-rtmp --dbg-package=kodi-inputstream-rtmp-dbg + dh_auto_configure -- -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_SHARED_LIBS=1 -DUSE_LTO=1 override_dh_installdocs: dh_installdocs --link-doc=kodi-inputstream-rtmp diff -Nru kodi-inputstream-rtmp-2.0.9/debian/source/format kodi-inputstream-rtmp-3.4.0/debian/source/format --- kodi-inputstream-rtmp-2.0.9/debian/source/format 2013-05-31 22:59:22.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/debian/source/format 2013-05-31 22:59:22.000000000 +0000 @@ -1 +1 @@ -3.0 (quilt) +3.0 (native) diff -Nru kodi-inputstream-rtmp-2.0.9/.gitignore kodi-inputstream-rtmp-3.4.0/.gitignore --- kodi-inputstream-rtmp-2.0.9/.gitignore 2020-02-09 10:13:36.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/.gitignore 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -# build artifacts -build/ -inputstream.*/addon.xml - -# Debian build files -debian/changelog -debian/files -debian/*.log -debian/*.substvars -debian/.debhelper/ -debian/tmp/ -debian/kodi-inputstream-*/ -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 - -# to prevent add if project code opened by Visual Studio over CMake file -.vs/ diff -Nru kodi-inputstream-rtmp-2.0.9/inputstream.rtmp/addon.xml.in kodi-inputstream-rtmp-3.4.0/inputstream.rtmp/addon.xml.in --- kodi-inputstream-rtmp-2.0.9/inputstream.rtmp/addon.xml.in 2020-02-09 10:13:36.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/inputstream.rtmp/addon.xml.in 2013-05-31 22:59:22.000000000 +0000 @@ -1,7 +1,7 @@ @ADDON_DEPENDS@ @@ -9,18 +9,58 @@ point="kodi.inputstream" name="rtmp" protocols="rtmp|rtmpt|rtmpe|rtmpte|rtmps" + listitemprops="SWFPlayer|swfurl|PageURL|PlayPath|TcUrl|IsLive|swfvfy" library_@PLATFORM@="@LIBRARY_FILENAME@" /> - Client for RTMP streams - The Real Time Messaging Protocol (RTMP) is a proprietary network protocol developed by Adobe Inc. to transmit audio, video and other data over the Internet from a media server to a flash player. + Client für RTMP-Streams + Client for RTMP streams + Das Real Time Messaging Protocol (RTMP) ist ein proprietäres Netzwerkprotokoll, das von Adobe Inc. entwickelt wurde, um Audio-, Video- und andere Daten über das Internet von einem Medienserver zu einem Flash Player zu übertragen. -This addon implements RTMP streaming support for Kodi and installed add-ons. - +Dieses Addon implementiert die RTMP-Streaming-Unterstützung für Kodi und installierte Add-Ons. + The Real Time Messaging Protocol (RTMP) is a proprietary network protocol developed by Adobe Inc. to transmit audio, video and other data over the Internet from a media server to a flash player. + +This addon implements RTMP streaming support for Kodi and installed add-ons. @PLATFORM@ - GPL-2.0 + GPL-2.0-or-later https://github.com/xbmc/inputstream.rtmp icon.png + v3.4.0 +- Update: inputstream API 3.0.1 + - Fix wrong flags bit shift + +v3.3.0 +- Update inputstream API 3.0.0 +- Fix and allow use of stream values: + - SWFPlayer + - swfurl (same as SWFPlayer) + - PageURL + - PlayPath + - TcUrl + - IsLive + - swfvfy + +v3.2.0 +- Matrix API change inputstream API 2.3.4 +- Add german translation +- Improve debian package build and add test to Travis CI + +v3.1.1 +- Bump verion for PPA build Global API 1.2.0 and inputstream API 2.3.1 + +v3.1.0 +- Matrix API change inputstream API 2.3.1 +- Matrix APi change Global API 1.2.0 + +v3.0.5 +- Matrix API change to v2.3.0 - Re-release API change + +v3.0.4 +- Matrix API change to v2.3.0 - Pass mime type to inputstreams if available + +v3.0.3 +- Matrix API change to v2.2.0 - Allows upto 256 streams + diff -Nru kodi-inputstream-rtmp-2.0.9/Jenkinsfile kodi-inputstream-rtmp-3.4.0/Jenkinsfile --- kodi-inputstream-rtmp-2.0.9/Jenkinsfile 2020-02-09 10:13:36.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/Jenkinsfile 2013-05-31 22:59:22.000000000 +0000 @@ -1 +1 @@ -buildPlugin(version: "Leia") +buildPlugin(version: "Matrix") diff -Nru kodi-inputstream-rtmp-2.0.9/LICENSE.md kodi-inputstream-rtmp-3.4.0/LICENSE.md --- kodi-inputstream-rtmp-2.0.9/LICENSE.md 1970-01-01 00:00:00.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/LICENSE.md 2013-05-31 22:59:22.000000000 +0000 @@ -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. diff -Nru kodi-inputstream-rtmp-2.0.9/README.md kodi-inputstream-rtmp-3.4.0/README.md --- kodi-inputstream-rtmp-2.0.9/README.md 2020-02-09 10:13:36.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/README.md 2013-05-31 22:59:22.000000000 +0000 @@ -1,15 +1,17 @@ # inputstream.rtmp addon for Kodi -This is a [Kodi](http://kodi.tv) input stream addon for RTMP. +This is a [Kodi](https://kodi.tv) input stream addon for RTMP. -[![Build Status](https://travis-ci.org/xbmc/inputstream.rtmp.svg?branch=master)](https://travis-ci.org/xbmc/inputstream.rtmp) -[![Build Status](https://dev.azure.com/teamkodi/binary-addons/_apis/build/status/xbmc.inputstream.rtmp?branchName=Leia)](https://dev.azure.com/teamkodi/binary-addons/_build/latest?definitionId=29&branchName=Leia) - +[![License: GPL-2.0-or-later](https://img.shields.io/badge/License-GPL%20v2+-blue.svg)](LICENSE.md) +[![Build Status](https://travis-ci.org/xbmc/inputstream.rtmp.svg?branch=Matrix)](https://travis-ci.org/xbmc/inputstream.rtmp/branches) +[![Build Status](https://dev.azure.com/teamkodi/binary-addons/_apis/build/status/xbmc.inputstream.rtmp?branchName=Matrix)](https://dev.azure.com/teamkodi/binary-addons/_build/latest?definitionId=29&branchName=Matrix) +[![Build Status](https://jenkins.kodi.tv/view/Addons/job/xbmc/job/inputstream.rtmp/job/Matrix/badge/icon)](https://jenkins.kodi.tv/blue/organizations/jenkins/xbmc%2Finputstream.rtmp/branches/) + ## Build instructions -When building the addon you have to use the correct branch depending on which version of Kodi you're building against. -For example, if you're building the `master` branch of Kodi you should checkout the `master` branch of this repository. +When building the addon you have to use the correct branch depending on which version of Kodi you're building against. +If you want to build the addon to be compatible with the latest kodi `master` commit, you need to checkout the branch with the current kodi codename. Also make sure you follow this README from the branch in question. ### Linux @@ -17,8 +19,8 @@ The following instructions assume you will have built Kodi already in the `kodi-build` directory suggested by the README. -1. `git clone --branch Leia https://github.com/xbmc/xbmc.git` -2. `git clone https://github.com/xbmc/inputstream.rtmp.git` +1. `git clone --branch master https://github.com/xbmc/xbmc.git` +2. `git clone --branch Matrix https://github.com/xbmc/inputstream.rtmp.git` 3. `cd inputstream.rtmp && mkdir build && cd build` 4. `cmake -DADDONS_TO_BUILD=inputstream.rtmp -DADDON_SRC_PREFIX=../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../../xbmc/kodi-build/addons -DPACKAGE_ZIP=1 ../../xbmc/cmake/addons` 5. `make` diff -Nru kodi-inputstream-rtmp-2.0.9/src/RTMPStream.cpp kodi-inputstream-rtmp-3.4.0/src/RTMPStream.cpp --- kodi-inputstream-rtmp-2.0.9/src/RTMPStream.cpp 2020-02-09 10:13:36.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/src/RTMPStream.cpp 2013-05-31 22:59:22.000000000 +0000 @@ -1,21 +1,14 @@ /* - * Copyright (C) 2016-2020 Arne Morten Kvarving - * Copyright (C) 2018-2020 Team Kodi - * - * 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. - * - * . + * Copyright (C) 2016-2020 Arne Morten Kvarving + * Copyright (C) 2018-2020 Team Kodi * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. */ +#include "utils/Log.h" +#include "timer/Timer.h" + #include #include #include @@ -37,62 +30,65 @@ namespace { std::map options = - {{ "SWFPlayer", AVC("swfUrl") }, - { "PageURL", AVC("pageUrl") }, - { "PlayPath", AVC("playpath")}, - { "TcUrl", AVC("tcUrl") }, - { "IsLive", AVC("live") }}; + {{ "inputstream.rtmp.SWFPlayer", AVC("swfUrl") }, + { "inputstream.rtmp.swfurl", AVC("swfUrl") }, + { "inputstream.rtmp.PageURL", AVC("pageUrl") }, + { "inputstream.rtmp.PlayPath", AVC("playpath")}, + { "inputstream.rtmp.TcUrl", AVC("tcUrl") }, + { "inputstream.rtmp.IsLive", AVC("live") }, + { "inputstream.rtmp.swfvfy", AVC("swfVfy") }}; } class ATTRIBUTE_HIDDEN CInputStreamRTMP - : public kodi::addon::CInstanceInputStream + : public kodi::addon::CInstanceInputStream, + public rtmpstream::ITimerCallback { public: - CInputStreamRTMP(KODI_HANDLE instance); + CInputStreamRTMP(KODI_HANDLE instance, const std::string& kodiVersion); - bool Open(INPUTSTREAM& props) override; + bool Open(const kodi::addon::InputstreamProperty& props) override; void Close() override; - void GetCapabilities(INPUTSTREAM_CAPABILITIES& caps) override; - INPUTSTREAM_IDS GetStreamIds() override; - INPUTSTREAM_INFO GetStream(int streamid) override; - void EnableStream(int streamid, bool enable) override; - bool OpenStream(int streamid) override; + void GetCapabilities(kodi::addon::InputstreamCapabilities& caps) override; int ReadStream(uint8_t* buffer, unsigned int bufferSize) override; - void PauseStream(double time) override; bool PosTime(int ms) override; int GetTotalTime() override { return 20; } int GetTime() override { return 0; } - bool CanPauseStream() override { return true; } - bool CanSeekStream() override { return true; } private: + void OnTimeout() override; + RTMP* m_session = nullptr; - bool m_paused = false; + bool m_readPauseDetected = false; + mutable std::recursive_mutex m_critSection; + rtmpstream::CTimer m_readPauseDetectTimer; }; -CInputStreamRTMP::CInputStreamRTMP(KODI_HANDLE instance) - : CInstanceInputStream(instance) +CInputStreamRTMP::CInputStreamRTMP(KODI_HANDLE instance, const std::string& kodiVersion) + : CInstanceInputStream(instance, kodiVersion), + m_readPauseDetectTimer(this) { } -bool CInputStreamRTMP::Open(INPUTSTREAM& props) +bool CInputStreamRTMP::Open(const kodi::addon::InputstreamProperty& props) { - kodi::Log(ADDON_LOG_DEBUG, "InputStream.rtmp: OpenStream()"); + const std::string url = props.GetURL(); + const std::map infoValues = props.GetProperties(); + + rtmpstream::Log(ADDON_LOG_DEBUG, "InputStream.rtmp: OpenStream() URL: '%s'", url.c_str()); m_session = RTMP_Alloc(); RTMP_Init(m_session); - RTMP_SetupURL(m_session, const_cast(props.m_strURL)); + RTMP_SetupURL(m_session, const_cast(url.c_str())); + for (auto& it : options) { - for (size_t i = 0; i < props.m_nCountInfoValues; ++i) + auto info = infoValues.find(it.first); + if (info != infoValues.end()) { - if (it.first == props.m_ListItemProperties[i].m_strKey) - { - AVal av_tmp; - SetAVal(av_tmp, props.m_ListItemProperties[i].m_strValue); - RTMP_SetOpt(m_session, &it.second, &av_tmp); - } + AVal av_tmp; + SetAVal(av_tmp, info->second.c_str()); + RTMP_SetOpt(m_session, &it.second, &av_tmp); } } @@ -106,56 +102,61 @@ return true; } -bool CInputStreamRTMP::OpenStream(int streamid) -{ - return false; -} - void CInputStreamRTMP::Close() { + m_readPauseDetectTimer.Stop(); + if (m_session) { + std::unique_lock lock(m_critSection); + RTMP_Close(m_session); RTMP_Free(m_session); } - m_session = nullptr; - m_paused = false; -} -void CInputStreamRTMP::GetCapabilities(INPUTSTREAM_CAPABILITIES &caps) -{ - caps.m_mask |= INPUTSTREAM_CAPABILITIES::SUPPORTS_IPOSTIME; + m_session = nullptr; + m_readPauseDetected = false; } -INPUTSTREAM_IDS CInputStreamRTMP::GetStreamIds() +void CInputStreamRTMP::GetCapabilities(kodi::addon::InputstreamCapabilities& caps) { - INPUTSTREAM_IDS ids = { 0 }; - return ids; + caps.SetMask(INPUTSTREAM_SUPPORTS_IPOSTIME | + INPUTSTREAM_SUPPORTS_SEEK | + INPUTSTREAM_SUPPORTS_PAUSE); } -INPUTSTREAM_INFO CInputStreamRTMP::GetStream(int streamid) +int CInputStreamRTMP::ReadStream(uint8_t* buf, unsigned int size) { - INPUTSTREAM_INFO info = { INPUTSTREAM_INFO::STREAM_TYPE::TYPE_NONE }; - return info; -} + std::unique_lock lock(m_critSection); + if (m_readPauseDetected) + { + m_readPauseDetected = false; + RTMP_Pause(m_session, false); + rtmpstream::Log(ADDON_LOG_DEBUG, "InputStream.rtmp: Read resume detected"); + } -void CInputStreamRTMP::EnableStream(int streamid, bool enable) -{ -} + if (m_readPauseDetectTimer.IsRunning()) + m_readPauseDetectTimer.RestartAsync(2 * 1000); + else + m_readPauseDetectTimer.Start(2 * 1000); -int CInputStreamRTMP::ReadStream(uint8_t* buf, unsigned int size) -{ return RTMP_Read(m_session, reinterpret_cast(buf), size); } -void CInputStreamRTMP::PauseStream(double time) +void CInputStreamRTMP::OnTimeout() { - m_paused = !m_paused; - RTMP_Pause(m_session, m_paused); + std::unique_lock lock(m_critSection); + m_readPauseDetected = true; + + rtmpstream::Log(ADDON_LOG_DEBUG, "InputStream.rtmp: Read pause detected"); + + RTMP_Pause(m_session, true); } bool CInputStreamRTMP::PosTime(int ms) { + std::unique_lock lock(m_critSection); + return RTMP_SendSeek(m_session, ms); } @@ -166,11 +167,16 @@ { public: CMyAddon() = default; - ADDON_STATUS CreateInstance(int instanceType, std::string instanceID, KODI_HANDLE instance, KODI_HANDLE& addonInstance) override + ADDON_STATUS CreateInstance(int instanceType, + const std::string& instanceID, + KODI_HANDLE instance, + const std::string& version, + KODI_HANDLE& addonInstance) override + { if (instanceType == ADDON_INSTANCE_INPUTSTREAM) { - addonInstance = new CInputStreamRTMP(instance); + addonInstance = new CInputStreamRTMP(instance, version); return ADDON_STATUS_OK; } return ADDON_STATUS_NOT_IMPLEMENTED; diff -Nru kodi-inputstream-rtmp-2.0.9/src/timer/Timer.cpp kodi-inputstream-rtmp-3.4.0/src/timer/Timer.cpp --- kodi-inputstream-rtmp-2.0.9/src/timer/Timer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/src/timer/Timer.cpp 2013-05-31 22:59:22.000000000 +0000 @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#include "Timer.h" + +#include + +namespace rtmpstream +{ + +CTimer::CTimer(std::function const& callback) + : m_callback(callback), + m_timeout(0), + m_interval(false), + m_endTime(0) +{ } + +CTimer::CTimer(ITimerCallback *callback) + : CTimer(std::bind(&ITimerCallback::OnTimeout, callback)) +{ } + +CTimer::~CTimer() +{ + Stop(); +} + +bool CTimer::Start(uint32_t timeout, bool interval /* = false */) +{ + if (m_callback == nullptr || timeout == 0 || IsRunning()) + return false; + + m_timeout = timeout; + m_interval = interval; + + m_eventTimeout.Reset(); + + m_running = true; + m_thread = std::thread{&CTimer::Process, this}; + + m_thread.detach(); + + return true; +} + +bool CTimer::Stop() +{ + if (!m_running) + return false; + + m_running = false; + m_eventTimeout.Signal(); + + return true; +} + +void CTimer::RestartAsync(uint32_t timeout) +{ + m_timeout = timeout; + m_endTime = SystemClockMillis() + timeout; + m_eventTimeout.Signal(); +} + +bool CTimer::Restart() +{ + if (!IsRunning()) + return false; + + Stop(); + return Start(m_timeout, m_interval); +} + +float CTimer::GetElapsedSeconds() +{ + return GetElapsedMilliseconds() / 1000.0f; +} + +float CTimer::GetElapsedMilliseconds() +{ + if (!IsRunning()) + return 0.0f; + + return static_cast(m_timer.TimeLeft()); +} + +void CTimer::Process() +{ + while (m_running) + { + uint32_t currentTime = SystemClockMillis(); + m_endTime = currentTime + m_timeout; + m_timer.Init(m_timeout); + + // wait the necessary time + if (!m_eventTimeout.Wait(m_timeout)) + { + currentTime = SystemClockMillis(); + if (m_running && m_endTime <= currentTime) + { + // execute OnTimeout() callback + m_callback(); + + // continue if this is an interval timer, or if it was restarted during callback + if (!m_interval && m_endTime <= currentTime) + break; + } + } + } + + m_running = false; +} + +unsigned int CTimer::SystemClockMillis() +{ + uint64_t now_time; + static uint64_t start_time = 0; + static bool start_time_set = false; + + now_time = static_cast(std::chrono::duration(std::chrono::high_resolution_clock::now().time_since_epoch()).count() * 1000.0); + + if (!start_time_set) + { + start_time = now_time; + start_time_set = true; + } + return (unsigned int)(now_time - start_time); +} + +} /* namespace rtmpstream */ diff -Nru kodi-inputstream-rtmp-2.0.9/src/timer/Timer.h kodi-inputstream-rtmp-3.4.0/src/timer/Timer.h --- kodi-inputstream-rtmp-2.0.9/src/timer/Timer.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/src/timer/Timer.h 2013-05-31 22:59:22.000000000 +0000 @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2005-2020 Team Kodi + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once + +#include "TimerHelper.h" + +#include + +namespace rtmpstream +{ + +class ATTRIBUTE_HIDDEN ITimerCallback +{ +public: + virtual ~ITimerCallback() = default; + + virtual void OnTimeout() = 0; +}; + +class ATTRIBUTE_HIDDEN CTimer +{ +public: + explicit CTimer(ITimerCallback *callback); + explicit CTimer(std::function const& callback); + ~CTimer(); + + bool Start(uint32_t timeout, bool interval = false); + bool Stop(); + bool Restart(); + void RestartAsync(uint32_t timeout); + + bool IsRunning() { return m_running; } + + float GetElapsedSeconds(); + float GetElapsedMilliseconds(); + +private: + void Process(); + unsigned int SystemClockMillis(); + + std::function m_callback; + uint32_t m_timeout; + bool m_interval; + uint32_t m_endTime; + CEvent m_eventTimeout; + CTimeout m_timer; + std::thread m_thread; + bool m_running = false; +}; + +} /* namespace rtmpstream */ diff -Nru kodi-inputstream-rtmp-2.0.9/src/timer/TimerHelper.h kodi-inputstream-rtmp-3.4.0/src/timer/TimerHelper.h --- kodi-inputstream-rtmp-2.0.9/src/timer/TimerHelper.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/src/timer/TimerHelper.h 2013-05-31 22:59:22.000000000 +0000 @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2020 Team Kodi (https://kodi.tv) + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +namespace rtmpstream +{ + +inline std::string NowToString() +{ + std::chrono::system_clock::time_point p = std::chrono::system_clock::now(); + time_t t = std::chrono::system_clock::to_time_t(p); + return std::ctime(&t); +} + +class ATTRIBUTE_HIDDEN CTimeout +{ +public: + CTimeout(void) : m_iTarget(0) + { + } + + CTimeout(uint32_t iTimeout) + { + Init(iTimeout); + } + + bool IsSet(void) const + { + return m_iTarget > 0; + } + + void Init(uint32_t iTimeout) + { + m_iTarget = static_cast(std::chrono::duration(std::chrono::high_resolution_clock::now().time_since_epoch()).count() * 1000.0) + iTimeout; + } + + uint32_t TimeLeft(void) const + { + uint64_t iNow = static_cast(std::chrono::duration(std::chrono::high_resolution_clock::now().time_since_epoch()).count() * 1000.0); + return (iNow > m_iTarget) ? 0 : (uint32_t)(m_iTarget - iNow); + } + +private: + uint64_t m_iTarget; +}; + +typedef bool (*PredicateCallback) (void *param); + +template +class ATTRIBUTE_HIDDEN CCondition +{ +private: + static bool _PredicateCallbackDefault ( void *param ) + { + _Predicate *p = (_Predicate*)param; + return (*p); + } +public: + inline CCondition(void) {} + inline ~CCondition(void) + { + m_condition.notify_all(); + } + + inline void Broadcast(void) + { + m_condition.notify_all(); + } + + inline void Signal(void) + { + m_condition.notify_one(); + } + + inline bool Wait(std::recursive_mutex& mutex, uint32_t iTimeout) + { + std::unique_lock lck(mutex); + return m_condition.wait_for(lck, std::chrono::milliseconds(iTimeout)) != std::cv_status::timeout; + } + + inline bool Wait(std::recursive_mutex &mutex, PredicateCallback callback, void* param, uint32_t iTimeout) + { + bool bReturn(false); + CTimeout timeout(iTimeout); + + while (!bReturn) + { + if ((bReturn = callback(param)) == true) + break; + uint32_t iMsLeft = timeout.TimeLeft(); + if ((iTimeout != 0) && (iMsLeft == 0)) + break; + std::unique_lock lck(mutex); + m_condition.wait_for(lck, std::chrono::milliseconds(iMsLeft)); + } + + return bReturn; + } + + inline bool Wait(std::recursive_mutex &mutex, _Predicate &predicate, uint32_t iTimeout = 0) + { + return Wait(mutex, _PredicateCallbackDefault, (void*)&predicate, iTimeout); + } + +private: + std::condition_variable_any m_condition; +}; + +class ATTRIBUTE_HIDDEN CEvent +{ +public: + CEvent(bool bAutoReset = true) : + m_bSignaled(false), + m_bBroadcast(false), + m_iWaitingThreads(0), + m_bAutoReset(bAutoReset) {} + virtual ~CEvent(void) {} + + void Broadcast(void) + { + Set(true); + m_condition.Broadcast(); + } + + void Signal(void) + { + Set(false); + m_condition.Signal(); + } + + bool Wait(void) + { + std::unique_lock lck(m_mutex); + ++m_iWaitingThreads; + + bool bReturn = m_condition.Wait(m_mutex, m_bSignaled); + return ResetAndReturn() && bReturn; + } + + bool Wait(uint32_t iTimeout) + { + if (iTimeout == 0) + return Wait(); + + std::unique_lock lck(m_mutex); + ++m_iWaitingThreads; + bool bReturn = m_condition.Wait(m_mutex, m_bSignaled, iTimeout); + return ResetAndReturn() && bReturn; + } + + static void Sleep(uint32_t iTimeout) + { + CEvent event; + event.Wait(iTimeout); + } + + void Reset(void) + { + m_bSignaled = false; + } + +private: + void Set(bool bBroadcast = false) + { + m_bSignaled = true; + m_bBroadcast = bBroadcast; + } + + bool ResetAndReturn(void) + { + std::unique_lock lck(m_mutex); + bool bReturn(m_bSignaled); + if (bReturn && (--m_iWaitingThreads == 0 || !m_bBroadcast) && m_bAutoReset) + m_bSignaled = false; + return bReturn; + } + + volatile bool m_bSignaled; + CCondition m_condition; + std::recursive_mutex m_mutex; + volatile bool m_bBroadcast; + unsigned int m_iWaitingThreads; + bool m_bAutoReset; +}; + +} /* namespace rtmpstream */ diff -Nru kodi-inputstream-rtmp-2.0.9/src/utils/Log.h kodi-inputstream-rtmp-3.4.0/src/utils/Log.h --- kodi-inputstream-rtmp-2.0.9/src/utils/Log.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/src/utils/Log.h 2013-05-31 22:59:22.000000000 +0000 @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2020 Team Kodi (https://kodi.tv) + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once + +#include + +namespace rtmpstream +{ + +inline const char* kodiTranslateLogLevel(const AddonLog logLevel) +{ + switch (logLevel) + { + case ADDON_LOG_DEBUG: + return "LOG_DEBUG: "; + case ADDON_LOG_INFO: + return "LOG_INFO: "; + case ADDON_LOG_WARNING: + return "LOG_WARNING: "; + case ADDON_LOG_ERROR: + return "LOG_ERROR: "; + case ADDON_LOG_FATAL: + return "LOG_FATAL: "; + default: + break; + } + return "LOG_UNKNOWN: "; +} + +inline void Log(const AddonLog logLevel, const char* format, ...) +{ + char buffer[16384]; + va_list args; + va_start(args, format); + vsprintf(buffer, format, args); + va_end(args); + + kodi::Log(logLevel, buffer); +#ifdef DEBUG + fprintf(stderr, "%s%s\n", kodiTranslateLogLevel(logLevel), buffer); +#endif +} + +} /* namespace rtmpstream */ diff -Nru kodi-inputstream-rtmp-2.0.9/.travis.yml kodi-inputstream-rtmp-3.4.0/.travis.yml --- kodi-inputstream-rtmp-2.0.9/.travis.yml 2020-02-09 10:13:36.000000000 +0000 +++ kodi-inputstream-rtmp-3.4.0/.travis.yml 2013-05-31 22:59:22.000000000 +0000 @@ -1,16 +1,12 @@ language: cpp -# -# Define the build matrix -# -# Travis defaults to building on Ubuntu Precise when building on -# Linux. We need Trusty in order to get up to date versions of -# cmake and g++. -# env: global: - app_id=inputstream.rtmp +# +# Define the build matrix +# matrix: include: - os: linux @@ -21,19 +17,37 @@ dist: xenial sudo: required compiler: clang + - os: linux + dist: bionic + sudo: required + compiler: gcc + env: DEBIAN_BUILD=true + - os: linux + dist: focal + sudo: required + compiler: gcc + env: DEBIAN_BUILD=true - os: osx - osx_image: xcode9.4 + osx_image: xcode10.2 + +before_install: + - if [[ $DEBIAN_BUILD == true ]]; then sudo add-apt-repository -y ppa:team-xbmc/xbmc-nightly; fi + - if [[ $DEBIAN_BUILD == true ]]; then sudo apt-get install fakeroot; fi # # The addon source is automatically checked out in $TRAVIS_BUILD_DIR, # we'll put the Kodi source on the same level # before_script: - - cd $TRAVIS_BUILD_DIR/.. - - git clone --branch Leia --depth=1 https://github.com/xbmc/xbmc.git - - cd ${app_id} && mkdir build && cd build - - mkdir -p definition/${app_id} - - echo ${app_id} $TRAVIS_BUILD_DIR $TRAVIS_COMMIT > definition/${app_id}/${app_id}.txt - - 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 + - if [[ $DEBIAN_BUILD != true ]]; then cd $TRAVIS_BUILD_DIR/..; fi + - if [[ $DEBIAN_BUILD != true ]]; then git clone --branch master --depth=1 https://github.com/xbmc/xbmc.git; fi + - if [[ $DEBIAN_BUILD != true ]]; then cd ${app_id} && mkdir build && cd build; fi + - if [[ $DEBIAN_BUILD != true ]]; then mkdir -p definition/${app_id}; fi + - if [[ $DEBIAN_BUILD != true ]]; then echo ${app_id} $TRAVIS_BUILD_DIR $TRAVIS_COMMIT > definition/${app_id}/${app_id}.txt; fi + - if [[ $DEBIAN_BUILD != true ]]; then 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; fi + - if [[ $DEBIAN_BUILD == true ]]; then wget https://raw.githubusercontent.com/xbmc/xbmc/master/xbmc/addons/kodi-dev-kit/tools/debian-addon-package-test.sh && chmod +x ./debian-addon-package-test.sh; fi + - if [[ $DEBIAN_BUILD == true ]]; then sudo apt-get build-dep $TRAVIS_BUILD_DIR; fi -script: make +script: + - if [[ $DEBIAN_BUILD != true ]]; then make; fi + - if [[ $DEBIAN_BUILD == true ]]; then ./debian-addon-package-test.sh $TRAVIS_BUILD_DIR; fi