diff -Nru kodi-pvr-vbox-4.7.0/appveyor.yml kodi-pvr-vbox-8.1.0/appveyor.yml --- kodi-pvr-vbox-4.7.0/appveyor.yml 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/appveyor.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -version: BuildNr.{build} - -image: Visual Studio 2015 - -shallow_clone: true - -clone_folder: c:\projects\pvr.vbox - -environment: - app_id: pvr.vbox - - matrix: - - GENERATOR: "Visual Studio 14" - CONFIG: Release - - GENERATOR: "Visual Studio 14 Win64" - CONFIG: Release - - GENERATOR: "Visual Studio 14 Win64" - CONFIG: Release - WINSTORE: -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0.16299.0" - - GENERATOR: "Visual Studio 14 ARM" - CONFIG: Release - WINSTORE: -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0.16299.0" - -build_script: - - cd .. - - 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% %APPVEYOR_BUILD_FOLDER% %APPVEYOR_REPO_COMMIT% > definition\%app_id%\%app_id%.txt - - cmake -T host=x64 -G "%GENERATOR%" %WINSTORE% -DADDONS_TO_BUILD=%app_id% -DCMAKE_BUILD_TYPE=%CONFIG% -DADDONS_DEFINITION_DIR=%APPVEYOR_BUILD_FOLDER%/build/definition -DADDON_SRC_PREFIX=../.. -DCMAKE_INSTALL_PREFIX=../../xbmc/addons -DPACKAGE_ZIP=1 ../../xbmc/cmake/addons - - cmake --build . --config %CONFIG% --target %app_id% diff -Nru kodi-pvr-vbox-4.7.0/azure-pipelines.yml kodi-pvr-vbox-8.1.0/azure-pipelines.yml --- kodi-pvr-vbox-4.7.0/azure-pipelines.yml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/azure-pipelines.yml 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,65 @@ +variables: + app_id: 'pvr.vbox' + +trigger: + branches: + include: + - Matrix + - releases/* + paths: + include: + - '*' + exclude: + - 'debian/*' + +jobs: + - job: Windows + + pool: + vmImage: 'VS2017-Win2016' + + strategy: + matrix: + Win32: + GENERATOR: "Visual Studio 15 2017" + ARCHITECTURE: Win32 + CONFIGURATION: Release + Win64: + GENERATOR: "Visual Studio 15 2017" + ARCHITECTURE: x64 + CONFIGURATION: Release + Win64-UWP: + GENERATOR: "Visual Studio 15 2017" + ARCHITECTURE: x64 + CONFIGURATION: Release + 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.17763.0" + + workspace: + clean: all + + steps: + + - script: | + cd .. + git clone --branch master --depth=1 https://github.com/xbmc/xbmc.git kodi + cd $(Build.SourcesDirectory) + mkdir build + cd build + mkdir "definition/$(app_id)" + echo $(app_id) . . > definition/$(app_id)/$(app_id).txt + mklink /J "$(Pipeline.Workspace)/$(app_id)" "$(Build.SourcesDirectory)" + + - task: CMake@1 + inputs: + workingDirectory: 'build' + cmakeArgs: '-T host=x64 -G "$(GENERATOR)" -A $(ARCHITECTURE) $(WINSTORE) -DADDONS_TO_BUILD=$(app_id) -DCMAKE_BUILD_TYPE=$(CONFIGURATION) -DADDONS_DEFINITION_DIR=$(Pipeline.Workspace)/$(app_id)/build/definition -DADDON_SRC_PREFIX=../.. -DCMAKE_INSTALL_PREFIX=../../kodi/addons -DPACKAGE_ZIP=1 ../../kodi/cmake/addons' + + - task: CMake@1 + inputs: + workingDirectory: 'build' + cmakeArgs: '--build . --config $(CONFIGURATION) --target $(app_id)' diff -Nru kodi-pvr-vbox-4.7.0/CMakeLists.txt kodi-pvr-vbox-8.1.0/CMakeLists.txt --- kodi-pvr-vbox-4.7.0/CMakeLists.txt 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/CMakeLists.txt 2021-01-09 10:03:05.000000000 +0000 @@ -4,18 +4,16 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}) find_package(Kodi REQUIRED) -find_package(kodiplatform REQUIRED) -find_package(p8-platform REQUIRED) -include_directories(${kodiplatform_INCLUDE_DIRS} - ${p8-platform_INCLUDE_DIRS} - ${KODI_INCLUDE_DIR}/.. # Hack way with "/..", need bigger Kodi cmake rework to match right include ways +include_directories(${KODI_INCLUDE_DIR}/.. # Hack way with "/..", need bigger Kodi cmake rework to match right include ways ${PROJECT_SOURCE_DIR}) # Sources and headers set(VBOX_SOURCES - src/client.h - src/client.cpp) + src/addon.h + src/addon.cpp + src/VBoxInstance.h + src/VBoxInstance.cpp) set(VBOX_SOURCES_VBOX src/vbox/CategoryGenreMapper.h @@ -31,10 +29,6 @@ src/vbox/Recording.cpp src/vbox/RecordingReader.cpp src/vbox/RecordingReader.h - src/vbox/Reminder.h - src/vbox/Reminder.cpp - src/vbox/ReminderManager.h - src/vbox/ReminderManager.cpp src/vbox/SeriesRecording.h src/vbox/SeriesRecording.cpp src/vbox/Settings.h @@ -114,7 +108,6 @@ ${VBOX_RESOURCES} ${VBOX_LIBRARIES_TINYXML2}) -set(DEPLIBS ${p8-platform_LIBRARIES}) build_addon(pvr.vbox VBOX DEPLIBS) include(CPack) diff -Nru kodi-pvr-vbox-4.7.0/debian/changelog kodi-pvr-vbox-8.1.0/debian/changelog --- kodi-pvr-vbox-4.7.0/debian/changelog 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/debian/changelog 2013-05-31 22:59:22.000000000 +0000 @@ -1,4 +1,4 @@ -kodi-pvr-vbox (4.7.0-1~bionic) bionic; urgency=low +kodi-pvr-vbox (8.1.0-1~bionic) bionic; urgency=low [ kodi ] * autogenerated dummy changelog diff -Nru kodi-pvr-vbox-4.7.0/debian/control kodi-pvr-vbox-8.1.0/debian/control --- kodi-pvr-vbox-4.7.0/debian/control 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/debian/control 2013-05-31 22:59:22.000000000 +0000 @@ -2,10 +2,10 @@ Priority: extra Maintainer: Sam Stenvall Build-Depends: debhelper (>= 9.0.0), cmake, - libkodiplatform-dev (>= 16.0.0), kodi-addon-dev -Standards-Version: 3.9.4 + kodi-addon-dev +Standards-Version: 4.1.2 Section: libs -Homepage: https://github.com/Jalle19/pvr.vbox +Homepage: https://github.com/kodi-pvr/pvr.vbox Package: kodi-pvr-vbox Section: libs diff -Nru kodi-pvr-vbox-4.7.0/debian/copyright kodi-pvr-vbox-8.1.0/debian/copyright --- kodi-pvr-vbox-4.7.0/debian/copyright 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/debian/copyright 2013-05-31 22:59:22.000000000 +0000 @@ -1,9 +1,10 @@ Format: http://dep.debian.net/deps/dep5 Upstream-Name: pvr.vbox -Source: https://github.com/Jalle19/pvr.vbox +Source: https://github.com/kodi-pvr/pvr.vbox Files: * -Copyright: 2015 Sam Stenvall +Copyright: 2015-2020 Team Kodi + 2015 Sam Stenvall License: GPL-2+ 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 @@ -23,7 +24,8 @@ Files: debian/* -Copyright: 2013 Arne Morten Kvarving +Copyright: 2020 Team Kodi + 2013 Arne Morten Kvarving 2013 wsnipex License: GPL-2+ This package is free software; you can redistribute it and/or modify diff -Nru kodi-pvr-vbox-4.7.0/debian/source/format kodi-pvr-vbox-8.1.0/debian/source/format --- kodi-pvr-vbox-4.7.0/debian/source/format 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/debian/source/format 2013-05-31 22:59:22.000000000 +0000 @@ -1 +1 @@ -3.0 (native) +3.0 (quilt) diff -Nru kodi-pvr-vbox-4.7.0/.gitignore kodi-pvr-vbox-8.1.0/.gitignore --- kodi-pvr-vbox-4.7.0/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/.gitignore 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,50 @@ +# 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 diff -Nru kodi-pvr-vbox-4.7.0/Jenkinsfile kodi-pvr-vbox-8.1.0/Jenkinsfile --- kodi-pvr-vbox-4.7.0/Jenkinsfile 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/Jenkinsfile 2021-01-09 10:03:05.000000000 +0000 @@ -1 +1 @@ -buildPlugin(version: "Leia") +buildPlugin(version: "Matrix") diff -Nru kodi-pvr-vbox-4.7.0/LICENSE.md kodi-pvr-vbox-8.1.0/LICENSE.md --- kodi-pvr-vbox-4.7.0/LICENSE.md 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/LICENSE.md 2021-01-09 10:03:05.000000000 +0000 @@ -1,339 +1,264 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 +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 +> 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. - - GNU GENERAL PUBLIC LICENSE - 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 +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. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {description} - Copyright (C) {year} {fullname} - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - {signature of Ty Coon}, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. +**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-pvr-vbox-4.7.0/pvr.vbox/addon.xml.in kodi-pvr-vbox-8.1.0/pvr.vbox/addon.xml.in --- kodi-pvr-vbox-4.7.0/pvr.vbox/addon.xml.in 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/addon.xml.in 2021-01-09 10:03:05.000000000 +0000 @@ -1,12 +1,12 @@ @ADDON_DEPENDS@ PVR byvoegsel vir VBox Home TV Gateways @@ -18,12 +18,12 @@ PVR addon for VBox Home TV Gateways PVR addon for VBox Home TV Gateways PVR addon for VBox Home TV Gateways - Addon PVR para salidas VBox Home TV + Add-on PVR para salidas VBox Home TV PVR complemento para VBox Home TV Gateways PVR'i lisa VBox Home TV Gateways'le PVR addon-a VBox Home TV Gateway-entzako Kodin Vbox Home TV Gateway -asiakasohjelma - Addiciel de numériscope pour les passerelles « Home TV » de VBox + Addiciel de numériscope pour les passerelles «  Home TV » de VBox Extension enregistreur vidéo (PVR) pour les passerelles de TV domestique VBox Engadido PVR para gateways de VBox Home לקוח טלוויזיה חיה עבור VBox Home TV Gateways @@ -49,7 +49,7 @@ PVR dodatni program za VBox Kućni TV Mrežni Prolaz PVR-tillägg för VBox Home TV-gateway Przidŏwka PVR dlŏ bram VBox Home TV - VBox Home TV Gateway İçin PVR Eklentisi + VBox Ev TV Ağ Geçitleri için PVR eklentisi VBox 家庭电视网关的 PVR 插件 VBox Home TV Gateways 的 PVR 附加元件 Hierdie is 'n PVR byvoegsel om met VBox Communications' XTi TV Gateways te koppel. Dit ondersteun al die basiese funksionaliteit wat jy sal verwag, soos kyk, opneem en tydskuif. Addisioneel ondersteun dit die aanvul van die oor-die-lug gids data met eksterne XMLTV data. @@ -61,10 +61,10 @@ This is a PVR addon for interfacing with VBox Communications' XTi TV Gateways. It supports all the basic functionality you would expect, such as watching, recording and timeshifting. Additionally, it supports augmenting the over-the-air guide data with external XMLTV data. This is a PVR addon for interfacing with VBox Communications' XTi TV Gateways. It supports all the basic functionality you would expect, such as watching, recording and timeshifting. Additionally, it supports augmenting the over-the-air guide data with external XMLTV data. This is a PVR addon for interfacing with VBox Communications' XTi TV Gateways. It supports all the basic functionality you would expect, such as watching, recording and timeshifting. Additionally, it supports augmenting the over-the-air guide data with external XMLTV data. - Este es un addon PVR que sirve como interfaz para Comunicaciones con puertas de enlace XTi TV. Soporta toda la funcionalidad básica, por ejemplo, ver, grabar y timeshift. Adicionalmente, da da soporte adicional a la guía OTA con datos externos XMLTV. + Este es un add-on PVR que sirve como interfaz para Equipos Communications' XTi TV. Soporta toda la funcionalidad básica como ver, grabar y timeshift. Adicionalmente, aumenta la información de la guía OTA con datos externos XMLTV. Este es un complemento PVR para la interfaz con las pasarelas XTi TV de VBox Communications. Soporta todas las funciones básicas que se esperan, como ver, grabar y cambiar de tiempo. Además, soporta el aumento de los datos de guía de sobre el aire con datos XMLTV externos. Tämä PVR-lisäosa on tarkoitettu käytettäväksi VBox Communications XTi -laitteiden kanssa. Se tukee kaikkia perusominaisuuksia, kuten tv-lähetysten katsomista, tallentamista ja ajansiirtoa. Lisäksi se tukee XMLTV-formaatissa olevia ohjelmatietoja. - Ceci est un addiciel de numériscope assurant l’interface avec les passerelles « XTi TV » de VBox Communications. Il prend en charge toutes les fonctions de base que vous pourriez attendre, telles que regarder, enregistrer, ainsi que le décalage temporel. De plus, il prend en charge l’augmentation des données du guide télédiffusé avec les données XMLTV. + Un addiciel de numériscope assurant l’interface avec les passerelles «  XTi TV » de VBox Communications. Il prend en charge toutes les fonctions de base que vous pourriez attendre, telles que regarder, enregistrer, ainsi que le décalage temporel. De plus, il prend en charge l’augmentation des données du guide télédiffusé avec les données XMLTV. Ceci est une extension d'enregistreur vidéo (PVR) s'interfaçant avec les passerelles TV XTi de VBox Communications. L'extension permet les fonctionnalités attendues de base, comme le visionnage, l'enregistrement et le différé. De plus, elle propose d'ajouter des données externes XMLTV au guide électronique des programmes TV diffusé. Este engadido é un PVR para interactuar con gateways de VBox Communications' XTi TV. Soporte todas as funcionalidades básicas que poderías agardar, como ver, gravar e mudar o tempo. A maiores, tamén permite aumentar a guía en directo con datos externos XMLTV. לקוח טלוויזיה חיה זה מיועד להתממשקות עם XTi TV Gateways של VBox Communications. הלקוח כולל את כל היכולות הבסיסיות המתבקשות כמו צפייה בשידור חי ובהקלטות, תזמון הקלטות וטיימשיפט. ניתן אף לצרף מידע מלוח שידורים חיצוני בפורמט XMLTV בנוסף על המידע הנקלט עם הערוצים. @@ -90,9 +90,15 @@ Ovo je PVR dodatni program za povezivanje VBox Communications' XTi TV Mrežnim Prolazima. Podržava sve osnovne funkcionalnosti koje biste očekivali, kao što je gledanje, snimanje i vremenski pomeraj. Dodatno, podržava uvećanje over-the-air podataka vodiča sa spoljašnjim XMLTV podacima. Detta är ett PVR-tillägg för kommunikation med XTi TV-gateways från VBox Communications. Det stöder all förväntad grundläggande funktionalitet, som visning, inspelning och timeshift. Det stöder dessutom förbättring av signalburen guidedata via extern XMLTV-data. To je przidŏwka PVR do pojsrzedniczyniŏ ze XTi TV Gateway ôd VBox Communications. Podpiyrŏ wszyjske ajnfachowe funkcyje, kerych by szło ôczekiwać: ôbziyraniy, nagrywaniy, timeshifting. Ôkrōm tego, ôd przidŏwaniŏ zewnyntrznych datōw XMLTV podpiyrŏ rozszyrzowanie EPG ôd dostŏwcy. - Bu, VBox Communications' XTi TV Gateways için arabirim sağlayan bir PVR eklentisidir. İzleme, kaydetme ve zaman kaydırma gibi, beklenecek tüm temel işlevleri destekler. Ek olarak, harici XMLTV verileri ile yayın rehberi verilerinin güçlendirilmesini de destekler.l + Bu, VBox Communications'ın XTi TV Ağ Geçitleriyle arayüz oluşturmak için bir PVR eklentisidir. İzleme, kayıt ve zaman kayması gibi beklediğiniz tüm temel işlevleri destekler. Ayrıca, harici XMLTV verileri ile havadan kılavuz verilerinin artırılmasını da destekler. 此 PVR 插件是 VBox 通信的 XTi 电视网关的接口。它支持你所需要的所有基本功能,如观看、录像和时光平移,还支持通过外部 XMLTV 数据增强 OTA 指南数据。 這是為了與 VBox Communications' XTi TV Gateways 界接而開發的 PVR 附加元件。它支援你想得到的基本功能,如觀賞、錄影及時間平移。另外它還支援即時節目表與外部 XMLTV 資料結合。 @PLATFORM@ + GPL-2.0-or-later + https://github.com/kodi-pvr/pvr.vbox + https://forum.kodi.tv/forumdisplay.php?fid=233 + + icon.png + diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/changelog.txt kodi-pvr-vbox-8.1.0/pvr.vbox/changelog.txt --- kodi-pvr-vbox-4.7.0/pvr.vbox/changelog.txt 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/changelog.txt 2021-01-09 10:03:05.000000000 +0000 @@ -1,17 +1,84 @@ -4.7.0 +8.1.0 +- Update PVR API 7.1.0 + +8.0.0 +- Update PVR API 7.0.2 +- Fix some compile warnings by add of ATTRIBUTE_HIDDEN + +7.0.3 +- Remove p8 from debian control file + +7.0.2 +- Use kodi add-on StringUtils instead of local copy + +7.0.1 +- Remove p8-platforms and add local StringUtils for cpp17 + +7.0.0 +- Update PVR API 7.0.0 +- Rework addon to support new API interface + +6.0.0 +- Update PVR API 6.5.1 +- Update Global API 1.2.0 + +5.5.9 +- Update to PVR API 6.5.0 + +5.5.8 +- Update to PVR API 6.4.0 +- Correct license name on addon.xml + +5.5.7 +- Update to PVR API 6.3.0 + +5.5.6 +- Update Debian build code +- Update with some minor cleanups +- Cleanup source copyright to match SPDX +- Add license name forum url and source url to addon.xml +- Add GPL2+ license file and show GPL2+ on README.md + +5.5.5 +- Update: PVR API 6.2.0 +- Update: Remove reminders feature as it is now part of kodi + +5.5.4 +- Update Language files from Transifex + +5.5.3 +- Update Language files from Transifex + +5.5.2 +- Update Language files from Transifex + +5.5.1 +- Coding guidelines, strncpy safety and remove memset calls where possible + +5.5.0 - Skip initial EPG load to avoid crash scenario on boot on LibreElec/CoreElec +- New settings format and settings levels / help text -4.6.0 +5.4.0 - Fix timezone offset changing kodi time - remove compat functions as no longer needed - Remove external xmltv as xmltv supported by vbox -4.5.0 -- Implement GetStreamTimes API for timeshifting support +5.3.0 +- Implement GetStreamTimes API for timeshifting and recordings support - Mac build script - Fix compiler warnings - Add appveyor.yml +5.2.0 +- Recompile for 6.1.0 PVR Addon API compatibility + +5.1.0 +- Update to GUI addon API v5.14.0 + +5.0.0 +- Update to PVR addon API v6.0.0 + 4.4.3 - Fixed wrong size caused crash in Android Oreo (8) diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.af_za/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.af_za/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.af_za/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.af_za/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Konneksie (intern)" +msgid "Local network" +msgstr "Lokale netwerk" msgctxt "#30001" msgid "Hostname or IP address" @@ -33,41 +33,65 @@ msgstr "UPnP poort" msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Konneksie tydverstreke (sekondes)" +msgid "Connection timeout" +msgstr "Konneksie tydverstreke" msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS poort (los oop om gewone HTTP te gebruik)" +msgid "HTTPS port (set to 0 to use plain HTTP)" +msgstr "HTTPS poort (stel na 0 om gewone HTTP te gebruik)" -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Konneksie (ekstern)" +msgctxt "#30006" +msgid "Connection" +msgstr "Verbinding" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30020" +msgid "Channel & EPG" +msgstr "Kanaal & EPG" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanale" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Gebruik eksterne XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Eksterne XMLTV pad" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Verkies eksterne EPG bo OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Gebruik kanaal ikone vananf eksterne XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Kanaal nommers gestel deur" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logical Channel Number) vanaf agterkant" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Kanaal indeks in agterkant" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Herinnering tyd (minute voor program begin)" + +msgctxt "#30027" +msgid "Skip initial EPG load" +msgstr "Slaan aanvanklike EPG laai oor" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Tydskuif" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Stel tydskuif in staat" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Tydskuif buffer pad" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "VBox toestel herdeursoek van EPG (sal 'n tydjie vat)" @@ -76,14 +100,6 @@ msgid "Sync EPG" msgstr "Sinc EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logical Channel Number) vanaf agterkant" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Kanaal indeks in agterkant" - msgctxt "#30110" msgid "Remind me" msgstr "Herinner my" @@ -100,18 +116,30 @@ msgid "Cancel all the channel's reminders" msgstr "Kanselleer al die kanaal se herinneringe" -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Herinnering tyd (minute voor program begin)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Tydskuif" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Stel tydskuif in staat" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Tydskuif buffer pad" +msgctxt "#30601" +msgid "The IP address or hostname of your VBox when accessed from the local network." +msgstr "Die IP adres of gasheer naam van jou VBox wanneer toegang vanaf die lokale netwerk verkry word." + +msgctxt "#30602" +msgid "The port used to connect to your VBox when accessed from the local network. Default value is `80`." +msgstr "Die poort wat gebruik word om aan jou VBox te konnekteer wanneer toegang vanaf die lokale netwerk verkry word. Die verstek waarde is '80'." + +msgctxt "#30620" +msgid "Settings related to Channels & EPG." +msgstr "Verstellings verwant aan Kanale & EPG." + +msgctxt "#30622" +msgid "The amount of time in minutes prior to a programme start that a reminder should pop up." +msgstr "Die hoeveelheid tyd in minute voor 'n program begin wat 'n herinnering moet op pop." + +msgctxt "#30640" +msgid "Settings related to the timeshift." +msgstr "Verstellings verwant aan die tydskuif." + +msgctxt "#30641" +msgid "If enabled allows pause, rewind and fast-forward of live TV." +msgstr "Indien in staat gestel, laat pouseer, terugdraai en vinnig vorentoe van lewendige TV toe." + +msgctxt "#30642" +msgid "The path where the timeshift buffer files should be stored when timeshifting is enabled. Make sure you have a reasonable amount of disk space available since the buffer will grow indefinitely until you stop watching or switch channels." +msgstr "Die pad waar die tydskuif buffer lêers gestoor moet word wanneer tydskuif in staat gestel is. Maak seker jy het 'n redelike hoeveelheid skyf spasie beskikbaar aangesien die buffer onbeperk sal groei totdat jy ophou kyk of kanale verander." diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.am_et/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.am_et/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.am_et/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.am_et/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,10 +16,22 @@ "Language: am_ET\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +msgctxt "#30000" +msgid "Local network" +msgstr "የ አካባቢ ኔትዎርክ " + msgctxt "#30002" msgid "HTTP port" msgstr "HTTP port" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "ግንኙነት ጊዜው አልፏል (ሰከንዶች)" +msgctxt "#30006" +msgid "Connection" +msgstr "ግንኙነት " + +msgctxt "#30007" +msgid "Internet" +msgstr "ኢንተርኔት " + +msgctxt "#30021" +msgid "Channels" +msgstr "ጣቢያዎች" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ar_sa/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ar_sa/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ar_sa/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ar_sa/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,6 +16,18 @@ "Language: ar_SA\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +msgctxt "#30000" +msgid "Local network" +msgstr "الشبكة المحلية" + msgctxt "#30002" msgid "HTTP port" msgstr "منفذ HTTP" + +msgctxt "#30007" +msgid "Internet" +msgstr "الإنترنت" + +msgctxt "#30021" +msgid "Channels" +msgstr "قنوات" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.az_az/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.az_az/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.az_az/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.az_az/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: VBox TV Gateway PVR Client +# Addon id: pvr.vbox +# Addon Provider: Sam Stenvall +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Azerbaijani (Azerbaijan) (http://www.transifex.com/projects/p/kodi-main/language/az_AZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az_AZ\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30006" +msgid "Connection" +msgstr "Qoşulma" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanallar" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.be_by/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.be_by/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.be_by/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.be_by/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,6 +16,26 @@ "Language: be_BY\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +msgctxt "#30000" +msgid "Local network" +msgstr "Лакальная сетка" + msgctxt "#30002" msgid "HTTP port" msgstr "HTTP port" + +msgctxt "#30006" +msgid "Connection" +msgstr "Злучэньне" + +msgctxt "#30007" +msgid "Internet" +msgstr "Інтэрнэт" + +msgctxt "#30021" +msgid "Channels" +msgstr "Каналы" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Шлях да буферу таймшыфт" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.bg_bg/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.bg_bg/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.bg_bg/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.bg_bg/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Връзка (вътрешна)" +msgid "Local network" +msgstr "Локална мрежа" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "UPnP порт" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Време на изчакване при свързване (секунди)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS порт (ако е празно, ще се използва HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Връзка (външна)" +msgctxt "#30006" +msgid "Connection" +msgstr "Връзка" + +msgctxt "#30007" +msgid "Internet" +msgstr "Интернет" + +msgctxt "#30021" +msgid "Channels" +msgstr "Канали" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "Справочник" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Използване на външен XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Път до външния XMLTV" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Да се предпочита външен справочник пред ефирен" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Иконки за каналите от външен XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Номерата на каналите се задават от" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (логически номер на канал) от сървъра" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Номерация на каналите в сървъра" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Време за напомняне (минути пред началото на предаването)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Изместване във времето" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Включване на изместването във времето" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Път до буфера за изместване във времето" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Сканиране на справочника от устройството VBox (отнема време)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Синхронизиране на справочника" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (логически номер на канал) от сървъра" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Номерация на каналите в сървъра" - msgctxt "#30110" msgid "Remind me" msgstr "Да ми бъде напомнено" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Отказ от всички напомняния за канала" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Време за напомняне (минути пред началото на предаването)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Изместване във времето" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Включване на изместването във времето" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Път до буфера за изместване във времето" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.bs_ba/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.bs_ba/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.bs_ba/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.bs_ba/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: VBox TV Gateway PVR Client +# Addon id: pvr.vbox +# Addon Provider: Sam Stenvall +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/projects/p/kodi-main/language/bs_BA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bs_BA\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Local network" +msgstr "Lokalna mreža" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanali" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ca_es/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ca_es/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ca_es/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ca_es/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Connexió (interna)" +msgid "Local network" +msgstr "Xarxa local" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,38 +32,46 @@ msgid "UPnP port" msgstr "Port UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Temps d'expiració de la connexió (segons)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Connexió (externa)" +msgctxt "#30006" +msgid "Connection" +msgstr "Connexió" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Canals" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Utilitza un XMLTV extern" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Camí al XMLTV extern" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Utilitza les icones dels canals del XMLTV extern" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logical Channel Number) des del dorsal" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Temps de recordatori (minuts abans que comenci el programa)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Salts en el temps" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Habilita els salts en el temps" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Camí a la memòria intermèdia dels salts en el temps" msgctxt "#30107" msgid "Sync EPG" msgstr "Sincronitza l'EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logical Channel Number) des del dorsal" - msgctxt "#30110" msgid "Remind me" msgstr "Recorda'm" @@ -79,19 +87,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Cancel·la tots els recordatoris del canal" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Temps de recordatori (minuts abans que comenci el programa)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Salts en el temps" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Habilita els salts en el temps" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Camí a la memòria intermèdia dels salts en el temps" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.cs_cz/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.cs_cz/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.cs_cz/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.cs_cz/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Spojení (interní)" +msgid "Local network" +msgstr "Místní síť" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "Port UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Časový limit spojení (sekundy)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Port HTTPS (nechte prázdné pro použití jednoduchého HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Spojení (externí)" +msgctxt "#30006" +msgid "Connection" +msgstr "Spojení" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanály" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "Televizní program" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Použít vnější XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Cesta k externímu XMLTV" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Upřednostňovat externí televizní program před vzduchem šířenými daty" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Použít ikony kanálů z externího XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Čísla kanálů nastavena pomocí" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "Logické číslování kanálů (LCN) z backendu" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Index kanálu v backendu" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Čas upozornění (minuty před začátkem programu)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Časový posun" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Povolit časový posun" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Cesta k vyrovnávací paměti časového posunu" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Opětovné vyhledání televizního programu zařízením VBox (bude to chvíli trvat)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Synchronizovat televizní program" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "Logické číslování kanálů (LCN) z backendu" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Index kanálu v backendu" - msgctxt "#30110" msgid "Remind me" msgstr "Upozornit mě" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Zrušit všechna upozornění kanálu" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Čas upozornění (minuty před začátkem programu)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Časový posun" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Povolit časový posun" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Popis umístění vyrovnávací paměti časového posunu" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.cy_gb/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.cy_gb/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.cy_gb/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.cy_gb/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,6 +16,10 @@ "Language: cy_GB\n" "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" +msgctxt "#30000" +msgid "Local network" +msgstr "Rhwydwaith lleol" + msgctxt "#30001" msgid "Hostname or IP address" msgstr "Cyfeiriad IP neu Westenw" @@ -24,6 +28,18 @@ msgid "HTTP port" msgstr "Porth HTTP" -msgctxt "#30202" +msgctxt "#30006" +msgid "Connection" +msgstr "Cysylltiad" + +msgctxt "#30007" +msgid "Internet" +msgstr "Rhyngrwyd" + +msgctxt "#30021" +msgid "Channels" +msgstr "Sianeli" + +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "Llwybr byffro Symud Amser" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.da_dk/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.da_dk/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.da_dk/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.da_dk/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Forbindelse (intern)" +msgid "Local network" +msgstr "Lokalnetværk" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,66 @@ msgid "UPnP port" msgstr "UPnP port" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Forbindelsestimeout (sekunder)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS port (efterlad tom for at benytte HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Forbindelse (ekstern)" +msgctxt "#30006" +msgid "Connection" +msgstr "Forbindelse" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanaler" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Benyt ekstern XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Ekstern XMLTV sti" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Foretræk ekstern EPG over OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Benyt kanalikoner fra ekstern XMLTV" +msgctxt "#30023" +msgid "Channel numbers set by" +msgstr "Kanalnummerering angivet af" + +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logical Channel Number) fra motor" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Kanalindeks i motor" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Påmindelsestidspunkt (minutter før programmet starter)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Tidsforskydning" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Aktiver tidsforskydning" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Stien til tidsforskydningsbuffer" + +msgctxt "#30106" +msgid "VBox device rescan of EPG (will take a while)" +msgstr "VBox-enheds nye skanning af EPG (vil tage et stykke tid)" msgctxt "#30107" msgid "Sync EPG" msgstr "Synkroniser EPG" +msgctxt "#30110" +msgid "Remind me" +msgstr "Husk mig på det" + +msgctxt "#30111" +msgid "Manual reminder" +msgstr "Manuel huskeseddel" + msgctxt "#30112" msgid "Cancel reminder (if exists)" msgstr "Afmeld påmindelse (hvis den findes)" @@ -75,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Afmeld alle kanalens påmindelser" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Påmindelsestidspunkt (minutter før programmet starter)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Tidsforskydning" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Aktiver tidsforskydning" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Timeshift buffer sti" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.de_de/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.de_de/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.de_de/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.de_de/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Verbindung (intern)" +msgid "Local network" +msgstr "Lokales Netzwerk" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "UPnP Port" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Verbindungszeitüberschreitung (Sekunden)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS Port (freilassen, um nur HTTP zu nutzen)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Verbindung (extern)" +msgctxt "#30006" +msgid "Connection" +msgstr "Verbindung" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanäle" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Verwende externes XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Externer XMLTV Pfad" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Externes EPG über OTA bevorzugen" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Benutze externe Kanal-Icons von XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Kanalnummer verwenden von" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logische Kanalnummer) des Backends" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Kanalindex des Backends" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Erinnerungs-Zeitpunkt (Minuten vor Programmstart)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Timeshift" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Timeshift aktivieren" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Timeshift Puffer-Pfad" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "EPG auf VBox neu einlesen (dauert etwas)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "EPG synchronisieren" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logische Kanalnummer) des Backends" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Kanalindex des Backends" - msgctxt "#30110" msgid "Remind me" msgstr "Erinnere mich" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Alle Erinnerungen des Kanals löschen" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Erinnerungs-Zeitpunkt (Minuten vor Programmstart)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Timeshift" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Timeshift aktivieren" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Timeshift-Puffer-Pfad" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.el_gr/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.el_gr/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.el_gr/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.el_gr/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Σύνδεση (εσωτερική)" +msgid "Local network" +msgstr "Τοπικό δίκτυο" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,46 +32,30 @@ msgid "UPnP port" msgstr "Θύρα UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Χρονικό όριο σύνδεσης (δευτερόλεπτα)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Θύρα HTTPS (αφήστε κενή για απλή HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Σύνδεση (εξωτερική)" +msgctxt "#30006" +msgid "Connection" +msgstr "Σύνδεση" + +msgctxt "#30007" +msgid "Internet" +msgstr "Διαδίκτυο" + +msgctxt "#30021" +msgid "Channels" +msgstr "Κανάλια" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Χρήση εξωτερικής XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Διαδρομή εξωτερικής XMLTV" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Προτίμηση εξωτερικού EPG αντί OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Χρήση εικονιδίων καναλιών από την εξωτερική XMLTV" - -msgctxt "#30200" +msgctxt "#30040" msgid "Timeshift" msgstr "Timeshift" -msgctxt "#30201" +msgctxt "#30041" msgid "Enable timeshifting" msgstr "Ενεργοποίηση timeshift" -msgctxt "#30202" +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "Διαδρομή προσωρινής αποθήκευσης Timeshift" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.en_au/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.en_au/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.en_au/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.en_au/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,10 +16,26 @@ "Language: en_AU\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Local network" +msgstr "Local network" + msgctxt "#30002" msgid "HTTP port" msgstr "HTTP port" -msgctxt "#30202" +msgctxt "#30006" +msgid "Connection" +msgstr "Connection" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Channels" + +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "Timeshift buffer path" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.en_gb/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.en_gb/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.en_gb/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.en_gb/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,10 +16,11 @@ "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#settings labels +################### +################### msgctxt "#30000" -msgid "Connection (internal)" +msgid "Local network" msgstr "" msgctxt "#30001" @@ -35,31 +36,73 @@ msgstr "" msgctxt "#30004" -msgid "Connection timeout (seconds)" +msgid "Connection timeout" msgstr "" msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" +msgid "HTTPS port (set to 0 to use plain HTTP)" msgstr "" -#empty strings from id 30006 to 30049 +msgctxt "#30006" +msgid "Connection" +msgstr "" -msgctxt "#30050" -msgid "Connection (external)" +msgctxt "#30007" +msgid "Internet" msgstr "" -#empty strings from id 30051 to 30099 +#empty strings from id 30008 to 30019 -msgctxt "#30100" -msgid "EPG" +msgctxt "#30020" +msgid "Channel & EPG" msgstr "" -#empty strings from id 30101 to 30104 +msgctxt "#30021" +msgid "Channels" +msgstr "" -msgctxt "#30105" +msgctxt "#30022" +msgid "EPG" +msgstr "" + +msgctxt "#30023" msgid "Channel numbers set by" msgstr "" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "" + +msgctxt "#30027" +msgid "Skip initial EPG load" +msgstr "" + +#empty strings from id 30028 to 30039 + +msgctxt "#30040" +msgid "Timeshift" +msgstr "" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "" + +#empty strings from id 30043 to 30105 +############# +############# + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "" @@ -68,13 +111,7 @@ msgid "Sync EPG" msgstr "" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "" +#empty strings from id 30108 to 30109 msgctxt "#30110" msgid "Remind me" @@ -92,24 +129,81 @@ msgid "Cancel all the channel's reminders" msgstr "" -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" +#empty strings from id 30114 to 30599 +#help info - Connection + +msgctxt "#30600" +msgid "Contains settings for connecting to the VBox device from both your local network and from the internet. A local connection will be attempted first and if unsuccessful the internet settings will be used." msgstr "" -msgctxt "#30115" -msgid "Skip initial EPG load" +msgctxt "#30601" +msgid "The IP address or hostname of your VBox when accessed from the local network." msgstr "" -#empty strings from id 30116 to 30199 +msgctxt "#30602" +msgid "The port used to connect to your VBox when accessed from the local network. Default value is `80`." +msgstr "" -msgctxt "#30200" -msgid "Timeshift" +msgctxt "#30603" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the local network. The default `0` means this is disabled and HTTP will be used instead." msgstr "" -msgctxt "#30201" -msgid "Enable timeshifting" +msgctxt "#30604" +msgid "The port used to connect to your VBox via UPnP when accessed from the local network. Default value is `55555`." msgstr "" -msgctxt "#30202" -msgid "Timeshift buffer path" +msgctxt "#30605" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the local network. Default value is `3`." +msgstr "" + +msgctxt "#30606" +msgid "The IP address or hostname of your VBox when accessed from the internet." +msgstr "" + +msgctxt "#30607" +msgid "The port used to connect to your VBox when accessed from the internet." +msgstr "" + +msgctxt "#30608" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the internet. The default `0` means this is disabled and HTTP will be used instead." +msgstr "" + +msgctxt "#30609" +msgid "The port used to connect to your VBox via UPnP when accessed from the internet. Default value is `55555`." +msgstr "" + +msgctxt "#30610" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the internet. Default value is `10`." +msgstr "" + +#empty strings from id 30611 to 30619 + +msgctxt "#30620" +msgid "Settings related to Channels & EPG." +msgstr "" + +msgctxt "#30621" +msgid "Channel numbers can be set via either of the following two options: [LCN (Logical Channel Number) from backend] The channel numbers as set on the backend; [Channel index in backend] Starting from 1 number the channels as per the order they appear on the backend." +msgstr "" + +msgctxt "#30622" +msgid "The amount of time in minutes prior to a programme start that a reminder should pop up." +msgstr "" + +msgctxt "#30623" +msgid "Ignore the initial EPG load. Enabled by default to prevent crash issues on LibreElec/CoreElec." +msgstr "" + +#empty strings from id 30624 to 30639 + +msgctxt "#30640" +msgid "Settings related to the timeshift." +msgstr "" + +msgctxt "#30641" +msgid "If enabled allows pause, rewind and fast-forward of live TV." +msgstr "" + +msgctxt "#30642" +msgid "The path where the timeshift buffer files should be stored when timeshifting is enabled. Make sure you have a reasonable amount of disk space available since the buffer will grow indefinitely until you stop watching or switch channels." msgstr "" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.en_nz/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.en_nz/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.en_nz/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.en_nz/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Connection (internal)" +msgid "Local network" +msgstr "Local network" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "UPnP port" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Connection timeout (seconds)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS port (leave empty to use plain HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Connection (external)" +msgctxt "#30006" +msgid "Connection" +msgstr "Connection" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Channels" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Use external XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "External XMLTV path" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Prefer external EPG over OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Use channel icons from external XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Channel numbers set by" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logical Channel Number) from backend" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Channel index in backend" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Reminder time (minutes before program starts)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Timeshift" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Enable timeshifting" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Timeshift buffer path" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "VBox device rescan of EPG (will take a while)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Sync EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logical Channel Number) from backend" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Channel index in backend" - msgctxt "#30110" msgid "Remind me" msgstr "Remind me" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Cancel all the channel's reminders" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Reminder time (minutes before program starts)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Timeshift" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Enable timeshifting" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Timeshift buffer path" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.en_us/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.en_us/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.en_us/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.en_us/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Connection (internal)" +msgid "Local network" +msgstr "Local network" msgctxt "#30001" msgid "Hostname or IP address" @@ -33,41 +33,65 @@ msgstr "UPnP port" msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Connection timeout (seconds)" +msgid "Connection timeout" +msgstr "Connection timeout" msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS port (leave empty to use plain HTTP)" +msgid "HTTPS port (set to 0 to use plain HTTP)" +msgstr "HTTPS port (set to 0 to use plain HTTP)" -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Connection (external)" +msgctxt "#30006" +msgid "Connection" +msgstr "Connection" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30020" +msgid "Channel & EPG" +msgstr "Channel & EPG" + +msgctxt "#30021" +msgid "Channels" +msgstr "Channels" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Use external XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "External XMLTV path" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Prefer external EPG over OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Use channel icons from external XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Channel numbers set by" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logical Channel Number) from backend" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Channel index in backend" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Reminder time (minutes before program starts)" + +msgctxt "#30027" +msgid "Skip initial EPG load" +msgstr "Skip initial EPG load" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Timeshift" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Enable timeshifting" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Timeshift buffer path" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "VBox device rescan of EPG (will take a while)" @@ -76,14 +100,6 @@ msgid "Sync EPG" msgstr "Sync EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logical Channel Number) from backend" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Channel index in backend" - msgctxt "#30110" msgid "Remind me" msgstr "Remind me" @@ -100,18 +116,74 @@ msgid "Cancel all the channel's reminders" msgstr "Cancel all the channel's reminders" -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Reminder time (minutes before program starts)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Timeshift" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Enable timeshifting" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Timeshift buffer path" +msgctxt "#30600" +msgid "Contains settings for connecting to the VBox device from both your local network and from the internet. A local connection will be attempted first and if unsuccessful the internet settings will be used." +msgstr "Contains settings for connecting to the VBox device from both your local network and from the internet. A local connection will be attempted first and if unsuccessful the internet settings will be used." + +msgctxt "#30601" +msgid "The IP address or hostname of your VBox when accessed from the local network." +msgstr "The IP address or hostname of your VBox when accessed from the local network." + +msgctxt "#30602" +msgid "The port used to connect to your VBox when accessed from the local network. Default value is `80`." +msgstr "The port used to connect to your VBox when accessed from the local network. Default value is `80`." + +msgctxt "#30603" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the local network. The default `0` means this is disabled and HTTP will be used instead." +msgstr "The port used to connect to your VBox if using HTTPS when accessed from the local network. The default `0` means this is disabled and HTTP will be used instead." + +msgctxt "#30604" +msgid "The port used to connect to your VBox via UPnP when accessed from the local network. Default value is `55555`." +msgstr "The port used to connect to your VBox via UPnP when accessed from the local network. Default value is `55555`." + +msgctxt "#30605" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the local network. Default value is `3`." +msgstr "The value used (in seconds) to denote when a connection attempt has failed when accessed from the local network. Default value is `3`." + +msgctxt "#30606" +msgid "The IP address or hostname of your VBox when accessed from the internet." +msgstr "The IP address or hostname of your VBox when accessed from the internet." + +msgctxt "#30607" +msgid "The port used to connect to your VBox when accessed from the internet." +msgstr "The port used to connect to your VBox when accessed from the internet." + +msgctxt "#30608" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the internet. The default `0` means this is disabled and HTTP will be used instead." +msgstr "The port used to connect to your VBox if using HTTPS when accessed from the internet. The default `0` means this is disabled and HTTP will be used instead." + +msgctxt "#30609" +msgid "The port used to connect to your VBox via UPnP when accessed from the internet. Default value is `55555`." +msgstr "The port used to connect to your VBox via UPnP when accessed from the internet. Default value is `55555`." + +msgctxt "#30610" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the internet. Default value is `10`." +msgstr "The value used (in seconds) to denote when a connection attempt has failed when accessed from the internet. Default value is `10`." + +msgctxt "#30620" +msgid "Settings related to Channels & EPG." +msgstr "Settings related to Channels & EPG." + +msgctxt "#30621" +msgid "Channel numbers can be set via either of the following two options: [LCN (Logical Channel Number) from backend] The channel numbers as set on the backend; [Channel index in backend] Starting from 1 number the channels as per the order they appear on the backend." +msgstr "Channel numbers can be set via either of the following two options: [LCN (Logical Channel Number) from backend] The channel numbers as set on the backend; [Channel index in backend] Starting from 1 number the channels as per the order they appear on the backend." + +msgctxt "#30622" +msgid "The amount of time in minutes prior to a programme start that a reminder should pop up." +msgstr "The amount of time in minutes prior to a program start that a reminder should pop up." + +msgctxt "#30623" +msgid "Ignore the initial EPG load. Enabled by default to prevent crash issues on LibreElec/CoreElec." +msgstr "Ignore the initial EPG load. Enabled by default to prevent crash issues on LibreElec/CoreElec." + +msgctxt "#30640" +msgid "Settings related to the timeshift." +msgstr "Settings related to the timeshift." + +msgctxt "#30641" +msgid "If enabled allows pause, rewind and fast-forward of live TV." +msgstr "If enabled allows pause, rewind and fast-forward of live TV." + +msgctxt "#30642" +msgid "The path where the timeshift buffer files should be stored when timeshifting is enabled. Make sure you have a reasonable amount of disk space available since the buffer will grow indefinitely until you stop watching or switch channels." +msgstr "The path where the timeshift buffer files should be stored when timeshifting is enabled. Make sure you have a reasonable amount of disk space available since the buffer will grow indefinitely until you stop watching or switch channels." diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.eo/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.eo/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.eo/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.eo/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: VBox TV Gateway PVR Client +# Addon id: pvr.vbox +# Addon Provider: Sam Stenvall +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Esperanto (http://www.transifex.com/projects/p/kodi-main/language/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Local network" +msgstr "LAN" + +msgctxt "#30007" +msgid "Internet" +msgstr "Interreto" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.es_ar/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.es_ar/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.es_ar/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.es_ar/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,14 +16,30 @@ "Language: es_AR\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Local network" +msgstr "Red local" + msgctxt "#30002" msgid "HTTP port" msgstr "Puerto HTTP" -msgctxt "#30200" +msgctxt "#30006" +msgid "Connection" +msgstr "Conexión" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Canales" + +msgctxt "#30040" msgid "Timeshift" msgstr "Timeshift" -msgctxt "#30202" +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "Ruta del buffer de Timeshift" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.es_es/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.es_es/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.es_es/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.es_es/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Conexión (interna)" +msgid "Local network" +msgstr "Red local" msgctxt "#30001" msgid "Hostname or IP address" @@ -33,41 +33,65 @@ msgstr "Puerto UPnP" msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Tiempo de espera para conexión (segundos)" +msgid "Connection timeout" +msgstr "Tiempo de expiración de conexión" msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Puerto HTTPS (dejar vacío para utilizar simple HTTP)" +msgid "HTTPS port (set to 0 to use plain HTTP)" +msgstr "Puerto HTTPS (0 para usar HTTP)" -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Conexión (externa)" +msgctxt "#30006" +msgid "Connection" +msgstr "Conexión" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30020" +msgid "Channel & EPG" +msgstr "Canal y EPG" + +msgctxt "#30021" +msgid "Channels" +msgstr "Canales" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Usar XMLTV externo" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Ruta XMLTV externa" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Preferir EPG externo vía OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Usar iconos de canal del XMLTV externo" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Poner los números de canal por" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Número Lógico de Canal) desde el backend" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Índice de canales en el backend" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Tiempo de Recuerdame (minutos antes de que empiece el programa)" + +msgctxt "#30027" +msgid "Skip initial EPG load" +msgstr "Saltar carga inicial de EPG" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Timeshift" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Habilitar timeshifting" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Ruta del buffer de Timeshift" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Dispositivo VBox reescaneando EPG (tardará un rato)" @@ -76,14 +100,6 @@ msgid "Sync EPG" msgstr "Sincronizar EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Número Lógico de Canal) desde el backend" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Índice de canales en el backend" - msgctxt "#30110" msgid "Remind me" msgstr "Recuerdame" @@ -100,18 +116,74 @@ msgid "Cancel all the channel's reminders" msgstr "Cancelar los Recuerdame de todos los canales" -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Tiempo de Recuerdame (minutos antes de que empiece el programa)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Timeshift" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Habilitar timeshifting" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Ruta del buffer de Timeshift" +msgctxt "#30600" +msgid "Contains settings for connecting to the VBox device from both your local network and from the internet. A local connection will be attempted first and if unsuccessful the internet settings will be used." +msgstr "Ajustes para conectar el dispositivo VBox por red local o por internet. Primero intenta la conexión local y si falla se usan los ajustes de internet." + +msgctxt "#30601" +msgid "The IP address or hostname of your VBox when accessed from the local network." +msgstr "Dirección IP o nombre de la VBox cuando se accede por red local." + +msgctxt "#30602" +msgid "The port used to connect to your VBox when accessed from the local network. Default value is `80`." +msgstr "Puerto usado para conectar la VBox cuando se accede por red local. Por defecto es '80'." + +msgctxt "#30603" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the local network. The default `0` means this is disabled and HTTP will be used instead." +msgstr "Puerto usado para conectar la VBox si se usa HTTPS por red local. Por defecto es '0', que lo desactiva y se usa HTTP." + +msgctxt "#30604" +msgid "The port used to connect to your VBox via UPnP when accessed from the local network. Default value is `55555`." +msgstr "Puerto usado para conectar la VBox vía UPnP cuando se accede por red local. Por defecto es '55555'." + +msgctxt "#30605" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the local network. Default value is `3`." +msgstr "El valor usado (en segundos) para considerar que el intento de conexión ha fallado cuando se accede por red local. Por defecto es '3'." + +msgctxt "#30606" +msgid "The IP address or hostname of your VBox when accessed from the internet." +msgstr "Dirección IP o nombre de la VBox cuando se accede por internet." + +msgctxt "#30607" +msgid "The port used to connect to your VBox when accessed from the internet." +msgstr "Puerto usado para conectar la VBox cuando se accede por internet." + +msgctxt "#30608" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the internet. The default `0` means this is disabled and HTTP will be used instead." +msgstr "Puerto usado para conectar la VBox si se usa HTTPS por internet. Por defecto es '0', que lo desactiva y se usa HTTP." + +msgctxt "#30609" +msgid "The port used to connect to your VBox via UPnP when accessed from the internet. Default value is `55555`." +msgstr "Puerto usado para conectar la VBox vía UPnP cuando se accede por internet. Por defecto es '55555'." + +msgctxt "#30610" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the internet. Default value is `10`." +msgstr "El valor usado (en segundos) para considerar que el intento de conexión ha fallado cuando se accede por internet. Por defecto es '10'." + +msgctxt "#30620" +msgid "Settings related to Channels & EPG." +msgstr "Ajustes relacionados con Canales y EPG." + +msgctxt "#30621" +msgid "Channel numbers can be set via either of the following two options: [LCN (Logical Channel Number) from backend] The channel numbers as set on the backend; [Channel index in backend] Starting from 1 number the channels as per the order they appear on the backend." +msgstr "El número de los canales se puede establecer de dos maneras: [LCN (Numero Lógico de Canal) desde el servidor] El número se ponen como en el servidor; [Índice de Canal en servidor] Empezando por el 1, siguiendo el orden en el que aparecen en el servidor." + +msgctxt "#30622" +msgid "The amount of time in minutes prior to a programme start that a reminder should pop up." +msgstr "La cantidad de tiempo en minutos antes de que empiece un programa en que saltará un recordatorio." + +msgctxt "#30623" +msgid "Ignore the initial EPG load. Enabled by default to prevent crash issues on LibreElec/CoreElec." +msgstr "Ignora la carga inicial de EPG. Activado por defecto para prevenir errores y caidas en LibreElec/CoreElec." + +msgctxt "#30640" +msgid "Settings related to the timeshift." +msgstr "Ajustes relacionados con TimeShift." + +msgctxt "#30641" +msgid "If enabled allows pause, rewind and fast-forward of live TV." +msgstr "Si se activa permite parar, rebobinar y avanzar la TV en directo." + +msgctxt "#30642" +msgid "The path where the timeshift buffer files should be stored when timeshifting is enabled. Make sure you have a reasonable amount of disk space available since the buffer will grow indefinitely until you stop watching or switch channels." +msgstr "La ruta donde se guardarán los archivos de vídeo cuando se activa TimeShift. Asegúrate de que hay una cantidad razonable de espacio en disco, porque el tamaño de los archivos puede crecer indefinidamente hasta que cambies de canal o apagues." diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.es_mx/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.es_mx/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.es_mx/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.es_mx/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Conexión (interna)" +msgid "Local network" +msgstr "Red Local" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "Puerto UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Tiempo de espera de la conexión (segundos)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Puerto HTTPS (deje vacío para utilizar HTTP normal)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Conexión (externa)" +msgctxt "#30006" +msgid "Connection" +msgstr "Conexión" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Canales" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Utilizar XMLTV externo" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Ruta de XMLTV externa" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Preferir EPG externo sobre OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Usar los iconos de canal de XMLTV externo" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Números de canales establecidos por" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logical Channel Number) de la fuente" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Índice de canales en la fuente" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Tiempo de recordatorio (minutos antes del inicio del programa)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Cambio de hora" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Habilitar el Cambio de hora" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Ruta del buffer de TimeShift" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "El dispositivo VBox vuelve a explorar el EPG (tardará un tiempo)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Sync EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logical Channel Number) de la fuente" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Índice de canales en la fuente" - msgctxt "#30110" msgid "Remind me" msgstr "Recuerdame" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Cancelar todos los recordatorios del canal" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Tiempo de recordatorio (minutos antes del inicio del programa)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Cambio de hora" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Habilitar el Cambio de hora" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Ruta del buffer de TimeShift" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.et_ee/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.et_ee/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.et_ee/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.et_ee/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,10 +16,26 @@ "Language: et_EE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Local network" +msgstr "Kohtvõrk" + msgctxt "#30002" msgid "HTTP port" msgstr "HTTP port" -msgctxt "#30202" +msgctxt "#30006" +msgid "Connection" +msgstr "Ühendus" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanalid" + +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "Ajanihke puhverduse rada" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.eu_es/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.eu_es/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.eu_es/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.eu_es/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,6 +16,10 @@ "Language: eu_ES\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Local network" +msgstr "Sare lokala" + msgctxt "#30001" msgid "Hostname or IP address" msgstr "Ostalari izena edo IP helbidea" @@ -28,6 +32,14 @@ msgid "UPnP port" msgstr "UPnP ataka" -msgctxt "#30200" +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanalak" + +msgctxt "#30040" msgid "Timeshift" msgstr "Denbora aldaketa" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.fa_af/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.fa_af/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.fa_af/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.fa_af/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: VBox TV Gateway PVR Client +# Addon id: pvr.vbox +# Addon Provider: Sam Stenvall +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Persian (Afghanistan) (http://www.transifex.com/projects/p/kodi-main/language/fa_AF/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_AF\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30006" +msgid "Connection" +msgstr "اتصال" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.fa_ir/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.fa_ir/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.fa_ir/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.fa_ir/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,6 +16,18 @@ "Language: fa_IR\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "Local network" +msgstr "شبکه محلی" + msgctxt "#30002" msgid "HTTP port" msgstr "پورت HTTP" + +msgctxt "#30007" +msgid "Internet" +msgstr "اینترنت" + +msgctxt "#30021" +msgid "Channels" +msgstr "کانال ها" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.fi_fi/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.fi_fi/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.fi_fi/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.fi_fi/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Yhteys (sisäinen)" +msgid "Local network" +msgstr "Paikallisverkosta" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "UPnP-portti" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Yhteyden aikakatkaisu (sekuntia)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS-portti (jätä tyhjäksi käyttääksesi HTTP:tä)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Yhteys (ulkoinen)" +msgctxt "#30006" +msgid "Connection" +msgstr "Yhteys" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internetistä" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanavat" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "Ohjelmaopas" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Käytä XMLTV-tiedostoa" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "XMLTV-tiedoston polku" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Suosi lähetyksen mukana tulevaa ohjelmaopasta" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Käytä XMLTV-tiedoston kanavalogoja" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Kanavanumerot lähteestä" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (looginen kanavanumero) taustaosalta" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Taustaosan kanavanumero" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Muistutuksen aika (minuuttia ennen ohjelman alkua)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Ajansiirto" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Käytä ajansiirtoa" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Ajansiirtopuskurin polku" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Lataa VBoxin ohjelmaopas uudelleen (kestää hetken)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Synkronoi ohjelmaopas" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (looginen kanavanumero) taustaosalta" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Taustaosan kanavanumero" - msgctxt "#30110" msgid "Remind me" msgstr "Muistuta minua" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Peruuta kaikki kanavan muistutukset" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Muistutuksen aika (minuuttia ennen ohjelman alkua)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Ajansiirto" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Käytä ajansiirtoa" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Ajansiirtopuskurin polku" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.fo_fo/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.fo_fo/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.fo_fo/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.fo_fo/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: VBox TV Gateway PVR Client +# Addon id: pvr.vbox +# Addon Provider: Sam Stenvall +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Faroese (Faroe Islands) (http://www.transifex.com/projects/p/kodi-main/language/fo_FO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fo_FO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Local network" +msgstr "Lokalt net" + +msgctxt "#30021" +msgid "Channels" +msgstr "Rás" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.fr_ca/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.fr_ca/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.fr_ca/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.fr_ca/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n > 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Connexion (interne)" +msgid "Local network" +msgstr "Réseau Local" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "Port UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Temporisation de connexion (secondes)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Port HTTPS (laisser vide pour utiliser HTTP simple)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Connexion (externe)" +msgctxt "#30006" +msgid "Connection" +msgstr "Connexion" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Chaînes" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "GÉP" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Utiliser XMLTV externe" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Chemin de XMLTV externe" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Préférer le GÉP externe à celui télédiffusé" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Utliser des icônes de chaînes d’un XMLTV externe" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Les numéros de chaînes sont définis par" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "NLC (numéro logique de chaîne) de la dorsale" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "L’index des chaînes de la dorsale" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Heure du rappel (minutes avant le début du programme)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Décalage temporel" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Activer le décalage temporel" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Chemin du tampon de décalage temporel" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Réanalyse du GÉP par l’appareil VBox (prendra un certain temps)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Synchroniser le GÉP" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "NLC (numéro logique de chaîne) de la dorsale" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "L’index des chaînes de la dorsale" - msgctxt "#30110" msgid "Remind me" msgstr "Me rappeler" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Annuler les rappels de toutes les chaînes" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Heure du rappel (minutes avant le début du programme)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Décalage temporel" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Activer le décalage temporel" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Chemin du tampon de décalage temporel" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.fr_fr/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.fr_fr/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.fr_fr/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.fr_fr/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n > 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Connexion (interne)" +msgid "Local network" +msgstr "Réseau local" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "Port UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Temporisation de connexion (secondes)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Port HTTPS (laisser vide pour du simple HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Connexion (externe)" +msgctxt "#30006" +msgid "Connection" +msgstr "Connexion" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Chaînes " -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "Guide électronique des programmes TV" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Utiliser un XMLTV externe" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Chemin du XMLTV externe" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Préférer le guide électronique des programmes TV à celui diffusé" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Utiliser des icônes de chaînes d'un XMLTV externe" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Numéros de chaînes définis par" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "Numéro de chaîne logique (LCN) depuis le serveur" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Index des chaîne du serveur" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Temps de rappel (minutes avant que le programme commence)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Différé" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Activer le différé" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Chemin du tampon pour le différé" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Réanalyse du guide TV par la VBox en cours…" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Synchronisation guide TV" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "Numéro de chaîne logique (LCN) depuis le serveur" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Index des chaîne du serveur" - msgctxt "#30110" msgid "Remind me" msgstr "Me le rappeler" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Annuler tous les rappels de chaînes" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Temps de rappel (minutes avant que le programme commence)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Différé" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Activer le différé" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Chemin du tampon pour le différé" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.gl_es/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.gl_es/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.gl_es/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.gl_es/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Conexión (interna)" +msgid "Local network" +msgstr "Rede local" msgctxt "#30001" msgid "Hostname or IP address" @@ -33,41 +33,61 @@ msgstr "Porto UPnP" msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Tempo de espera da conexión (segundos)" +msgid "Connection timeout" +msgstr "Tempo de espera" msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Porto HTTPS (deixar baleiro para empregar HTTP)" +msgid "HTTPS port (set to 0 to use plain HTTP)" +msgstr "Porto HTTPS (deixar 0 para empregar HTTP)" -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Conexión (externa)" +msgctxt "#30006" +msgid "Connection" +msgstr "Conexión" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30020" +msgid "Channel & EPG" +msgstr "Canle & EPG" + +msgctxt "#30021" +msgid "Channels" +msgstr "Canles" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "Guía" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Empregar XMLTV externo" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Ruta do XMLTV externo" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Preferir EPG externo sobre OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Empregar as iconas das canles do XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Números de canles definidos por" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Número de canle lóxico) dende o motor" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Índice de canais no servidor" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Tempo de recordatorio (minutos antes de que comece o programa)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Timeshift" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Activar timeshifting" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Ruta do búfer do Timeshift" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Volver a procurar a guía EPG do dispositivo VBox (tardará un rato)" @@ -76,14 +96,6 @@ msgid "Sync EPG" msgstr "Sincronizar Guía" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Número de canle lóxico) dende o motor" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Índice de canais no servidor" - msgctxt "#30110" msgid "Remind me" msgstr "Lémbrame" @@ -99,19 +111,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Cancelar tódolos recordatorios da canle" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Tempo de recordatorio (minutos antes de que comece o programa)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Timeshift" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Activar timeshifting" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Ruta do búfer do Timeshift" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.he_il/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.he_il/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.he_il/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.he_il/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "חיבור (פנימי)" +msgid "Local network" +msgstr "רשת מקומית" msgctxt "#30001" msgid "Hostname or IP address" @@ -33,41 +33,65 @@ msgstr "פורט UPnP" msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "זמן מירבי לניסיון חיבור (שנ')" +msgid "Connection timeout" +msgstr "תום זמן החיבור" msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "פורט HTTPS (לשימוש ב־HTTP יש להשאיר ריק)" +msgid "HTTPS port (set to 0 to use plain HTTP)" +msgstr "פתחת HTTPS (יש להגדיר ל־0 כדי להשתמש ב־HTTP פשוט)" -msgctxt "#30050" -msgid "Connection (external)" -msgstr "חיבור (חיצוני)" +msgctxt "#30006" +msgid "Connection" +msgstr "חיבור" + +msgctxt "#30007" +msgid "Internet" +msgstr "אינטרנט" + +msgctxt "#30020" +msgid "Channel & EPG" +msgstr "ערוץ ו־EPG" + +msgctxt "#30021" +msgid "Channels" +msgstr "ערוצים" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "לוח שידורים" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "השתמש ב־XMLTV חיצוני" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "נתיב XMLTV חיצוני" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "העדף לוח שידורים חיצוני ע\"פ לוח המצורף לשידור" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "השתמש בסמלי ערוצים מ־XMLTV חיצוני" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "מספור ערוצים לפי" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "מספור ערוצים לוגים מהמכשיר" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "אינדקס ערוצים מהמכשיר" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "זמן נותר (דקות לפני שהתוכנית מתחילה)" + +msgctxt "#30027" +msgid "Skip initial EPG load" +msgstr "דילוג על טעינה ראשונית של EPG" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "הסט זמן" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "אפשר טיימשיפט" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "נתיב חוצץ טיימשיפט" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "סריקה מחדש של לוח השידורים בעזרת המכשיר (יקח קצת זמן)" @@ -76,14 +100,6 @@ msgid "Sync EPG" msgstr "סנכרן לוח שידורים" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "מספור ערוצים לוגים מהמכשיר" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "אינדקס ערוצים מהמכשיר" - msgctxt "#30110" msgid "Remind me" msgstr "הזכר לי" @@ -100,18 +116,50 @@ msgid "Cancel all the channel's reminders" msgstr "בטל את כל התיזכורים של הערוץ" -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "זמן נותר (דקות לפני שהתוכנית מתחילה)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "טיימשיפט" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "אפשר טיימשיפט" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "נתיב חוצץ טיימשיפט" +msgctxt "#30600" +msgid "Contains settings for connecting to the VBox device from both your local network and from the internet. A local connection will be attempted first and if unsuccessful the internet settings will be used." +msgstr "מכיל הגדרות להתחברות להתקן ה־VBox מהרשת המקומית ומהאינטרנט. תחילה יתבצע ניסיון להתחברות מקומית ואם זה לא צולח אז יתבצע ניסיון עם הגדרות הגישה דרך האינטרנט." + +msgctxt "#30601" +msgid "The IP address or hostname of your VBox when accessed from the local network." +msgstr "כתובת ה־IP או שם המארח של מכונת ה־VBox הווירטואלית שלך בעת גישה מהרשת המקומית." + +msgctxt "#30602" +msgid "The port used to connect to your VBox when accessed from the local network. Default value is `80`." +msgstr "הפתחה שמיועדת להתחברות ל־VBox שלך בעת גישה מהרשת המקומית. ערך בררת המחדל הוא `80`." + +msgctxt "#30603" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the local network. The default `0` means this is disabled and HTTP will be used instead." +msgstr "הפתחה שמיועדת להתחברות ל־VBox באמצעות HTTPS שלך בעת גישה מהרשת המקומית. בררת המחדל היא `0`, כלומר שהתכונה הזו מושבתת וייעשה שימוש ב־HTTP במקום." + +msgctxt "#30604" +msgid "The port used to connect to your VBox via UPnP when accessed from the local network. Default value is `55555`." +msgstr "הפתחה שמיועדת להתחברות ל־VBox שלך דרך UPnP בעת גישה מהרשת המקומית. ערך בררת המחדל הוא `55555`." + +msgctxt "#30605" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the local network. Default value is `3`." +msgstr "הערך (בשניות) שמציין מתי ניסיון חיבור נכשל בעת גישה מהרשת המקומית. בררת המחדל היא `3`." + +msgctxt "#30606" +msgid "The IP address or hostname of your VBox when accessed from the internet." +msgstr "כתובת ה־IP או שם המארח של ה־VBox שלך בגישה דרך האינטרנט." + +msgctxt "#30607" +msgid "The port used to connect to your VBox when accessed from the internet." +msgstr "הפתחה שמיועדת לחיבור ל־VBox שלך בעת גישה מהאינטרנט." + +msgctxt "#30608" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the internet. The default `0` means this is disabled and HTTP will be used instead." +msgstr "הפתחה שמיועדת להתחברות ל־VBox באמצעות HTTPS שלך בעת גישה מהאינטרנט. בררת המחדל היא `0`, כלומר שהתכונה הזו מושבתת וייעשה שימוש ב־HTTP במקום." + +msgctxt "#30609" +msgid "The port used to connect to your VBox via UPnP when accessed from the internet. Default value is `55555`." +msgstr "הפתחה שמיועדת להתחברות ל־VBox שלך דרך UPnP בעת גישה מהאינטרנט. ערך בררת המחדל הוא `55555`." + +msgctxt "#30610" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the internet. Default value is `10`." +msgstr "הערך (בשניות) שמציין מתי ניסיון חיבור נכשל בעת גישה מהאינטרנט. בררת המחדל היא `10`." + +msgctxt "#30620" +msgid "Settings related to Channels & EPG." +msgstr "הגדרות שקשורות בערוצים וב־EPG" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.hi_in/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.hi_in/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.hi_in/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.hi_in/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: VBox TV Gateway PVR Client +# Addon id: pvr.vbox +# Addon Provider: Sam Stenvall +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hindi (India) (http://www.transifex.com/projects/p/kodi-main/language/hi_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hi_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Local network" +msgstr "स्थानीय नेटवर्क" + +msgctxt "#30007" +msgid "Internet" +msgstr "इंटरनेट" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.hr_hr/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.hr_hr/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.hr_hr/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.hr_hr/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Povezivanje (vanjsko)" +msgid "Local network" +msgstr "Lokalna mreža" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "UPnP ulaz" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Istek povezivanja (sekunde)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS ulaz (ostavi parazno za korištenje HTTP-a)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Povezivanje (vanjsko)" +msgctxt "#30006" +msgid "Connection" +msgstr "Povezivanje" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Programi" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG vodič" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Koristi vanjski XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Putanja vanjskog XMLTV-a" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Preferiraj vanjski EPG preko (OTA) tv signala" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Koristi ikone programa iz vanjskog XMLTV-a" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Brojeve programa postavi po" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logičan broj programa) s pozadinskog softvera" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Sadržaj programa u pozadinskom softveru" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Vrijeme podsjetnika (minuta prije nego program započne)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Vremensko premotavanje" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Omogući vremensko premotavanje" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Putanja međuspremnika premotavanja u vremenu" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Ponovno pretraživanje EPG vodiča VBox uređaja (može potrajati neko vrijeme)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Uskladi EPG vodič" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logičan broj programa) s pozadinskog softvera" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Sadržaj programa u pozadinskom softveru" - msgctxt "#30110" msgid "Remind me" msgstr "Podsjeti me" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Poništi sve podsjetnike programa" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Vrijeme podsjetnika (minuta prije nego program započne)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Vremensko premotavanje" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Omogući vremensko premotavanje" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Putanja međuspremnika premotavanja u vremenu" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.hu_hu/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.hu_hu/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.hu_hu/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.hu_hu/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Kapcsolat (belső)" +msgid "Local network" +msgstr "Helyi hálózat" msgctxt "#30001" msgid "Hostname or IP address" @@ -33,41 +33,65 @@ msgstr "UPnP port" msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Kapcsolódási időtúllépés (mp.)" +msgid "Connection timeout" +msgstr "Kapcsolat időtúllépés" msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS port (hagyja üresen a HTTP használatához)" +msgid "HTTPS port (set to 0 to use plain HTTP)" +msgstr "HTTPS port (0 az alap HTTP)" -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Kapcsolat (külső)" +msgctxt "#30006" +msgid "Connection" +msgstr "Kapcsolat" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30020" +msgid "Channel & EPG" +msgstr "Csatorna és EPG" + +msgctxt "#30021" +msgid "Channels" +msgstr "Csatornák" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Külső XMLTV használata" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Külső XMLTV útvonal" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Külső EPG adatok előbyen részesítése OTA-n." - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Az XMLTV által adott csatorna ikonok használata" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Csatornaszámozás ez alapján:" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logikai csatornaszám) a háttérrendszertől" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Csatornaszámozás a háttérrendszerben" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Emlékeztetési idő (percekben a műsor kezdete előtt)" + +msgctxt "#30027" +msgid "Skip initial EPG load" +msgstr "Kezdeti EPG-betöltés átugrása" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Csúsztatott felvétel" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Csúsztatott élőkép engedélyezése" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Csúsztatott élőkép tároló útvonala" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "VBox eszköz EPG újrapásztázás (eltart egy darabig)" @@ -76,14 +100,6 @@ msgid "Sync EPG" msgstr "EPG szincronizálása" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logikai csatornaszám) a háttérrendszertől" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Csatornaszámozás a háttérrendszerben" - msgctxt "#30110" msgid "Remind me" msgstr "Emlékeztető" @@ -100,18 +116,74 @@ msgid "Cancel all the channel's reminders" msgstr "A csatorna összes emlékeztetőjének törlése" -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Emlékeztetési idő (percekben a műsor kezdete előtt)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Csúsztatott felvétel" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Csúsztatott élőkép engedélyezése" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Csúsztatott élőkép tároló útvonala" +msgctxt "#30600" +msgid "Contains settings for connecting to the VBox device from both your local network and from the internet. A local connection will be attempted first and if unsuccessful the internet settings will be used." +msgstr "A VBox készülékhez való csatlakozáshoz szükséges beállításokat tartalmazza mind a helyi hálózatról, mind az internetről. Először megkísérli a helyi kapcsolatot, és ha sikertelen, akkor az internetbeállításokat fogja használni." + +msgctxt "#30601" +msgid "The IP address or hostname of your VBox when accessed from the local network." +msgstr "A VBox IP-címe vagy gazdaneve, amikor a helyi hálózatról érik el." + +msgctxt "#30602" +msgid "The port used to connect to your VBox when accessed from the local network. Default value is `80`." +msgstr "A VBox csatlakozásához használt port, amikor a helyi hálózatról érik el. Az alapértelmezett érték: 80." + +msgctxt "#30603" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the local network. The default `0` means this is disabled and HTTP will be used instead." +msgstr "A VBox csatlakozásához használt port ha HTTPS-t használ, amikor a helyi hálózatról érkezik. Az alapértelmezett \"0\" azt jelenti, hogy ez le van tiltva, és helyette a HTTP lesz használatban." + +msgctxt "#30604" +msgid "The port used to connect to your VBox via UPnP when accessed from the local network. Default value is `55555`." +msgstr "Az a port, amely UPnP-n keresztül csatlakozik a VBox-hoz amikor a helyi hálózatról érik el. Az alapértelmezett érték: 55555." + +msgctxt "#30605" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the local network. Default value is `3`." +msgstr "Az az érték (másodpercben), amely jelzi ha helyi hálózatról a csatlakozási kísérlet sikertelen volt. Az alapértelmezett érték \"3\"." + +msgctxt "#30606" +msgid "The IP address or hostname of your VBox when accessed from the internet." +msgstr "A VBox IP-címe vagy gazdaneve, ha az internetről fér hozzá." + +msgctxt "#30607" +msgid "The port used to connect to your VBox when accessed from the internet." +msgstr "A VBox satlakozásához használt port, amikor az internetről van hozzáférés." + +msgctxt "#30608" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the internet. The default `0` means this is disabled and HTTP will be used instead." +msgstr "A VBox csatlakozásához használt port ha HTTPS-t használ amikor az internetről fér hozzá. Az alapértelmezett \"0\" azt jelenti, hogy ez le van tiltva és helyette a HTTP lesz használatban." + +msgctxt "#30609" +msgid "The port used to connect to your VBox via UPnP when accessed from the internet. Default value is `55555`." +msgstr "Az a port amellyel az UPnP-n keresztül csatlakozik a VBox-hoz, amikor az internetről hozzáfér. Az alapértelmezett érték: 55555." + +msgctxt "#30610" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the internet. Default value is `10`." +msgstr "Az az érték (másodpercben) amely azt jelzi ha egy csatlakozási kísérlet sikertelen volt, ha az internetről érkezett. Az alapértelmezett érték: 10." + +msgctxt "#30620" +msgid "Settings related to Channels & EPG." +msgstr "A csatornákkal és az EPG-vel kapcsolatos beállítások." + +msgctxt "#30621" +msgid "Channel numbers can be set via either of the following two options: [LCN (Logical Channel Number) from backend] The channel numbers as set on the backend; [Channel index in backend] Starting from 1 number the channels as per the order they appear on the backend." +msgstr "A csatornaszámok a következő két lehetőség valamelyikével állíthatók be: [LCN (Logical Channel Number) a háttérből] A csatornaszámok a háttérben állnak; [Csatornaindex a háttérben] Az 1-től kezdve számozza a csatornákat a háttérrendszerben megjelenő sorrend szerint." + +msgctxt "#30622" +msgid "The amount of time in minutes prior to a programme start that a reminder should pop up." +msgstr "Emlékeztető megjelenítése, a program futtatásához szükséges idő percben." + +msgctxt "#30623" +msgid "Ignore the initial EPG load. Enabled by default to prevent crash issues on LibreElec/CoreElec." +msgstr "Figyelmen kívül hagyja a kezdeti EPG-terhelést. Alapértelmezésben engedélyezve, hogy megakadályozzák a LibreElec / CoreElec összeomlását." + +msgctxt "#30640" +msgid "Settings related to the timeshift." +msgstr "A csúsztatott felvételhez (timeshift) kapcsolódó beállítások." + +msgctxt "#30641" +msgid "If enabled allows pause, rewind and fast-forward of live TV." +msgstr "Ha az engedélyezve van,akkor lehetővé teszi a szüneteltetést, a visszatekerést és az előrehaladást élő adás esetén." + +msgctxt "#30642" +msgid "The path where the timeshift buffer files should be stored when timeshifting is enabled. Make sure you have a reasonable amount of disk space available since the buffer will grow indefinitely until you stop watching or switch channels." +msgstr "Az az útvonal ahova az időeltolásos pufferfájlokat tárolni kell amikor az időeltolás (timeshift) engedélyezve van. Győződjön meg róla, hogy van elegendő szabad lemezterület mivel a puffer határozatlan ideig növekszik amíg meg nem állítja a nézést vagy csatornaváltást." diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.hy_am/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.hy_am/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.hy_am/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.hy_am/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: VBox TV Gateway PVR Client +# Addon id: pvr.vbox +# Addon Provider: Sam Stenvall +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Armenian (Armenia) (http://www.transifex.com/projects/p/kodi-main/language/hy_AM/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy_AM\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Local network" +msgstr "Լոկալ ցանց" + +msgctxt "#30007" +msgid "Internet" +msgstr "Համացանց" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.id_id/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.id_id/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.id_id/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.id_id/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=1; plural=0;\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Koneksi (intern)" +msgid "Local network" +msgstr "LAN" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,46 +32,30 @@ msgid "UPnP port" msgstr "Soket UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Koneksi timeout (detik)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Soket HTTPS (biarkan kosong untuk menggunakan HTTP polos)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Koneksi (eksternal)" +msgctxt "#30006" +msgid "Connection" +msgstr "Koneksi" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Saluran" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG " -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Gunakan XMLTV eksternal" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Jalur XMLTV eksternal" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Pilih EPG eksternal melalui OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Gunakan ikon saluran dari XMLTV eksternal" - -msgctxt "#30200" +msgctxt "#30040" msgid "Timeshift" msgstr "Pergeseran waktu" -msgctxt "#30201" +msgctxt "#30041" msgid "Enable timeshifting" msgstr "Aktifkan pergeseran waktu" -msgctxt "#30202" +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "Path penyangga Timeshift" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.is_is/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.is_is/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.is_is/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.is_is/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Tenging (innbyggð)" +msgid "Local network" +msgstr "Staðarnet" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "UPnP-gátt" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Tengitími rennur út (sekúndur)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS-gátt (hafa autt til að nota venjulegt HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Tenging (útvær)" +msgctxt "#30006" +msgid "Connection" +msgstr "Tenging" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Rásir" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "Rafrænn EPG-sjónvarpsvísir" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Nota ytri XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Slóð að ytri XMLTV" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Taka útværa dagskrárvísa framyfir upphaflega" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Rása-táknmyndir frá útværu XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Nota rásanúmer frá" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logical Channel Number) frá bakenda" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Rásaröðun í bakenda" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Tími áminningar (mínútur fyrir upphaf dagskrárliðs)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Tímaflakk" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Virkja tímaflakk" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Slóð á biðminni tímahliðrunar" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Endurskönnun VBox-tækis á EPG-dagskrárvísi (mun taka dálítinn tíma)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Samstilla EPG-dagskrárvísi" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logical Channel Number) frá bakenda" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Rásaröðun í bakenda" - msgctxt "#30110" msgid "Remind me" msgstr "Áminna mig" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Hætta við allar áminningar rása" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Tími áminningar (mínútur fyrir upphaf dagskrárliðs)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Tímaflakk" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Virkja tímaflakk" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Slóð á biðminni tímahliðrunar" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.it_it/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.it_it/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.it_it/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.it_it/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Connessione (interna)" +msgid "Local network" +msgstr "Rete locale" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "Porta UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Timeout Connessione (secondi)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Porta HTTPS (lasciare vuoto per usare HTTP base)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Connessione (esterna)" +msgctxt "#30006" +msgid "Connection" +msgstr "Connessione" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Canali" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Usa un XMLTV esterno" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Percorso XMLTV esterno" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Preferisci l'EPG esterno a quello OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Usa loghi canale da XMLTV esterno" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Numeri Canali impostati da" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logical Channel Number) dal backend" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Indice Canali nel backend" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Orario promemoria (minuti prima che il programma inizi)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Timeshift" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Abilita il timeshifting" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Path per il buffer del timeshift" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Riscansiona EPG dispositivo VBox (può richiedere tempo)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Sincronizza EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logical Channel Number) dal backend" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Indice Canali nel backend" - msgctxt "#30110" msgid "Remind me" msgstr "Ricordamelo" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Cancella tutti i promemoria del canale" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Orario promemoria (minuti prima che il programma inizi)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Timeshift" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Abilita il timeshifting" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Percorso per il buffer del timeshift" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ja_jp/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ja_jp/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ja_jp/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ja_jp/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,10 +16,70 @@ "Language: ja_JP\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "Local network" +msgstr "ローカル ネットワーク" + +msgctxt "#30001" +msgid "Hostname or IP address" +msgstr "ホスト名かIPアドレス" + msgctxt "#30002" msgid "HTTP port" msgstr "HTTP ポート" -msgctxt "#30202" +msgctxt "#30003" +msgid "UPnP port" +msgstr "UPnPポート" + +msgctxt "#30006" +msgid "Connection" +msgstr "接続" + +msgctxt "#30007" +msgid "Internet" +msgstr "インターネット" + +msgctxt "#30021" +msgid "Channels" +msgstr "チャンネル" + +msgctxt "#30022" +msgid "EPG" +msgstr "EPG" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "あとで通知の時間 (プログラム開始の数分前)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "タイムシフト" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "タイムシフト有効" + +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "タイムシフト用バッファのパス" + +msgctxt "#30107" +msgid "Sync EPG" +msgstr "EPGと同期" + +msgctxt "#30110" +msgid "Remind me" +msgstr "あとで通知" + +msgctxt "#30111" +msgid "Manual reminder" +msgstr "手動であとで通知" + +msgctxt "#30112" +msgid "Cancel reminder (if exists)" +msgstr "あとで通知をキャンセル(あるなら)" + +msgctxt "#30113" +msgid "Cancel all the channel's reminders" +msgstr "すべてのチャンネルであとで通知をキャンセル" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ko_kr/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ko_kr/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ko_kr/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ko_kr/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=1; plural=0;\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "연결 (내부)" +msgid "Local network" +msgstr "로컬 네트워크" msgctxt "#30001" msgid "Hostname or IP address" @@ -33,41 +33,65 @@ msgstr "UPnP 포트" msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "연결 시간 제한 (초)" +msgid "Connection timeout" +msgstr "연결 시간 초과" msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS 포트 (HTTP를 사용하면 공란)" +msgid "HTTPS port (set to 0 to use plain HTTP)" +msgstr "HTTPS 포트 (단순 HTTP를 사용하려면 0으로 설정)" -msgctxt "#30050" -msgid "Connection (external)" -msgstr "연결 (외부)" +msgctxt "#30006" +msgid "Connection" +msgstr "연결" + +msgctxt "#30007" +msgid "Internet" +msgstr "인터넷" + +msgctxt "#30020" +msgid "Channel & EPG" +msgstr "체널과 EPG" + +msgctxt "#30021" +msgid "Channels" +msgstr "채널" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "외부 XMLTV 사용" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "외부 XMLTV 경로" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "OTA를 통한 외부 EPG 우선" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "외부 XMLTV의 채널 아이콘 사용" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "설정된 채널 수" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "백엔드의 LCN (Logical Channel Number)" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "백엔드의 채널 인덱스" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "시간 알리기 (프로그램이 시작하기 수 분전)" + +msgctxt "#30027" +msgid "Skip initial EPG load" +msgstr "초기 EPG 읽기 건너뜀" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "타임시프트" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "타임시프트 사용" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "타임시프트 버퍼 경로" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "EPG의 VBox 장치 다시 검색 (시간이 걸림)" @@ -76,14 +100,6 @@ msgid "Sync EPG" msgstr "EPG 동기화" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "백엔드의 LCN (Logical Channel Number)" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "백엔드의 채널 인덱스" - msgctxt "#30110" msgid "Remind me" msgstr "알리기" @@ -100,18 +116,74 @@ msgid "Cancel all the channel's reminders" msgstr "모든 채널의 알리기 취소" -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "시간 알리기 (프로그램이 시작하기 수 분전)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "타임시프트" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "타임시프트 사용" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "타임시프트 버퍼 경로" +msgctxt "#30600" +msgid "Contains settings for connecting to the VBox device from both your local network and from the internet. A local connection will be attempted first and if unsuccessful the internet settings will be used." +msgstr "로컬 네트워크와 인터넷에서 VBox 장치에 연결하는 설정을 포함합니다. 로컬 네트워크를 먼저 시도하고 안되면 인터넷 설정이 사용됩니다." + +msgctxt "#30601" +msgid "The IP address or hostname of your VBox when accessed from the local network." +msgstr "로컬 네트워크에서 접속할 VBox의 IP 주소나 호스트명." + +msgctxt "#30602" +msgid "The port used to connect to your VBox when accessed from the local network. Default value is `80`." +msgstr "로컬 네트워크에서 VBox 연결에 사용할 포트. 기본값은 `80`." + +msgctxt "#30603" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the local network. The default `0` means this is disabled and HTTP will be used instead." +msgstr "HTTPS를 사용할 때 로컬 네트워크에서 VBox 연결에 사용할 포트. 기본값 `0`은 HTTP가 대신 사용됨." + +msgctxt "#30604" +msgid "The port used to connect to your VBox via UPnP when accessed from the local network. Default value is `55555`." +msgstr "로컬 네트워크에서 UPnP로 VBox에 연결할 포트. 기본값은 `55555`." + +msgctxt "#30605" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the local network. Default value is `3`." +msgstr "로컬 네트워크에서 연결 실패에 사용할 값 (초). 기본값은 `3`." + +msgctxt "#30606" +msgid "The IP address or hostname of your VBox when accessed from the internet." +msgstr "인터넷에서 접속할 VBox의 IP 주소나 호스트명." + +msgctxt "#30607" +msgid "The port used to connect to your VBox when accessed from the internet." +msgstr "인터넷에서 접속할 VBox의 포트." + +msgctxt "#30608" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the internet. The default `0` means this is disabled and HTTP will be used instead." +msgstr "HTTPS를 사용할 때 인터넷에서 VBox 연결에 사용할 포트. 기본값 `0`은 HTTP가 대신 사용됨." + +msgctxt "#30609" +msgid "The port used to connect to your VBox via UPnP when accessed from the internet. Default value is `55555`." +msgstr "인터넷에서 UPnP로 VBox에 연결할 포트. 기본값은 `55555`." + +msgctxt "#30610" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the internet. Default value is `10`." +msgstr "인터넷에서 연결 실패에 사용할 값 (초). 기본값은 `10`." + +msgctxt "#30620" +msgid "Settings related to Channels & EPG." +msgstr "채널과 EPG 관련 설정" + +msgctxt "#30621" +msgid "Channel numbers can be set via either of the following two options: [LCN (Logical Channel Number) from backend] The channel numbers as set on the backend; [Channel index in backend] Starting from 1 number the channels as per the order they appear on the backend." +msgstr "다음 두 옵션으로 설정하는 채널 번호: [백엔드의 LCN(로컬 채널 번호)] 백엔드에 설정된 채널 번호; [백엔드의 채널 색인] 백엔드에 보이는 순서에 따라서 1부터 시작된 채널 숫자." + +msgctxt "#30622" +msgid "The amount of time in minutes prior to a programme start that a reminder should pop up." +msgstr "프로그램을 시작하기 이 분 시간 전에 알림이 열립니다." + +msgctxt "#30623" +msgid "Ignore the initial EPG load. Enabled by default to prevent crash issues on LibreElec/CoreElec." +msgstr "초기 EPG 읽지 않음. LibreElec/CoreElec에서 충돌을 방지하기 위해 기본 사용 함." + +msgctxt "#30640" +msgid "Settings related to the timeshift." +msgstr "시간 이동 관련 설정." + +msgctxt "#30641" +msgid "If enabled allows pause, rewind and fast-forward of live TV." +msgstr "생방송 TV의 잠시 멈춤, 빠르게 돌리기를 사용할 때." + +msgctxt "#30642" +msgid "The path where the timeshift buffer files should be stored when timeshifting is enabled. Make sure you have a reasonable amount of disk space available since the buffer will grow indefinitely until you stop watching or switch channels." +msgstr "시간 이동을 사용할 때 버퍼 파일이 저장될 경로. 시청을 중지하거나 채널을 변경할 때까지 버퍼가 제한없이 커지므로 충분한 디스크 여유 공간이 있어야 합니다." diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.lt_lt/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.lt_lt/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.lt_lt/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.lt_lt/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Prisijungimas (vidinis)" +msgid "Local network" +msgstr "Vietinis tinklas" msgctxt "#30001" msgid "Hostname or IP address" @@ -33,41 +33,65 @@ msgstr "UPnP prievadas" msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Prisijungimo laukimo laikas (sekundėmis)" +msgid "Connection timeout" +msgstr "Prisijungimo laukimo laikas" msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS prievadas (palikite tuščią paprast HTTP naudojimui)" +msgid "HTTPS port (set to 0 to use plain HTTP)" +msgstr "HTTPS prievadas (nustatykite 0 norėdami naudoti paprastą HTTP)" -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Prisijungimas (išorinis)" +msgctxt "#30006" +msgid "Connection" +msgstr "Prijungimas" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internetas" + +msgctxt "#30020" +msgid "Channel & EPG" +msgstr "Kanalas ir EPG" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanalai" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Naudoti išorinį XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Išorinio XMLTV kelias" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Teikti pirmenybę EPG prieš OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Naudoti kanalų piktogramas iš išorinio XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Kanalų numeracija nustatyta pagal" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (loginė kanalų numeracija) iš posistemės" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Kanalų indeksą posistemėje" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Priminimo laikas (minučių prieš programos pradžią)" + +msgctxt "#30027" +msgid "Skip initial EPG load" +msgstr "Praleisti pradinį EPG įkėlimą" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Laiko poslinkis" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Įjungti laiko poslinkį" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Laiko poslinkio buferio kelias" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "VBox įrenginio pakartotinis EPG nuskaitymas (gali šiek tiek užtrukti)" @@ -76,14 +100,6 @@ msgid "Sync EPG" msgstr "Sinchronizuoti EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (loginė kanalų numeracija) iš posistemės" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Kanalų indeksą posistemėje" - msgctxt "#30110" msgid "Remind me" msgstr "Priminti man" @@ -100,18 +116,18 @@ msgid "Cancel all the channel's reminders" msgstr "Atšaukti visus kanalų priminimus" -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Priminimo laikas (minučių prieš programos pradžią)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Laiko poslinkis" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Įjungti laiko poslinkį" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Laiko poslinkio buferio kelias" +msgctxt "#30601" +msgid "The IP address or hostname of your VBox when accessed from the local network." +msgstr "Jūsų VBox IP adresas arba įrenginio vardas, kai jis pasiekiamas iš vietinio tinklo." + +msgctxt "#30606" +msgid "The IP address or hostname of your VBox when accessed from the internet." +msgstr "Jūsų VBox IP adresas arba įrenginio vardas, kai jis pasiekiamas per internetą." + +msgctxt "#30620" +msgid "Settings related to Channels & EPG." +msgstr "Su kanalais ir EPG susiję nustatymai." + +msgctxt "#30640" +msgid "Settings related to the timeshift." +msgstr "Su laiko poslinkiu susiję nustatymai." diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.lv_lv/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.lv_lv/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.lv_lv/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.lv_lv/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Pieslēgums (iekšējais)" +msgid "Local network" +msgstr "Lokālais tīkls" msgctxt "#30001" msgid "Hostname or IP address" @@ -28,22 +28,26 @@ msgid "HTTP port" msgstr "HTTP ports" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Pieslēguma noilgums (sekundes)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Pieslēgums (ārējais)" +msgctxt "#30006" +msgid "Connection" +msgstr "Pieslēgums" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internets" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanāli" -msgctxt "#30108" +msgctxt "#30024" msgid "LCN (Logical Channel Number) from backend" msgstr "LKN (Loģiskais Kanāla Numurs) no galasistēmas" -msgctxt "#30109" +msgctxt "#30025" msgid "Channel index in backend" msgstr "Kanālu indekss galasistēmā" -msgctxt "#30202" +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "Laika nobīdes bufera ceļš" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.mi/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.mi/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.mi/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.mi/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: VBox TV Gateway PVR Client +# Addon id: pvr.vbox +# Addon Provider: Sam Stenvall +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Maori (http://www.transifex.com/projects/p/kodi-main/language/mi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mi\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Local network" +msgstr "Whatunga paetata" + +msgctxt "#30007" +msgid "Internet" +msgstr "Ipurangi" + +msgctxt "#30021" +msgid "Channels" +msgstr "Ngā hongere" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.mk_mk/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.mk_mk/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.mk_mk/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.mk_mk/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,10 +16,26 @@ "Language: mk_MK\n" "Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" +msgctxt "#30000" +msgid "Local network" +msgstr "Локална мрежа" + msgctxt "#30002" msgid "HTTP port" msgstr "HTTP порта" -msgctxt "#30202" +msgctxt "#30006" +msgid "Connection" +msgstr "Конекција" + +msgctxt "#30007" +msgid "Internet" +msgstr "Интернет" + +msgctxt "#30021" +msgid "Channels" +msgstr "Канали" + +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "Пат за Timeshift buffer-от" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.mn_mn/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.mn_mn/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.mn_mn/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.mn_mn/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,6 +16,18 @@ "Language: mn_MN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Local network" +msgstr "Дотоод сүлжээ" + msgctxt "#30002" msgid "HTTP port" msgstr "HTTP порт" + +msgctxt "#30007" +msgid "Internet" +msgstr "Интернэт" + +msgctxt "#30021" +msgid "Channels" +msgstr "Сувгууд" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ms_my/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ms_my/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ms_my/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ms_my/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=1; plural=0;\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Sambungan (dalaman)" +msgid "Local network" +msgstr "Rangkaian setempat" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "Port UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Had masa tamat sambungan (saat)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Port HTTPS (biarkan kosong untuk guna HTTP biasa)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Sambungan (luaran)" +msgctxt "#30006" +msgid "Connection" +msgstr "Sambungan" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Saluran" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Guna XMLTV luaran" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Laluan XMLTV luaran" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Utamakan EPG luaran berbanding OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Guna ikon saluran dari XMLTV luaran" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Nombor saluran ditetapkan oleh" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logical Channel Number) dari bahagian belakang" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Indeks saluran dalam bahagian belakang" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Masa peringatan (minit sebelum program bermula)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Anjak Masa" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Benarkan anjak masa" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Laluan penimbal Anjak Masa" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Imbas semula peranti VBox bagi EPG (akan mengambil masa)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Segerak EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logical Channel Number) dari bahagian belakang" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Indeks saluran dalam bahagian belakang" - msgctxt "#30110" msgid "Remind me" msgstr "Ingatkan saya" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Batalkan semua peringatan saluran" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Masa peringatan (minit sebelum program bermula)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Anjak Masa" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Benarkan anjak masa" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Laluan penimbal Anjak Masa" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.mt_mt/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.mt_mt/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.mt_mt/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.mt_mt/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,10 +16,22 @@ "Language: mt_MT\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" +msgctxt "#30000" +msgid "Local network" +msgstr "LAN" + msgctxt "#30002" msgid "HTTP port" msgstr "port tal- HTTP" -msgctxt "#30202" +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Stazzjonijiet" + +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "Il-Buffer path tat-timeshift" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.my_mm/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.my_mm/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.my_mm/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.my_mm/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: VBox TV Gateway PVR Client +# Addon id: pvr.vbox +# Addon Provider: Sam Stenvall +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/kodi-main/language/my_MM/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my_MM\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Local network" +msgstr "Local network" + +msgctxt "#30006" +msgid "Connection" +msgstr "ကွန်နက်ရှင်" + +msgctxt "#30007" +msgid "Internet" +msgstr "အင်တာနက်" + +msgctxt "#30021" +msgid "Channels" +msgstr "Channel များ" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.nb_no/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.nb_no/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.nb_no/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.nb_no/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Tilkobling (intern)" +msgid "Local network" +msgstr "Lokalt nettverk" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "UPnP-port" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Tidsavbrudd for tilkobling (sekunder)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS-port (la stå tom for vanlig HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Tilkobling (ekstern)" +msgctxt "#30006" +msgid "Connection" +msgstr "Tilkobling" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internett" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanaler" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Bruk ekstern XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Ekstern XMLTV sti" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Foretrekk ekstern EPG istedenfor OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Bruk kanal ikoner for ekstern XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Kanal nummer satt av" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logisk Kanal Nummer) fra bakgrunn" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Kanalindeks i bakgrunnen" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Påminnelsestid (minutter før programmet starter)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Tdsforskyvning" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Aktiver tidsforskyvning" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Sti for tidsforskyvningbuffer" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "VBOX-enhet reskanner EPG (vil ta litt tid)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Synk EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logisk Kanal Nummer) fra bakgrunn" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Kanalindeks i bakgrunnen" - msgctxt "#30110" msgid "Remind me" msgstr "Påminn meg" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Avbryt alle kanalpåminnelser" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Påminnelsestid (minutter før programmet starter)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Tdsforskyvning" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Aktiver tidsforskyvning" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Sti for tidsforskyvningbuffer" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.nl_nl/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.nl_nl/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.nl_nl/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.nl_nl/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Verbinding (intern)" +msgid "Local network" +msgstr "Lokaal netwerk" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "UPnP poort" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Connectie time-out (seconden)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS-poort (laat leeg, om gewoon HTTP te gebruiken)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Verbinding (extern)" +msgctxt "#30006" +msgid "Connection" +msgstr "Verbinding" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanalen" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Gebruik externe XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Extern XMLTV pad" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Voorkeur voor externe EPG boven OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Gebruik kanaaliconen van externe XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Kanaalnummers ingesteld door" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LKN (Logisch Kanaal Nummer) van backend" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Kanaalindex in backend" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Herinnertijd (minuten voordat het programma begint)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Timeshift" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Inschakelen timeshifting" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Tijdsprong bufferlocatie" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "VBox apparaat herscannen van EPG (Kan even duren)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Synchroniseer EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LKN (Logisch Kanaal Nummer) van backend" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Kanaalindex in backend" - msgctxt "#30110" msgid "Remind me" msgstr "Herinner mij" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Annuleer al de kanalen herinneringen" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Herinnertijd (minuten voordat het programma begint)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Timeshift" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Inschakelen timeshifting" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Timeshift bufferpad" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.pl_pl/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.pl_pl/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.pl_pl/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.pl_pl/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Połączenie (wewnętrzne)" +msgid "Local network" +msgstr "Sieć lokalna" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "Port UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Limit czasu połączenia (sekundy)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Port HTTPS (pozostał puste, aby używać protokołu HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Połączenie (zewnętrzne)" +msgctxt "#30006" +msgid "Connection" +msgstr "Połączenie" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanały" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "Przewodnik" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Używaj zewnętrznego źródła XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Ściezka do zewnętrznego źródła XMLTV" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Preferuj zewnętrzne źródła przewodnika zamiast nadawanych" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Używaj ikon kanałów z zewnętrznych źródeł XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Numery kanałów wg" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "Logicznego numeru kanału (LCN)" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Indeksu kanału" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Czas przypomnienia (w minutach przed uruchomieniem)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Przesunięcie czasowe" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Aktywuj funkcję przesunięcia czasowego" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Folderu bufora przesunięcia czasowego" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Urządzenie VBox skanuje źródło przewodnika (trochę to potrwa)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Synchronizuj dane przewodnika" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "Logicznego numeru kanału (LCN)" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Indeksu kanału" - msgctxt "#30110" msgid "Remind me" msgstr "Przypominaj" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Anuluj przypomnienia dla wszystkich kanałów" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Czas przypomnienia (w minutach przed uruchomieniem)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Przesunięcie czasowe" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Aktywuj funkcję przesunięcia czasowego" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Folderu pliku przesunięcia czasowego" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.pt_br/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.pt_br/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.pt_br/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.pt_br/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n > 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Conexão (interna)" +msgid "Local network" +msgstr "Rede Local" msgctxt "#30001" msgid "Hostname or IP address" @@ -33,40 +33,64 @@ msgstr "Porta UPnP" msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Tempo limite para conexão (segundos)" +msgid "Connection timeout" +msgstr "Tempo limite para conexão" msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Porta HTTPS (deixe em branco para usar HTTP simples)" +msgid "HTTPS port (set to 0 to use plain HTTP)" +msgstr "Porta HTTPS (defina como 0 para usar HTTP apenas)" -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Conexão (externa)" +msgctxt "#30006" +msgid "Connection" +msgstr "Ligação" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30020" +msgid "Channel & EPG" +msgstr "Canal & EPG" + +msgctxt "#30021" +msgid "Channels" +msgstr "Canais" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" -msgstr "Guia" +msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Usar aquivo XMLTV externo" +msgctxt "#30023" +msgid "Channel numbers set by" +msgstr "Números dos canais definidos por" + +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Número Lógico do Canal) via backend" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Indexar canal no backend" -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Caminho para o arquivo XMLTV externo" +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Tempo do lembrete (minutos antes do programa começar)" -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Preferir guia externo em vez do OTA" +msgctxt "#30027" +msgid "Skip initial EPG load" +msgstr "Pule o carregamento inicial do EPG" -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Usar logos de canais do XMLTV externo" +msgctxt "#30040" +msgid "Timeshift" +msgstr "Ver Mais Tarde" -msgctxt "#30105" -msgid "Channel numbers set by" -msgstr "Números dos canais definidos por" +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Ativar mudança de horário" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Localização do buffer para 'Ver Mais Tarde'" msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" @@ -76,14 +100,6 @@ msgid "Sync EPG" msgstr "Sincr. guia" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Número Lógico do Canal) via backend" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Indexar canal no backend" - msgctxt "#30110" msgid "Remind me" msgstr "Lembre-me" @@ -100,18 +116,74 @@ msgid "Cancel all the channel's reminders" msgstr "Cancelar todos os lembretes dos canais" -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Tempo do lembrete (minutos antes do programa começar)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Mudança de horário" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Ativar mudança de horário" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Caminho do buffer de gravação" +msgctxt "#30600" +msgid "Contains settings for connecting to the VBox device from both your local network and from the internet. A local connection will be attempted first and if unsuccessful the internet settings will be used." +msgstr "Contém ajustes para conectar-se ao dispositivo VBox da rede local e da Internet. Uma conexão local será tentada primeiro e, se não funcionar, as configurações da Internet serão usadas." + +msgctxt "#30601" +msgid "The IP address or hostname of your VBox when accessed from the local network." +msgstr "O endereço IP ou nome do host do seu VBox quando acessado a partir da rede local." + +msgctxt "#30602" +msgid "The port used to connect to your VBox when accessed from the local network. Default value is `80`." +msgstr "A porta usada para conectar-se ao seu VBox quando acessada pela rede local. O valor padrão é `80`." + +msgctxt "#30603" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the local network. The default `0` means this is disabled and HTTP will be used instead." +msgstr "A porta usada para conectar-se ao seu VBox se estiver usando HTTPS quando acessado da rede local. O padrão \"0\" significa que está desabilitado e o HTTP será usado." + +msgctxt "#30604" +msgid "The port used to connect to your VBox via UPnP when accessed from the local network. Default value is `55555`." +msgstr "A porta usada para conectar-se ao seu VBox via UPnP quando acessada pela rede local. O valor padrão é `55555`." + +msgctxt "#30605" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the local network. Default value is `3`." +msgstr "O valor usado (em segundos) para indicar quando uma tentativa de conexão falhou quando acessada a partir da rede local. O valor padrão é `3`." + +msgctxt "#30606" +msgid "The IP address or hostname of your VBox when accessed from the internet." +msgstr "O endereço IP ou o nome do host do seu VBox quando acessado da Internet." + +msgctxt "#30607" +msgid "The port used to connect to your VBox when accessed from the internet." +msgstr "A porta usada para conectar-se ao seu VBox quando acessada pela Internet." + +msgctxt "#30608" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the internet. The default `0` means this is disabled and HTTP will be used instead." +msgstr "A porta usada para conectar-se ao seu VBox se estiver usando HTTPS quando acessado da Internet. O padrão \"0\" significa que está desabilitado e o HTTP será usado." + +msgctxt "#30609" +msgid "The port used to connect to your VBox via UPnP when accessed from the internet. Default value is `55555`." +msgstr "A porta usada para conectar-se ao seu VBox via UPnP quando acessada da Internet. O valor padrão é `55555`." + +msgctxt "#30610" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the internet. Default value is `10`." +msgstr "O valor usado (em segundos) para indicar quando uma tentativa de conexão falhou quando acessado da Internet. O valor padrão é `10`." + +msgctxt "#30620" +msgid "Settings related to Channels & EPG." +msgstr "Ajustes relacionados a Canais e EPG." + +msgctxt "#30621" +msgid "Channel numbers can be set via either of the following two options: [LCN (Logical Channel Number) from backend] The channel numbers as set on the backend; [Channel index in backend] Starting from 1 number the channels as per the order they appear on the backend." +msgstr "Os números dos canais podem ser configurados por meio de uma das duas opções a seguir: [LCN (Número do canal lógico) do backend] Os números do canal, conforme definido no backend; [Índice do canal no backend] A partir de 1 número, os canais de acordo com a ordem em que aparecem no backend." + +msgctxt "#30622" +msgid "The amount of time in minutes prior to a programme start that a reminder should pop up." +msgstr "A quantidade de tempo, em minutos antes do início do programa, que um lembrete deve aparecer." + +msgctxt "#30623" +msgid "Ignore the initial EPG load. Enabled by default to prevent crash issues on LibreElec/CoreElec." +msgstr "Ignore a carga inicial de EPG. Ativado por padrão para evitar problemas de falha no LibreElec / CoreElec." + +msgctxt "#30640" +msgid "Settings related to the timeshift." +msgstr "Ajustes relacionados ao horário." + +msgctxt "#30641" +msgid "If enabled allows pause, rewind and fast-forward of live TV." +msgstr "Se ativado, permite pausar, retroceder e avançar rapidamente na TV ao vivo." + +msgctxt "#30642" +msgid "The path where the timeshift buffer files should be stored when timeshifting is enabled. Make sure you have a reasonable amount of disk space available since the buffer will grow indefinitely until you stop watching or switch channels." +msgstr "O caminho em que os arquivos do buffer do desvio de horário devem ser armazenados quando o desvio de tempo está ativado. Verifique se você tem uma quantidade razoável de espaço em disco disponível, pois o buffer aumentará indefinidamente até que você pare de assistir ou alterne entre canais." diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.pt_pt/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.pt_pt/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.pt_pt/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.pt_pt/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Ligação (interna)" +msgid "Local network" +msgstr "Rede local" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,54 @@ msgid "UPnP port" msgstr "Porto de UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Tempo-limite da ligação (em segundos)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Porto de HTTPS (deixar em branco para usar HTTP simples)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Ligação (externa)" +msgctxt "#30006" +msgid "Connection" +msgstr "Ligação" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Canais" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Usar um XMLTV externo" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Localização do XMLTV externo" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Preferir o EPG externo sobre o OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Usar os ícones de canais do XMLTV externo" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Número de canais definidos por" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logical Channel Number) da estrutura" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Indexação dos canais na estrutura" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Hora do lembrete (minutos antes do programa iniciar)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Ver Mais Tarde" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Ativar o 'Ver mais tarde'" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Localização do buffer para 'Ver Mais Tarde'" + +msgctxt "#30106" +msgid "VBox device rescan of EPG (will take a while)" +msgstr "Nova análise do EPG do aparelho VBox (pode demorar)" + msgctxt "#30107" msgid "Sync EPG" msgstr "Sincronizar EPG" @@ -87,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Cancelar todos os lembretes de canal" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Hora do lembrete (minutos antes do programa iniciar)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Ver Mais Tarde" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Ativar o 'Ver mais tarde'" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Localização do buffer para 'Ver Mais Tarde'" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ro_ro/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ro_ro/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ro_ro/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ro_ro/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Conexiune (internă)" +msgid "Local network" +msgstr "Rețea locală" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "Port UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Expirare timp conexiune (secunde)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Port HTTPS (lăsați necompletat pentru HTTP simplu)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Conexiune (externă)" +msgctxt "#30006" +msgid "Connection" +msgstr "Conexiune" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Canale" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "Ghid program electronic" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Folosește fișier XMLTV extern" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Cale fișier XMLTV extern" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Preferă ghidul tv electronic extern venit prin aer" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Folosește sigle canale din XMLTV extern" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Numerele canalelelor setate de" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logical Channel Number) din backend" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Index canale în backend" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Timp reamintire (în minute, înainte să inceapa programul)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Decalaj temporal" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Activează decalajul temporal" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Calea buffer-ului de înregistrare" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Scanare EPG a dispozitivului VBox (va dura o vreme)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Sincronizare EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logical Channel Number) din backend" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Index canale în backend" - msgctxt "#30110" msgid "Remind me" msgstr "Reamintește-mi" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Anulează toate reamintirile canalelor" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Timp reamintire (în minute, înainte să inceapa programul)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Decalaj temporal" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Activează decalajul temporal" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Calea buffer-ului de înregistrare" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ru_ru/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ru_ru/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ru_ru/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ru_ru/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Подключение (внутреннее)" +msgid "Local network" +msgstr "Локальная сеть" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "Порт UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Таймаут подключения (секунд)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Порт HTTPS (оставьте пустым для HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Подключение (внешнее)" +msgctxt "#30006" +msgid "Connection" +msgstr "Соединение" + +msgctxt "#30007" +msgid "Internet" +msgstr "Интернет" + +msgctxt "#30021" +msgid "Channels" +msgstr "Каналы" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Использовать внешний XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Путь к внешнему XMLTV" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Внешний XMLTV предпочтительнее эфирного" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Использовать логотипы каналов из внешнего XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Номера каналов, установленные" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logical Channel Number) из бэкэнда" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Индекс канала в бэкэнд" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Время напоминания (за минуты до запуска программы)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Таймшифт" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Включить таймшифт" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Путь к буферу таймшифт" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Повторное сканирование устройства VBox EPG (займет некоторое время)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Синхронизация EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logical Channel Number) из бэкэнда" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Индекс канала в бэкэнд" - msgctxt "#30110" msgid "Remind me" msgstr "Напомнить мне" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Отменить все напоминания канала" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Время напоминания (за минуты до запуска программы)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Таймшифт" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Включить таймшифт" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Путь к буферу таймшифт" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.si_lk/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.si_lk/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.si_lk/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.si_lk/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,10 +16,18 @@ "Language: si_LK\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Local network" +msgstr "ස්ථානික ජාලය" + msgctxt "#30002" msgid "HTTP port" msgstr "HTTP තිර්ථය" -msgctxt "#30202" +msgctxt "#30007" +msgid "Internet" +msgstr "අන්තර්ජාලය" + +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "කාල සාරු අවරෝධක පෙත" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.sk_sk/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.sk_sk/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.sk_sk/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.sk_sk/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Spojenie (interné)" +msgid "Local network" +msgstr "Miestna sieť" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,41 +32,49 @@ msgid "UPnP port" msgstr "Port UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Časový limit spojenia (v sekundách)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Port HTTPS (pre použitie HTTP ponechajte pole prázdne)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Spojenie (externé)" +msgctxt "#30006" +msgid "Connection" +msgstr "Pripojenie" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanály" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" -msgstr "EPG" +msgstr "Televízny program" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Použiť externé údaje XMLTV" +msgctxt "#30023" +msgid "Channel numbers set by" +msgstr "Čísla programov nadstavených" -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Cesta k externým údajom XMLTV" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logické číslo programu) z backendu" -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Uprednostniť externé údaje EPG pred OTA" +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Index programov v backende" -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Použiť ikony kanálov z externých údajov XMLTV" +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Pripomeň mi čas (minúty pred začiatkom programu)" -msgctxt "#30105" -msgid "Channel numbers set by" -msgstr "Čísla programov nadstavených" +msgctxt "#30040" +msgid "Timeshift" +msgstr "Časový posun" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Povoliť časový posun" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Cesta k zásobníku časového posunu" msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Synchronizovať EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logické číslo programu) z backendu" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Index programov v backende" - msgctxt "#30110" msgid "Remind me" msgstr "Pripomeň mi" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Zrušiť pripomienkovače z tohto programu" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Pripomeň mi čas (minúty pred začiatkom programu)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Časový posun" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Povoliť časový posun" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Cesta k zásobníku časového posunu" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.sl_si/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.sl_si/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.sl_si/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.sl_si/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Povezava (notranja)" +msgid "Local network" +msgstr "Krajevno omrežje" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,46 +32,30 @@ msgid "UPnP port" msgstr "Vrata UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Prekinitev povezave (sekunde)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Vrata HTTPS (pustite prazno, če ne potrebujete)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Povezava (zunanja)" +msgctxt "#30006" +msgid "Connection" +msgstr "Povezava" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Programi" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPV" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Uporabi zunanji XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Pot zunanjega XMLTV" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Prednost ima zunanji EPV pred OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Uporabi ikone kanalov iz zunanjega XMLTV" - -msgctxt "#30200" +msgctxt "#30040" msgid "Timeshift" msgstr "Časovni zamik" -msgctxt "#30201" +msgctxt "#30041" msgid "Enable timeshifting" msgstr "Omogoči časovni zamik" -msgctxt "#30202" +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "Pot medpomnenja časovnega zamika" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.sq_al/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.sq_al/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.sq_al/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.sq_al/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,6 +16,18 @@ "Language: sq_AL\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Local network" +msgstr "Rrejti lokal" + msgctxt "#30002" msgid "HTTP port" msgstr "HTTP porti" + +msgctxt "#30007" +msgid "Internet" +msgstr "Interneti" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanalet" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.sr_rs/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.sr_rs/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.sr_rs/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.sr_rs/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Веза (унутрашња)" +msgid "Local network" +msgstr "Локална мрежа" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "UPnP порт" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Истек времена за повезивање (секунде)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS порт (оставити празно да би се користио обичан HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Веза (спољашња)" +msgctxt "#30006" +msgid "Connection" +msgstr "Веза" + +msgctxt "#30007" +msgid "Internet" +msgstr "Интернет" + +msgctxt "#30021" +msgid "Channels" +msgstr "Канали" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Користи спољашњи XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Путања Спољашњег XMLTV " - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Дати предност спољашњем EPG уместо OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Користи иконе канала од спољашњег XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Бројеви канала постављени од" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Логичан Број Канала) од позадине" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Индекс канала у позадини" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Време подсетника (минута пре почетка програма)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Померај времена" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Омогући померај времена" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Путања међумеморије помераја времена" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Поновна претрага VBox уређајем EPG -а (потрајаће)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Синхронизуј EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Логичан Број Канала) од позадине" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Индекс канала у позадини" - msgctxt "#30110" msgid "Remind me" msgstr "Подсети ме" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Откажи све подсетнике канала" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Време подсетника (минута пре почетка програма)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Померај времена" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Омогући померај времена" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Путања међумеморије помераја времена" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.sr_rs@latin/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.sr_rs@latin/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.sr_rs@latin/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.sr_rs@latin/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Veza (unutrašnja)" +msgid "Local network" +msgstr "Lokalna mreža" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "UPnP port" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Istek vremena za povezivanje (sekunde)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS port (ostaviti prazno da bi se koristio običan HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Veza (spoljašnja)" +msgctxt "#30006" +msgid "Connection" +msgstr "Veza" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanali" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Koristi spoljašnji XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Putanja Spoljašnjeg XMLTV" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Dati prednost spoljašnjem EPG umesto OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Koristi ikone kanala od spoljašnjeg XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Brojevi kanala postavljeni od" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logičan Broj Kanala) od pozadine" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Indeks kanala u pozadini" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Vreme podsetnika (minuta pre početka programa)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Pomeraj vremena" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Omogući pomeraj vremena" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Putanja međumemorije pomeraja vremena" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "Ponovna pretraga VBox uređajem EPG-a (potrajaće)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Sinhronizuj EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logičan Broj Kanala) od pozadine" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Indeks kanala u pozadini" - msgctxt "#30110" msgid "Remind me" msgstr "Podseti me" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Otkaži sve podsetnike kanala" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Vreme podsetnika (minuta pre početka programa)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Pomeraj vremena" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Omogući pomeraj vremena" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Putanja međumemorije pomeraja vremena" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.sv_se/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.sv_se/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.sv_se/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.sv_se/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Anslutning (intern)" +msgid "Local network" +msgstr "Lokalt nätverk" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "UPnP-port" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Anslutningsavbrott (sekunder)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS-port (lämna tom för att använda vanlig HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Anslutning (extern)" +msgctxt "#30006" +msgid "Connection" +msgstr "Anslutning" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanaler" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Använd extern XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Extern XMLTV-genväg" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Föredra extern EPG framför OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Använd kanalikoner från extern XMLTV" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "Kanalnummer sätts av" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN (Logical Channel Number) från bakgrundsservern" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Kanalindex i bakgrundsservern" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Påminnelsetid (minuter innan programmet startar)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Tidsförskjutning" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Aktivera tidsskiftande" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Buffertsökväg för Timeshift " + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "VBox-enhet återskanning av EPG (kommer att ta ett tag)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "Synkronisera EPG" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN (Logical Channel Number) från bakgrundsservern" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Kanalindex i bakgrundsservern" - msgctxt "#30110" msgid "Remind me" msgstr "Påminn mig" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "Avbryt alla kanalpåminnelser" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Påminnelsetid (minuter innan programmet startar)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Tidsskifte" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Aktivera tidsskiftande" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Buffertsökväg för Timeshift " diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.szl/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.szl/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.szl/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.szl/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Skuplowanie (wnōntrzne)" +msgid "Local network" +msgstr "Lokalny nec" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,46 +32,30 @@ msgid "UPnP port" msgstr "Port UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Czŏs na kuplowanie (sekōndy)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "Port HTTPS (ôstŏw pusty, coby używać ino HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Skuplowanie (zewnyntrzne)" +msgctxt "#30006" +msgid "Connection" +msgstr "Skuplowanie" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanały" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Używej zewnyntrznygo XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Cesta ku zewnyntrznymu XMLTV" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "Preferuj zewnyntrzny EPG ôd OTA" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Używej ikōn kanałōw ze zewnyntrznygo XMLTV" - -msgctxt "#30200" +msgctxt "#30040" msgid "Timeshift" msgstr "Timeshift" -msgctxt "#30201" +msgctxt "#30041" msgid "Enable timeshifting" msgstr "Aktywuj timeshift" -msgctxt "#30202" +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "Cesta bufora timeshift" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ta_in/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ta_in/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.ta_in/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.ta_in/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,6 +16,18 @@ "Language: ta_IN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Local network" +msgstr "குறும்பரப்புப் பிணையம்" + msgctxt "#30002" msgid "HTTP port" msgstr "HTTP துறை" + +msgctxt "#30007" +msgid "Internet" +msgstr "இணையம்" + +msgctxt "#30021" +msgid "Channels" +msgstr "சேனல்கள்" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.tg_tj/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.tg_tj/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.tg_tj/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.tg_tj/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,6 +16,18 @@ "Language: tg_TJ\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Local network" +msgstr "Шабакаи маҳаллӣ" + msgctxt "#30002" msgid "HTTP port" msgstr "Порти HTTP" + +msgctxt "#30007" +msgid "Internet" +msgstr "Интернет" + +msgctxt "#30021" +msgid "Channels" +msgstr "Шабакаҳо" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.th_th/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.th_th/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.th_th/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.th_th/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,6 +16,22 @@ "Language: th_TH\n" "Plural-Forms: nplurals=1; plural=0;\n" -msgctxt "#30202" +msgctxt "#30000" +msgid "Local network" +msgstr "เครือข่ายท้องถิ่น" + +msgctxt "#30006" +msgid "Connection" +msgstr "การเชื่อมต่อ" + +msgctxt "#30007" +msgid "Internet" +msgstr "อินเตอร์เน็ต" + +msgctxt "#30021" +msgid "Channels" +msgstr "ช่องสัญญาณ" + +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "เส้นทางบัฟเฟอร์ของ Timeshift" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.tr_tr/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.tr_tr/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.tr_tr/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.tr_tr/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=1; plural=0;\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "Bağlantı (iç)" +msgid "Local network" +msgstr "Yerel ağ" msgctxt "#30001" msgid "Hostname or IP address" @@ -33,40 +33,64 @@ msgstr "UPnP portu" msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Bağlatı zaman aşımı (saniye)" +msgid "Connection timeout" +msgstr "Bağlantı zaman aşımı" msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS Portu (Düz HTTP kullanmak için boş bırakın)" +msgid "HTTPS port (set to 0 to use plain HTTP)" +msgstr "HTTPS portu (düz HTTP kullanmak için 0 olarak ayarlanır)" -msgctxt "#30050" -msgid "Connection (external)" -msgstr "Bağlantı (dış)" +msgctxt "#30006" +msgid "Connection" +msgstr "Bağlantı" + +msgctxt "#30007" +msgid "Internet" +msgstr "İnternet" + +msgctxt "#30020" +msgid "Channel & EPG" +msgstr "Kanal & EPG" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanallar" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" -msgstr "Elektronik Program Rehberi" +msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Dış XMLTV kullan" +msgctxt "#30023" +msgid "Channel numbers set by" +msgstr "Kanal numaralarını belirle" -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "Dış XMLTV Yolu" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "Arka arayüzden LCN (Mantıksal Kanal Numarası)" -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "OTA üzerinden harici Ektronik program rehberi tercih et" +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "Arka arayüzde kanal indeksi" -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "Kanal simgelerini harici XMLTV den kullan" +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "Hatırlatma zamanı (Program başlamadan kaç dakika önce)" -msgctxt "#30105" -msgid "Channel numbers set by" -msgstr "Kanal numaralarını belirle" +msgctxt "#30027" +msgid "Skip initial EPG load" +msgstr "İlk EPG yükünü atla" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "Zaman Kaydırma" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "Zaman Kaydırma Aktif" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "Zaman kaydırma arabellek yolu" msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" @@ -76,14 +100,6 @@ msgid "Sync EPG" msgstr "Elektronik Program Rehberi'ni eşle" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "Arka arayüzden LCN (Mantıksal Kanal Numarası)" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "Arka arayüzde kanal indeksi" - msgctxt "#30110" msgid "Remind me" msgstr "Hatırlat" @@ -100,18 +116,74 @@ msgid "Cancel all the channel's reminders" msgstr "Kanalın tüm hatırlatmalarını iptal et" -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "Hatırlatma zamanı (Program başlamadan kaç dakika önce)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "Zaman Kaydırma" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "Zaman Kaydırma Aktif" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "Zaman Kaydırma tampon bellek yolu" +msgctxt "#30600" +msgid "Contains settings for connecting to the VBox device from both your local network and from the internet. A local connection will be attempted first and if unsuccessful the internet settings will be used." +msgstr "Hem yerel ağınızdan hem de internetten VBox cihazına bağlanma ayarlarını içerir. İlk önce yerel bir bağlantı denenecek ve başarısız olursa internet ayarları kullanılacaktır." + +msgctxt "#30601" +msgid "The IP address or hostname of your VBox when accessed from the local network." +msgstr "Yerel ağdan erişildiğinde VBox'ınızın IP adresi veya ana bilgisayar adı." + +msgctxt "#30602" +msgid "The port used to connect to your VBox when accessed from the local network. Default value is `80`." +msgstr "Yerel ağdan erişildiğinde VBox'ınıza bağlanmak için kullanılan bağlantı noktası. Varsayılan değer 80'dir." + +msgctxt "#30603" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the local network. The default `0` means this is disabled and HTTP will be used instead." +msgstr "Yerel ağdan erişildiğinde HTTPS kullanılıyorsa VBox'ınıza bağlanmak için kullanılan bağlantı noktası. Varsayılan \"0\", bunun devre dışı olduğu ve bunun yerine HTTP'nin kullanılacağı anlamına gelir." + +msgctxt "#30604" +msgid "The port used to connect to your VBox via UPnP when accessed from the local network. Default value is `55555`." +msgstr "Yerel ağdan erişildiğinde VBox'ınıza UPnP aracılığıyla bağlanmak için kullanılan bağlantı noktası. Varsayılan değer: 55555." + +msgctxt "#30605" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the local network. Default value is `3`." +msgstr "Yerel ağdan erişildiğinde bir bağlantı girişiminin başarısız olduğunu göstermek için kullanılan değer (saniye cinsinden). Varsayılan değer: 3." + +msgctxt "#30606" +msgid "The IP address or hostname of your VBox when accessed from the internet." +msgstr "İnternetten erişildiğinde VBox'ınızın IP adresi veya ana bilgisayar adı." + +msgctxt "#30607" +msgid "The port used to connect to your VBox when accessed from the internet." +msgstr "İnternetten erişildiğinde VBox'ınıza bağlanmak için kullanılan port." + +msgctxt "#30608" +msgid "The port used to connect to your VBox if using HTTPS when accessed from the internet. The default `0` means this is disabled and HTTP will be used instead." +msgstr "İnternetten erişildiğinde HTTPS kullanılıyorsa VBox'ınıza bağlanmak için kullanılan port. Varsayılan \"0\", bunun devre dışı olduğu ve bunun yerine HTTP'nin kullanılacağı anlamına gelir." + +msgctxt "#30609" +msgid "The port used to connect to your VBox via UPnP when accessed from the internet. Default value is `55555`." +msgstr "İnternetten erişildiğinde VBox'ınıza UPnP aracılığıyla bağlanmak için kullanılan port. Varsayılan değer: 55555." + +msgctxt "#30610" +msgid "The value used (in seconds) to denote when a connection attempt has failed when accessed from the internet. Default value is `10`." +msgstr "İnternetten erişildiğinde bir bağlantı girişiminin başarısız olduğunu belirtmek için kullanılan değer (saniye cinsinden). Varsayılan değer \"10\" dur." + +msgctxt "#30620" +msgid "Settings related to Channels & EPG." +msgstr "Kanallar ve EPG ile ilgili ayarlar." + +msgctxt "#30621" +msgid "Channel numbers can be set via either of the following two options: [LCN (Logical Channel Number) from backend] The channel numbers as set on the backend; [Channel index in backend] Starting from 1 number the channels as per the order they appear on the backend." +msgstr "Kanal numaraları aşağıdaki iki seçenekten biriyle ayarlanabilir: [Arka uçtan LCN (Mantıksal Kanal Numarası)] Arka uçta ayarlanan kanal numaraları; [Arka uçta kanal dizini] Kanalların arka uçta göründükleri sıraya göre 1 numaradan başlayarak." + +msgctxt "#30622" +msgid "The amount of time in minutes prior to a programme start that a reminder should pop up." +msgstr "Bir program başlamadan önce dakika cinsinden süre, bir hatırlatıcının görüntülenmesi gereken süredir." + +msgctxt "#30623" +msgid "Ignore the initial EPG load. Enabled by default to prevent crash issues on LibreElec/CoreElec." +msgstr "İlk EPG yükünü yok sayın. LibreElec / CoreElec'te kilitlenme sorunlarını önlemek için varsayılan olarak etkindir." + +msgctxt "#30640" +msgid "Settings related to the timeshift." +msgstr "Zaman kaymasıyla ilgili ayarlar." + +msgctxt "#30641" +msgid "If enabled allows pause, rewind and fast-forward of live TV." +msgstr "Etkinleştirilirse canlı TV'nin duraklatılmasına, geri sarılmasına ve hızlı ileri sarılmasına izin verilir." + +msgctxt "#30642" +msgid "The path where the timeshift buffer files should be stored when timeshifting is enabled. Make sure you have a reasonable amount of disk space available since the buffer will grow indefinitely until you stop watching or switch channels." +msgstr "Zaman kaydırma etkinken zaman kaydırma tampon dosyalarının saklanması gereken yol. İzlemeyi durdurana veya kanalları değiştirene kadar arabellek süresiz olarak büyüyeceğinden, makul miktarda disk alanınız olduğundan emin olun." diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.uk_ua/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.uk_ua/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.uk_ua/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.uk_ua/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,6 +16,10 @@ "Language: uk_UA\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +msgctxt "#30000" +msgid "Local network" +msgstr "Локальна мережа" + msgctxt "#30001" msgid "Hostname or IP address" msgstr "Хост або IP адреса" @@ -28,30 +32,26 @@ msgid "UPnP port" msgstr "Порт UPnP" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "Тайм-аут з'єднання (секунди)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS-порт (залиште порожнім, щоб використовувати HTTP)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "З'єднання (зовнішнє)" +msgctxt "#30006" +msgid "Connection" +msgstr "Зв’язок" + +msgctxt "#30007" +msgid "Internet" +msgstr "Інтернет" + +msgctxt "#30021" +msgid "Channels" +msgstr "Канали" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "EPG" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "Використовувати зовнішній XMLTV" - -msgctxt "#30200" +msgctxt "#30040" msgid "Timeshift" msgstr "Зрушення в часі" -msgctxt "#30202" +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "Шлях до буферу зсуву у часі" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.uz_uz/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.uz_uz/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.uz_uz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.uz_uz/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: VBox TV Gateway PVR Client +# Addon id: pvr.vbox +# Addon Provider: Sam Stenvall +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Uzbek (Uzbekistan) (http://www.transifex.com/projects/p/kodi-main/language/uz_UZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz_UZ\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Local network" +msgstr "Mahalliy tarmoq" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kanallar" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.vi_vn/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.vi_vn/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.vi_vn/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.vi_vn/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -16,10 +16,26 @@ "Language: vi_VN\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "Local network" +msgstr "Mạng nội bộ" + msgctxt "#30002" msgid "HTTP port" msgstr "Cổng HTTP" -msgctxt "#30202" +msgctxt "#30006" +msgid "Connection" +msgstr "Kết nối" + +msgctxt "#30007" +msgid "Internet" +msgstr "Internet" + +msgctxt "#30021" +msgid "Channels" +msgstr "Kênh" + +msgctxt "#30042" msgid "Timeshift buffer path" msgstr "Đường dẫn bộ đệm Timeshift" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.zh_cn/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.zh_cn/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.zh_cn/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.zh_cn/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=1; plural=0;\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "连接(内部)" +msgid "Local network" +msgstr "局域网" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "UPnP 端口" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "连接超时(秒)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS 端口(如果只使用 HTTP 的话请留空)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "连接(外部)" +msgctxt "#30006" +msgid "Connection" +msgstr "连接" + +msgctxt "#30007" +msgid "Internet" +msgstr "互联网" + +msgctxt "#30021" +msgid "Channels" +msgstr "频道" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "电子节目单" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "使用外部 XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "外部 XMLTV 路径" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "首选基于 OTA 的电子节目单" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "使用来自外部 XMLTV 的频道图标" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "频道号设置" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "LCN(逻辑频道号)来自后端" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "后端频道索引" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "提醒时间(节目开始前多少分钟)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "时光平移" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "启用时光平移" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "时光平移缓存路径" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "VBox 设备重扫描电子节目单(需要一点时间)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "同步电子节目单" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "LCN(逻辑频道号)来自后端" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "后端频道索引" - msgctxt "#30110" msgid "Remind me" msgstr "提醒我" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "取消所有频道提醒" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "提醒时间(节目开始前多少分钟)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "时光平移" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "启用时光平移" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "时光平移缓存路径" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.zh_tw/strings.po kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.zh_tw/strings.po --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/language/resource.language.zh_tw/strings.po 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/language/resource.language.zh_tw/strings.po 2021-01-09 10:03:05.000000000 +0000 @@ -17,8 +17,8 @@ "Plural-Forms: nplurals=1; plural=0;\n" msgctxt "#30000" -msgid "Connection (internal)" -msgstr "連接 (內部)" +msgid "Local network" +msgstr "區域網路" msgctxt "#30001" msgid "Hostname or IP address" @@ -32,42 +32,50 @@ msgid "UPnP port" msgstr "UPnP 連接埠" -msgctxt "#30004" -msgid "Connection timeout (seconds)" -msgstr "連接逾時 (秒)" - -msgctxt "#30005" -msgid "HTTPS port (leave empty to use plain HTTP)" -msgstr "HTTPS 連接埠 (留空以使用一般的HTTP協定)" - -msgctxt "#30050" -msgid "Connection (external)" -msgstr "連接 (外部)" +msgctxt "#30006" +msgid "Connection" +msgstr "連接" + +msgctxt "#30007" +msgid "Internet" +msgstr "網際網路" + +msgctxt "#30021" +msgid "Channels" +msgstr "頻道" -msgctxt "#30100" +msgctxt "#30022" msgid "EPG" msgstr "電子節目表" -msgctxt "#30101" -msgid "Use external XMLTV" -msgstr "使用外部的 XMLTV" - -msgctxt "#30102" -msgid "External XMLTV path" -msgstr "外部 XMLTV 路徑" - -msgctxt "#30103" -msgid "Prefer external EPG over OTA" -msgstr "優先使用外部電子節目表,然後才使用即時資料" - -msgctxt "#30104" -msgid "Use channel icons from external XMLTV" -msgstr "使用來自外部 XMLTV 的頻道圖示" - -msgctxt "#30105" +msgctxt "#30023" msgid "Channel numbers set by" msgstr "頻道號碼設定以" +msgctxt "#30024" +msgid "LCN (Logical Channel Number) from backend" +msgstr "來自後端的LCN(邏輯式頻道號碼)" + +msgctxt "#30025" +msgid "Channel index in backend" +msgstr "後端頻道索引" + +msgctxt "#30026" +msgid "Reminder time (minutes before program starts)" +msgstr "提醒時間(節目開始前的分鐘數)" + +msgctxt "#30040" +msgid "Timeshift" +msgstr "時間平移" + +msgctxt "#30041" +msgid "Enable timeshifting" +msgstr "開啟時間平移" + +msgctxt "#30042" +msgid "Timeshift buffer path" +msgstr "時間平移緩衝路徑" + msgctxt "#30106" msgid "VBox device rescan of EPG (will take a while)" msgstr "VBox設備重新掃描電子節目表單(會花點時間)" @@ -76,14 +84,6 @@ msgid "Sync EPG" msgstr "同步電子節目表" -msgctxt "#30108" -msgid "LCN (Logical Channel Number) from backend" -msgstr "來自後端的LCN(邏輯式頻道號碼)" - -msgctxt "#30109" -msgid "Channel index in backend" -msgstr "後端頻道索引" - msgctxt "#30110" msgid "Remind me" msgstr "提醒我" @@ -99,19 +99,3 @@ msgctxt "#30113" msgid "Cancel all the channel's reminders" msgstr "取消所有頻道的提醒" - -msgctxt "#30114" -msgid "Reminder time (minutes before program starts)" -msgstr "提醒時間(節目開始前的分鐘數)" - -msgctxt "#30200" -msgid "Timeshift" -msgstr "時間平移" - -msgctxt "#30201" -msgid "Enable timeshifting" -msgstr "開啟時間平移" - -msgctxt "#30202" -msgid "Timeshift buffer path" -msgstr "時間平移緩衝路徑" diff -Nru kodi-pvr-vbox-4.7.0/pvr.vbox/resources/settings.xml kodi-pvr-vbox-8.1.0/pvr.vbox/resources/settings.xml --- kodi-pvr-vbox-4.7.0/pvr.vbox/resources/settings.xml 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/pvr.vbox/resources/settings.xml 2021-01-09 10:03:05.000000000 +0000 @@ -1,3 +1,169 @@ + + +
+ + + + + + 0 + + + true + + + + + 1 + 80 + + 1 + 1 + 65535 + + + + + 2 + 0 + + 0 + 1 + 65535 + + + + + 2 + 55555 + + 1 + 1 + 65535 + + + + + 3 + 3 + + 1 + 1 + 60 + + + true + 14045 + + + + + + 2 + + + true + + + + + 2 + 19999 + + 1 + 1 + 65535 + + + + + 2 + 0 + + 0 + 1 + 65535 + + + + + 2 + 55555 + + 1 + 1 + 65535 + + + + + 3 + 10 + + 1 + 1 + 60 + + + true + 14045 + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 2 + true + + + + + + + + + + 0 + false + + + + 2 + special://userdata/addon_data/pvr.vbox + + true + true + + + true + + + 657 + + + + +
+
+ + \ No newline at end of file diff -Nru kodi-pvr-vbox-4.7.0/README.md kodi-pvr-vbox-8.1.0/README.md --- kodi-pvr-vbox-4.7.0/README.md 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/README.md 2021-01-09 10:03:05.000000000 +0000 @@ -1,17 +1,18 @@ -[![Build Status](https://travis-ci.org/kodi-pvr/pvr.vbox.svg?branch=Leia)](https://travis-ci.org/kodi-pvr/pvr.vbox/branches) -[![Build Status](https://ci.appveyor.com/api/projects/status/github/kodi-pvr/pvr.vuplus?branch=Leia&svg=true)](https://ci.appveyor.com/project/kodi-pvr/pvr-vuplus?branch=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/kodi-pvr/pvr.vbox.svg?branch=Matrix)](https://travis-ci.org/kodi-pvr/pvr.vbox/branches) +[![Build Status](https://dev.azure.com/teamkodi/kodi-pvr/_apis/build/status/kodi-pvr.pvr.vbox?branchName=Matrix)](https://dev.azure.com/teamkodi/kodi-pvr/_build/latest?definitionId=70&branchName=Matrix) +[![Build Status](https://jenkins.kodi.tv/view/Addons/job/kodi-pvr/job/pvr.vbox/job/Matrix/badge/icon)](https://jenkins.kodi.tv/blue/organizations/jenkins/kodi-pvr%2Fpvr.vbox/branches/) [![Coverity Scan Build Status](https://scan.coverity.com/projects/5120/badge.svg)](https://scan.coverity.com/projects/5120) # VBox Home TV Gateway PVR Client -This repository provides a [Kodi](http://kodi.tv) PVR addon for interfacing with the VBox Communications XTi TV Gateway devices. This README serves as a quick overview of the functionality and architecture -of the addon, to make it easier for others to possible contribute. +This repository provides a [Kodi](http://kodi.tv) PVR addon for interfacing with the VBox Communications XTi TV Gateway devices. This README serves as a quick overview of the functionality and architecture of the addon, to make it easier for others to possible contribute. ## Build instructions ### Linux -1. `git clone --branch Leia https://github.com/xbmc/xbmc.git` +1. `git clone --branch master https://github.com/xbmc/xbmc.git` 2. `git clone https://github.com/kodi-pvr/pvr.vbox.git` 3. `cd pvr.vbox && mkdir build && cd build` 4. `cmake -DADDONS_TO_BUILD=pvr.vbox -DADDON_SRC_PREFIX=../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../../xbmc/kodi-build/addons -DPACKAGE_ZIP=1 ../../xbmc/cmake/addons` @@ -59,7 +60,7 @@ ## Settings -There are two tabs in the settings dialog with identical settings, which means you can configure your addon to contact the VBox TV Gateway using both its internal and external address/port. This is useful for e.g. a laptop which is not permanently inside your internal network. When the addon starts it first attempts to make a connection using the internal settings. If that fails, it will try the external settings instead. The addon restarts itself if the connection is lost so it will automatically switch back without having to restart Kodi. +It's possible to configure the addon to connect to the VBox TV Gateway using both the local netowrk and via the internet address/port. This is useful for e.g. a laptop which is not permanently inside your internal network. When the addon starts it first attempts to make a connection using the local network settings. If that fails, it will try the internet settings instead. The addon restarts itself if the connection is lost so it will automatically switch back without having to restart Kodi. ### Connection - Internal Connection settings to use when connecting from your local network. For a local network connection the port values should not need to be modified. @@ -80,9 +81,9 @@ * **Connection timeout (seconds)**: The value used (in seconds) to denote when a connection attempt has failed when accessed from the internet. Default value is `10`. ### EPG -Settings related to the EPG. +Settings related to Channels & EPG. -* **Channel numbers set by**: Channel numbers be set via either of the following two options: +* **Channel numbers set by**: Channel numbers can be set via either of the following two options: - `LCN (Logical Channel Number) from backend` - The channel numbers as set on the backend. - `Channel index in backend` - Starting from 1 number the channels as per the order they appear on the backend. * **Reminder time (minutes before programme start)**: The amount of time in minutes prior to a programme start that a reminder should pop up. diff -Nru kodi-pvr-vbox-4.7.0/src/addon.cpp kodi-pvr-vbox-8.1.0/src/addon.cpp --- kodi-pvr-vbox-4.7.0/src/addon.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/addon.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#include "addon.h" +#include "VBoxInstance.h" + +using namespace vbox; + +ADDON_STATUS CVBoxAddon::CreateInstance(int instanceType, const std::string& instanceID, KODI_HANDLE instance, const std::string& version, KODI_HANDLE& addonInstance) +{ + if (instanceType == ADDON_INSTANCE_PVR) + { + kodi::Log(ADDON_LOG_DEBUG, "creating VBox Gateway PVR addon"); + + Settings settings; + ReadSettings(settings); + + m_vbox = new CVBoxInstance(settings, instance, version); + ADDON_STATUS status = m_vbox->Initialize(); + + addonInstance = m_vbox; + + return status; + } + + return ADDON_STATUS_UNKNOWN; +} + +void CVBoxAddon::DestroyInstance(int instanceType, const std::string& instanceID, KODI_HANDLE addonInstance) +{ + if (instanceType == ADDON_INSTANCE_PVR) + { + m_vbox = nullptr; + } +} + +void CVBoxAddon::ReadSettings(Settings& settings) +{ + settings.m_internalConnectionParams.hostname = kodi::GetSettingString("hostname", ""); + settings.m_internalConnectionParams.httpPort = kodi::GetSettingInt("http_port", 80); + settings.m_internalConnectionParams.httpsPort = kodi::GetSettingInt("https_port", 0); + settings.m_internalConnectionParams.upnpPort = kodi::GetSettingInt("upnp_port", 55555); + settings.m_internalConnectionParams.timeout = kodi::GetSettingInt("connection_timeout", 3); + + settings.m_externalConnectionParams.hostname = kodi::GetSettingString("external_hostname", ""); + settings.m_externalConnectionParams.httpPort = kodi::GetSettingInt("external_http_port", 19999); + settings.m_externalConnectionParams.httpsPort = kodi::GetSettingInt("external_https_port", 0); + settings.m_externalConnectionParams.upnpPort = kodi::GetSettingInt("external_upnp_port", 55555); + settings.m_externalConnectionParams.timeout = kodi::GetSettingInt("connection_timeout", 10); + + settings.m_setChannelIdUsingOrder = kodi::GetSettingEnum("set_channelid_using_order", CH_ORDER_BY_LCN); + settings.m_skipInitialEpgLoad = kodi::GetSettingBoolean("skip_initial_epg_load", true); + settings.m_timeshiftEnabled = kodi::GetSettingBoolean("timeshift_enabled", false); + settings.m_timeshiftBufferPath = kodi::GetSettingString("timeshift_path", ""); +} + +ADDON_STATUS CVBoxAddon::SetSetting(const std::string& settingName, const kodi::CSettingValue& settingValue) +{ +#define UPDATE_STR(key, var) \ + if (settingName == key) \ + { \ + if (var != settingValue.GetString()) \ + { \ + kodi::Log(ADDON_LOG_INFO, "updated setting %s from '%s' to '%s'", settingName.c_str(), var.c_str(), settingValue.GetString().c_str()); \ + return ADDON_STATUS_NEED_RESTART; \ + } \ + return ADDON_STATUS_OK; \ + } + +#define UPDATE_INT(key, var) \ + if (settingName == key) \ + { \ + if (var != settingValue.GetInt()) \ + { \ + kodi::Log(ADDON_LOG_INFO, "updated setting %s from '%d' to '%d'", settingName.c_str(), var, settingValue.GetInt()); \ + return ADDON_STATUS_NEED_RESTART; \ + } \ + return ADDON_STATUS_OK; \ + } + +#define UPDATE_BOOL(key, var) \ + if (settingName == key) \ + { \ + if (var != settingValue.GetBoolean()) \ + { \ + kodi::Log(ADDON_LOG_INFO, "updated setting %s from '%d' to '%d'", settingName.c_str(), var, settingValue.GetBoolean()); \ + return ADDON_STATUS_NEED_RESTART; \ + } \ + return ADDON_STATUS_OK; \ + } + + if (m_vbox) + { + const vbox::Settings& settings = m_vbox->GetSettings(); + + UPDATE_STR("hostname", settings.m_internalConnectionParams.hostname); + UPDATE_INT("http_port", settings.m_internalConnectionParams.httpPort); + UPDATE_INT("https_port", settings.m_internalConnectionParams.httpsPort); + UPDATE_INT("upnp_port", settings.m_internalConnectionParams.upnpPort); + UPDATE_INT("connection_timeout", settings.m_internalConnectionParams.timeout); + UPDATE_STR("external_hostname", settings.m_externalConnectionParams.hostname); + UPDATE_INT("external_http_port", settings.m_externalConnectionParams.httpPort); + UPDATE_INT("external_https_port", settings.m_externalConnectionParams.httpsPort); + UPDATE_INT("external_upnp_port", settings.m_externalConnectionParams.upnpPort); + UPDATE_INT("external_connection_timeout", settings.m_externalConnectionParams.timeout); + UPDATE_INT("set_channelid_using_order", settings.m_setChannelIdUsingOrder); + UPDATE_BOOL("skip_initial_epg_load", settings.m_skipInitialEpgLoad); + UPDATE_BOOL("timeshift_enabled", settings.m_timeshiftEnabled); + UPDATE_STR("timeshift_path", settings.m_timeshiftBufferPath); + } + + return ADDON_STATUS_OK; +#undef UPDATE_BOOL +#undef UPDATE_INT +#undef UPDATE_STR +} + +ADDONCREATOR(CVBoxAddon) diff -Nru kodi-pvr-vbox-4.7.0/src/addon.h kodi-pvr-vbox-8.1.0/src/addon.h --- kodi-pvr-vbox-4.7.0/src/addon.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/addon.h 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once + +#include + +namespace vbox +{ +class Settings; +} + +class CVBoxInstance; + +class ATTRIBUTE_HIDDEN CVBoxAddon : public kodi::addon::CAddonBase +{ +public: + CVBoxAddon() = default; + + ADDON_STATUS CreateInstance(int instanceType, const std::string& instanceID, KODI_HANDLE instance, const std::string& version, KODI_HANDLE& addonInstance) override; + void DestroyInstance(int instanceType, const std::string& instanceID, KODI_HANDLE addonInstance) override; + ADDON_STATUS SetSetting(const std::string& settingName, const kodi::CSettingValue& settingValue) override; + +private: + void ReadSettings(vbox::Settings& settings); + + CVBoxInstance* m_vbox = nullptr; +}; diff -Nru kodi-pvr-vbox-4.7.0/src/client.cpp kodi-pvr-vbox-8.1.0/src/client.cpp --- kodi-pvr-vbox-4.7.0/src/client.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/client.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1279 +0,0 @@ -/* - * Copyright (C) 2015 Sam Stenvall - * - * 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 XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#include -#include "p8-platform/util/util.h" -#include "kodi/xbmc_pvr_dll.h" -#include "client.h" -#include "vbox/Exceptions.h" -#include "vbox/VBox.h" -#include "vbox/ContentIdentifier.h" -#include "vbox/RecordingReader.h" -#include "timeshift/DummyBuffer.h" -#include "timeshift/FilesystemBuffer.h" -#include "xmltv/Utilities.h" - -using namespace ADDON; -using namespace vbox; - -// Initialize helpers -CHelper_libXBMC_addon *XBMC = NULL; -CHelper_libXBMC_pvr *PVR = NULL; -CHelper_libKODI_guilib *GUI = NULL; - -// Initialize globals -ADDON_STATUS g_status = ADDON_STATUS_UNKNOWN; -VBox *g_vbox = nullptr; -bool g_skippingInitialEpgLoad; -timeshift::Buffer *g_timeshiftBuffer = nullptr; -RecordingReader* recordingReader = nullptr; - -std::string g_internalHostname; -std::string g_externalHostname; -int g_internalHttpPort; -int g_externalHttpPort; -int g_internalHttpsPort; -int g_externalHttpsPort; -int g_internalUpnpPort; -int g_externalUpnpPort; -int g_internalConnectionTimeout; -int g_externalConnectionTimeout; - -ChannelOrder g_setChannelIdUsingOrder; -unsigned int g_remindMinsBeforeProg; -bool g_skipInitialEpgLoad; -bool g_timeshiftEnabled; -std::string g_timeshiftBufferPath; - -// settings context menu -unsigned int MENUHOOK_ID_RESCAN_EPG = 1; -unsigned int MENUHOOK_ID_SYNC_EPG = 2; -// EPG context menu -unsigned int MENUHOOK_ID_EPG_REMINDER = 1; -unsigned int MENUHOOK_ID_CANCEL_EPG_REMINDER = 2; -// channels context menu -unsigned int MENUHOOK_ID_MANUAL_REMINDER = 1; -unsigned int MENUHOOK_ID_CANCEL_CHANNEL_REMINDER = 2; - -extern "C" { - -void ADDON_ReadSettings() -{ -#define UPDATE_INT(var, key, def)\ - if (!XBMC->GetSetting(key, &var))\ - var = def; - -#define UPDATE_STR(var, key, tmp, def)\ - if (XBMC->GetSetting(key, tmp))\ - var = tmp;\ - else\ - var = def; - - char buffer[1024]; - - UPDATE_STR(g_internalHostname, "hostname", buffer, ""); - UPDATE_INT(g_internalHttpPort, "http_port", 80); - UPDATE_INT(g_internalHttpsPort, "https_port", 0); - UPDATE_INT(g_internalUpnpPort, "upnp_port", 55555); - UPDATE_STR(g_externalHostname, "external_hostname", buffer, ""); - UPDATE_INT(g_externalHttpPort, "external_http_port", 19999); - UPDATE_INT(g_externalHttpsPort, "external_https_port", 0); - UPDATE_INT(g_externalUpnpPort, "external_upnp_port", 55555); - UPDATE_INT(g_internalConnectionTimeout, "connection_timeout", 3); - UPDATE_INT(g_externalConnectionTimeout, "external_connection_timeout", 10); - UPDATE_INT(g_setChannelIdUsingOrder, "set_channelid_using_order", CH_ORDER_BY_LCN); - UPDATE_INT(g_remindMinsBeforeProg, "reminder_mins_before_prog", 0); - UPDATE_INT(g_skipInitialEpgLoad, "skip_initial_epg_load", true); - UPDATE_INT(g_timeshiftEnabled, "timeshift_enabled", false); - UPDATE_STR(g_timeshiftBufferPath, "timeshift_path", buffer, ""); - -#undef UPDATE_INT -#undef UPDATE_STR -} - -ADDON_STATUS ADDON_Create(void* hdl, void* props) -{ - if (!hdl || !props) - return ADDON_STATUS_UNKNOWN; - - // Instantiate helpers - XBMC = new CHelper_libXBMC_addon; - PVR = new CHelper_libXBMC_pvr; - GUI = new CHelper_libKODI_guilib; - - if (!XBMC->RegisterMe(hdl) || - !PVR->RegisterMe(hdl) || - !GUI->RegisterMe(hdl) ) - { - SAFE_DELETE(XBMC); - SAFE_DELETE(PVR); - SAFE_DELETE(GUI); - return ADDON_STATUS_PERMANENT_FAILURE; - } - - // Read the settings. The addon is restarted whenever a setting is changed - // so we only need to read them here. - ADDON_ReadSettings(); - Settings settings; - - settings.m_internalConnectionParams = - { - g_internalHostname, - g_internalHttpPort, - g_internalHttpsPort, - g_internalUpnpPort, - g_internalConnectionTimeout - }; - - settings.m_externalConnectionParams = - { - g_externalHostname, - g_externalHttpPort, - g_externalHttpsPort, - g_externalUpnpPort, - g_externalConnectionTimeout - }; - - settings.m_setChannelIdUsingOrder = g_setChannelIdUsingOrder; - settings.m_remindMinsBeforeProg = g_remindMinsBeforeProg; - settings.m_skipInitialEpgLoad = g_skipInitialEpgLoad; - settings.m_timeshiftEnabled = g_timeshiftEnabled; - settings.m_timeshiftBufferPath = g_timeshiftBufferPath; - - // Create the addon - VBox::Log(LOG_DEBUG, "creating VBox Gateway PVR addon"); - g_status = ADDON_STATUS_UNKNOWN; - g_vbox = new VBox(settings); - - // Validate settings - if (g_vbox->ValidateSettings()) - { - // Start the addon - try { - g_vbox->Initialize(); - g_status = ADDON_STATUS_OK; - - // Attach event handlers - g_vbox->OnChannelsUpdated = []() { PVR->TriggerChannelUpdate(); }; - g_vbox->OnRecordingsUpdated = []() { PVR->TriggerRecordingUpdate(); }; - g_vbox->OnTimersUpdated = []() { PVR->TriggerTimerUpdate(); }; - g_vbox->OnGuideUpdated = []() - { - for (const auto &channel : g_vbox->GetChannels()) - { - PVR->TriggerEpgUpdate(ContentIdentifier::GetUniqueId(channel)); - } - }; - - // Create the timeshift buffer - if (settings.m_timeshiftEnabled) - g_timeshiftBuffer = new timeshift::FilesystemBuffer(settings.m_timeshiftBufferPath); - else - g_timeshiftBuffer = new timeshift::DummyBuffer(); - - g_timeshiftBuffer->SetReadTimeout(g_vbox->GetConnectionParams().timeout); - - // initializing TV Settings Client Specific menu hooks - PVR_MENUHOOK hooks[] = { { MENUHOOK_ID_RESCAN_EPG, 30106, PVR_MENUHOOK_SETTING }, - { MENUHOOK_ID_SYNC_EPG, 30107, PVR_MENUHOOK_SETTING }, - { MENUHOOK_ID_EPG_REMINDER, 30110, PVR_MENUHOOK_EPG }, - { MENUHOOK_ID_CANCEL_EPG_REMINDER, 30112, PVR_MENUHOOK_EPG }, - { MENUHOOK_ID_MANUAL_REMINDER, 30111, PVR_MENUHOOK_CHANNEL }, - { MENUHOOK_ID_CANCEL_CHANNEL_REMINDER, 30113, PVR_MENUHOOK_CHANNEL } }; - - for (int i = 0; i < sizeof(hooks) / sizeof(PVR_MENUHOOK); ++i) - PVR->AddMenuHook(&hooks[i]); - } - catch (FirmwareVersionException &e) { - XBMC->QueueNotification(ADDON::QUEUE_ERROR, e.what()); - g_status = ADDON_STATUS_PERMANENT_FAILURE; - } - catch (VBoxException &e) { - VBox::LogException(e); - g_status = ADDON_STATUS_LOST_CONNECTION; - } - } - else - g_status = ADDON_STATUS_NEED_SETTINGS; - - return g_status; -} - -ADDON_STATUS ADDON_GetStatus() -{ - return g_status; -} - -void ADDON_Destroy() -{ - SAFE_DELETE(g_vbox); - SAFE_DELETE(g_timeshiftBuffer); - g_status = ADDON_STATUS_UNKNOWN; -} - -ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue) -{ -#define UPDATE_STR(key, var)\ - if (!strcmp(settingName, key))\ - {\ - if (strcmp(var.c_str(), (const char*)settingValue) != 0)\ - {\ - VBox::Log(LOG_INFO, "updated setting %s from '%s' to '%s'",\ - settingName, var.c_str(), settingValue);\ - return ADDON_STATUS_NEED_RESTART;\ - }\ - return ADDON_STATUS_OK;\ - } - -#define UPDATE_INT(key, type, var)\ - if (!strcmp(settingName, key))\ - {\ - if (var != *(type*)settingValue)\ - {\ - VBox::Log(LOG_INFO, "updated setting %s from '%d' to '%d'",\ - settingName, var, (int)*(type*)settingValue);\ - return ADDON_STATUS_NEED_RESTART;\ - }\ - return ADDON_STATUS_OK;\ - } - - const vbox::Settings &settings = g_vbox->GetSettings(); - - UPDATE_STR("hostname", settings.m_internalConnectionParams.hostname); - UPDATE_INT("http_port", int, settings.m_internalConnectionParams.httpPort); - UPDATE_INT("https_port", int, settings.m_internalConnectionParams.httpsPort); - UPDATE_INT("upnp_port", int, settings.m_internalConnectionParams.upnpPort); - UPDATE_INT("connection_timeout", int, settings.m_internalConnectionParams.timeout); - UPDATE_STR("external_hostname", settings.m_externalConnectionParams.hostname); - UPDATE_INT("external_http_port", int, settings.m_externalConnectionParams.httpPort); - UPDATE_INT("external_https_port", int, settings.m_externalConnectionParams.httpsPort); - UPDATE_INT("external_upnp_port", int, settings.m_externalConnectionParams.upnpPort); - UPDATE_INT("external_connection_timeout", int, settings.m_externalConnectionParams.timeout); - UPDATE_INT("set_channelid_using_order", ChannelOrder, settings.m_setChannelIdUsingOrder); - UPDATE_INT("reminder_mins_before_prog", unsigned int, settings.m_remindMinsBeforeProg) - UPDATE_INT("skip_initial_epg_load", bool, settings.m_skipInitialEpgLoad); - UPDATE_INT("timeshift_enabled", bool, settings.m_timeshiftEnabled); - UPDATE_STR("timeshift_path", settings.m_timeshiftBufferPath); - - return ADDON_STATUS_OK; -#undef UPDATE_INT -#undef UPDATE_STR -} - -void OnSystemSleep() -{ -} - -void OnSystemWake() -{ -} - -void OnPowerSavingActivated() -{ -} - -void OnPowerSavingDeactivated() -{ -} - -PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES* pCapabilities) -{ - pCapabilities->bSupportsTV = true; - pCapabilities->bSupportsRadio = true; - pCapabilities->bSupportsChannelGroups = false; - pCapabilities->bSupportsEPG = true; - pCapabilities->bHandlesInputStream = true; - - // Recording capability is determined further down, we'll assume false - // in case the real capabilities cannot be determined for some reason - pCapabilities->bSupportsRecordings = false; - pCapabilities->bSupportsTimers = false; - - // Unsupported features - pCapabilities->bSupportsRecordingsUndelete = false; - pCapabilities->bSupportsChannelScan = false; - pCapabilities->bSupportsChannelSettings = false; - pCapabilities->bHandlesDemuxing = false; - pCapabilities->bSupportsRecordingPlayCount = false; - pCapabilities->bSupportsLastPlayedPosition = false; - pCapabilities->bSupportsRecordingEdl = false; - - // Wait for initialization until we decide if we support recordings or not. - // Recording is only possible when external media is present - if (g_vbox->GetStateHandler().WaitForState(StartupState::INITIALIZED) - && g_vbox->SupportsRecordings()) - { - pCapabilities->bSupportsRecordings = true; - pCapabilities->bSupportsTimers = true; - } - - pCapabilities->bSupportsRecordingsRename = false; - pCapabilities->bSupportsRecordingsLifetimeChange = false; - pCapabilities->bSupportsDescrambleInfo = false; - - return PVR_ERROR_NO_ERROR; -} - -const char *GetBackendName() -{ - static std::string backendName = g_vbox->GetBackendName(); - return backendName.c_str(); -} - -const char *GetBackendVersion() -{ - static std::string backendVersion = g_vbox->GetBackendVersion(); - return backendVersion.c_str(); -} - -const char *GetConnectionString() -{ - static std::string connectionString = g_vbox->GetConnectionString(); - return connectionString.c_str(); -} - -const char *GetBackendHostname() -{ - static std::string backendHostname = g_vbox->GetBackendHostname(); - return backendHostname.c_str(); -} - -int GetChannelsAmount() -{ - try { - return g_vbox->GetChannelsAmount(); - } - catch (VBoxException &e) - { - g_vbox->LogException(e); - return PVR_ERROR_SERVER_ERROR; - } -} - -PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio) -{ - auto &channels = g_vbox->GetChannels(); - unsigned int i = 0; - - for (const auto &item : channels) - { - // Skip those that are not of the correct type - if (item->m_radio != bRadio) - continue; - - PVR_CHANNEL channel; - memset(&channel, 0, sizeof(PVR_CHANNEL)); - - channel.iUniqueId = ContentIdentifier::GetUniqueId(item); - channel.bIsRadio = item->m_radio; - - // Override LCN if backend channel order should be forced - ++i; - if (g_vbox->GetSettings().m_setChannelIdUsingOrder == CH_ORDER_BY_INDEX) - channel.iChannelNumber = i; - // default - CH_ORDER_BY_LCN - else - channel.iChannelNumber = item->m_number; - - channel.iEncryptionSystem = item->m_encrypted ? 0xFFFF : 0x0000; - - strncpy(channel.strChannelName, item->m_name.c_str(), - sizeof(channel.strChannelName)); - strncpy(channel.strIconPath, item->m_iconUrl.c_str(), - sizeof(channel.strIconPath)); - - // Set stream format for TV channels - if (!item->m_radio) - { - strncpy(channel.strInputFormat, "video/mp2t", - sizeof(channel.strInputFormat)); - } - - VBox::Log(LOG_INFO, "Adding channel %d: %s. Icon: %s", - channel.iChannelNumber, channel.strChannelName, channel.strIconPath); - - PVR->TransferChannelEntry(handle, &channel); - } - - return PVR_ERROR_NO_ERROR; -} - -PVR_ERROR GetDriveSpace(long long *iTotal, long long *iUsed) -{ - *iTotal = g_vbox->GetRecordingTotalSpace() / 1024; - *iUsed = g_vbox->GetRecordingUsedSpace() / 1024; - - return PVR_ERROR_NO_ERROR; -} - -int GetRecordingsAmount(bool deleted) -{ - return g_vbox->GetRecordingsAmount(); -} - -PVR_ERROR GetRecordings(ADDON_HANDLE handle, bool deleted) -{ - auto &recordings = g_vbox->GetRecordingsAndTimers(); - - for (const auto &item : recordings) - { - // Skip timers - if (!item->IsRecording()) - continue; - - PVR_RECORDING recording; - memset(&recording, 0, sizeof(PVR_RECORDING)); - - time_t startTime = xmltv::Utilities::XmltvToUnixTime(item->m_startTime); - time_t endTime = xmltv::Utilities::XmltvToUnixTime(item->m_endTime); - unsigned int id = item->m_id; - - recording.recordingTime = startTime; - std::time_t now = std::time(nullptr); - if (now > endTime) - recording.iDuration = static_cast(endTime - startTime); - else - recording.iDuration = static_cast(now - startTime); - recording.iEpgEventId = id; - - strncpy(recording.strChannelName, item->m_channelName.c_str(), - sizeof(recording.strChannelName)); - - strncpy(recording.strRecordingId, std::to_string(id).c_str(), - sizeof(recording.strRecordingId)); - - strncpy(recording.strTitle, item->m_title.c_str(), - sizeof(recording.strTitle)); - - strncpy(recording.strPlot, item->m_description.c_str(), - sizeof(recording.strPlot)); - - recording.iChannelUid = PVR_CHANNEL_INVALID_UID; - recording.channelType = PVR_RECORDING_CHANNEL_TYPE_UNKNOWN; - - // Find the recordings channel and use its unique ID if we find one - auto &channels = g_vbox->GetChannels(); - auto it = std::find_if(channels.cbegin(), channels.cend(), - [&item](const ChannelPtr &channel) - { - return channel->m_xmltvName == item->m_channelId; - }); - - if (it != channels.cend()) - { - ChannelPtr channel = *it; - recording.iChannelUid = ContentIdentifier::GetUniqueId(channel); - if (channel->m_radio) - recording.channelType = PVR_RECORDING_CHANNEL_TYPE_RADIO; - else - recording.channelType = PVR_RECORDING_CHANNEL_TYPE_TV; - } - - PVR->TransferRecordingEntry(handle, &recording); - } - - return PVR_ERROR_NO_ERROR; -} - -PVR_ERROR DeleteRecording(const PVR_RECORDING &recording) -{ - try { - unsigned int id = static_cast(std::stoi(recording.strRecordingId)); - - if (g_vbox->DeleteRecordingOrTimer(id)) - return PVR_ERROR_NO_ERROR; - else - return PVR_ERROR_FAILED; - } - catch (...) - { - return PVR_ERROR_INVALID_PARAMETERS; - } -} - -// Recording stream methods -bool OpenRecordedStream(const PVR_RECORDING& recording) -{ - if (recordingReader) - SAFE_DELETE(recordingReader); - recordingReader = nullptr; - - unsigned int id = static_cast(std::stoi(recording.strRecordingId)); - auto &recordings = g_vbox->GetRecordingsAndTimers(); - auto recIt = std::find_if(recordings.begin(), recordings.end(), - [id](const RecordingPtr &item) - { - return item->IsRecording() && id == item->m_id; - }); - - if (recIt == recordings.end()) - return PVR_ERROR_SERVER_ERROR; - - std::time_t now = std::time(nullptr), start = 0, end = 0; - std::string channelName = recording.strChannelName; - time_t recordingTime = recording.recordingTime; - auto timerIt = std::find_if(recordings.begin(), recordings.end(), - [now, channelName, recordingTime](const RecordingPtr &item) - { - return item->IsTimer() && item->IsRunning(now, channelName, recordingTime); - }); - if (timerIt != recordings.end()) - { - auto& timer = *timerIt; - start = xmltv::Utilities::XmltvToUnixTime(timer->m_startTime); - end = xmltv::Utilities::XmltvToUnixTime(timer->m_endTime); - } - - recordingReader = new RecordingReader((*recIt)->m_url.c_str(), start, end, recording.iDuration); - - return recordingReader->Start(); -} - -void CloseRecordedStream() -{ - if (recordingReader) - SAFE_DELETE(recordingReader); - recordingReader = nullptr; -} - -int ReadRecordedStream(unsigned char* buffer, unsigned int size) -{ - if (!recordingReader) - return 0; - - return recordingReader->ReadData(buffer, size); -} - -long long SeekRecordedStream(long long position, int whence) -{ - if (!recordingReader) - return 0; - - return recordingReader->Seek(position, whence); -} - -long long LengthRecordedStream() -{ - if (!recordingReader) - return -1; - - return recordingReader->Length(); -} - -PVR_ERROR GetTimerTypes(PVR_TIMER_TYPE types[], int *size) -{ - int numOfTimerTypes = 0; - - memset(&types[numOfTimerTypes], 0, sizeof(types[numOfTimerTypes])); - // EPG based single recording - types[numOfTimerTypes].iId = vbox::TIMER_VBOX_TYPE_EPG_BASED_SINGLE; - strcpy(types[numOfTimerTypes].strDescription, "EPG-based one time recording"); - types[numOfTimerTypes].iAttributes = - PVR_TIMER_TYPE_REQUIRES_EPG_TAG_ON_CREATE | - PVR_TIMER_TYPE_SUPPORTS_START_TIME | - PVR_TIMER_TYPE_SUPPORTS_END_TIME; - ++numOfTimerTypes; - // episode recording - memset(&types[numOfTimerTypes], 0, sizeof(types[numOfTimerTypes])); - types[numOfTimerTypes].iId = TIMER_VBOX_TYPE_EPISODE; - strcpy(types[numOfTimerTypes].strDescription, "Episode recording"); - types[numOfTimerTypes].iAttributes = - PVR_TIMER_TYPE_IS_READONLY | - PVR_TIMER_TYPE_SUPPORTS_START_TIME | - PVR_TIMER_TYPE_SUPPORTS_END_TIME; - ++numOfTimerTypes; - // manual recording - memset(&types[numOfTimerTypes], 0, sizeof(types[numOfTimerTypes])); - types[numOfTimerTypes].iId = TIMER_VBOX_TYPE_MANUAL_SINGLE; - strcpy(types[numOfTimerTypes].strDescription, "Manual one time recording"); - types[numOfTimerTypes].iAttributes = - PVR_TIMER_TYPE_IS_MANUAL | - PVR_TIMER_TYPE_FORBIDS_EPG_TAG_ON_CREATE | - PVR_TIMER_TYPE_SUPPORTS_CHANNELS | - PVR_TIMER_TYPE_SUPPORTS_START_TIME | - PVR_TIMER_TYPE_SUPPORTS_END_TIME; - ++numOfTimerTypes; - - //Automatic series recording - memset(&types[numOfTimerTypes], 0, sizeof(types[numOfTimerTypes])); - types[numOfTimerTypes].iId = TIMER_VBOX_TYPE_EPG_BASED_AUTO_SERIES; - strcpy(types[numOfTimerTypes].strDescription, "EPG-based automatic series recording"); -types[numOfTimerTypes].iAttributes = - PVR_TIMER_TYPE_REQUIRES_EPG_SERIES_ON_CREATE; - ++numOfTimerTypes; - - // EPG based series recording - memset(&types[numOfTimerTypes], 0, sizeof(types[numOfTimerTypes])); - types[numOfTimerTypes].iId = TIMER_VBOX_TYPE_EPG_BASED_MANUAL_SERIES; - strcpy(types[numOfTimerTypes].strDescription, "EPG-based manual series recording"); - types[numOfTimerTypes].iAttributes = - PVR_TIMER_TYPE_IS_REPEATING | - PVR_TIMER_TYPE_REQUIRES_EPG_TAG_ON_CREATE | - PVR_TIMER_TYPE_SUPPORTS_START_TIME | - PVR_TIMER_TYPE_SUPPORTS_END_TIME | - PVR_TIMER_TYPE_SUPPORTS_WEEKDAYS; - ++numOfTimerTypes; - - //Manual series recording - memset(&types[numOfTimerTypes], 0, sizeof(types[numOfTimerTypes])); - types[numOfTimerTypes].iId = TIMER_VBOX_TYPE_MANUAL_SERIES; - strcpy(types[numOfTimerTypes].strDescription, "Manual series recording"); - types[numOfTimerTypes].iAttributes = - PVR_TIMER_TYPE_IS_MANUAL | - PVR_TIMER_TYPE_IS_REPEATING | - PVR_TIMER_TYPE_FORBIDS_EPG_TAG_ON_CREATE | - PVR_TIMER_TYPE_SUPPORTS_CHANNELS | - PVR_TIMER_TYPE_SUPPORTS_START_TIME | - PVR_TIMER_TYPE_SUPPORTS_END_TIME | - PVR_TIMER_TYPE_SUPPORTS_WEEKDAYS; - ++numOfTimerTypes; - - *size = numOfTimerTypes; - return PVR_ERROR_NO_ERROR; -} - -int GetTimersAmount() -{ - return g_vbox->GetTimersAmount(); -} - -PVR_ERROR GetTimers(ADDON_HANDLE handle) -{ - /* TODO: Change implementation to get support for the timer features introduced with PVR API 1.9.7 */ - auto &recordings = g_vbox->GetRecordingsAndTimers(); - - // first get timers from single recordings (scheduled) - for (const auto &item : recordings) - { - // Skip recordings - if (!item->IsTimer()) - continue; - - PVR_TIMER timer; - memset(&timer, 0, sizeof(PVR_TIMER)); - timer.iTimerType = (item->m_seriesId > 0)? vbox::TIMER_VBOX_TYPE_EPISODE : vbox::TIMER_VBOX_TYPE_MANUAL_SINGLE; - timer.startTime = xmltv::Utilities::XmltvToUnixTime(item->m_startTime); - timer.endTime = xmltv::Utilities::XmltvToUnixTime(item->m_endTime); - timer.iClientIndex = item->m_id; - - // Convert the internal timer state to PVR_TIMER_STATE - switch (item->GetState()) - { - case RecordingState::SCHEDULED: - timer.state = PVR_TIMER_STATE_SCHEDULED; - break; - case RecordingState::RECORDED: - case RecordingState::EXTERNAL: - timer.state = PVR_TIMER_STATE_COMPLETED; - break; - case RecordingState::RECORDING: - timer.state = PVR_TIMER_STATE_RECORDING; - break; - case RecordingState::RECORDING_ERROR: - break; - } - - // Find the timer's channel and use its unique ID - auto &channels = g_vbox->GetChannels(); - auto it = std::find_if(channels.cbegin(), channels.cend(), - [&item](const ChannelPtr &channel) - { - return channel->m_xmltvName == item->m_channelId; - }); - - if (it != channels.cend()) - timer.iClientChannelUid = ContentIdentifier::GetUniqueId(*it); - else - continue; - - strncpy(timer.strTitle, item->m_title.c_str(), - sizeof(timer.strTitle)); - - strncpy(timer.strSummary, item->m_description.c_str(), - sizeof(timer.strSummary)); - - g_vbox->Log(LOG_DEBUG, "GetTimers(): adding timer to show %s", item->m_title.c_str()); - // TODO: Set margins to whatever the API reports - PVR->TransferTimerEntry(handle, &timer); - } - // second: get timer rules for series - auto &series = g_vbox->GetSeriesTimers(); - for (const auto &item : series) - { - PVR_TIMER timer; - memset(&timer, 0, sizeof(PVR_TIMER)); - - timer.iTimerType = (item->m_fIsAuto)? vbox::TIMER_VBOX_TYPE_EPG_BASED_AUTO_SERIES : vbox::TIMER_VBOX_TYPE_MANUAL_SERIES; - timer.iClientIndex = item->m_id; - timer.state = PVR_TIMER_STATE_SCHEDULED; - - // Find the timer's channel and use its unique ID - auto &channels = g_vbox->GetChannels(); - auto it = std::find_if(channels.cbegin(), channels.cend(), - [&item](const ChannelPtr &channel) - { - return channel->m_xmltvName == item->m_channelId; - }); - - if (it != channels.cend()) - timer.iClientChannelUid = ContentIdentifier::GetUniqueId(*it); - - unsigned int nextScheduledId = item->m_scheduledId; - // Find next recording of the series - auto recIt = std::find_if(recordings.begin(), recordings.end(), - [nextScheduledId](const RecordingPtr &recording) - { - return nextScheduledId == recording->m_id; - }); - // if it doesn't exist (canceled) - don't add series - if (recIt == recordings.end()) - continue; - - timer.startTime = xmltv::Utilities::XmltvToUnixTime(item->m_startTime); - // automatic starts & stops whenever detected (will appear as episode) - if (item->m_fIsAuto) - { - timer.bStartAnyTime = true; - timer.bEndAnyTime = true; - } - else - { - // set periodic times - timer.firstDay = xmltv::Utilities::XmltvToUnixTime(item->m_startTime); - timer.iWeekdays = item->m_weekdays; - timer.endTime = xmltv::Utilities::XmltvToUnixTime(item->m_endTime); - } - strncpy(timer.strTitle, item->m_title.c_str(), - sizeof(timer.strTitle)); - - strncpy(timer.strSummary, item->m_description.c_str(), - sizeof(timer.strSummary)); - - // TODO: Set margins to whatever the API reports - PVR->TransferTimerEntry(handle, &timer); - } - return PVR_ERROR_NO_ERROR; -} - -PVR_ERROR AddTimer(const PVR_TIMER &timer) -{ - VBox::Log(LOG_DEBUG, "AddTimer() : entering with timer type 0x%x", timer.iTimerType); - // Find the channel the timer is for - auto &channels = g_vbox->GetChannels(); - auto it = std::find_if(channels.cbegin(), channels.cend(), - [&timer](const ChannelPtr &channel) - { - return timer.iClientChannelUid == ContentIdentifier::GetUniqueId(channel); - }); - - if (it == channels.end()) - return PVR_ERROR_INVALID_PARAMETERS; - - const ChannelPtr channel = *it; - - // Find the channel's schedule - const Schedule schedule = g_vbox->GetSchedule(channel); - - try { - // update the recording margins in the backend - g_vbox->UpdateRecordingMargins( {timer.iMarginStart, timer.iMarginEnd} ); - // Set start time to now if it's missing - time_t startTime = timer.startTime; - time_t endTime = timer.endTime; - std::string title(timer.strTitle); - std::string desc(timer.strSummary); - - if (startTime == 0) - startTime = time(nullptr); - - // Add a programme-based timer if the programme exists in the schedule - const xmltv::ProgrammePtr programme = (schedule.schedule)? schedule.schedule->GetProgramme(timer.iEpgUid) : nullptr; - - switch (timer.iTimerType) - { - case TIMER_VBOX_TYPE_EPG_BASED_SINGLE: - case TIMER_VBOX_TYPE_EPISODE: - if (programme) - { - switch (schedule.origin) - { - case Schedule::Origin::INTERNAL_GUIDE: - g_vbox->AddTimer(channel, programme); - break; - case Schedule::Origin::EXTERNAL_GUIDE: - title = programme->m_title; - desc = programme->m_description; - g_vbox->AddTimer(channel, startTime, endTime, title, desc); - break; - } - return PVR_ERROR_NO_ERROR; - } - else - { - g_vbox->AddTimer(channel, startTime, endTime, title, desc); - return PVR_ERROR_NO_ERROR; - } - case TIMER_VBOX_TYPE_MANUAL_SINGLE: - g_vbox->AddTimer(channel, startTime, endTime, title, desc); - return PVR_ERROR_NO_ERROR; - case TIMER_VBOX_TYPE_EPG_BASED_AUTO_SERIES: - { - if (!programme) - return PVR_ERROR_INVALID_PARAMETERS; - g_vbox->AddSeriesTimer(channel, programme); - return PVR_ERROR_NO_ERROR; - } - case TIMER_VBOX_TYPE_EPG_BASED_MANUAL_SERIES: - { - if (!programme) - return PVR_ERROR_INVALID_PARAMETERS; - g_vbox->AddTimer(channel, startTime, endTime, title, desc, timer.iWeekdays); - return PVR_ERROR_NO_ERROR; - } - case TIMER_VBOX_TYPE_MANUAL_SERIES: - { - g_vbox->AddTimer(channel, startTime, endTime, title, desc, timer.iWeekdays); - return PVR_ERROR_NO_ERROR; - } - default: - // any other timer type is wrong - return PVR_ERROR_INVALID_PARAMETERS; - } - } - catch (VBoxException &e) - { - g_vbox->LogException(e); - return PVR_ERROR_FAILED; - } -} - -PVR_ERROR DeleteTimer(const PVR_TIMER &timer, bool bForceDelete) -{ - if (g_vbox->DeleteRecordingOrTimer(timer.iClientIndex)) - return PVR_ERROR_NO_ERROR; - - return PVR_ERROR_FAILED; -} - -PVR_ERROR UpdateTimer(const PVR_TIMER &timer) -{ - PVR_ERROR err = DeleteTimer(timer, true); - - if (err == PVR_ERROR_NO_ERROR) - return AddTimer(timer); - return err; -} - -PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) -{ - const ChannelPtr channelPtr = g_vbox->GetChannel(channel.iUniqueId); - - if (!channelPtr) - return PVR_ERROR_INVALID_PARAMETERS; - - if (g_skippingInitialEpgLoad) - { - VBox::Log(LOG_DEBUG, "%s Skipping Initial EPG for channel: %s", __FUNCTION__, channelPtr->m_name.c_str()); - g_vbox->MarkChannelAsInitialEpgSkipped(channel.iUniqueId); - return PVR_ERROR_NO_ERROR; - } - - // Retrieve the schedule - const auto schedule = g_vbox->GetSchedule(channelPtr); - - if (!schedule.schedule) - return PVR_ERROR_NO_ERROR; - - // Transfer the programmes between the start and end times - for (const auto &programme : schedule.schedule->GetSegment(iStart, iEnd)) - { - EPG_TAG event; - memset(&event, 0, sizeof(EPG_TAG)); - - event.startTime = xmltv::Utilities::XmltvToUnixTime(programme->m_startTime); - event.endTime = xmltv::Utilities::XmltvToUnixTime(programme->m_endTime); - event.iUniqueChannelId = channel.iUniqueId; - event.iUniqueBroadcastId = ContentIdentifier::GetUniqueId(programme.get()); - event.strTitle = programme->m_title.c_str(); - event.strPlot = programme->m_description.c_str(); - event.iYear = programme->m_year; - event.strEpisodeName = programme->m_subTitle.c_str(); - event.strIconPath = programme->m_icon.c_str(); - - std::string directors = xmltv::Utilities::ConcatenateStringList(programme->GetDirectors()); - std::string writers = xmltv::Utilities::ConcatenateStringList(programme->GetWriters()); - std::vector categories = programme->GetCategories(); - std::string catStrings = xmltv::Utilities::ConcatenateStringList(categories); - - event.strDirector = directors.c_str(); - event.strWriter = writers.c_str(); - - // use genre mapper to find the most common genre type (from categories) - event.iGenreType = g_vbox->GetCategoriesGenreType(categories); - event.strGenreDescription = catStrings.c_str(); - - // Extract up to five cast members only - std::vector actorNames; - const auto &actors = programme->GetActors(); - int numActors = std::min(static_cast(actors.size()), 5); - - for (unsigned int i = 0; i < numActors; i++) - actorNames.push_back(actors.at(i).name); - - std::string cast = xmltv::Utilities::ConcatenateStringList(actorNames); - event.strCast = cast.c_str(); - - event.iFlags = EPG_TAG_FLAG_UNDEFINED; - - if (!programme->m_seriesIds.empty()) - { - VBox::Log(LOG_DEBUG, "GetEPGForChannel():programme %s marked as belonging to a series", programme->m_title.c_str()); - event.iFlags |= EPG_TAG_FLAG_IS_SERIES; - } - PVR->TransferEpgEntry(handle, &event); - } - - return PVR_ERROR_NO_ERROR; -} - -PVR_ERROR SetEPGTimeFrame(int) -{ - return PVR_ERROR_NOT_IMPLEMENTED; -} - -PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus) -{ - const ChannelPtr currentChannel = g_vbox->GetCurrentChannel(); - - if (!currentChannel) - return PVR_ERROR_NO_ERROR; - - try { - ChannelStreamingStatus status = g_vbox->GetChannelStreamingStatus(currentChannel); - - // Adjust for Kodi's weird handling of the signal strength - signalStatus.iSignal = static_cast(status.GetSignalStrength()) * 655; - signalStatus.iSNR = static_cast(status.m_signalQuality) * 655; - signalStatus.iBER = status.GetBer(); - - strncpy(signalStatus.strAdapterName, - status.GetTunerName().c_str(), sizeof(signalStatus.strAdapterName)); - - strncpy(signalStatus.strAdapterStatus, - status.m_lockStatus.c_str(), sizeof(signalStatus.strAdapterStatus)); - - strncpy(signalStatus.strServiceName, - status.GetServiceName().c_str(), sizeof(signalStatus.strServiceName)); - - strncpy(signalStatus.strMuxName, - status.GetMuxName().c_str(), sizeof(signalStatus.strMuxName)); - } - catch (VBoxException &e) - { - g_vbox->LogException(e); - } - - return PVR_ERROR_NO_ERROR; -} - -PVR_ERROR GetDescrambleInfo(PVR_DESCRAMBLE_INFO*) -{ - return PVR_ERROR_NOT_IMPLEMENTED; -} - -bool OpenLiveStream(const PVR_CHANNEL &channel) -{ - // Find the channel - const ChannelPtr channelPtr = g_vbox->GetChannel(channel.iUniqueId); - - if (!channelPtr) - return false; - - // Remember the current channel if the buffer was successfully opened - if (g_timeshiftBuffer->Open(channelPtr->m_url)) - { - g_vbox->SetCurrentChannel(channelPtr); - return true; - } - - CloseLiveStream(); - g_vbox->SetChannelStreamingStatus(channelPtr); - return false; -} - -void CloseLiveStream() -{ - g_timeshiftBuffer->Close(); - g_vbox->SetCurrentChannel(nullptr); -} - -int ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize) -{ - return g_timeshiftBuffer->Read(pBuffer, iBufferSize); -} - -long long LengthLiveStream() -{ - return g_timeshiftBuffer->Length(); -} - -long long SeekLiveStream(long long iPosition, int iWhence /* = SEEK_SET */) -{ - return g_timeshiftBuffer->Seek(iPosition, iWhence); -} - -bool CanPauseStream() -{ - return g_vbox->GetSettings().m_timeshiftEnabled; -} - -bool CanSeekStream() -{ - return g_vbox->GetSettings().m_timeshiftEnabled; -} - -bool IsRealTimeStream() -{ - const ChannelPtr currentChannel = g_vbox->GetCurrentChannel(); - - return currentChannel != nullptr; -} - -// Stream times -PVR_ERROR GetStreamTimes(PVR_STREAM_TIMES* times) -{ - // Addon API 5.8.0 - if (!times) - return PVR_ERROR_INVALID_PARAMETERS; - - if (IsRealTimeStream() && g_timeshiftBuffer && g_vbox->GetSettings().m_timeshiftEnabled) - { - times->startTime = g_timeshiftBuffer->GetStartTime(); - times->ptsStart = 0; - times->ptsBegin = 0; - times->ptsEnd = (!g_timeshiftBuffer->CanSeekStream()) ? 0 - : (g_timeshiftBuffer->GetEndTime() - g_timeshiftBuffer->GetStartTime()) * DVD_TIME_BASE; - - return PVR_ERROR_NO_ERROR; - } - else if (recordingReader) - { - times->startTime = 0; - times->ptsStart = 0; - times->ptsBegin = 0; - times->ptsEnd = static_cast(recordingReader->CurrentDuration()) * DVD_TIME_BASE; - - return PVR_ERROR_NO_ERROR; - } - - return PVR_ERROR_NOT_IMPLEMENTED; -} - -void PauseStream(bool bPaused) -{ - // TODO: Setting for timeshift on pause as well as always -} - -bool SetProgramReminder(unsigned int epgUid) -{ - ChannelPtr selectedChannel = nullptr; - - // find channel with the program in context - auto &channels = g_vbox->GetChannels(); - auto it = std::find_if(channels.cbegin(), channels.cend(), - [&epgUid](const ChannelPtr &channel) - { - const Schedule schedule = g_vbox->GetSchedule(channel); - const xmltv::ProgrammePtr programme = (schedule.schedule) ? schedule.schedule->GetProgramme(epgUid) : nullptr; - return (programme != nullptr); - }); - // if channel doesn't exist - return error - if (it == channels.cend()) - { - XBMC->QueueNotification(QUEUE_ERROR, "Program not found for that channel"); - return false; - } - else - { - // otherwise - get the program object and add a reminder with it as parameter - selectedChannel = *it; - const Schedule schedule = g_vbox->GetSchedule(selectedChannel); - const xmltv::ProgrammePtr programme = (schedule.schedule) ? schedule.schedule->GetProgramme(epgUid) : nullptr; - if (programme) - { - try { - g_vbox->AddReminder(selectedChannel, programme); - } - catch (VBoxException &e) - { - g_vbox->LogException(e); - return false; - } - XBMC->QueueNotification(QUEUE_INFO, "Reminder added"); - } - } - return true; -} - -static bool SetManualReminder(const PVR_MENUHOOK_DATA &item) -{ - time_t currTime = time(nullptr), reminderTime; - ChannelPtr selectedChannel = nullptr; - char buffer[256]; - - memset(buffer, 0, sizeof(buffer)); - // get channel in context - selectedChannel = g_vbox->GetChannel(item.data.channel.iUniqueId); - if (!selectedChannel) - return false; - - try { - // create the current time's formatted timestamp (for user input) - std::tm tm = *std::localtime(&currTime); - - // get program time & name (from user dialogs) - if (!GUI->Dialog_Numeric_ShowAndGetDate(tm, "Program starts at")) - return false; - if (!GUI->Dialog_Numeric_ShowAndGetTime(tm, "Program starts at")) - return false; - if (!GUI->Dialog_Keyboard_ShowAndGetInput(*buffer, sizeof(buffer), "Program title", true, false)) - return false; - - std::string progTitle(buffer); - - reminderTime = std::mktime(&tm); - // add reminder using manual time & title - g_vbox->AddReminder(selectedChannel, reminderTime, progTitle); - } - catch (VBoxException &e) - { - g_vbox->LogException(e); - return false; - } - XBMC->QueueNotification(QUEUE_INFO, "Reminder added"); - return true; -} - -PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) -{ - if (menuhook.category == PVR_MENUHOOK_SETTING) - { - if (menuhook.iHookId == MENUHOOK_ID_RESCAN_EPG) - { - XBMC->QueueNotification(ADDON::QUEUE_INFO, "Rescanning EPG, this will take a while"); - g_vbox->StartEPGScan(); - return PVR_ERROR_NO_ERROR; - } - else if (menuhook.iHookId == MENUHOOK_ID_SYNC_EPG) - { - XBMC->QueueNotification(ADDON::QUEUE_INFO, "Getting EPG from VBox device"); - g_vbox->SyncEPGNow(); - return PVR_ERROR_NO_ERROR; - } - return PVR_ERROR_INVALID_PARAMETERS; - } - if (menuhook.category == PVR_MENUHOOK_EPG) - { - if (menuhook.iHookId == MENUHOOK_ID_EPG_REMINDER) - { - if (SetProgramReminder(item.data.iEpgUid)) - return PVR_ERROR_NO_ERROR; - } - else if (menuhook.iHookId == MENUHOOK_ID_CANCEL_EPG_REMINDER) - { - if (g_vbox->DeleteProgramReminders(item.data.iEpgUid)) - XBMC->QueueNotification(ADDON::QUEUE_INFO, "Reminder canceled"); - else - XBMC->QueueNotification(ADDON::QUEUE_WARNING, "Program does not have a reminder to cancel"); - return PVR_ERROR_NO_ERROR; - } - return PVR_ERROR_INVALID_PARAMETERS; - } - else if (menuhook.category == PVR_MENUHOOK_CHANNEL) - { - if (menuhook.iHookId == MENUHOOK_ID_MANUAL_REMINDER) - { - if (SetManualReminder(item)) - return PVR_ERROR_NO_ERROR; - } - else if (menuhook.iHookId == MENUHOOK_ID_CANCEL_CHANNEL_REMINDER) - { - if (g_vbox->DeleteChannelReminders(g_vbox->GetChannel(item.data.channel.iUniqueId))) - XBMC->QueueNotification(ADDON::QUEUE_INFO, "Removed channel's existing reminders"); - else - XBMC->QueueNotification(ADDON::QUEUE_WARNING, "Channel does not have reminders to cancel"); - return PVR_ERROR_NO_ERROR; - } - return PVR_ERROR_INVALID_PARAMETERS; - } - return PVR_ERROR_NOT_IMPLEMENTED; -} - -// Management methods -PVR_ERROR DialogChannelScan() { 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 DialogChannelSettings(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR DialogAddChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR OpenDialogChannelScan() { 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 UndeleteRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; } - -// Channel group methods -int GetChannelGroupsAmount() { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) { return PVR_ERROR_NOT_IMPLEMENTED; } - - -// Demuxer methods -void DemuxReset() {} -void DemuxFlush() {} -void DemuxAbort() {} -DemuxPacket* DemuxRead() { return NULL; } -PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) { return PVR_ERROR_NOT_IMPLEMENTED; } - -// Recording methods (not supported by VBox) -PVR_ERROR RenameRecording(const PVR_RECORDING &recording) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR SetRecordingLifetime(const PVR_RECORDING*) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING &recording, int count) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition) { return PVR_ERROR_NOT_IMPLEMENTED; } -int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) { return -1; } -PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) { return PVR_ERROR_NOT_IMPLEMENTED; }; -PVR_ERROR DeleteAllRecordingsFromTrash() { return PVR_ERROR_NOT_IMPLEMENTED; } - -// EPG Methods -PVR_ERROR IsEPGTagRecordable(const EPG_TAG*, bool*) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR IsEPGTagPlayable(const EPG_TAG*, bool*) { 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; } - -// Timeshift methods -bool SeekTime(double, bool, double*) { return false; } -void SetSpeed(int) {}; -bool IsTimeshifting() { return false; } - -// Miscellaneous unimplemented methods -PVR_ERROR GetChannelStreamProperties(const PVR_CHANNEL*, PVR_NAMED_VALUE*, unsigned int*) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR GetRecordingStreamProperties(const PVR_RECORDING* recording, PVR_NAMED_VALUE* properties, unsigned int* iPropertiesCount) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR GetStreamReadChunkSize(int* chunksize) { return PVR_ERROR_NOT_IMPLEMENTED; } - -} diff -Nru kodi-pvr-vbox-4.7.0/src/client.h kodi-pvr-vbox-8.1.0/src/client.h --- kodi-pvr-vbox-4.7.0/src/client.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/client.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Sam Stenvall - * - * 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 XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#include "kodi/libXBMC_addon.h" -#include "kodi/libXBMC_pvr.h" -#include -#include "vbox/VBox.h" - -#ifdef TARGET_WINDOWS -#define snprintf _snprintf -#endif - -// Helpers -extern ADDON::CHelper_libXBMC_addon *XBMC; -extern CHelper_libXBMC_pvr *PVR; -extern CHelper_libKODI_guilib *GUI; - -// Globals -extern ADDON_STATUS g_status; -extern vbox::VBox *g_vbox; -extern bool g_skippingInitialEpgLoad; diff -Nru kodi-pvr-vbox-4.7.0/src/timeshift/Buffer.cpp kodi-pvr-vbox-8.1.0/src/timeshift/Buffer.cpp --- kodi-pvr-vbox-4.7.0/src/timeshift/Buffer.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/timeshift/Buffer.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -20,6 +20,7 @@ */ #include "Buffer.h" + #include using namespace timeshift; @@ -34,9 +35,8 @@ // Remember the start time and open the input m_startTime = time(nullptr); - m_inputHandle = XBMC->OpenFile(ss.str().c_str(), 0x08 /*READ_NO_CACHE*/); - return m_inputHandle != nullptr; + return m_inputHandle.OpenFile(ss.str(), ADDON_READ_NO_CACHE); } Buffer::~Buffer() @@ -49,11 +49,10 @@ CloseHandle(m_inputHandle); } -void Buffer::CloseHandle(void *&handle) +void Buffer::CloseHandle(kodi::vfs::CFile& handle) { - if (handle) + if (handle.IsOpen()) { - XBMC->CloseFile(handle); - handle = nullptr; + handle.Close(); } } diff -Nru kodi-pvr-vbox-4.7.0/src/timeshift/Buffer.h kodi-pvr-vbox-8.1.0/src/timeshift/Buffer.h --- kodi-pvr-vbox-4.7.0/src/timeshift/Buffer.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/timeshift/Buffer.h 2021-01-09 10:03:05.000000000 +0000 @@ -20,9 +20,8 @@ * */ -#include #include -#include "../client.h" +#include /** * The basic type all buffers operate on @@ -33,16 +32,17 @@ typedef unsigned char byte; #endif -namespace timeshift { +#include + +namespace timeshift +{ /** * Base class for all timeshift buffers */ - class Buffer + class ATTRIBUTE_HIDDEN Buffer { public: - Buffer() : - m_inputHandle(nullptr), m_startTime(0), - m_readTimeout(DEFAULT_READ_TIMEOUT) {}; + Buffer() = default; virtual ~Buffer(); /** @@ -60,7 +60,7 @@ * Reads "length" bytes into the specified buffer * @return the number of bytes read */ - virtual int Read(byte *buffer, size_t length) = 0; + virtual int Read(byte* buffer, size_t length) = 0; /** * Seeks to the specified position @@ -91,27 +91,18 @@ /** * @return the time the buffering started */ - time_t GetStartTime() const - { - return m_startTime; - } + time_t GetStartTime() const { return m_startTime; } /** * @return basically the current time */ - time_t GetEndTime() const - { - return time(nullptr); - } + time_t GetEndTime() const { return time(nullptr); } /** * Sets the read timeout (defaults to 10 seconds) * @param timeout the read timeout in seconds */ - void SetReadTimeout(int timeout) - { - m_readTimeout = timeout; - } + void SetReadTimeout(int timeout) { m_readTimeout = timeout; } protected: const static int DEFAULT_READ_TIMEOUT; @@ -120,23 +111,23 @@ * Safely closes an open file handle. * @param the handle to close. The pointer will be nulled. */ - void CloseHandle(void *&handle); + void CloseHandle(kodi::vfs::CFile& handle); /** * The input handle (where data is read from) */ - void *m_inputHandle; + kodi::vfs::CFile m_inputHandle; /** * The time (in seconds) to wait when opening a read handle and when * waiting for the buffer to have enough data */ - int m_readTimeout; + int m_readTimeout = DEFAULT_READ_TIMEOUT; private: /** * The time the buffer was created */ - time_t m_startTime; + time_t m_startTime = 0; }; -} +} // namespace timeshift diff -Nru kodi-pvr-vbox-4.7.0/src/timeshift/DummyBuffer.cpp kodi-pvr-vbox-8.1.0/src/timeshift/DummyBuffer.cpp --- kodi-pvr-vbox-4.7.0/src/timeshift/DummyBuffer.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/timeshift/DummyBuffer.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -21,14 +21,14 @@ #include "DummyBuffer.h" -using namespace vbox::timeshift; +using namespace timeshift; -int DummyBuffer::Read(byte *buffer, size_t length) +int DummyBuffer::Read(byte* buffer, size_t length) { - return XBMC->ReadFile(m_inputHandle, buffer, length); + return m_inputHandle.Read(buffer, length); } int64_t DummyBuffer::Seek(int64_t position, int whence) { - return XBMC->SeekFile(m_inputHandle, position, whence); + return m_inputHandle.Seek(position, whence); } diff -Nru kodi-pvr-vbox-4.7.0/src/timeshift/DummyBuffer.h kodi-pvr-vbox-8.1.0/src/timeshift/DummyBuffer.h --- kodi-pvr-vbox-4.7.0/src/timeshift/DummyBuffer.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/timeshift/DummyBuffer.h 2021-01-09 10:03:05.000000000 +0000 @@ -22,21 +22,22 @@ #include "Buffer.h" -namespace timeshift { +namespace timeshift +{ /** * Dummy buffer that just passes all calls through to the input file * handle without actually buffering anything */ - class DummyBuffer : public Buffer + class ATTRIBUTE_HIDDEN DummyBuffer : public Buffer { public: DummyBuffer() : Buffer() {} virtual ~DummyBuffer() {} - virtual int Read(byte *buffer, size_t length) override + virtual int Read(byte* buffer, size_t length) override { - return XBMC->ReadFile(m_inputHandle, buffer, length); + return m_inputHandle.Read(buffer, length); } virtual int64_t Seek(int64_t position, int whence) override @@ -56,12 +57,14 @@ virtual int64_t Position() const override { - return XBMC->GetFilePosition(m_inputHandle); + kodi::vfs::CacheStatus status; + m_inputHandle.IoControlGetCacheStatus(status); + return m_inputHandle.GetPosition(); } virtual int64_t Length() const override { - return XBMC->GetFileLength(m_inputHandle); + return m_inputHandle.GetLength(); } }; -} +} // namespace timeshift diff -Nru kodi-pvr-vbox-4.7.0/src/timeshift/FilesystemBuffer.cpp kodi-pvr-vbox-8.1.0/src/timeshift/FilesystemBuffer.cpp --- kodi-pvr-vbox-4.7.0/src/timeshift/FilesystemBuffer.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/timeshift/FilesystemBuffer.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -20,20 +20,15 @@ */ #include "FilesystemBuffer.h" + #include using namespace timeshift; const int FilesystemBuffer::INPUT_READ_LENGTH = 32768; -// Fix a stupid #define on Windows which causes XBMC->DeleteFile() to break -#ifdef _WIN32 -#undef DeleteFile -#endif // _WIN32 - -FilesystemBuffer::FilesystemBuffer(const std::string &bufferPath) - : Buffer(), m_outputReadHandle(nullptr), m_outputWriteHandle(nullptr), - m_readPosition(0), m_writePosition(0) +FilesystemBuffer::FilesystemBuffer(const std::string& bufferPath) + : Buffer(), m_readPosition(0), m_writePosition(0) { m_bufferPath = bufferPath + "/buffer.ts"; } @@ -43,24 +38,21 @@ FilesystemBuffer::Close(); // Remove the buffer file so it doesn't take up space once Kodi has exited - XBMC->DeleteFile(m_bufferPath.c_str()); + kodi::vfs::DeleteFile(m_bufferPath); } bool FilesystemBuffer::Open(const std::string inputUrl) { // Open the file handles - m_outputWriteHandle = XBMC->OpenFileForWrite(m_bufferPath.c_str(), true); - m_outputReadHandle = XBMC->OpenFile(m_bufferPath.c_str(), 0x08/*READ_NO_CACHE*/); + m_outputWriteHandle.OpenFileForWrite(m_bufferPath, true); + m_outputReadHandle.OpenFile(m_bufferPath, ADDON_READ_NO_CACHE); - if (!Buffer::Open(inputUrl) || !m_outputReadHandle || !m_outputWriteHandle) + if (!Buffer::Open(inputUrl) || !m_outputReadHandle.IsOpen() || !m_outputWriteHandle.IsOpen()) return false; // Start the input thread m_active = true; - m_inputThread = std::thread([this]() - { - ConsumeInput(); - }); + m_inputThread = std::thread([this]() { ConsumeInput(); }); return true; } @@ -82,31 +74,30 @@ // Close any open handles std::unique_lock lock(m_mutex); - if (m_outputReadHandle) + if (m_outputReadHandle.IsOpen()) CloseHandle(m_outputReadHandle); - if (m_outputWriteHandle) + if (m_outputWriteHandle.IsOpen()) CloseHandle(m_outputWriteHandle); // Reset - m_outputReadHandle = m_outputWriteHandle = nullptr; m_readPosition = m_writePosition = 0; } -int FilesystemBuffer::Read(byte *buffer, size_t length) +int FilesystemBuffer::Read(byte* buffer, size_t length) { // Wait until we have enough data int64_t requiredLength = Position() + length; std::unique_lock lock(m_mutex); m_condition.wait_for(lock, std::chrono::seconds(m_readTimeout), - [this, requiredLength]() - { - return Length() >= requiredLength; - }); + [this, requiredLength]() + { + return Length() >= requiredLength; + }); // Now we can read - int read = XBMC->ReadFile(m_outputReadHandle, buffer, length); + int read = m_outputReadHandle.Read(buffer, length); m_readPosition += read; return read; @@ -115,7 +106,7 @@ int64_t FilesystemBuffer::Seek(int64_t position, int whence) { std::unique_lock lock(m_mutex); - int64_t newPosition = XBMC->SeekFile(m_outputReadHandle, position, whence); + int64_t newPosition = m_outputReadHandle.Seek(position, whence); m_readPosition.exchange(newPosition); return newPosition; @@ -123,18 +114,16 @@ void FilesystemBuffer::ConsumeInput() { - byte *buffer = new byte[INPUT_READ_LENGTH]; + byte* buffer = new byte[INPUT_READ_LENGTH]; while (m_active) { - memset(buffer, 0, INPUT_READ_LENGTH); - // Read from m_inputHandle - ssize_t read = XBMC->ReadFile(m_inputHandle, buffer, INPUT_READ_LENGTH); + ssize_t read = m_inputHandle.Read(buffer, INPUT_READ_LENGTH); // Write to m_outputHandle std::unique_lock lock(m_mutex); - ssize_t written = XBMC->WriteFile(m_outputWriteHandle, buffer, read); + ssize_t written = m_outputWriteHandle.Write(buffer, read); m_writePosition += written; // Signal that we have data again diff -Nru kodi-pvr-vbox-4.7.0/src/timeshift/FilesystemBuffer.h kodi-pvr-vbox-8.1.0/src/timeshift/FilesystemBuffer.h --- kodi-pvr-vbox-4.7.0/src/timeshift/FilesystemBuffer.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/timeshift/FilesystemBuffer.h 2021-01-09 10:03:05.000000000 +0000 @@ -21,53 +21,43 @@ */ #include "Buffer.h" -#include + +#include #include #include -#include +#include + +#include -namespace timeshift { +namespace timeshift +{ /** * Timeshift buffer which buffers into a file */ - class FilesystemBuffer : public Buffer + class ATTRIBUTE_HIDDEN FilesystemBuffer : public Buffer { public: - /** * @param bufferPath the directory to store the buffer files in */ - FilesystemBuffer(const std::string &bufferPath); + FilesystemBuffer(const std::string& bufferPath); virtual ~FilesystemBuffer(); virtual bool Open(const std::string inputUrl) override; virtual void Close() override; - virtual int Read(byte *buffer, size_t length) override; + virtual int Read(byte* buffer, size_t length) override; virtual int64_t Seek(int64_t position, int whence) override; - virtual bool CanPauseStream() const override - { - return true; - } - - virtual bool CanSeekStream() const override - { - return true; - } - - virtual int64_t Position() const override - { - return m_readPosition.load(); - } - - virtual int64_t Length() const override - { - return m_writePosition.load(); - } + virtual bool CanPauseStream() const override { return true; } - private: + virtual bool CanSeekStream() const override { return true; } + + virtual int64_t Position() const override { return m_readPosition.load(); } + virtual int64_t Length() const override { return m_writePosition.load(); } + + private: const static int INPUT_READ_LENGTH; /** @@ -90,12 +80,12 @@ /** * Read-only handle to the buffer file */ - void *m_outputReadHandle; + kodi::vfs::CFile m_outputReadHandle; /** * Write-only handle to the buffer file */ - void *m_outputWriteHandle; + kodi::vfs::CFile m_outputWriteHandle; /** * The thread that reads from m_inputHandle and writes to the output @@ -128,4 +118,4 @@ */ std::atomic m_writePosition; }; -} +} // namespace timeshift diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/CategoryGenreMapper.cpp kodi-pvr-vbox-8.1.0/src/vbox/CategoryGenreMapper.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/CategoryGenreMapper.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/CategoryGenreMapper.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,32 +1,26 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + #include "CategoryGenreMapper.h" -#include -#include "lib/tinyxml2/tinyxml2.h" -#include "p8-platform/util/StringUtils.h" -#include "Utilities.h" + #include "Exceptions.h" -#include "../client.h" +#include "Utilities.h" -using namespace xmltv; +#include + +#include +#include +#include +#include + +// using namespace xmltv; +using namespace kodi::tools; using namespace vbox; using namespace tinyxml2; @@ -47,27 +41,27 @@ m_genreMap["user"] = EPG_EVENT_CONTENTMASK_USERDEFINED; } -void CategoryGenreMapper::Initialize(const std::string &xmlFileName) +void CategoryGenreMapper::Initialize(const std::string& xmlFileName) { - g_vbox->Log(ADDON::LOG_INFO, "Initializing genre mapper"); + kodi::Log(ADDON_LOG_INFO, "Initializing genre mapper"); LoadCategoryToGenreXML(xmlFileName); } -bool CategoryGenreMapper::LoadCategoryToGenreXML(const std::string &xmlFileName) +bool CategoryGenreMapper::LoadCategoryToGenreXML(const std::string& xmlFileName) { - if (!XBMC->FileExists(xmlFileName.c_str(), false)) + if (!kodi::vfs::FileExists(xmlFileName, false)) { - g_vbox->Log(ADDON::LOG_INFO, "No Category to Genre mapping XML found"); + kodi::Log(ADDON_LOG_INFO, "No Category to Genre mapping XML found"); return false; } else { - g_vbox->Log(ADDON::LOG_INFO, "Found channel mapping file, attempting to load it"); - void *fileHandle = XBMC->OpenFile(xmlFileName.c_str(), 0x08 /* READ_NO_CACHE */); + kodi::Log(ADDON_LOG_INFO, "Found channel mapping file, attempting to load it"); + kodi::vfs::CFile fileHandle; - if (!fileHandle) + if (!fileHandle.OpenFile(xmlFileName, ADDON_READ_NO_CACHE)) { - g_vbox->Log(ADDON::LOG_INFO, "Could not open Category to Genre mapping XML"); + kodi::Log(ADDON_LOG_INFO, "Could not open Category to Genre mapping XML"); return false; } // Read the XML @@ -79,23 +73,23 @@ throw vbox::InvalidXMLException("XML parsing failed: " + std::string(document.ErrorName())); // Create mappings - for (const XMLElement *element = document.RootElement()->FirstChildElement("category"); - element != nullptr; element = element->NextSiblingElement("category")) + for (const XMLElement* element = document.RootElement()->FirstChildElement("category"); element != nullptr; + element = element->NextSiblingElement("category")) { - const char *pGenreAttr = element->Attribute("genre-type"); + const char* pGenreAttr = element->Attribute("genre-type"); if (!pGenreAttr) continue; - m_categoryMap.insert(std::pair(element->GetText(), m_genreMap[pGenreAttr]) ); + m_categoryMap.insert(std::pair(element->GetText(), m_genreMap[pGenreAttr])); } - - XBMC->CloseFile(fileHandle); } return true; } -static bool UpdateFullCatMatch(std::map &rMatchesMap, std::map::iterator & rFinalMatch, - CategoryMap::iterator &rCatItr, std::string &rCategoryStr) +static bool UpdateFullCatMatch(std::map& rMatchesMap, + std::map::iterator& rFinalMatch, + CategoryMap::iterator& rCatItr, + std::string& rCategoryStr) { // return match if category string matches fully (after ignoring case) if (!StringUtils::CompareNoCase(rCatItr->first, rCategoryStr)) @@ -114,8 +108,10 @@ } // genre-type match counting algorithm taken from Stalker PVR add-on -static void UpdatePartialCatMatch(std::map &rMatchesMap, std::map::iterator & rFinalMatch, - CategoryMap::iterator &rCatItr, std::string &rCategoryStr) +static void UpdatePartialCatMatch(std::map& rMatchesMap, + std::map::iterator& rFinalMatch, + CategoryMap::iterator& rCatItr, + std::string& rCategoryStr) { std::string lowerCategoryStr(rCategoryStr); std::string xmlCatStr(rCatItr->first); @@ -135,7 +131,7 @@ } // genre-type match counting algorithm taken from Stalker PVR add-on -static void UpdateFinalMatch(std::map &rMatchesMap, std::map::iterator & rFinalMatch) +static void UpdateFinalMatch(std::map& rMatchesMap, std::map::iterator& rFinalMatch) { // update final match as the match with the maximum counter for (std::map::iterator match = rMatchesMap.begin(); match != rMatchesMap.end(); ++match) @@ -148,7 +144,7 @@ } } -int CategoryGenreMapper::GetCategoriesGenreType(std::vector &categories) +int CategoryGenreMapper::GetCategoriesGenreType(std::vector& categories) { std::map matches; std::map::iterator finalMatch = matches.end(); @@ -178,6 +174,6 @@ UpdateFinalMatch(matches, finalMatch); - XBMC->Log(ADDON::LOG_DEBUG, "Final match is %d", finalMatch->first); + kodi::Log(ADDON_LOG_DEBUG, "Final match is %d", finalMatch->first); return finalMatch->first; } diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/CategoryGenreMapper.h kodi-pvr-vbox-8.1.0/src/vbox/CategoryGenreMapper.h --- kodi-pvr-vbox-4.7.0/src/vbox/CategoryGenreMapper.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/CategoryGenreMapper.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,31 +1,21 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * 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 -namespace vbox { +namespace vbox +{ typedef std::map GenreMap; typedef std::map CategoryMap; @@ -37,9 +27,9 @@ public: CategoryGenreMapper(); ~CategoryGenreMapper() = default; - void Initialize(const std::string &xmlFileName); - bool LoadCategoryToGenreXML(const std::string &xmlFileName); - int GetCategoriesGenreType(std::vector &categories); + void Initialize(const std::string& xmlFileName); + bool LoadCategoryToGenreXML(const std::string& xmlFileName); + int GetCategoriesGenreType(std::vector& categories); private: GenreMap m_genreMap; @@ -47,4 +37,4 @@ }; typedef std::unique_ptr CategoryMapperPtr; -} +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/Channel.h kodi-pvr-vbox-8.1.0/src/vbox/Channel.h --- kodi-pvr-vbox-4.7.0/src/vbox/Channel.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/Channel.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,29 +1,19 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once -#include #include +#include -namespace vbox { +namespace vbox +{ class Channel; typedef std::shared_ptr ChannelPtr; @@ -34,13 +24,20 @@ class Channel { public: - Channel(const std::string &uniqueId, const std::string &xmltvName, - const std::string &name, const std::string &url) - : m_uniqueId(uniqueId), m_index(0), m_xmltvName(xmltvName), m_name(name), m_number(0), - m_radio(false), m_url(url), m_encrypted(false) {} + Channel(const std::string& uniqueId, const std::string& xmltvName, const std::string& name, const std::string& url) + : m_uniqueId(uniqueId), + m_index(0), + m_xmltvName(xmltvName), + m_name(name), + m_number(0), + m_radio(false), + m_url(url), + m_encrypted(false) + { + } ~Channel() {} - bool operator== (const Channel &other) + bool operator==(const Channel& other) { return m_index == other.m_index && m_xmltvName == other.m_xmltvName && @@ -53,7 +50,7 @@ m_uniqueId == other.m_uniqueId; } - bool operator!= (const Channel &other) + bool operator!=(const Channel& other) { return !(*this == other); } @@ -81,4 +78,4 @@ std::string m_url; bool m_encrypted; }; -} +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/ChannelStreamingStatus.cpp kodi-pvr-vbox-8.1.0/src/vbox/ChannelStreamingStatus.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/ChannelStreamingStatus.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/ChannelStreamingStatus.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,25 +1,14 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "ChannelStreamingStatus.h" + #include #include @@ -68,7 +57,8 @@ unsigned int rfLevel = 0; - try { + try + { // Convert the RF level to an integer rfLevel = static_cast(std::stoi(m_rfLevel)); @@ -85,7 +75,6 @@ } catch (std::invalid_argument) { - } return rfLevel; @@ -96,7 +85,8 @@ if (!m_active) return 0; - try { + try + { // Make sure it's not detected as hexadecimal return std::stol(m_ber); } diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/ChannelStreamingStatus.h kodi-pvr-vbox-8.1.0/src/vbox/ChannelStreamingStatus.h --- kodi-pvr-vbox-4.7.0/src/vbox/ChannelStreamingStatus.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/ChannelStreamingStatus.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,28 +1,18 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once #include -namespace vbox { +namespace vbox +{ /** * Represents the streaming status of a channel. Only the fields required by @@ -31,10 +21,8 @@ class ChannelStreamingStatus { public: - ChannelStreamingStatus() - : m_active(false), m_signalQuality(0), m_sid(0) {}; - - ~ChannelStreamingStatus() {}; + ChannelStreamingStatus() = default; + ~ChannelStreamingStatus() = default; /** * @return the service name (SID XXX) @@ -61,47 +49,28 @@ */ long GetBer() const; - void SetServiceId(unsigned int sid) - { - m_sid = sid; - } - - void SetTunerId(const std::string &tunerId) - { - m_tunerId = tunerId; - } - - void SetTunerType(const std::string &tunerType) - { - m_tunerType = tunerType; - } - - void SetRfLevel(const std::string &rfLevel) - { - m_rfLevel = rfLevel; - } - - void SetBer(const std::string &ber) - { - m_ber = ber; - } + void SetServiceId(unsigned int sid) { m_sid = sid; } + void SetTunerId(const std::string& tunerId) { m_tunerId = tunerId; } + void SetTunerType(const std::string& tunerType) { m_tunerType = tunerType; } + void SetRfLevel(const std::string& rfLevel) { m_rfLevel = rfLevel; } + void SetBer(const std::string& ber) { m_ber = ber; } public: - bool m_active; + bool m_active = false; std::string m_lockStatus; std::string m_lockedMode; std::string m_modulation; std::string m_frequency; - unsigned int m_signalQuality; + unsigned int m_signalQuality = 0; private: const static int RFLEVEL_MIN; const static int RFLEVEL_MAX; - unsigned int m_sid; + unsigned int m_sid = 0; std::string m_tunerId; std::string m_tunerType; std::string m_rfLevel; std::string m_ber; }; -} +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/ContentIdentifier.h kodi-pvr-vbox-8.1.0/src/vbox/ContentIdentifier.h --- kodi-pvr-vbox-4.7.0/src/vbox/ContentIdentifier.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/ContentIdentifier.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,44 +1,34 @@ -#pragma once /* - * Copyright (C) 2015 Sam Stenvall - * - * 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 XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - * http://www.gnu.org/copyleft/gpl.html + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. */ -#include +#pragma once + +#include "../xmltv/Programme.h" +#include "../xmltv/Utilities.h" #include "Channel.h" #include "Recording.h" #include "SeriesRecording.h" -#include "../xmltv/Programme.h" -#include "../xmltv/Utilities.h" -namespace vbox { +#include + +namespace vbox +{ /** * Static helper class for creating unique identifiers for arbitrary objects */ class ContentIdentifier { public: - /** * @return a unique ID for the channel */ - static unsigned int GetUniqueId(const vbox::ChannelPtr &channel) + static unsigned int GetUniqueId(const vbox::ChannelPtr& channel) { std::hash hasher; int uniqueId = hasher(channel->m_uniqueId); @@ -49,7 +39,7 @@ * @return a unique ID for the recording. This implementation must match * that of xmltv::Programme so that recordings can be linked to programmes. */ - static unsigned int GetUniqueId(const vbox::Recording *recording) + static unsigned int GetUniqueId(const vbox::Recording* recording) { std::hash hasher; std::string timestamp = std::to_string(::xmltv::Utilities::XmltvToUnixTime(recording->m_endTime)); @@ -61,7 +51,7 @@ * @return a unique ID for the series. This implementation must match * that of xmltv::Programme so that series can be linked to programmes. */ - static unsigned int GetUniqueId(const vbox::SeriesRecording *series) + static unsigned int GetUniqueId(const vbox::SeriesRecording* series) { std::hash hasher; std::string timestamp = std::to_string(::xmltv::Utilities::XmltvToUnixTime(series->m_endTime)); @@ -72,7 +62,7 @@ /** * @return a unique ID for the programme */ - static unsigned int GetUniqueId(const xmltv::Programme *programme) + static unsigned int GetUniqueId(const xmltv::Programme* programme) { std::hash hasher; std::string timestamp = std::to_string(::xmltv::Utilities::XmltvToUnixTime(programme->m_endTime)); @@ -80,4 +70,4 @@ return std::abs(uniqueId); } }; -} +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/Exceptions.h kodi-pvr-vbox-8.1.0/src/vbox/Exceptions.h --- kodi-pvr-vbox-4.7.0/src/vbox/Exceptions.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/Exceptions.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,57 +1,47 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once #include -namespace vbox { +namespace vbox +{ // Base exception class class VBoxException : public std::runtime_error { public: - VBoxException(const std::string &message) : std::runtime_error(message) {} + VBoxException(const std::string& message) : std::runtime_error(message) {} }; // Domain-specific exceptions class InvalidXMLException : public VBoxException { public: - InvalidXMLException(const std::string &message) : VBoxException(message) {}; + InvalidXMLException(const std::string& message) : VBoxException(message){}; }; class InvalidResponseException : public VBoxException { public: - InvalidResponseException(const std::string &message) : VBoxException(message) {}; + InvalidResponseException(const std::string& message) : VBoxException(message){}; }; class RequestFailedException : public VBoxException { public: - RequestFailedException(const std::string &message) : VBoxException(message) {}; + RequestFailedException(const std::string& message) : VBoxException(message){}; }; class FirmwareVersionException : public VBoxException { public: - FirmwareVersionException(const std::string &message) : VBoxException(message) {}; + FirmwareVersionException(const std::string& message) : VBoxException(message){}; }; -} +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/GuideChannelMapper.cpp kodi-pvr-vbox-8.1.0/src/vbox/GuideChannelMapper.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/GuideChannelMapper.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/GuideChannelMapper.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,60 +1,47 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "GuideChannelMapper.h" -#include -#include "lib/tinyxml2/tinyxml2.h" + #include "Exceptions.h" #include "Utilities.h" -#include "../client.h" + +#include + +#include using namespace vbox; using namespace tinyxml2; const std::string GuideChannelMapper::MAPPING_FILE_PATH = "special://userdata/addon_data/pvr.vbox/channel_mappings.xml"; -GuideChannelMapper::GuideChannelMapper( - const ::xmltv::Guide &vboxGuide, - const ::xmltv::Guide &externalGuide) : - m_vboxGuide(vboxGuide), - m_externalGuide(externalGuide) +GuideChannelMapper::GuideChannelMapper(const ::xmltv::Guide& vboxGuide, const ::xmltv::Guide& externalGuide) + : m_vboxGuide(vboxGuide), m_externalGuide(externalGuide) { } void GuideChannelMapper::Initialize() { - g_vbox->Log(ADDON::LOG_INFO, "Initializing channel mapper with default mappings"); + kodi::Log(ADDON_LOG_INFO, "Initializing channel mapper with default mappings"); // Generate default mappings m_channelMappings = CreateDefaultMappings(); // Create a default mapping file if none exists, otherwise load it - if (!XBMC->FileExists(MAPPING_FILE_PATH.c_str(), false)) + if (!kodi::vfs::FileExists(MAPPING_FILE_PATH, false)) { - g_vbox->Log(ADDON::LOG_INFO, "No external XMLTV channel mapping file found, saving default mappings"); + kodi::Log(ADDON_LOG_INFO, "No external XMLTV channel mapping file found, saving default mappings"); Save(); } else { - g_vbox->Log(ADDON::LOG_INFO, "Found channel mapping file, attempting to load it"); + kodi::Log(ADDON_LOG_INFO, "Found channel mapping file, attempting to load it"); Load(); } } @@ -66,7 +53,7 @@ // Add a mapping for every channel which display names matches, otherwise // leave it empty - for (const std::string &channelName : channelNames) + for (const std::string& channelName : channelNames) { if (!m_externalGuide.GetChannelId(channelName).empty()) mappings[channelName] = channelName; @@ -79,9 +66,9 @@ void GuideChannelMapper::Load() { - void *fileHandle = XBMC->OpenFile(MAPPING_FILE_PATH.c_str(), 0x08 /* READ_NO_CACHE */); + kodi::vfs::CFile fileHandle; - if (fileHandle) + if (fileHandle.OpenFile(MAPPING_FILE_PATH, ADDON_READ_NO_CACHE)) { // Read the XML tinyxml2::XMLDocument document; @@ -92,16 +79,14 @@ throw vbox::InvalidXMLException("XML parsing failed: " + std::string(document.ErrorName())); // Create mappings - for (const XMLElement *element = document.RootElement()->FirstChildElement("mapping"); - element != nullptr; element = element->NextSiblingElement("mapping")) + for (const XMLElement* element = document.RootElement()->FirstChildElement("mapping"); element != nullptr; + element = element->NextSiblingElement("mapping")) { const std::string vboxName = element->Attribute("vbox-name"); const std::string xmltvName = element->Attribute("xmltv-name"); m_channelMappings[vboxName] = xmltvName; } - - XBMC->CloseFile(fileHandle); } } @@ -109,17 +94,17 @@ { // Create the document tinyxml2::XMLDocument document; - XMLDeclaration *declaration = document.NewDeclaration(); + XMLDeclaration* declaration = document.NewDeclaration(); document.InsertEndChild(declaration); // Create the root node () - XMLElement *rootElement = document.NewElement("xmltvmap"); + XMLElement* rootElement = document.NewElement("xmltvmap"); document.InsertEndChild(rootElement); // Create one for every channel - for (const auto &mapping : m_channelMappings) + for (const auto& mapping : m_channelMappings) { - XMLElement *mappingElement = document.NewElement("mapping"); + XMLElement* mappingElement = document.NewElement("mapping"); mappingElement->SetAttribute("vbox-name", mapping.first.c_str()); mappingElement->SetAttribute("xmltv-name", mapping.second.c_str()); @@ -127,21 +112,19 @@ } // Save the file - void *fileHandle = XBMC->OpenFileForWrite(MAPPING_FILE_PATH.c_str(), false); + kodi::vfs::CFile fileHandle; - if (fileHandle) + if (fileHandle.OpenFileForWrite(MAPPING_FILE_PATH, false)) { XMLPrinter printer; document.Accept(&printer); std::string xml = printer.CStr(); - XBMC->WriteFile(fileHandle, xml.c_str(), xml.length()); - - XBMC->CloseFile(fileHandle); + fileHandle.Write(xml.c_str(), xml.length()); } } -std::string GuideChannelMapper::GetExternalChannelName(const std::string &vboxName) const +std::string GuideChannelMapper::GetExternalChannelName(const std::string& vboxName) const { auto it = m_channelMappings.find(vboxName); diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/GuideChannelMapper.h kodi-pvr-vbox-8.1.0/src/vbox/GuideChannelMapper.h --- kodi-pvr-vbox-4.7.0/src/vbox/GuideChannelMapper.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/GuideChannelMapper.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,31 +1,22 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once -#include -#include -#include #include "../xmltv/Guide.h" -namespace vbox { +#include +#include +#include + +namespace vbox +{ class GuideChannelMapper; typedef std::unique_ptr GuideChannelMapperPtr; @@ -38,8 +29,7 @@ class GuideChannelMapper { public: - - GuideChannelMapper(const ::xmltv::Guide &vboxGuide, const ::xmltv::Guide &externalGuide); + GuideChannelMapper(const ::xmltv::Guide& vboxGuide, const ::xmltv::Guide& externalGuide); ~GuideChannelMapper() = default; /** @@ -52,10 +42,9 @@ * @param vboxName a VBox channel name * @return the corresponding channel name from the external guide */ - std::string GetExternalChannelName(const std::string &vboxName) const; + std::string GetExternalChannelName(const std::string& vboxName) const; private: - /** * Creates a default mapping between the two guides using exact name matching * @eturn the mappings @@ -80,16 +69,16 @@ /** * The internal guide data */ - const ::xmltv::Guide &m_vboxGuide; + const ::xmltv::Guide& m_vboxGuide; /** * The external guide data */ - const ::xmltv::Guide &m_externalGuide; + const ::xmltv::Guide& m_externalGuide; /** * The channel name mappings */ ChannelMappings m_channelMappings; }; -} +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/Recording.cpp kodi-pvr-vbox-8.1.0/src/vbox/Recording.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/Recording.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/Recording.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,23 +1,11 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "Recording.h" @@ -25,8 +13,7 @@ using namespace vbox; -Recording::Recording(const std::string &channelId, - const std::string &channelName, RecordingState state) +Recording::Recording(const std::string& channelId, const std::string& channelName, RecordingState state) : m_id(0), m_seriesId(0), m_channelId(channelId), m_channelName(channelName), m_state(state) { } @@ -46,4 +33,4 @@ if (timerStartTime != startTime) return false; return true; -} \ No newline at end of file +} diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/Recording.h kodi-pvr-vbox-8.1.0/src/vbox/Recording.h --- kodi-pvr-vbox-4.7.0/src/vbox/Recording.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/Recording.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,35 +1,26 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once #include -#include #include +#include -namespace vbox { +namespace vbox +{ /** * The possible states a recording can be in */ - enum RecordingState { + enum RecordingState + { SCHEDULED, RECORDED, RECORDING, @@ -46,11 +37,10 @@ class Recording { public: - Recording(const std::string &channelId, - const std::string &channelName, RecordingState state); + Recording(const std::string& channelId, const std::string& channelName, RecordingState state); ~Recording(); - bool operator== (const Recording &other) + bool operator==(const Recording& other) { return m_id == other.m_id && m_seriesId == other.m_seriesId && @@ -65,7 +55,7 @@ m_state == other.m_state; } - bool operator!= (const Recording &other) + bool operator!=(const Recording& other) { return !(*this == other); } @@ -78,8 +68,7 @@ */ bool IsTimer() const { - return m_state == RecordingState::SCHEDULED || - m_state == RecordingState::RECORDING; + return m_state == RecordingState::SCHEDULED || m_state == RecordingState::RECORDING; } /** @@ -89,19 +78,16 @@ bool IsRecording() const { return m_state == RecordingState::RECORDED || - m_state == RecordingState::RECORDING || - m_state == RecordingState::RECORDING_ERROR || - m_state == RecordingState::EXTERNAL; + m_state == RecordingState::RECORDING || + m_state == RecordingState::RECORDING_ERROR || + m_state == RecordingState::EXTERNAL; } /** * Returns the state of the recording * @return the state */ - RecordingState GetState() const - { - return m_state; - } + RecordingState GetState() const { return m_state; } unsigned int m_id; unsigned int m_seriesId; @@ -118,4 +104,4 @@ private: RecordingState m_state; }; -} +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/RecordingReader.cpp kodi-pvr-vbox-8.1.0/src/vbox/RecordingReader.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/RecordingReader.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/RecordingReader.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,40 +1,24 @@ /* - * Copyright (C) 2005-2019 Team XBMC - * http://www.xbmc.org - * - * 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 XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1335, USA. - * http://www.gnu.org/copyleft/gpl.html + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. */ #include "RecordingReader.h" -#include "../client.h" - #include -using namespace ADDON; using namespace vbox; RecordingReader::RecordingReader(const std::string& streamURL, std::time_t start, std::time_t end, int duration) : m_streamURL(streamURL), m_start(start), m_end(end), m_duration(duration) { - m_readHandle = XBMC->CURLCreate(m_streamURL.c_str()); - XBMC->CURLOpen(m_readHandle, XFILE::READ_NO_CACHE); - m_len = XBMC->GetFileLength(m_readHandle); + m_readHandle.CURLCreate(m_streamURL); + m_readHandle.CURLOpen(ADDON_READ_NO_CACHE); + m_len = m_readHandle.GetLength(); m_nextReopen = std::time(nullptr) + REOPEN_INTERVAL; //If this is an ongoing recording set the duration to the eventual length of the recording @@ -43,20 +27,18 @@ m_duration = static_cast(end - start); } - g_vbox->Log(ADDON::LOG_DEBUG, "%s RecordingReader: Started - url=%s, start=%u, end=%u, duration=%d", __FUNCTION__, m_streamURL.c_str(), - m_start, m_end, m_duration); + kodi::Log(ADDON_LOG_DEBUG, "%s RecordingReader: Started - url=%s, start=%u, end=%u, duration=%d", __FUNCTION__, + m_streamURL.c_str(), m_start, m_end, m_duration); } RecordingReader::~RecordingReader() { - if (m_readHandle) - XBMC->CloseFile(m_readHandle); - g_vbox->Log(ADDON::LOG_DEBUG, "%s RecordingReader: Stopped", __FUNCTION__); + kodi::Log(ADDON_LOG_DEBUG, "%s RecordingReader: Stopped", __FUNCTION__); } bool RecordingReader::Start() { - return (m_readHandle != nullptr); + return m_readHandle.IsOpen(); } ssize_t RecordingReader::ReadData(unsigned char* buffer, unsigned int size) @@ -68,10 +50,10 @@ if (m_pos == m_len || now > m_nextReopen) { /* reopen stream */ - g_vbox->Log(ADDON::LOG_DEBUG, "%s RecordingReader: Reopening stream...", __FUNCTION__); - XBMC->CURLOpen(m_readHandle, XFILE::READ_REOPEN | XFILE::READ_NO_CACHE); - m_len = XBMC->GetFileLength(m_readHandle); - XBMC->SeekFile(m_readHandle, m_pos, SEEK_SET); + kodi::Log(ADDON_LOG_DEBUG, "%s RecordingReader: Reopening stream...", __FUNCTION__); + m_readHandle.CURLOpen(ADDON_READ_REOPEN | ADDON_READ_NO_CACHE); + m_len = m_readHandle.GetLength(); + m_readHandle.Seek(m_pos, SEEK_SET); // random value (10 MiB) we choose to switch to fast reopen interval bool nearEnd = m_len - m_pos <= 10 * 1024 * 1024; @@ -83,18 +65,18 @@ } } - ssize_t read = XBMC->ReadFile(m_readHandle, buffer, size); + ssize_t read = m_readHandle.Read(buffer, size); m_pos += read; return read; } int64_t RecordingReader::Seek(long long position, int whence) { - int64_t ret = XBMC->SeekFile(m_readHandle, position, whence); + int64_t ret = m_readHandle.Seek(position, whence); // for unknown reason seek sometimes doesn't return the correct position // so let's sync with the underlaying implementation - m_pos = XBMC->GetFilePosition(m_readHandle); - m_len = XBMC->GetFileLength(m_readHandle); + m_pos = m_readHandle.GetPosition(); + m_len = m_readHandle.GetLength(); return ret; } @@ -116,11 +98,11 @@ if (now < m_end) { - g_vbox->Log(ADDON::LOG_DEBUG, "%s RecordingReader - Partial: %d", __FUNCTION__, static_cast(now - m_start)); + kodi::Log(ADDON_LOG_DEBUG, "%s RecordingReader - Partial: %d", __FUNCTION__, static_cast(now - m_start)); return now - m_start; } } - g_vbox->Log(ADDON::LOG_DEBUG, "%s RecordingReader - Full: %d", __FUNCTION__, m_duration); + kodi::Log(ADDON_LOG_DEBUG, "%s RecordingReader - Full: %d", __FUNCTION__, m_duration); return m_duration; } diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/RecordingReader.h kodi-pvr-vbox-8.1.0/src/vbox/RecordingReader.h --- kodi-pvr-vbox-4.7.0/src/vbox/RecordingReader.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/RecordingReader.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,34 +1,22 @@ -#pragma once /* - * Copyright (C) 2005-2019 Team XBMC - * http://www.xbmc.org - * - * 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 XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1335, USA. - * http://www.gnu.org/copyleft/gpl.html + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. */ -#include "kodi/libXBMC_addon.h" +#pragma once #include #include +#include + namespace vbox { - class RecordingReader + class ATTRIBUTE_HIDDEN RecordingReader { public: RecordingReader(const std::string& streamURL, std::time_t start, std::time_t end, int duration); @@ -47,7 +35,7 @@ static const int REOPEN_INTERVAL_FAST = 10; const std::string& m_streamURL; - void* m_readHandle; + kodi::vfs::CFile m_readHandle; int m_duration; @@ -59,4 +47,4 @@ uint64_t m_pos = {0}; uint64_t m_len; }; -} // namespace vbox \ No newline at end of file +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/Reminder.cpp kodi-pvr-vbox-8.1.0/src/vbox/Reminder.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/Reminder.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/Reminder.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,110 +0,0 @@ -/* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ -#include "ContentIdentifier.h" -#include "Reminder.h" -#include -#include "lib/tinyxml2/tinyxml2.h" -#include "p8-platform/util/StringUtils.h" -#include "Utilities.h" -#include "Exceptions.h" -#include "../client.h" - -using namespace vbox; -using namespace tinyxml2; - -unsigned int Reminder::FindChannelNumber(const ChannelPtr &channel) -{ - if (g_vbox->GetSettings().m_setChannelIdUsingOrder == CH_ORDER_BY_LCN) - { - return channel->m_number; - } - else - { - auto &channels = g_vbox->GetChannels(); - unsigned int i = 0; - - for (const auto &item : channels) - { - ++i; - if (item == channel) - break; - } - return i; - } -} - -Reminder::Reminder(const ChannelPtr &channel, const ::xmltv::ProgrammePtr &programme, unsigned int minsInAdvance) : - m_minsInAdvance(minsInAdvance), m_startTime(xmltv::Utilities::XmltvToUnixTime(programme->m_startTime)), - m_popTime(xmltv::Utilities::XmltvToUnixTime(programme->m_startTime) - (60 * m_minsInAdvance)), m_progName(programme->m_title), - m_channelName(channel->m_name), m_channelXmltvName(channel->m_xmltvName) -{ - m_channelNum = FindChannelNumber(channel); -} - -Reminder::Reminder(const ChannelPtr &channel, time_t startTime, std::string &progName, unsigned int minsInAdvance) : - m_minsInAdvance(minsInAdvance), m_startTime(startTime), - m_popTime(startTime - (60 * m_minsInAdvance)), m_progName(progName), - m_channelName(channel->m_name), m_channelXmltvName(channel->m_xmltvName) -{ - m_channelNum = FindChannelNumber(channel); -} - -void Reminder::ComposeMessage(time_t currTime) -{ - char buf[32], minBuf[32]; - - memset(minBuf, 0, sizeof(buf)); - - sprintf(buf, "[%u] ", m_channelNum); - - m_msgTitle = "Program reminder:"; - m_msgText = "Program: " + std::string(" ") + m_progName + '\n'; - m_msgText += "Channel: " + std::string(" ") + std::string(buf) + m_channelName + '\n'; - unsigned int minutes = (m_startTime - currTime) / 60; - - m_msgText += "Starts "; - - if (currTime < m_startTime && minutes > 0) - { - sprintf(minBuf, "%li", (m_startTime - currTime) / 60); - m_msgText += "in: " + std::string(minBuf) + " minutes"; - } - else - { - m_msgText += ": Now"; - } -} - -std::string Reminder::GetReminderText() -{ - ComposeMessage(time(nullptr)); - return m_msgText; -} - -time_t Reminder::GetPopTime() const -{ - return m_popTime; -} - -time_t Reminder::GetStartTime() const -{ - return m_startTime; -} \ No newline at end of file diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/Reminder.h kodi-pvr-vbox-8.1.0/src/vbox/Reminder.h --- kodi-pvr-vbox-4.7.0/src/vbox/Reminder.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/Reminder.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,110 +0,0 @@ -#pragma once -/* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ - -#include -#include "Channel.h" -#include "../xmltv/Programme.h" -#include "kodi/xbmc_pvr_types.h" - -namespace vbox { - - class ReminderManager; - - /** - * Represents a single-program reminder. - * Contains a message reminding the user of the program - */ - class Reminder - { - public: - - /** - * Creates a reminder from a channel and a specific program - * @param channel the channel containing the program to remind - * @param programme the program to remind - * @param minsInAdvance minutes before the program's start time to pop the reminder - */ - Reminder(const ChannelPtr &channel, const ::xmltv::ProgrammePtr &programme, unsigned int minsInAdvance); - - /** - * Creates a reminder according to a manually given program name and its' start time - * @param channel the channel containing the program to remind - * @param startTime the program's original start time - * @param minsInAdvance minutes before the program's start time to pop the reminder - */ - Reminder(const ChannelPtr &channel, time_t startTime, std::string &progName, unsigned int minsInAdvance); - - /** - * For comparing reminders' pop times - */ - bool operator< (const Reminder &other) const - { - return !(m_popTime < other.m_popTime); - } - - /** - * Composes & returns a message for a certain moment in time, showing details - * of the program and the time left for it to start - * @param currTime the current time of showing the reminder pop-up - * @return the reminder's pop-up message - */ - std::string GetReminderText(); - - /** - * @return the reminder's pop time - */ - time_t GetPopTime() const; - - /** - * @return the program's original start time - */ - time_t GetStartTime() const; - - private: - friend ReminderManager; - - /** - * Finds a channel's display number in the addon (LCN / index - varies by setting) - * @param channel the requested channel - * @return the channel's number - */ - static unsigned int FindChannelNumber(const ChannelPtr &channel); - - /** - * Composes the reminder's message - * @param currTime the time of showing the popup (pop time) - */ - void ComposeMessage(time_t currTime); - - unsigned int m_minsInAdvance; - time_t m_startTime; - time_t m_popTime; - std::string m_channelXmltvName; - unsigned int m_channelNum; - std::string m_channelName; - std::string m_progName; - std::string m_msgTitle; - std::string m_msgText; - }; - - typedef std::shared_ptr ReminderPtr; -} diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/ReminderManager.cpp kodi-pvr-vbox-8.1.0/src/vbox/ReminderManager.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/ReminderManager.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/ReminderManager.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,302 +0,0 @@ -/* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ -#include "ContentIdentifier.h" -#include "ReminderManager.h" -#include -#include "lib/tinyxml2/tinyxml2.h" -#include "p8-platform/util/StringUtils.h" -#include "Utilities.h" -#include "Exceptions.h" -#include "../client.h" - -using namespace vbox; -using namespace tinyxml2; - -const std::string ReminderManager::REMINDERS_XML = "special://userdata/addon_data/pvr.vbox/reminders.xml"; - -void ReminderManager::Initialize() -{ - if (!XBMC->FileExists(REMINDERS_XML.c_str(), false)) - { - g_vbox->Log(ADDON::LOG_INFO, "No reminders XML found"); - Save(); - } - else - { - g_vbox->Log(ADDON::LOG_INFO, "Reminders XML found"); - Load(); - } -} - -bool ReminderManager::AddReminder(const ChannelPtr &channel, const ::xmltv::ProgrammePtr &programme, unsigned int minsBeforePop) -{ - // Construct the object - ReminderPtr reminder(new Reminder(channel, programme, minsBeforePop)); - // save in queue - g_vbox->Log(ADDON::LOG_DEBUG, "Added reminder (1) for channel %s, prog %s", programme->m_channelName.c_str(), programme->m_title.c_str()); - m_reminders.push(reminder); - Save(); - return true; -} - -bool ReminderManager::AddReminder(const ChannelPtr &channel, time_t startTime, std::string &progName, unsigned int minsBeforePop) -{ - g_vbox->Log(ADDON::LOG_DEBUG, "Added reminder for %s", g_vbox->CreateTimestamp(startTime).c_str()); - // Construct the object - ReminderPtr reminder(new Reminder(channel, startTime, progName, minsBeforePop)); - // save in queue - g_vbox->Log(ADDON::LOG_DEBUG, "Added reminder (2) for channel %s, prog %s", channel->m_name.c_str(), progName.c_str()); - m_reminders.push(reminder); - Save(); - return true; -} - -ReminderPtr ReminderManager::GetReminderToPop(time_t currTime) -{ - if (m_reminders.empty()) - return nullptr; - - ReminderPtr reminder = m_reminders.top(); - if (reminder) - { - time_t popTime = reminder->GetPopTime(); - time_t startTime = reminder->GetStartTime(); - - // if past pop time - handle reminder - if (currTime > popTime) - { - // if we're somewhere between the pop time and the first - // 5 first minutes of the program (addon might have not been active) - pop reminder - if (currTime < startTime + 5 * 60) - { - g_vbox->Log(ADDON::LOG_DEBUG, "Reminder popped"); - return reminder; - } - // reminder is too old (either popped or past the first 5 minutes of program) - delete it - else - DeleteNextReminder(); - } - } - return nullptr; -} - -void ReminderManager::DeleteNextReminder() -{ - g_vbox->Log(ADDON::LOG_DEBUG, "Removing reminder!"); - m_reminders.pop(); - Save(); -} - -bool ReminderManager::DeleteChannelReminders(const ChannelPtr &rChannel) -{ - bool fSuccess = false; - ReminderQueue queue; - - while (!m_reminders.empty()) - { - ReminderPtr reminder = m_reminders.top(); - m_reminders.pop(); - std::string channelId = reminder->m_channelXmltvName; - // find matching channel - auto &channels = g_vbox->GetChannels(); - auto it = std::find_if(channels.cbegin(), channels.cend(), - [&channelId](const ChannelPtr &channel) - { - return channelId == channel->m_xmltvName; - }); - - // if channel does not match - keep reminder - if (it != channels.end()) - { - const ChannelPtr &selectedChannel = *it; - if (rChannel == selectedChannel) - { - g_vbox->Log(ADDON::LOG_INFO, "Removing reminder, matches channel %s", selectedChannel->m_xmltvName.c_str()); - fSuccess = true; - continue; - } - } - queue.push(reminder); - } - m_reminders = queue; - if (fSuccess) - Save(); - return fSuccess; -} - - -bool ReminderManager::DeleteProgramReminders(unsigned int epgUid) -{ - bool fSuccess = false; - ReminderQueue queue; - - g_vbox->Log(ADDON::LOG_INFO, "KillProgramReminders(): in"); - while (!m_reminders.empty()) - { - ReminderPtr reminder = m_reminders.top(); - m_reminders.pop(); - std::string channelId = reminder->m_channelXmltvName; - - auto &channels = g_vbox->GetChannels(); - auto it = std::find_if(channels.cbegin(), channels.cend(), - [&channelId](const ChannelPtr &channel) - { - return channelId == channel->m_xmltvName; - }); - - // if channel does not match - keep reminder & continue - if (it != channels.end()) - { - const ChannelPtr &selectedChannel = *it; - const Schedule schedule = g_vbox->GetSchedule(selectedChannel); - const xmltv::ProgrammePtr programme = (schedule.schedule) ? schedule.schedule->GetProgramme(epgUid) : nullptr; - // skip reminder if the EPG event is found - if (programme && programme->m_title == reminder->m_progName && xmltv::Utilities::XmltvToUnixTime(programme->m_startTime) == reminder->m_startTime) - { - fSuccess = true; - continue; - } - } - queue.push(reminder); - } - m_reminders = queue; - if (fSuccess) - Save(); - return fSuccess; -} - - -void ReminderManager::Load() -{ - g_vbox->Log(ADDON::LOG_INFO, "Found reminders XML file, attempting to load it"); - void *fileHandle = XBMC->OpenFile(REMINDERS_XML.c_str(), 0x08 /* READ_NO_CACHE */); - - if (!fileHandle) - { - g_vbox->Log(ADDON::LOG_ERROR, "Could not open reminders XML, throwing exception"); - throw vbox::InvalidXMLException("XML could not be opened" ); - } - - m_reminders = ReminderQueue(); - - g_vbox->Log(ADDON::LOG_INFO, "Reading XML"); - // Read the XML - tinyxml2::XMLDocument document; - std::unique_ptr contents = utilities::ReadFileContents(fileHandle); - - // Try to parse the document - if (document.Parse(contents->c_str(), contents->size()) != XML_NO_ERROR) - throw vbox::InvalidXMLException("XML parsing failed: " + std::string(document.ErrorName())); - - unsigned int minsBeforePop = g_vbox->GetSettings().m_remindMinsBeforeProg; - // Create mappings - for (const XMLElement *element = document.RootElement()->FirstChildElement("reminder"); - element != nullptr; element = element->NextSiblingElement("reminder")) - { - g_vbox->Log(ADDON::LOG_INFO, "Found reminder"); - // get channel, program name and start time - const char *pXmltvId = element->Attribute("channel"); - const char *pStartTime = element->Attribute("start-time"); - const char *pProgName = element->GetText(); - g_vbox->Log(ADDON::LOG_INFO, "Reminder 1 is for ch %s, startTime %s", pXmltvId, pStartTime); - std::string progTitle(pProgName? pProgName : ""); - g_vbox->Log(ADDON::LOG_INFO, "Reminder 2 is for ch %s, startTime %s, progTitle=%s", pXmltvId, pStartTime, progTitle.c_str()); - if (!pXmltvId || !pStartTime) - continue; - - g_vbox->Log(ADDON::LOG_INFO, "Reminder 3 is for ch %s, startTime %s", pXmltvId, pStartTime); - std::string encodedChId(pXmltvId); - std::string xmltvStartTime(pStartTime); - time_t startTime(xmltv::Utilities::XmltvToUnixTime(xmltvStartTime)); - g_vbox->Log(ADDON::LOG_INFO, "Reminder is for encodedChId %s, looking for it", encodedChId.c_str()); - // Find the channel the reminder is for - auto &channels = g_vbox->GetChannels(); - auto it = std::find_if(channels.cbegin(), channels.cend(), - [&encodedChId](const ChannelPtr &channel) - { - g_vbox->Log(ADDON::LOG_INFO, "Channel is %s when looking for %s", channel->m_xmltvName.c_str(), encodedChId.c_str()); - return encodedChId == channel->m_xmltvName; - }); - - if (it == channels.end()) - { - g_vbox->Log(ADDON::LOG_INFO, "Channel of reminder not found, continuing"); - continue; - } - const ChannelPtr channel = *it; - - g_vbox->Log(ADDON::LOG_INFO, "Channel found, it's %s, adding reminder to queue", channel->m_xmltvName.c_str()); - if (!AddReminder(channel, startTime, progTitle, minsBeforePop)) - g_vbox->Log(ADDON::LOG_ERROR, "Could not load reminder"); - else - g_vbox->Log(ADDON::LOG_INFO, "Channel found, it's %s, added reminder to queue", channel->m_xmltvName.c_str()); - } - XBMC->CloseFile(fileHandle); -} - -void ReminderManager::Save() -{ - ReminderQueue queue; - - // Create the document - tinyxml2::XMLDocument document; - XMLDeclaration *declaration = document.NewDeclaration(); - document.InsertEndChild(declaration); - - // Create the root node () - XMLElement *rootElement = document.NewElement("reminders"); - document.InsertEndChild(rootElement); - g_vbox->Log(ADDON::LOG_INFO, "Save(1): %u reminders", m_reminders.size()); - - // Create one for every reminder - while (!m_reminders.empty()) - { - ReminderPtr reminder = m_reminders.top(); - g_vbox->Log(ADDON::LOG_INFO, "Save(2): got reminder", m_reminders.size()); - XMLElement *reminderElement = document.NewElement("reminder"); - reminderElement->SetText(reminder->m_progName.c_str()); - reminderElement->SetAttribute("channel", reminder->m_channelXmltvName.c_str()); - reminderElement->SetAttribute("start-time", g_vbox->CreateTimestamp(reminder->m_startTime).c_str()); - rootElement->InsertFirstChild(reminderElement); - m_reminders.pop(); - g_vbox->Log(ADDON::LOG_INFO, "Save(3): popped. Now pushing to queue", m_reminders.size()); - queue.push(reminder); - } - g_vbox->Log(ADDON::LOG_INFO, "Save(4): queue size %d, m_reminders size %d", queue.size(), m_reminders.size()); - m_reminders = queue; - g_vbox->Log(ADDON::LOG_INFO, "Save(5): queue size %d, m_reminders size %d", queue.size(), m_reminders.size()); - - XBMC->DeleteFile(REMINDERS_XML.c_str()); - // Save the file - void *fileHandle = XBMC->OpenFileForWrite(REMINDERS_XML.c_str(), false); - - if (fileHandle) - { - XMLPrinter printer; - document.Accept(&printer); - - //XBMC->TruncateFile() - std::string xml = printer.CStr(); - XBMC->WriteFile(fileHandle, xml.c_str(), xml.length()); - - XBMC->CloseFile(fileHandle); - } -} diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/ReminderManager.h kodi-pvr-vbox-8.1.0/src/vbox/ReminderManager.h --- kodi-pvr-vbox-4.7.0/src/vbox/ReminderManager.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/ReminderManager.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,115 +0,0 @@ -#pragma once -/* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ - -#include -#include -#include -#include -#include "Reminder.h" -#include "../xmltv/Programme.h" -#include "kodi/xbmc_pvr_types.h" - -namespace vbox { - - typedef std::priority_queue > ReminderQueue; - typedef std::unique_ptr ReminderQueuePtr; - - /** - * Represents a reminder manager, which creates, stores and manages reminders - * according to the time they're supposed to pop. It stores the reminders to disk - */ - class ReminderManager - { - public: - ReminderManager() = default; - ~ReminderManager() = default; - - /** - * Initializes the manager by loading previously set reminders from disk - * if no XML exists, saves the current reminders to disk - */ - void Initialize(); - - /** - * Creates and stores a reminder with a given channel and program - * @param channel the channel containing the program to remind - * @param programme the program to remind - * @param minsInAdvance minutes before the program's start time to pop the reminder - * @return the success of adding the newly created reminder - */ - bool AddReminder(const ChannelPtr &channel, const ::xmltv::ProgrammePtr &programme, unsigned int minsBeforePop); - - /** - * Creates and stores a reminder with a given channel, and a manually given program name and its' start time - * @param channel the channel containing the program to remind - * @param programme the program to remind - * @param minsInAdvance minutes before the program's start time to pop the reminder - * @return the success of adding the newly created reminder - */ - bool AddReminder(const ChannelPtr &channel, time_t startTime, std::string &progName, unsigned int minsBeforePop); - - /** - * @param currTime the current time - * @return the reminder at the top of the queue - */ - ReminderPtr GetReminderToPop(time_t currTime); - - /** - * Removes the reminder at the top of the queue - */ - void DeleteNextReminder(); - - /** - * Removes all reminder set for a channel (if exist) - */ - bool DeleteChannelReminders(const ChannelPtr &channel); - - /** - * Removes a program's reminder (if exists) - */ - bool DeleteProgramReminders(unsigned int epgUid); - - /** - * Loads reminders from disk - */ - void Load(); - - /** - * Saves reminders to disk - */ - void Save(); - - private: - - /** - * The path to the reminders XML file - */ - const static std::string REMINDERS_XML; - - /** - * The queue of reminders (prioritized by earliest) - */ - ReminderQueue m_reminders; - }; - - typedef std::unique_ptr ReminderManagerPtr; -} diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/request/ApiRequest.cpp kodi-pvr-vbox-8.1.0/src/vbox/request/ApiRequest.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/request/ApiRequest.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/request/ApiRequest.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,59 +1,46 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "ApiRequest.h" -#include "../../client.h" + #include "../../xmltv/Utilities.h" + #include using namespace vbox::request; using vbox::response::ResponseType; const std::vector ApiRequest::externalCapableMethods = { - "GetXmltvEntireFile", - "GetXmltvSection", - "GetXmltvChannelsList", - "GetXmltvProgramsList", - "GetRecordsList" + "GetXmltvEntireFile", + "GetXmltvSection", + "GetXmltvChannelsList", + "GetXmltvProgramsList", + "GetRecordsList" }; const std::vector ApiRequest::xmltvMethods = { - "GetXmltvEntireFile", - "GetXmltvSection", - "GetXmltvChannelsList", - "GetXmltvProgramsList", + "GetXmltvEntireFile", + "GetXmltvSection", + "GetXmltvChannelsList", + "GetXmltvProgramsList", }; -ApiRequest::ApiRequest(const std::string &method) - : m_method(method), m_timeout(0) +ApiRequest::ApiRequest(const std::string& method, const std::string& hostname, int upnpPort) : m_method(method), m_timeout(0) { AddParameter("Method", method); // Add external IP and port options to the methods that support it - if (std::find( - externalCapableMethods.cbegin(), - externalCapableMethods.cend(), method) != externalCapableMethods.cend()) + if (std::find(externalCapableMethods.cbegin(), externalCapableMethods.cend(), method) != + externalCapableMethods.cend()) { - AddParameter("ExternalIP", g_vbox->GetConnectionParams().hostname); - AddParameter("Port", g_vbox->GetConnectionParams().upnpPort); + AddParameter("ExternalIP", hostname); + AddParameter("Port", upnpPort); } } @@ -68,21 +55,19 @@ return ResponseType::GENERIC; } -std::string ApiRequest::GetLocation() const +std::string ApiRequest::GetLocation(std::string url) const { - std::string url = g_vbox->GetApiBaseUrl(); - // Append parameters (including method) if (!m_parameters.empty()) { - for (auto const ¶meter : m_parameters) + for (auto const& parameter : m_parameters) { - // multiple values possible for each parameter - for (auto const &value : parameter.second) - { - url += "&" + parameter.first + "="; - url += ::xmltv::Utilities::UrlEncode(value); - } + // multiple values possible for each parameter + for (auto const& value : parameter.second) + { + url += "&" + parameter.first + "="; + url += ::xmltv::Utilities::UrlEncode(value); + } } } @@ -98,17 +83,17 @@ return m_method; } -void ApiRequest::AddParameter(const std::string &name, const std::string &value) +void ApiRequest::AddParameter(const std::string& name, const std::string& value) { m_parameters[name].push_back(value); } -void ApiRequest::AddParameter(const std::string &name, int value) +void ApiRequest::AddParameter(const std::string& name, int value) { m_parameters[name].push_back(std::to_string(value)); } -void ApiRequest::AddParameter(const std::string &name, unsigned int value) +void ApiRequest::AddParameter(const std::string& name, unsigned int value) { m_parameters[name].push_back(std::to_string(value)); } diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/request/ApiRequest.h kodi-pvr-vbox-8.1.0/src/vbox/request/ApiRequest.h --- kodi-pvr-vbox-4.7.0/src/vbox/request/ApiRequest.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/request/ApiRequest.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,32 +1,24 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once + +#include "Request.h" -#include #include +#include #include -#include "Request.h" -namespace vbox { - namespace request { +namespace vbox +{ + namespace request + { /** * Represents an API request @@ -34,8 +26,8 @@ class ApiRequest : public Request { public: - ApiRequest(const std::string &method); - virtual ~ApiRequest() {}; + ApiRequest(const std::string& method, const std::string& hostname, int upnpPort); + virtual ~ApiRequest(){}; /** * Adds a request parameter with the specified value @@ -43,18 +35,17 @@ * @param name The name. * @param value The value. */ - void AddParameter(const std::string &name, const std::string &value); - void AddParameter(const std::string &name, int value); - void AddParameter(const std::string &name, unsigned int value); + void AddParameter(const std::string& name, const std::string& value); + void AddParameter(const std::string& name, int value); + void AddParameter(const std::string& name, unsigned int value); void SetTimeout(int timeout); virtual vbox::response::ResponseType GetResponseType() const override; - virtual std::string GetLocation() const override; + virtual std::string GetLocation(std::string url) const override; virtual std::string GetIdentifier() const override; private: - /** * The method name */ @@ -81,5 +72,5 @@ */ static const std::vector xmltvMethods; }; - } -} + } // namespace request +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/request/FileRequest.h kodi-pvr-vbox-8.1.0/src/vbox/request/FileRequest.h --- kodi-pvr-vbox-4.7.0/src/vbox/request/FileRequest.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/request/FileRequest.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,30 +1,22 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once -#include #include "Request.h" -namespace vbox { - namespace request { +#include + +namespace vbox +{ + namespace request + { /** * Represents a local file request @@ -32,8 +24,7 @@ class FileRequest : public Request { public: - FileRequest(const std::string &path) - : m_path(path) {} + FileRequest(const std::string& path) : m_path(path) {} virtual ~FileRequest() {} virtual response::ResponseType GetResponseType() const override @@ -42,18 +33,12 @@ return response::ResponseType::XMLTV; } - virtual std::string GetLocation() const override - { - return m_path; - } + virtual std::string GetLocation(std::string url) const override { return m_path; } - virtual std::string GetIdentifier() const override - { - return "FileRequest for \"" + m_path + "\""; - } + virtual std::string GetIdentifier() const override { return "FileRequest for \"" + m_path + "\""; } private: std::string m_path; }; - } -} \ No newline at end of file + } // namespace request +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/request/Request.h kodi-pvr-vbox-8.1.0/src/vbox/request/Request.h --- kodi-pvr-vbox-4.7.0/src/vbox/request/Request.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/request/Request.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,30 +1,22 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once -#include #include "../response/Response.h" -namespace vbox { - namespace request { +#include + +namespace vbox +{ + namespace request + { /** * Interface for requests @@ -42,12 +34,12 @@ /** * @return the request location */ - virtual std::string GetLocation() const = 0; + virtual std::string GetLocation(std::string url) const = 0; /** * @return an identifier for this request (mainly for logging purposes) */ virtual std::string GetIdentifier() const = 0; }; - } -} + } // namespace request +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/response/Content.cpp kodi-pvr-vbox-8.1.0/src/vbox/response/Content.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/response/Content.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/response/Content.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,39 +1,28 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "Content.h" -#include "kodi/xbmc_pvr_types.h" -#include "lib/tinyxml2/tinyxml2.h" -#include "../Channel.h" -#include "../../xmltv/Utilities.h" -#include "../../xmltv/Guide.h" + #include "../../vbox/VBox.h" +#include "../../xmltv/Guide.h" +#include "../../xmltv/Utilities.h" +#include "../Channel.h" + +#include using namespace tinyxml2; using namespace vbox; using namespace vbox::response; -std::string Content::GetString(const std::string ¶meter) const +std::string Content::GetString(const std::string& parameter) const { - const XMLElement *element = GetParameterElement(parameter); + const XMLElement* element = GetParameterElement(parameter); if (element) return xmltv::Utilities::GetStdString(element->GetText()); @@ -41,29 +30,29 @@ return ""; } -int Content::GetInteger(const std::string ¶meter) const +int Content::GetInteger(const std::string& parameter) const { int value = 0; - const XMLElement *element = GetParameterElement(parameter); + const XMLElement* element = GetParameterElement(parameter); if (element) value = xmltv::Utilities::QueryIntText(element); return value; } -unsigned int Content::GetUnsignedInteger(const std::string ¶meter) const +unsigned int Content::GetUnsignedInteger(const std::string& parameter) const { unsigned int value = 0; - XMLElement *element = GetParameterElement(parameter); + XMLElement* element = GetParameterElement(parameter); if (element) value = xmltv::Utilities::QueryUnsignedText(element); return value; } -tinyxml2::XMLElement* Content::GetParameterElement(const std::string ¶meter) const +tinyxml2::XMLElement* Content::GetParameterElement(const std::string& parameter) const { return m_content->FirstChildElement(parameter.c_str()); } @@ -75,8 +64,8 @@ // Remember the index each channel had, it's needed for certain API requests unsigned int index = 1; - for (XMLElement *element = m_content->FirstChildElement("channel"); - element != NULL; element = element->NextSiblingElement("channel")) + for (XMLElement* element = m_content->FirstChildElement("channel"); element != NULL; + element = element->NextSiblingElement("channel")) { ChannelPtr channel = CreateChannel(element); channel->m_index = index++; @@ -91,10 +80,10 @@ return ::xmltv::Guide(m_content); } -ChannelPtr XMLTVResponseContent::CreateChannel(const tinyxml2::XMLElement *xml) const +ChannelPtr XMLTVResponseContent::CreateChannel(const tinyxml2::XMLElement* xml) const { // Extract data from the various elements - const XMLElement *displayElement = xml->FirstChildElement("display-name"); + const XMLElement* displayElement = xml->FirstChildElement("display-name"); std::string name(xmltv::Utilities::GetStdString(displayElement->GetText())); displayElement = displayElement->NextSiblingElement("display-name"); std::string type(xmltv::Utilities::GetStdString(displayElement->GetText())); @@ -105,8 +94,7 @@ std::string xmltvName = ::xmltv::Utilities::UrlDecode(xml->Attribute("id")); // Create the channel with some basic information - ChannelPtr channel(new Channel(uniqueId, xmltvName, name, - xml->FirstChildElement("url")->Attribute("src"))); + ChannelPtr channel(new Channel(uniqueId, xmltvName, name, xml->FirstChildElement("url")->Attribute("src"))); // Extract the LCN (optional) displayElement = displayElement->NextSiblingElement("display-name"); @@ -123,7 +111,7 @@ } // Set icon URL if it exists - const char *iconUrl = xml->FirstChildElement("icon")->Attribute("src"); + const char* iconUrl = xml->FirstChildElement("icon")->Attribute("src"); if (iconUrl != NULL) channel->m_iconUrl = iconUrl; @@ -138,8 +126,8 @@ { std::vector recordings; - for (XMLElement *element = m_content->FirstChildElement("record"); - element != NULL; element = element->NextSiblingElement("record")) + for (XMLElement* element = m_content->FirstChildElement("record"); element != NULL; + element = element->NextSiblingElement("record")) { RecordingPtr recording = CreateRecording(element); recordings.push_back(std::move(recording)); @@ -152,8 +140,8 @@ { std::vector allSeries; - for (XMLElement *element = m_content->FirstChildElement("record-series"); - element != NULL; element = element->NextSiblingElement("record-series")) + for (XMLElement* element = m_content->FirstChildElement("record-series"); element != NULL; + element = element->NextSiblingElement("record-series")) { SeriesRecordingPtr series = CreateSeriesRecording(element); allSeries.push_back(std::move(series)); @@ -162,12 +150,12 @@ return allSeries; } -RecordingPtr RecordingResponseContent::CreateRecording(const tinyxml2::XMLElement *xml) const +RecordingPtr RecordingResponseContent::CreateRecording(const tinyxml2::XMLElement* xml) const { // Extract mandatory properties std::string channelId = xmltv::Utilities::UrlDecode(xmltv::Utilities::GetStdString(xml->Attribute("channel"))); - const XMLElement *element = xml->FirstChildElement("channel-name"); + const XMLElement* element = xml->FirstChildElement("channel-name"); if (!element) return nullptr; @@ -191,7 +179,7 @@ element = xml->FirstChildElement("series-id"); if (element) - recording->m_seriesId = xmltv::Utilities::QueryUnsignedText(element); + recording->m_seriesId = xmltv::Utilities::QueryUnsignedText(element); // TODO: External recordings don't have an end time, default to one hour if (xml->Attribute("stop") != NULL) @@ -235,15 +223,15 @@ return recording; } -static void AddWeekdayBits(unsigned int &rWeekdays, const char *pWeekdaysText) +static void AddWeekdayBits(unsigned int& rWeekdays, const char* pWeekdaysText) { - static unsigned int days[7] = { PVR_WEEKDAY_SUNDAY, PVR_WEEKDAY_MONDAY, PVR_WEEKDAY_TUESDAY, - PVR_WEEKDAY_WEDNESDAY, PVR_WEEKDAY_THURSDAY, PVR_WEEKDAY_FRIDAY, PVR_WEEKDAY_SATURDAY }; + static unsigned int days[7] = {PVR_WEEKDAY_SUNDAY, PVR_WEEKDAY_MONDAY, PVR_WEEKDAY_TUESDAY, PVR_WEEKDAY_WEDNESDAY, + PVR_WEEKDAY_THURSDAY, PVR_WEEKDAY_FRIDAY, PVR_WEEKDAY_SATURDAY}; unsigned int dayInWeek = 0; - char *pDay; + char* pDay; char buf[32]; - strncpy(buf, pWeekdaysText, sizeof(buf)-1); + strncpy(buf, pWeekdaysText, sizeof(buf) - 1); pDay = strtok(buf, ","); while (pDay) @@ -256,7 +244,7 @@ } } -SeriesRecordingPtr RecordingResponseContent::CreateSeriesRecording(const tinyxml2::XMLElement *xml) const +SeriesRecordingPtr RecordingResponseContent::CreateSeriesRecording(const tinyxml2::XMLElement* xml) const { // Extract mandatory properties std::string channelId = xmltv::Utilities::UrlDecode(xmltv::Utilities::GetStdString(xml->Attribute("channel"))); @@ -265,7 +253,7 @@ SeriesRecordingPtr series(new SeriesRecording(channelId)); series->m_id = atoi(xmltv::Utilities::GetStdString(xml->Attribute("series-id")).c_str()); - const XMLElement *element = xml->FirstChildElement("schedule-record-id"); + const XMLElement* element = xml->FirstChildElement("schedule-record-id"); if (element) series->m_scheduledId = xmltv::Utilities::QueryIntText(element); @@ -275,8 +263,8 @@ series->m_title = xmltv::Utilities::GetStdString(element->GetText()); else - // Some recordings may have certain tags, but they can be empty - element = xml->FirstChildElement("programme-desc"); + // Some recordings may have certain tags, but they can be empty + element = xml->FirstChildElement("programme-desc"); if (element) series->m_description = xmltv::Utilities::GetStdString(element->GetText()); @@ -304,7 +292,7 @@ } -RecordingState RecordingResponseContent::GetState(const std::string &state) const +RecordingState RecordingResponseContent::GetState(const std::string& state) const { if (state == "recorded") return RecordingState::RECORDED; diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/response/Content.h kodi-pvr-vbox-8.1.0/src/vbox/response/Content.h --- kodi-pvr-vbox-4.7.0/src/vbox/response/Content.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/response/Content.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,39 +1,32 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ -#include -#include +#pragma once + +#include "../../xmltv/Guide.h" #include "../Channel.h" #include "../Recording.h" #include "../SeriesRecording.h" -#include "../../xmltv/Guide.h" -namespace tinyxml2 { +#include +#include + +namespace tinyxml2 +{ // Forward declarations class XMLElement; -} +} // namespace tinyxml2 -namespace vbox { - namespace response { +namespace vbox +{ + namespace response + { /** * The base class for all response contents @@ -41,41 +34,38 @@ class Content { public: - Content(tinyxml2::XMLElement *content) - : m_content(content) {} - virtual ~Content() {}; + Content(tinyxml2::XMLElement* content) : m_content(content) {} + virtual ~Content(){}; /** * Returns the specified parameter as a string * @param name the parameter * @return the value */ - std::string GetString(const std::string ¶meter) const; + std::string GetString(const std::string& parameter) const; /** * Returns the specified parameter as an integer * @param name the parameter * @return the value */ - int GetInteger(const std::string ¶meter) const; + int GetInteger(const std::string& parameter) const; /** * Returns the specified parameter as an unsigned integer * @param name the parameter * @return the value */ - unsigned int GetUnsignedInteger(const std::string ¶meter) const; + unsigned int GetUnsignedInteger(const std::string& parameter) const; protected: - /** * The request content */ - tinyxml2::XMLElement *m_content; + tinyxml2::XMLElement* m_content; private: - - tinyxml2::XMLElement* GetParameterElement(const std::string ¶meter) const; + tinyxml2::XMLElement* GetParameterElement(const std::string& parameter) const; }; /** @@ -84,9 +74,8 @@ class XMLTVResponseContent : public Content { public: - XMLTVResponseContent(tinyxml2::XMLElement *content) - : Content(content) {} - virtual ~XMLTVResponseContent() {}; + XMLTVResponseContent(tinyxml2::XMLElement* content) : Content(content) {} + virtual ~XMLTVResponseContent(){}; /** * Returns the list of channels contained in the response @@ -101,8 +90,7 @@ ::xmltv::Guide GetGuide() const; private: - ChannelPtr CreateChannel(const tinyxml2::XMLElement *xml) const; - + ChannelPtr CreateChannel(const tinyxml2::XMLElement* xml) const; }; /** @@ -111,17 +99,16 @@ class RecordingResponseContent : public Content { public: - RecordingResponseContent(tinyxml2::XMLElement *content) - : Content(content) {} - virtual ~RecordingResponseContent() {}; + RecordingResponseContent(tinyxml2::XMLElement* content) : Content(content) {} + virtual ~RecordingResponseContent(){}; std::vector GetRecordings() const; std::vector GetSeriesRecordings() const; private: - RecordingPtr CreateRecording(const tinyxml2::XMLElement *xml) const; - SeriesRecordingPtr CreateSeriesRecording(const tinyxml2::XMLElement *xml) const; - RecordingState GetState(const std::string &state) const; + RecordingPtr CreateRecording(const tinyxml2::XMLElement* xml) const; + SeriesRecordingPtr CreateSeriesRecording(const tinyxml2::XMLElement* xml) const; + RecordingState GetState(const std::string& state) const; }; - } -} + } // namespace response +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/response/Factory.h kodi-pvr-vbox-8.1.0/src/vbox/response/Factory.h --- kodi-pvr-vbox-4.7.0/src/vbox/response/Factory.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/response/Factory.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,38 +1,30 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once -#include #include "../request/Request.h" #include "Response.h" -namespace vbox { - namespace response { +#include + +namespace vbox +{ + namespace response + { /** * Factor for response objects */ - class Factory { + class Factory + { public: - /** * Prevents construction */ @@ -43,19 +35,19 @@ * @param request the request * @return the response */ - static ResponsePtr CreateResponse(const request::Request &request) + static ResponsePtr CreateResponse(const request::Request& request) { switch (request.GetResponseType()) { - case ResponseType::XMLTV: - return ResponsePtr(new XMLTVResponse); - case ResponseType::RECORDS: - return ResponsePtr(new RecordingResponse); - case ResponseType::GENERIC: - default: - return ResponsePtr(new Response); + case ResponseType::XMLTV: + return ResponsePtr(new XMLTVResponse); + case ResponseType::RECORDS: + return ResponsePtr(new RecordingResponse); + case ResponseType::GENERIC: + default: + return ResponsePtr(new Response); } } }; - } -} + } // namespace response +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/response/Response.cpp kodi-pvr-vbox-8.1.0/src/vbox/response/Response.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/response/Response.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/response/Response.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,27 +1,16 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "Response.h" -#include "../Exceptions.h" + #include "../../xmltv/Utilities.h" +#include "../Exceptions.h" using namespace tinyxml2; using namespace vbox::response; @@ -29,8 +18,8 @@ Response::Response() { // Some XMLTV files have weird line endings, try to account for that - m_document = std::unique_ptr( - new XMLDocument(/*processEntities = */true, tinyxml2::PRESERVE_WHITESPACE)); + m_document = + std::unique_ptr(new XMLDocument(/*processEntities = */ true, tinyxml2::PRESERVE_WHITESPACE)); m_error.code = ErrorCode::SUCCESS; m_error.description = ""; @@ -40,7 +29,7 @@ { } -void Response::ParseRawResponse(const std::string &rawResponse) +void Response::ParseRawResponse(const std::string& rawResponse) { // Try to parse the response as XML if (m_document->Parse(rawResponse.c_str(), rawResponse.size()) != XML_NO_ERROR) @@ -55,14 +44,14 @@ int errorCode; std::string errorDescription; - XMLNode *rootElement = m_document->RootElement(); - XMLElement *statusElement = rootElement->FirstChildElement(GetStatusElementName().c_str()); + XMLNode* rootElement = m_document->RootElement(); + XMLElement* statusElement = rootElement->FirstChildElement(GetStatusElementName().c_str()); // Not all response types always return the status element if (statusElement) { - XMLElement *errCodeEl = statusElement->FirstChildElement("ErrorCode"); - XMLElement *errDescEl = statusElement->FirstChildElement("ErrorDescription"); + XMLElement* errCodeEl = statusElement->FirstChildElement("ErrorCode"); + XMLElement* errDescEl = statusElement->FirstChildElement("ErrorDescription"); if (errCodeEl) { @@ -80,7 +69,7 @@ XMLElement* Response::GetReplyElement() const { - XMLNode *rootElement = m_document->RootElement(); + XMLNode* rootElement = m_document->RootElement(); return rootElement->FirstChildElement("Reply"); } diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/response/Response.h kodi-pvr-vbox-8.1.0/src/vbox/response/Response.h --- kodi-pvr-vbox-4.7.0/src/vbox/response/Response.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/response/Response.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,31 +1,23 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once #include #include -#include "lib/tinyxml2/tinyxml2.h" -namespace vbox { - namespace response { +#include + +namespace vbox +{ + namespace response + { class Response; typedef std::unique_ptr ResponsePtr; @@ -34,7 +26,8 @@ * The various response types (indicates what kind of content the response * will contain) */ - enum ResponseType { + enum ResponseType + { GENERIC = 0, XMLTV, RECORDS @@ -43,7 +36,8 @@ /** * The possible error codes a response can have */ - enum ErrorCode { + enum ErrorCode + { SUCCESS = 0, UNKNOWN_METHOD, GENERAL_ERROR, @@ -58,7 +52,8 @@ /** * Represents an error */ - struct Error { + struct Error + { ErrorCode code; std::string description; }; @@ -77,7 +72,7 @@ * Move constructor. It transfers the ownership of * the underlying XML document. */ - Response(Response &&other) + Response(Response&& other) { if (this != &other) m_document = std::move(other.m_document); @@ -87,31 +82,22 @@ * Parses the raw XML response * @param rawResponse The raw response. */ - void ParseRawResponse(const std::string &rawResponse); + void ParseRawResponse(const std::string& rawResponse); /** * @return whether the response was successful */ - bool IsSuccessful() const - { - return GetErrorCode() == ErrorCode::SUCCESS; - } + bool IsSuccessful() const { return GetErrorCode() == ErrorCode::SUCCESS; } /** * @return the error code */ - ErrorCode GetErrorCode() const - { - return m_error.code; - } + ErrorCode GetErrorCode() const { return m_error.code; } /** * @return the error description */ - std::string GetErrorDescription() const - { - return m_error.description; - } + std::string GetErrorDescription() const { return m_error.description; } /** * Returns the portion of the XML response that represents the actual @@ -121,17 +107,13 @@ virtual tinyxml2::XMLElement* GetReplyElement() const; protected: - /** * Returns the name of the element that represents the request status. The * element name varies slightly between different response types so it * may be overriden * @return the element name */ - virtual std::string GetStatusElementName() const - { - return "Status"; - } + virtual std::string GetStatusElementName() const { return "Status"; } /** * The underlying XML response document @@ -139,7 +121,6 @@ std::unique_ptr m_document; private: - /** * Parses the response status for possible errors */ @@ -160,10 +141,7 @@ virtual tinyxml2::XMLElement* GetReplyElement() const override; protected: - virtual std::string GetStatusElementName() const override - { - return "Error"; - } + virtual std::string GetStatusElementName() const override { return "Error"; } }; /** @@ -175,10 +153,7 @@ virtual tinyxml2::XMLElement* GetReplyElement() const override; protected: - virtual std::string GetStatusElementName() const override - { - return "Error"; - } + virtual std::string GetStatusElementName() const override { return "Error"; } }; - } -} + } // namespace response +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/SeriesRecording.cpp kodi-pvr-vbox-8.1.0/src/vbox/SeriesRecording.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/SeriesRecording.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/SeriesRecording.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,30 +1,17 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "SeriesRecording.h" using namespace vbox; -SeriesRecording::SeriesRecording(const std::string &channelId) - : m_id(0), m_scheduledId(0), m_channelId(channelId), m_fIsAuto(false), m_weekdays(0) +SeriesRecording::SeriesRecording(const std::string& channelId) + : m_id(0), m_scheduledId(0), m_channelId(channelId), m_fIsAuto(false), m_weekdays(0) { - } \ No newline at end of file diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/SeriesRecording.h kodi-pvr-vbox-8.1.0/src/vbox/SeriesRecording.h --- kodi-pvr-vbox-4.7.0/src/vbox/SeriesRecording.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/SeriesRecording.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,29 +1,19 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once -#include #include +#include -namespace vbox { +namespace vbox +{ class SeriesRecording; typedef std::unique_ptr SeriesRecordingPtr; @@ -34,21 +24,21 @@ class SeriesRecording { public: - SeriesRecording(const std::string &channelId); + SeriesRecording(const std::string& channelId); ~SeriesRecording() = default; - bool operator== (const SeriesRecording &other) + bool operator==(const SeriesRecording& other) { return m_id == other.m_id && - m_scheduledId == other.m_scheduledId && - m_channelId == other.m_channelId && - m_title == other.m_title && - m_description == other.m_description && - m_startTime == other.m_startTime && - m_endTime == other.m_endTime; + m_scheduledId == other.m_scheduledId && + m_channelId == other.m_channelId && + m_title == other.m_title && + m_description == other.m_description && + m_startTime == other.m_startTime && + m_endTime == other.m_endTime; } - bool operator!= (const SeriesRecording &other) + bool operator!=(const SeriesRecording& other) { return !(*this == other); } @@ -64,4 +54,4 @@ unsigned int m_weekdays; }; -} \ No newline at end of file +} // namespace vbox \ No newline at end of file diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/Settings.h kodi-pvr-vbox-8.1.0/src/vbox/Settings.h --- kodi-pvr-vbox-4.7.0/src/vbox/Settings.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/Settings.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,29 +1,19 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once -#include #include +#include -namespace vbox { +namespace vbox +{ enum ChannelOrder { @@ -74,23 +64,20 @@ /** * @return whether HTTPS should be used or not */ - bool UseHttps() const - { - return httpsPort > 0; - } + bool UseHttps() const { return httpsPort > 0; } }; /** * Represents the settings for this addon */ - class Settings { + class Settings + { public: ConnectionParameters m_internalConnectionParams; ConnectionParameters m_externalConnectionParams; ChannelOrder m_setChannelIdUsingOrder; - unsigned int m_remindMinsBeforeProg; bool m_skipInitialEpgLoad; bool m_timeshiftEnabled; std::string m_timeshiftBufferPath; }; -} \ No newline at end of file +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/SoftwareVersion.cpp kodi-pvr-vbox-8.1.0/src/vbox/SoftwareVersion.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/SoftwareVersion.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/SoftwareVersion.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,22 +1,10 @@ /* - * Copyright (C) 2015 Sam Stenvall - * - * 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 XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - * http://www.gnu.org/copyleft/gpl.html + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. */ #include "SoftwareVersion.h" @@ -26,11 +14,11 @@ std::string SoftwareVersion::GetString() const { return std::to_string(m_major) + "." + - std::to_string(m_minor) + "." + - std::to_string(m_revision); + std::to_string(m_minor) + "." + + std::to_string(m_revision); } -SoftwareVersion SoftwareVersion::ParseString(const std::string &string) +SoftwareVersion SoftwareVersion::ParseString(const std::string& string) { SoftwareVersion version; std::string format = "%d.%d.%d"; @@ -38,8 +26,7 @@ if (string.substr(0, 1) == "V") format = string.substr(0, 2) + ".%d.%d.%d"; - sscanf(string.c_str(), format.c_str(), &version.m_major, &version.m_minor, - &version.m_revision); + sscanf(string.c_str(), format.c_str(), &version.m_major, &version.m_minor, &version.m_revision); return version; } diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/SoftwareVersion.h kodi-pvr-vbox-8.1.0/src/vbox/SoftwareVersion.h --- kodi-pvr-vbox-4.7.0/src/vbox/SoftwareVersion.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/SoftwareVersion.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,24 +1,13 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once #include @@ -30,32 +19,31 @@ class SoftwareVersion { public: - - bool operator== (const SoftwareVersion &other) const + bool operator==(const SoftwareVersion& other) const { return m_major == other.m_major && - m_minor == other.m_minor && - m_revision == other.m_revision; + m_minor == other.m_minor && + m_revision == other.m_revision; } - bool operator> (const SoftwareVersion &other) const + bool operator>(const SoftwareVersion& other) const { return m_major > other.m_major || - m_minor > other.m_minor || - m_revision > other.m_revision; + m_minor > other.m_minor || + m_revision > other.m_revision; } - bool operator< (const SoftwareVersion &other) const + bool operator<(const SoftwareVersion& other) const { return !(*this > other) && !(*this == other); } - bool operator>= (const SoftwareVersion &other) const + bool operator>=(const SoftwareVersion& other) const { return !(*this < other); } - bool operator<= (const SoftwareVersion &other) const + bool operator<=(const SoftwareVersion& other) const { return !(*this > other); } @@ -69,11 +57,11 @@ * @return a SoftwareVersion object representing the specified version * string. The version string should either be e.g. "2.46.20" or "VB.2.46.20" */ - static SoftwareVersion ParseString(const std::string &string); + static SoftwareVersion ParseString(const std::string& string); private: unsigned int m_major = 0; unsigned int m_minor = 0; unsigned int m_revision = 0; }; -} +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/StartupStateHandler.cpp kodi-pvr-vbox-8.1.0/src/vbox/StartupStateHandler.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/StartupStateHandler.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/StartupStateHandler.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,23 +1,11 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "StartupStateHandler.h" diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/StartupStateHandler.h kodi-pvr-vbox-8.1.0/src/vbox/StartupStateHandler.h --- kodi-pvr-vbox-4.7.0/src/vbox/StartupStateHandler.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/StartupStateHandler.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,35 +1,26 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once #include -#include #include +#include -namespace vbox { +namespace vbox +{ /** * The various startup states the addon can be in */ - enum StartupState { + enum StartupState + { UNINITIALIZED, INITIALIZED, CHANNELS_LOADED, @@ -46,13 +37,11 @@ class StartupStateHandler { public: - /** * Initializes the handler. The state is set to UNINITIALIZED by default. */ - StartupStateHandler() - : m_state(StartupState::UNINITIALIZED) { } - ~StartupStateHandler() {}; + StartupStateHandler() : m_state(StartupState::UNINITIALIZED) {} + ~StartupStateHandler(){}; /** * Waits for the specified state. @@ -66,10 +55,10 @@ // Wait for the state to change m_condition.wait_for(lock, std::chrono::seconds(STATE_WAIT_TIMEOUT), - [this, state]() - { - return m_state >= state; - }); + [this, state]() + { + return m_state >= state; + }); return m_state >= state; } @@ -100,7 +89,6 @@ } private: - /** * The maximum amount of seconds to block while waiting for a state * change @@ -122,4 +110,4 @@ */ mutable std::condition_variable m_condition; }; -} +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/Utilities.h kodi-pvr-vbox-8.1.0/src/vbox/Utilities.h --- kodi-pvr-vbox-4.7.0/src/vbox/Utilities.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/Utilities.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,30 +1,21 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once #include #include -#include "../client.h" -namespace utilities { +#include + +namespace utilities +{ /** * Compares two containers for equality based on the equality of their @@ -32,16 +23,15 @@ * pointers). */ template - bool deref_equals(const Container& left, const Container &right) + bool deref_equals(const Container& left, const Container& right) { - return !(left.size() != right.size() || !std::equal( - left.begin(), - left.end(), - right.begin(), - [](const typename Container::value_type &leftItem, const typename Container::value_type &rightItem) - { - return *leftItem == *rightItem; - })); + return !(left.size() != right.size() || + !std::equal(left.begin(), left.end(), right.begin(), + [](const typename Container::value_type& leftItem, + const typename Container::value_type& rightItem) + { + return *leftItem == *rightItem; + })); } /** @@ -50,7 +40,7 @@ * @param fileHandle the file handle * @return the contents (unique pointer) */ - inline std::unique_ptr ReadFileContents(void *fileHandle) + inline std::unique_ptr ReadFileContents(kodi::vfs::CFile& fileHandle) { std::unique_ptr content(new std::string()); @@ -58,9 +48,9 @@ int bytesRead = 0; // Read until EOF or explicit error - while ((bytesRead = XBMC->ReadFile(fileHandle, buffer, sizeof(buffer) - 1)) > 0) + while ((bytesRead = fileHandle.Read(buffer, sizeof(buffer) - 1)) > 0) content->append(buffer, bytesRead); return content; } -} +} // namespace utilities diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/VBox.cpp kodi-pvr-vbox-8.1.0/src/vbox/VBox.cpp --- kodi-pvr-vbox-4.7.0/src/vbox/VBox.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/VBox.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,53 +1,45 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "VBox.h" -#include -#include -#include -#include -#include "p8-platform/util/timeutils.h" -#include "../client.h" + +#include "../xmltv/Utilities.h" #include "ContentIdentifier.h" #include "Exceptions.h" #include "Utilities.h" -#include "response/Factory.h" -#include "request/Request.h" #include "request/ApiRequest.h" #include "request/FileRequest.h" +#include "request/Request.h" #include "response/Content.h" -#include "../xmltv/Utilities.h" +#include "response/Factory.h" + +#include +#include +#include +#include + +#include -using namespace ADDON; using namespace vbox; -const char * VBox::MINIMUM_SOFTWARE_VERSION = "2.48"; +const char* VBox::MINIMUM_SOFTWARE_VERSION = "2.48"; const time_t STREAMING_STATUS_UPDATE_INTERVAL = 10; const int CHANNELS_PER_CHANNELBATCH = 100; const int CHANNELS_PER_EPGBATCH = 10; const size_t VBOX_LOG_BUFFER = 16384; -VBox::VBox(const Settings &settings) - : m_settings(settings), m_currentChannel(nullptr), m_categoryGenreMapper(nullptr), m_shouldSyncEpg(false), m_reminderManager(nullptr), - m_lastStreamStatus({ChannelStreamingStatus(), time(nullptr)}) +VBox::VBox(const Settings& settings) + : m_settings(settings), + m_currentChannel(nullptr), + m_categoryGenreMapper(nullptr), + m_shouldSyncEpg(false), + m_lastStreamStatus({ChannelStreamingStatus(), time(nullptr)}) { } @@ -66,12 +58,12 @@ DetermineConnectionParams(); // Query the software version, we need a few elements from that response - request::ApiRequest versionRequest("QuerySwVersion"); + request::ApiRequest versionRequest("QuerySwVersion", GetConnectionParams().hostname, GetConnectionParams().upnpPort); response::ResponsePtr response = PerformRequest(versionRequest); response::Content versionContent(response->GetReplyElement()); // Query the board info, we need some elements from that as well - request::ApiRequest boardRequest("QueryBoardInfo"); + request::ApiRequest boardRequest("QueryBoardInfo", GetConnectionParams().hostname, GetConnectionParams().upnpPort); response::ResponsePtr boardResponse = PerformRequest(boardRequest); response::Content boardInfo(boardResponse->GetReplyElement()); @@ -80,14 +72,14 @@ model += " " + versionContent.GetString("DeviceType"); // e.g. XTI model += " " + boardInfo.GetString("ProductNumber"); // e.g. 3352 - Log(LOG_INFO, "device information: "); - Log(LOG_INFO, std::string(" model: " + model).c_str()); - Log(LOG_INFO, std::string(" hardware revision: " + boardInfo.GetString("HWRev")).c_str()); - Log(LOG_INFO, std::string(" firmware revision: " + boardInfo.GetString("FWRev")).c_str()); - Log(LOG_INFO, std::string(" uboot version: " + boardInfo.GetString("UbootVersion")).c_str()); - Log(LOG_INFO, std::string(" kernel version: " + boardInfo.GetString("KernelVersion")).c_str()); - Log(LOG_INFO, std::string(" software version: " + boardInfo.GetString("SoftwareVersion")).c_str()); - Log(LOG_INFO, std::string(" number of tuners: " + std::to_string(boardInfo.GetInteger("TunersNumber"))).c_str()); + kodi::Log(ADDON_LOG_INFO, "device information: "); + kodi::Log(ADDON_LOG_INFO, std::string(" model: " + model).c_str()); + kodi::Log(ADDON_LOG_INFO, std::string(" hardware revision: " + boardInfo.GetString("HWRev")).c_str()); + kodi::Log(ADDON_LOG_INFO, std::string(" firmware revision: " + boardInfo.GetString("FWRev")).c_str()); + kodi::Log(ADDON_LOG_INFO, std::string(" uboot version: " + boardInfo.GetString("UbootVersion")).c_str()); + kodi::Log(ADDON_LOG_INFO, std::string(" kernel version: " + boardInfo.GetString("KernelVersion")).c_str()); + kodi::Log(ADDON_LOG_INFO, std::string(" software version: " + boardInfo.GetString("SoftwareVersion")).c_str()); + kodi::Log(ADDON_LOG_INFO, std::string(" number of tuners: " + std::to_string(boardInfo.GetInteger("TunersNumber"))).c_str()); // Construct backend information m_backendInformation.name = model; @@ -96,16 +88,16 @@ // Check that the backend uses a compatible software version if (m_backendInformation.version < SoftwareVersion::ParseString(MINIMUM_SOFTWARE_VERSION)) { - std::string error = std::string("Firmware version ") + - MINIMUM_SOFTWARE_VERSION + " or higher is required"; + std::string error = std::string("Firmware version ") + MINIMUM_SOFTWARE_VERSION + " or higher is required"; throw FirmwareVersionException(error); } // Query external media status. The request will error if no external media // is attached - try { - request::ApiRequest mediaRequest("QueryExternalMediaStatus"); + try + { + request::ApiRequest mediaRequest("QueryExternalMediaStatus", GetConnectionParams().hostname, GetConnectionParams().upnpPort); response::ResponsePtr mediaResponse = PerformRequest(mediaRequest); response::Content mediaStatus = response::Content(mediaResponse->GetReplyElement()); @@ -116,13 +108,13 @@ m_backendInformation.externalMediaStatus = externalMediaStatus; } - catch (VBoxException &e) + catch (VBoxException& e) { LogException(e); } // Query the timezone offset used - request::ApiRequest timezoneRequest("QuerySystemTime"); + request::ApiRequest timezoneRequest("QuerySystemTime", GetConnectionParams().hostname, GetConnectionParams().upnpPort); timezoneRequest.AddParameter("TimeFormat", "XMLTV"); response::ResponsePtr timezoneResponse = PerformRequest(timezoneRequest); response::Content timezoneInfo(timezoneResponse->GetReplyElement()); @@ -133,7 +125,7 @@ // Consider the addon initialized m_stateHandler.EnterState(StartupState::INITIALIZED); - g_skippingInitialEpgLoad = m_settings.m_skipInitialEpgLoad; + m_skippingInitialEpgLoad = m_settings.m_skipInitialEpgLoad; RetrieveChannels(false); { @@ -155,8 +147,9 @@ // Attempt to perform a request using the internal connection parameters m_currentConnectionParameters = m_settings.m_internalConnectionParams; - try { - request::ApiRequest request("QuerySwVersion"); + try + { + request::ApiRequest request("QuerySwVersion", GetConnectionParams().hostname, GetConnectionParams().upnpPort); request.SetTimeout(m_currentConnectionParameters.timeout); PerformRequest(request); } @@ -165,28 +158,28 @@ // Retry the request with the external parameters if (m_settings.m_externalConnectionParams.AreValid()) { - Log(LOG_INFO, "Unable to connect using internal connection settings, trying with external"); + kodi::Log(ADDON_LOG_INFO, "Unable to connect using internal connection settings, trying with external"); m_currentConnectionParameters = m_settings.m_externalConnectionParams; - request::ApiRequest request("QuerySwVersion"); + request::ApiRequest request("QuerySwVersion", GetConnectionParams().hostname, GetConnectionParams().upnpPort); request.SetTimeout(m_currentConnectionParameters.timeout); PerformRequest(request); } } - auto ¶ms = m_currentConnectionParameters; - Log(LOG_INFO, "Connection parameters used: "); - Log(LOG_INFO, " Hostname: %s", params.hostname.c_str()); + auto& params = m_currentConnectionParameters; + kodi::Log(ADDON_LOG_INFO, "Connection parameters used: "); + kodi::Log(ADDON_LOG_INFO, " Hostname: %s", params.hostname.c_str()); if (params.UseHttps()) - Log(LOG_INFO, " HTTPS port: %d", params.httpsPort); + kodi::Log(ADDON_LOG_INFO, " HTTPS port: %d", params.httpsPort); else - Log(LOG_INFO, " HTTP port: %d", params.httpPort); + kodi::Log(ADDON_LOG_INFO, " HTTP port: %d", params.httpPort); - Log(LOG_INFO, " UPnP port: %d", params.upnpPort); + kodi::Log(ADDON_LOG_INFO, " UPnP port: %d", params.upnpPort); } -void VBox::InitScanningEPG(std::string &rScanMethod, std::string &rGetStatusMethod, std::string &rfIsScanningFlag) +void VBox::InitScanningEPG(std::string& rScanMethod, std::string& rGetStatusMethod, std::string& rfIsScanningFlag) { // determine wether the device is in External XMLTV mode (internal, not through Kodi definitions) SendScanEPG(rScanMethod); @@ -213,62 +206,29 @@ switch (m_epgScanState) { - case EPGSCAN_SHOULD_SCAN: - // find the correct methods for the guide's External XMLTV / Live Signal mode - InitScanningEPG(scanEpgMethod, epgStatusCheckMethod, epgStatusCheckFlag); - case EPGSCAN_SCANNING: - case EPGSCAN_FINISHED: - if (fRetrieveGuide) - { - // check for EPG detection state - GetEpgDetectionState(epgStatusCheckMethod, epgStatusCheckFlag); - // retrieve guide periodically (or when finished) - RetrieveGuide(); - // if done detecting EPG - change flag to false - if (m_epgScanState == EPGSCAN_FINISHED) + case EPGSCAN_SHOULD_SCAN: + // find the correct methods for the guide's External XMLTV / Live Signal mode + InitScanningEPG(scanEpgMethod, epgStatusCheckMethod, epgStatusCheckFlag); + case EPGSCAN_SCANNING: + case EPGSCAN_FINISHED: + if (fRetrieveGuide) { - XBMC->QueueNotification(ADDON::QUEUE_INFO, "EPG scanned and synced with guide"); - m_epgScanState = EPGSCAN_NO_SCAN; + // check for EPG detection state + GetEpgDetectionState(epgStatusCheckMethod, epgStatusCheckFlag); + // retrieve guide periodically (or when finished) + RetrieveGuide(); + // if done detecting EPG - change flag to false + if (m_epgScanState == EPGSCAN_FINISHED) + { + kodi::QueueNotification(QUEUE_INFO, "", "EPG scanned and synced with guide"); + m_epgScanState = EPGSCAN_NO_SCAN; + } } - } - case EPGSCAN_NO_SCAN: - break; + case EPGSCAN_NO_SCAN: + break; } } -void VBox::RetrieveReminders() -{ - // Abort if we're already initialized - if (!m_reminderManager) - { - Log(LOG_INFO, "Loading reminders manager"); - - m_reminderManager = ReminderManagerPtr(new ReminderManager()); - - try { - m_reminderManager->Initialize(); - } - catch (VBoxException &e) - { - LogException(e); - Log(LOG_INFO, "Failed to load the reminders XML"); - return; - } - } - m_reminderManager->Load(); -} - -ReminderPtr VBox::GetActiveReminder() -{ - // check if reminder needed now - return m_reminderManager->GetReminderToPop(time(nullptr)); -} - -void VBox::DisplayReminder(const ReminderPtr &reminder) -{ - GUI->Dialog_OK_ShowAndGetInput("Program reminder", std::string(reminder->GetReminderText()).c_str()); -} - void VBox::BackgroundUpdater() { // Keep count of how many times the loop has run so we can perform some @@ -278,7 +238,6 @@ // Retrieve everything in order once before starting the loop, without // triggering the event handlers RetrieveChannels(false); - RetrieveReminders(); InitializeGenreMapper(); RetrieveRecordings(false); @@ -294,7 +253,7 @@ std::this_thread::sleep_for(std::chrono::milliseconds(INITIAL_EPG_STEP_SECS * 1000)); } - g_skippingInitialEpgLoad = false; + m_skippingInitialEpgLoad = false; // Whether or not initial EPG updates occurred now Trigger "Real" EPG updates // This will regard Initial EPG as completed anyway. @@ -302,14 +261,6 @@ while (m_active) { - // check for reminders each iteration - ReminderPtr reminder = GetActiveReminder(); - if (reminder) - { - DisplayReminder(reminder); - m_reminderManager->DeleteNextReminder(); - } - // Update recordings every 12 iterations = 1 minute if (lapCounter % 12 == 0) RetrieveRecordings(); @@ -318,7 +269,7 @@ if (lapCounter % 6 == 0) RetrieveChannels(); - // if supposed to scan EPG - send scan API and get guide every 5 minutes, until done scanning + // if supposed to scan EPG - send scan API and get guide every 5 minutes, until done scanning if (m_epgScanState != EPGSCAN_NO_SCAN) UpdateEpgScan(lapCounter % (12 * 5) == 0); // one-time guide retrieval (from PVR manager settings) @@ -332,13 +283,14 @@ RetrieveGuide(); lapCounter++; - usleep(5000 * 1000); // for some infinitely retarded reason, std::thread::sleep_for doesn't work + std::this_thread::sleep_for(std::chrono::milliseconds(5000)); } } bool VBox::IsInitialEpgSkippingCompleted() { - Log(LOG_DEBUG, "%s Waiting to Get Initial EPG for %d remaining channels", __FUNCTION__, m_unskippedInitialEpgChannelsMap.size()); + kodi::Log(ADDON_LOG_DEBUG, "%s Waiting to Get Initial EPG for %d remaining channels", __FUNCTION__, + m_unskippedInitialEpgChannelsMap.size()); return m_unskippedInitialEpgChannelsMap.size() == 0; } @@ -352,7 +304,8 @@ //We want to trigger full updates only so let's make sure it's not an initialEpg m_unskippedInitialEpgChannelsMap.erase(channel->m_uniqueId); - Log(LOG_DEBUG, "%s - Trigger EPG update for channel: %s (%s)", __FUNCTION__, channel->m_name.c_str(), channel->m_uniqueId.c_str()); + kodi::Log(ADDON_LOG_DEBUG, "%s - Trigger EPG update for channel: %s (%s)", __FUNCTION__, channel->m_name.c_str(), + channel->m_uniqueId.c_str()); } } @@ -361,7 +314,7 @@ void VBox::MarkChannelAsInitialEpgSkipped(unsigned int channelUid) { - const ChannelPtr channelPtr = g_vbox->GetChannel(channelUid); + const ChannelPtr channelPtr = GetChannel(channelUid); m_unskippedInitialEpgChannelsMap.erase(channelPtr->m_uniqueId); } @@ -373,7 +326,8 @@ return false; // Check timeshift settings - if (m_settings.m_timeshiftEnabled && !XBMC->CanOpenDirectory(m_settings.m_timeshiftBufferPath.c_str())) + std::vector items; + if (m_settings.m_timeshiftEnabled && !kodi::vfs::GetDirectory(m_settings.m_timeshiftBufferPath, "", items)) return false; return true; @@ -444,9 +398,11 @@ m_stateHandler.WaitForState(StartupState::CHANNELS_LOADED); std::unique_lock lock(m_mutex); - auto it = std::find_if(m_channels.cbegin(), m_channels.cend(), [uniqueId](const ChannelPtr &channel) { - return uniqueId == ContentIdentifier::GetUniqueId(channel); - }); + auto it = std::find_if(m_channels.cbegin(), m_channels.cend(), + [uniqueId](const ChannelPtr& channel) { + return uniqueId == ContentIdentifier::GetUniqueId(channel); + } + ); if (it == m_channels.cend()) return nullptr; @@ -459,50 +415,11 @@ return m_currentChannel; } -void VBox::SetCurrentChannel(const ChannelPtr &channel) +void VBox::SetCurrentChannel(const ChannelPtr& channel) { m_currentChannel = channel; } -bool VBox::AddReminder(const ChannelPtr &channel, const ::xmltv::ProgrammePtr &programme) -{ - return m_reminderManager->AddReminder(channel, programme, m_settings.m_remindMinsBeforeProg); -} - -bool VBox::AddReminder(const ChannelPtr &channel, time_t startTime, std::string &progName) -{ - return m_reminderManager->AddReminder(channel, startTime, progName, m_settings.m_remindMinsBeforeProg); -} - -bool VBox::DeleteChannelReminders(const ChannelPtr &channel) -{ - return m_reminderManager->DeleteChannelReminders(channel); -} - -bool VBox::DeleteProgramReminders(unsigned int epgUid) -{ - return m_reminderManager->DeleteProgramReminders(epgUid); -} - -const ChannelPtr VBox::FindChannelForEPGReminder(int epgUid) -{ - const xmltv::ProgrammePtr programme = nullptr; - const std::vector &channels = g_vbox->GetChannels(); - - // Find channel that contains this programme - const std::vector::const_iterator it = std::find_if(channels.cbegin(), channels.cend(), - [&epgUid](const ChannelPtr &channel) - { - const Schedule schedule = g_vbox->GetSchedule(channel); - const xmltv::ProgrammePtr programme = (schedule.schedule) ? schedule.schedule->GetProgramme(epgUid) : nullptr; - return (programme); - }); - // Find the channel's schedule - if (it == channels.cend()) - XBMC->QueueNotification(QUEUE_WARNING, "Reminder could not find the requested channel"); - return *it; -} - void VBox::StartEPGScan() { m_epgScanState = EPGSCAN_SHOULD_SCAN; @@ -513,32 +430,32 @@ m_shouldSyncEpg = true; } -void VBox::SendScanEPG(std::string &rEpgDetectionCheckMethod) const +void VBox::SendScanEPG(std::string& rEpgDetectionCheckMethod) const { // call method to send EPG detection command - request::ApiRequest request(rEpgDetectionCheckMethod); + request::ApiRequest request(rEpgDetectionCheckMethod, GetConnectionParams().hostname, GetConnectionParams().upnpPort); request.AddParameter("ChannelID", "All"); response::ResponsePtr response = PerformRequest(request); response::Content content(response->GetReplyElement()); } -void VBox::GetEpgDetectionState(std::string &methodName, std::string &flagName) +void VBox::GetEpgDetectionState(std::string& methodName, std::string& flagName) { // call method to check EPG detection status - request::ApiRequest request(methodName); + request::ApiRequest request(methodName, GetConnectionParams().hostname, GetConnectionParams().upnpPort); response::ResponsePtr response = PerformRequest(request); response::Content content(response->GetReplyElement()); // set flag using a YES/NO flag std::string isInlDetection = content.GetString(flagName); - m_epgScanState = (isInlDetection == "YES")? EPGSCAN_SCANNING : EPGSCAN_FINISHED; + m_epgScanState = (isInlDetection == "YES") ? EPGSCAN_SCANNING : EPGSCAN_FINISHED; } -void VBox::SetChannelStreamingStatus(const ChannelPtr &channel) +void VBox::SetChannelStreamingStatus(const ChannelPtr& channel) { ChannelStreamingStatus status; - request::ApiRequest request("QueryChannelStreamingStatus"); + request::ApiRequest request("QueryChannelStreamingStatus", GetConnectionParams().hostname, GetConnectionParams().upnpPort); request.AddParameter("ChannelID", channel->m_xmltvName); response::ResponsePtr response = PerformRequest(request); response::Content content(response->GetReplyElement()); @@ -565,7 +482,7 @@ m_lastStreamStatus.m_timestamp = time(nullptr); } -ChannelStreamingStatus VBox::GetChannelStreamingStatus(const ChannelPtr &channel) +ChannelStreamingStatus VBox::GetChannelStreamingStatus(const ChannelPtr& channel) { time_t lastUpdateTime = m_lastStreamStatus.m_timestamp; time_t currTime(time(nullptr)); @@ -596,15 +513,14 @@ m_stateHandler.WaitForState(StartupState::RECORDINGS_LOADED); std::unique_lock lock(m_mutex); - return std::count_if(m_recordings.begin(), m_recordings.end(), [](const RecordingPtr &recording) { - return recording->IsRecording(); - }); + return std::count_if(m_recordings.begin(), m_recordings.end(), + [](const RecordingPtr& recording) { return recording->IsRecording(); }); } -request::ApiRequest VBox::CreateDeleteRecordingRequest(const RecordingPtr &recording) const +request::ApiRequest VBox::CreateDeleteRecordingRequest(const RecordingPtr& recording) const { RecordingState state = recording->GetState(); - unsigned int idToDelete = (recording->m_seriesId > 0)? recording->m_seriesId : recording->m_id; + unsigned int idToDelete = (recording->m_seriesId > 0) ? recording->m_seriesId : recording->m_id; // Determine the request method to use. If a recording is active we want to // cancel it instead of deleting it @@ -614,7 +530,7 @@ requestMethod = "CancelRecord"; // Create the request - request::ApiRequest request(requestMethod); + request::ApiRequest request(requestMethod, GetConnectionParams().hostname, GetConnectionParams().upnpPort); // Determine request parameters request.AddParameter("RecordID", idToDelete); @@ -624,15 +540,15 @@ return request; } -request::ApiRequest VBox::CreateDeleteSeriesRequest(const SeriesRecordingPtr &series) const +request::ApiRequest VBox::CreateDeleteSeriesRequest(const SeriesRecordingPtr& series) const { - Log(LOG_DEBUG, "Removing series with ID %d", series->m_id); + kodi::Log(ADDON_LOG_DEBUG, "Removing series with ID %d", series->m_id); // For a series, CancelRecord cancels next episodes, and if there's a current // episode being recorded, it is stopped std::string requestMethod = "CancelRecord"; // Create the request - request::ApiRequest request(requestMethod); + request::ApiRequest request(requestMethod, GetConnectionParams().hostname, GetConnectionParams().upnpPort); // Determine request parameters request.AddParameter("RecordID", series->m_id); @@ -646,13 +562,10 @@ std::unique_lock lock(m_mutex); // The request fails if the item doesn't exist - try { + try + { // Find the recording/timer - look for a single recording - auto it = std::find_if(m_recordings.begin(), m_recordings.end(), - [id](const RecordingPtr &recording) - { - return id == recording->m_id; - }); + auto it = std::find_if(m_recordings.begin(), m_recordings.end(), [id](const RecordingPtr& recording) { return id == recording->m_id; }); // if it matches a single recording - create and send delete request for recording if (it != m_recordings.cend()) @@ -666,11 +579,7 @@ else { // look for a series with that ID and throw exception if not found - auto seriesItr = std::find_if(m_series.begin(), m_series.end(), - [id](const SeriesRecordingPtr &series) - { - return id == series->m_id; - }); + auto seriesItr = std::find_if(m_series.begin(), m_series.end(), [id](const SeriesRecordingPtr& series) { return id == series->m_id; }); if (seriesItr != m_series.end()) { // create and send cancel request for that series recording @@ -691,7 +600,7 @@ return true; } - catch (VBoxException &e) + catch (VBoxException& e) { LogException(e); } @@ -701,11 +610,10 @@ const RecordingMargins VBox::GetRecordingMargins(bool fBackendSingleMargin) const { - RecordingMargins margins; + RecordingMargins margins = {0}; - memset(&margins, 0, sizeof(margins)); // get recording margins - request::ApiRequest request("GetRecordingsTimeOffset"); + request::ApiRequest request("GetRecordingsTimeOffset", GetConnectionParams().hostname, GetConnectionParams().upnpPort); response::ResponsePtr response = PerformRequest(request); response::Content content(response->GetReplyElement()); @@ -722,13 +630,14 @@ margins.m_beforeMargin = content.GetUnsignedInteger("MinutesPaddingBefore"); margins.m_afterMargin = content.GetUnsignedInteger("MinutesPaddingAfter"); } - Log(LOG_DEBUG, "GetRecordingMargins(): Current recording margins: %u and %u", margins.m_beforeMargin, margins.m_afterMargin); + kodi::Log(ADDON_LOG_DEBUG, "GetRecordingMargins(): Current recording margins: %u and %u", margins.m_beforeMargin, + margins.m_afterMargin); return margins; } void VBox::SetRecordingMargins(RecordingMargins margins, bool fBackendSingleMargin) { - request::ApiRequest request("SetRecordingsTimeOffset"); + request::ApiRequest request("SetRecordingsTimeOffset", GetConnectionParams().hostname, GetConnectionParams().upnpPort); // If version < 2.57, there is a single margin (for both before & after the program). // In that case, set either margin (they're the same) @@ -748,7 +657,7 @@ void VBox::UpdateRecordingMargins(RecordingMargins defaultMargins) { // get version from backend - SoftwareVersion version(SoftwareVersion::ParseString(m_backendInformation.version.GetString()) ); + SoftwareVersion version(SoftwareVersion::ParseString(m_backendInformation.version.GetString())); RecordingMargins updatedMargins; bool fBackendSingleMargin = true; @@ -771,13 +680,13 @@ // set the updated margins in backend, if different from the current ones if (updatedMargins != currMargins) - g_vbox->SetRecordingMargins(updatedMargins, fBackendSingleMargin); + SetRecordingMargins(updatedMargins, fBackendSingleMargin); } -void VBox::AddTimer(const ChannelPtr &channel, const ::xmltv::ProgrammePtr programme) +void VBox::AddTimer(const ChannelPtr& channel, const ::xmltv::ProgrammePtr programme) { // Add the timer - request::ApiRequest request("ScheduleProgramRecord"); + request::ApiRequest request("ScheduleProgramRecord", GetConnectionParams().hostname, GetConnectionParams().upnpPort); request.AddParameter("ChannelID", channel->m_xmltvName); request.AddParameter("ProgramTitle", programme->m_title); request.AddParameter("StartTime", programme->m_startTime); @@ -788,7 +697,7 @@ } -static void AddWeekdays(request::ApiRequest &rRequest, const unsigned int weekdays) +static void AddWeekdays(request::ApiRequest& rRequest, const unsigned int weekdays) { if (weekdays & PVR_WEEKDAY_SUNDAY) { @@ -820,12 +729,12 @@ } } -void VBox::AddSeriesTimer(const ChannelPtr &channel, const ::xmltv::ProgrammePtr programme) +void VBox::AddSeriesTimer(const ChannelPtr& channel, const ::xmltv::ProgrammePtr programme) { - Log(LOG_DEBUG, "Series timer for channel %s, program %s", channel->m_name.c_str(), programme->m_title.c_str()); + kodi::Log(ADDON_LOG_DEBUG, "Series timer for channel %s, program %s", channel->m_name.c_str(), programme->m_title.c_str()); // Add the timer - request::ApiRequest request("ScheduleProgramRecord"); + request::ApiRequest request("ScheduleProgramRecord", GetConnectionParams().hostname, GetConnectionParams().upnpPort); request.AddParameter("ChannelID", channel->m_xmltvName); request.AddParameter("ProgramTitle", programme->m_title); request.AddParameter("StartTime", programme->m_startTime); @@ -836,12 +745,12 @@ RetrieveRecordings(); } -void VBox::AddTimer(const ChannelPtr &channel, time_t startTime, time_t endTime, - const std::string title, const std::string description) +void VBox::AddTimer(const ChannelPtr& channel, time_t startTime, time_t endTime, + const std::string title, const std::string description) { - Log(LOG_DEBUG, "Adding Manual timer for channel %s", channel->m_name.c_str()); + kodi::Log(ADDON_LOG_DEBUG, "Adding Manual timer for channel %s", channel->m_name.c_str()); // Add the timer - request::ApiRequest request("ScheduleChannelRecord"); + request::ApiRequest request("ScheduleChannelRecord", GetConnectionParams().hostname, GetConnectionParams().upnpPort); request.AddParameter("ChannelID", channel->m_xmltvName); request.AddParameter("StartTime", CreateTimestamp(startTime)); request.AddParameter("EndTime", CreateTimestamp(endTime)); @@ -856,12 +765,16 @@ } // implement timer with rule for manually defined series -void VBox::AddTimer(const ChannelPtr &channel, time_t startTime, time_t endTime, - const std::string title, const std::string description, const unsigned int weekdays) +void VBox::AddTimer(const ChannelPtr& channel, + time_t startTime, + time_t endTime, + const std::string title, + const std::string description, + const unsigned int weekdays) { - Log(LOG_DEBUG, "Manual series timer for channel %s, weekdays = 0x%x", channel->m_name.c_str(), weekdays); + kodi::Log(ADDON_LOG_DEBUG, "Manual series timer for channel %s, weekdays = 0x%x", channel->m_name.c_str(), weekdays); // Add the timer - request::ApiRequest request("ScheduleChannelRecord"); + request::ApiRequest request("ScheduleChannelRecord", GetConnectionParams().hostname, GetConnectionParams().upnpPort); request.AddParameter("ChannelID", channel->m_xmltvName); request.AddParameter("Periodic", "YES"); request.AddParameter("FromTime", CreateDailyTime(startTime)); @@ -882,9 +795,8 @@ m_stateHandler.WaitForState(StartupState::RECORDINGS_LOADED); std::unique_lock lock(m_mutex); - int count = std::count_if(m_recordings.begin(), m_recordings.end(), [](const RecordingPtr &recording) { - return recording->IsTimer(); - }); + int count = std::count_if(m_recordings.begin(), m_recordings.end(), + [](const RecordingPtr& recording) { return recording->IsTimer(); }); count += m_series.size(); return count; } @@ -906,7 +818,7 @@ return m_series; } -const Schedule VBox::GetSchedule(const ChannelPtr &channel) const +const Schedule VBox::GetSchedule(const ChannelPtr& channel) const { // Load the schedule from the internal guide m_stateHandler.WaitForState(StartupState::GUIDE_LOADED); @@ -942,18 +854,19 @@ return ::xmltv::Utilities::UnixTimeToDailyTime(unixTimestamp, tzOffset); } -unsigned int VBox::GetDBVersion(std::string &versionName) const +unsigned int VBox::GetDBVersion(std::string& versionName) const { // get the backend's database version - request::ApiRequest request("QueryDataBaseVersion"); + request::ApiRequest request("QueryDataBaseVersion", GetConnectionParams().hostname, GetConnectionParams().upnpPort); response::ResponsePtr response = PerformRequest(request); response::Content content(response->GetReplyElement()); return content.GetUnsignedInteger(versionName); } -void VBox::RetrieveChannels(bool triggerEvent/* = true*/) +void VBox::RetrieveChannels(bool triggerEvent /* = true*/) { - try { + try + { std::string channelsDBVerName("ChannelsDataBaseVersion"); unsigned int newDBversion = GetDBVersion(channelsDBVerName); // if same as last fetched channels, no need for fetching again @@ -963,7 +876,7 @@ int lastChannelIndex; { - request::ApiRequest request("QueryXmltvNumOfChannels"); + request::ApiRequest request("QueryXmltvNumOfChannels", GetConnectionParams().hostname, GetConnectionParams().upnpPort); response::ResponsePtr response = PerformRequest(request); response::Content content(response->GetReplyElement()); @@ -981,12 +894,12 @@ if (!m_active) return; - int toIndex = std::min(fromIndex + (CHANNELS_PER_CHANNELBATCH - 1) , lastChannelIndex); + int toIndex = std::min(fromIndex + (CHANNELS_PER_CHANNELBATCH - 1), lastChannelIndex); // Swallow exceptions, we don't want channel loading to fail just because // one request failed try { - request::ApiRequest request("GetXmltvChannelsList"); + request::ApiRequest request("GetXmltvChannelsList", GetConnectionParams().hostname, GetConnectionParams().upnpPort); request.AddParameter("FromChIndex", fromIndex); request.AddParameter("ToChIndex", toIndex); response::ResponsePtr response = PerformRequest(request); @@ -996,7 +909,7 @@ // Add the batch to all channels allChannels.insert(allChannels.end(), channels.begin(), channels.end()); } - catch (VBoxException &e) + catch (VBoxException& e) { LogException(e); } @@ -1007,14 +920,14 @@ { std::unique_lock lock(m_mutex); m_channels = allChannels; - Log(LOG_INFO, "Channels database version updated to %u", newDBversion); + kodi::Log(ADDON_LOG_INFO, "Channels database version updated to %u", newDBversion); m_channelsDBVersion = newDBversion; if (triggerEvent) OnChannelsUpdated(); } } - catch (VBoxException &e) + catch (VBoxException& e) { LogException(e); return; @@ -1024,13 +937,14 @@ m_stateHandler.EnterState(StartupState::CHANNELS_LOADED); } -void VBox::RetrieveRecordings(bool triggerEvent/* = true*/) +void VBox::RetrieveRecordings(bool triggerEvent /* = true*/) { // Only attempt to retrieve recordings when external media is present if (m_backendInformation.externalMediaStatus.present) { - try { - request::ApiRequest request("GetRecordsList"); + try + { + request::ApiRequest request("GetRecordsList", GetConnectionParams().hostname, GetConnectionParams().upnpPort); request.AddParameter("Externals", "YES"); response::ResponsePtr response = PerformRequest(request); response::RecordingResponseContent content(response->GetReplyElement()); @@ -1052,7 +966,7 @@ } } } - catch (VBoxException &e) + catch (VBoxException& e) { // Intentionally don't return, the request fails if there are no // recordings (which is technically not an error) @@ -1064,11 +978,12 @@ m_stateHandler.EnterState(StartupState::RECORDINGS_LOADED); } -void VBox::RetrieveGuide(bool triggerEvent/* = true*/) +void VBox::RetrieveGuide(bool triggerEvent /* = true*/) { - Log(LOG_INFO, "Fetching guide data from backend (this will take a while)"); + kodi::Log(ADDON_LOG_INFO, "Fetching guide data from backend (this will take a while)"); - try { + try + { std::string progsDBVerName("ProgramsDataBaseVersion"); unsigned int newDBversion = GetDBVersion(progsDBVerName); @@ -1099,7 +1014,7 @@ // one request failed try { - request::ApiRequest request("GetXmltvSection"); + request::ApiRequest request("GetXmltvSection", GetConnectionParams().hostname, GetConnectionParams().upnpPort); request.AddParameter("FromChIndex", fromIndex); request.AddParameter("ToChIndex", toIndex); response::ResponsePtr response = PerformRequest(request); @@ -1108,7 +1023,7 @@ auto partialGuide = content.GetGuide(); guide += partialGuide; } - catch (VBoxException &e) + catch (VBoxException& e) { LogException(e); } @@ -1120,14 +1035,14 @@ { std::unique_lock lock(m_mutex); m_guide = guide; - Log(LOG_INFO, "Guide database version updated to %u", newDBversion); + kodi::Log(ADDON_LOG_INFO, "Guide database version updated to %u", newDBversion); m_programsDBVersion = newDBversion; } if (triggerEvent) OnGuideUpdated(); } - catch (VBoxException &e) + catch (VBoxException& e) { LogException(e); return; @@ -1143,28 +1058,29 @@ if (m_categoryGenreMapper) return; - Log(LOG_INFO, "Loading category genre mapper"); + kodi::Log(ADDON_LOG_INFO, "Loading category genre mapper"); m_categoryGenreMapper = CategoryMapperPtr(new CategoryGenreMapper()); - try { + try + { m_categoryGenreMapper->Initialize(CATEGORY_TO_GENRE_XML_PATH); } - catch (VBoxException &e) + catch (VBoxException& e) { LogException(e); - Log(LOG_INFO, "Failed to load the genre mapper"); + kodi::Log(ADDON_LOG_INFO, "Failed to load the genre mapper"); } } -int VBox::GetCategoriesGenreType(std::vector &categories) const +int VBox::GetCategoriesGenreType(std::vector& categories) const { return m_categoryGenreMapper->GetCategoriesGenreType(categories); } -void VBox::SwapChannelIcons(std::vector &channels) +void VBox::SwapChannelIcons(std::vector& channels) { - for (auto &channel : channels) + for (auto& channel : channels) { // Consult the channel mapper to find the corresponding external channel std::string displayName = m_guideChannelMapper->GetExternalChannelName(channel->m_name); @@ -1182,25 +1098,24 @@ } } -void VBox::LogGuideStatistics(const xmltv::Guide &guide) const +void VBox::LogGuideStatistics(const xmltv::Guide& guide) const { - for (const auto &schedule : guide.GetSchedules()) + for (const auto& schedule : guide.GetSchedules()) { - Log(LOG_INFO, "Fetched %d events for channel %s", schedule.second->GetLength(), - schedule.first.c_str()); + kodi::Log(ADDON_LOG_INFO, "Fetched %d events for channel %s", schedule.second->GetLength(), schedule.first.c_str()); } } -response::ResponsePtr VBox::PerformRequest(const request::Request &request) const +response::ResponsePtr VBox::PerformRequest(const request::Request& request) const { // Attempt to open a HTTP file handle - void *fileHandle = XBMC->OpenFile(request.GetLocation().c_str(), 0x08 /* READ_NO_CACHE */); + kodi::vfs::CFile fileHandle; - if (fileHandle) + if (fileHandle.OpenFile(request.GetLocation(GetApiBaseUrl()), ADDON_READ_NO_CACHE)) { // Read the response string std::unique_ptr responseContent = utilities::ReadFileContents(fileHandle); - XBMC->CloseFile(fileHandle); + fileHandle.Close(); // Parse the response response::ResponsePtr response = response::Factory::CreateResponse(request); @@ -1220,24 +1135,11 @@ } // The request failed completely - throw RequestFailedException("Unable to perform request (" + - request.GetIdentifier() + ")"); -} - -void VBox::Log(const ADDON::addon_log level, const char *format, ...) -{ - char *buf = new char[VBOX_LOG_BUFFER]; - size_t c = sprintf(buf, "pvr.vbox - "); - va_list va; - va_start(va, format); - vsnprintf(buf + c, VBOX_LOG_BUFFER - c, format, va); - va_end(va); - XBMC->Log(level, "%s", buf); - delete[] buf; + throw RequestFailedException("Unable to perform request (" + request.GetIdentifier() + ")"); } -void VBox::LogException(VBoxException &e) +void VBox::LogException(VBoxException& e) { std::string message = "Request failed: " + std::string(e.what()); - Log(LOG_ERROR, message.c_str()); + kodi::Log(ADDON_LOG_ERROR, message.c_str()); } diff -Nru kodi-pvr-vbox-4.7.0/src/vbox/VBox.h kodi-pvr-vbox-8.1.0/src/vbox/VBox.h --- kodi-pvr-vbox-4.7.0/src/vbox/VBox.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/vbox/VBox.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,53 +1,43 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ -#include -#include -#include -#include -#include -#include -#include -#include +#pragma once + +#include "../xmltv/Guide.h" +#include "../xmltv/Programme.h" +#include "../xmltv/Schedule.h" +#include "CategoryGenreMapper.h" #include "Channel.h" #include "ChannelStreamingStatus.h" +#include "Exceptions.h" #include "GuideChannelMapper.h" -#include "CategoryGenreMapper.h" #include "Recording.h" #include "SeriesRecording.h" -#include "Reminder.h" -#include "ReminderManager.h" -#include "Exceptions.h" #include "Settings.h" #include "SoftwareVersion.h" -#include "request/Request.h" +#include "StartupStateHandler.h" #include "request/ApiRequest.h" +#include "request/Request.h" #include "response/Response.h" -#include "StartupStateHandler.h" -#include "../xmltv/Programme.h" -#include "../xmltv/Schedule.h" -#include "../xmltv/Guide.h" -namespace vbox { +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace vbox +{ /** * Represents the status of any external media attached to the gateway @@ -118,7 +108,7 @@ { unsigned int m_beforeMargin; unsigned int m_afterMargin; - bool operator!=(const RecordingMargins &other) + bool operator!=(const RecordingMargins& other) { return (!(m_beforeMargin == other.m_beforeMargin && m_afterMargin == other.m_afterMargin)); } @@ -130,13 +120,12 @@ class VBox { public: - /** * The minimum backend software version required to use the addon */ - static const char * MINIMUM_SOFTWARE_VERSION; + static const char* MINIMUM_SOFTWARE_VERSION; - VBox(const Settings &settings); + VBox(const Settings& settings); ~VBox(); /** @@ -170,9 +159,9 @@ const std::vector& GetChannels() const; const ChannelPtr GetChannel(unsigned int uniqueId) const; const ChannelPtr GetCurrentChannel() const; - void SetCurrentChannel(const ChannelPtr &channel); - ChannelStreamingStatus GetChannelStreamingStatus(const ChannelPtr &channel); - void SetChannelStreamingStatus(const ChannelPtr &channel); + void SetCurrentChannel(const ChannelPtr& channel); + ChannelStreamingStatus GetChannelStreamingStatus(const ChannelPtr& channel); + void SetChannelStreamingStatus(const ChannelPtr& channel); // Recording methods bool SupportsRecordings() const; @@ -180,42 +169,34 @@ int64_t GetRecordingUsedSpace() const; int GetRecordingsAmount() const; int GetTimersAmount() const; - request::ApiRequest CreateDeleteRecordingRequest(const RecordingPtr &recording) const; - request::ApiRequest CreateDeleteSeriesRequest(const SeriesRecordingPtr &series) const; + request::ApiRequest CreateDeleteRecordingRequest(const RecordingPtr& recording) const; + request::ApiRequest CreateDeleteSeriesRequest(const SeriesRecordingPtr& series) const; bool DeleteRecordingOrTimer(unsigned int id); // for TIMER_VBOX_TYPE_EPG_BASED_SINGLE timer - void AddTimer(const ChannelPtr &channel, const ::xmltv::ProgrammePtr programme); + void AddTimer(const ChannelPtr& channel, const ::xmltv::ProgrammePtr programme); // for TIMER_VBOX_TYPE_MANUAL_SINGLE timer - void AddTimer(const ChannelPtr &channel, time_t startTime, time_t endTime, - const std::string title, const std::string description); + void AddTimer(const ChannelPtr& channel, time_t startTime, time_t endTime, + const std::string title, const std::string description); // for TIMER_VBOX_TYPE_EPG_BASED_MANUAL_SERIES timer - void AddTimer(const ChannelPtr &channel, time_t startTime, time_t endTime, - const std::string title, const std::string description, const unsigned int weekdays); + void AddTimer(const ChannelPtr& channel, time_t startTime, time_t endTime, + const std::string title, const std::string description, const unsigned int weekdays); // for TIMER_VBOX_TYPE_EPG_BASED_AUTO_SERIES timer - void AddSeriesTimer(const ChannelPtr &channel, const ::xmltv::ProgrammePtr programme); - const std::vector& GetRecordingsAndTimers() const; + void AddSeriesTimer(const ChannelPtr& channel, const ::xmltv::ProgrammePtr programme); + const std::vector& GetRecordingsAndTimers() const; const std::vector& GetSeriesTimers() const; void UpdateRecordingMargins(RecordingMargins defaultMargins); // EPG methods - const Schedule GetSchedule(const ChannelPtr &channel) const; - int GetCategoriesGenreType(std::vector &categories) const; + const Schedule GetSchedule(const ChannelPtr& channel) const; + int GetCategoriesGenreType(std::vector& categories) const; void StartEPGScan(); void SyncEPGNow(); void TriggerEpgUpdatesForChannels(); bool IsInitialEpgSkippingCompleted(); void MarkChannelAsInitialEpgSkipped(unsigned int channelUid); - // Reminder methods - bool AddReminder(const ChannelPtr &channel, const ::xmltv::ProgrammePtr &programme); - bool AddReminder(const ChannelPtr &channel, time_t startTime, std::string &progName); - bool DeleteChannelReminders(const ChannelPtr &channel); - bool DeleteProgramReminders(unsigned int epgUid); - const ChannelPtr FindChannelForEPGReminder(int epgUid); - // Helpers - static void Log(const ADDON::addon_log level, const char *format, ...); - static void LogException(VBoxException &e); + static void LogException(VBoxException& e); // Event handlers std::function OnChannelsUpdated; @@ -223,29 +204,29 @@ std::function OnTimersUpdated; std::function OnGuideUpdated; + protected: + bool m_skippingInitialEpgLoad = false; + private: static const int INITIAL_EPG_WAIT_SECS = 60; static const int INITIAL_EPG_STEP_SECS = 5; void BackgroundUpdater(); - unsigned int GetDBVersion(std::string &versionName) const; + unsigned int GetDBVersion(std::string& versionName) const; void RetrieveChannels(bool triggerEvent = true); void RetrieveRecordings(bool triggerEvent = true); void RetrieveGuide(bool triggerEvent = true); - ReminderPtr GetActiveReminder(); - void DisplayReminder(const ReminderPtr &reminder); - void RetrieveReminders(); void InitializeGenreMapper(); - void SwapChannelIcons(std::vector &channels); - void SendScanEPG(std::string &rEpgDetectionCheckMethod) const; - void GetEpgDetectionState(std::string &methodName, std::string &flagName); - void InitScanningEPG(std::string &rScanMethod, std::string &rGetStatusMethod, std::string &rfIsScanningFlag); + void SwapChannelIcons(std::vector& channels); + void SendScanEPG(std::string& rEpgDetectionCheckMethod) const; + void GetEpgDetectionState(std::string& methodName, std::string& flagName); + void InitScanningEPG(std::string& rScanMethod, std::string& rGetStatusMethod, std::string& rfIsScanningFlag); void UpdateEpgScan(bool fRetrieveGuide); const RecordingMargins GetRecordingMargins(bool fBackendSingleMargin) const; void SetRecordingMargins(RecordingMargins margin, bool fBackendSingleMargin); - void LogGuideStatistics(const ::xmltv::Guide &guide) const; - response::ResponsePtr PerformRequest(const request::Request &request) const; + void LogGuideStatistics(const ::xmltv::Guide& guide) const; + response::ResponsePtr PerformRequest(const request::Request& request) const; /** * The addons settings @@ -299,11 +280,6 @@ CategoryMapperPtr m_categoryGenreMapper; /** - * The reminder manager - */ - ReminderManagerPtr m_reminderManager; - - /** * Handler for the startup state */ StartupStateHandler m_stateHandler; @@ -359,4 +335,4 @@ */ mutable std::mutex m_mutex; }; -} +} // namespace vbox diff -Nru kodi-pvr-vbox-4.7.0/src/VBoxInstance.cpp kodi-pvr-vbox-8.1.0/src/VBoxInstance.cpp --- kodi-pvr-vbox-4.7.0/src/VBoxInstance.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/VBoxInstance.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,891 @@ +/* + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#include "VBoxInstance.h" + +#include "timeshift/DummyBuffer.h" +#include "timeshift/FilesystemBuffer.h" +#include "vbox/ContentIdentifier.h" +#include "vbox/RecordingReader.h" +#include "vbox/Settings.h" + +#include + +#include + +using namespace vbox; + +// settings context menu +unsigned int MENUHOOK_ID_RESCAN_EPG = 1; +unsigned int MENUHOOK_ID_SYNC_EPG = 2; + +CVBoxInstance::CVBoxInstance(const Settings& settings, KODI_HANDLE instance, const std::string& version) + : kodi::addon::CInstancePVRClient(instance, version), + VBox(settings) +{ + +} + +CVBoxInstance::~CVBoxInstance() +{ + delete m_timeshiftBuffer; +} + +ADDON_STATUS CVBoxInstance::Initialize() +{ + ADDON_STATUS status = ADDON_STATUS_UNKNOWN; + + // Validate settings + if (VBox::ValidateSettings()) + { + // Start the addon + try + { + VBox::Initialize(); + status = ADDON_STATUS_OK; + + // Attach event handlers + VBox::OnChannelsUpdated = [this]() { kodi::addon::CInstancePVRClient::TriggerChannelUpdate(); }; + VBox::OnRecordingsUpdated = [this]() { kodi::addon::CInstancePVRClient::TriggerRecordingUpdate(); }; + VBox::OnTimersUpdated = [this]() { kodi::addon::CInstancePVRClient::TriggerTimerUpdate(); }; + VBox::OnGuideUpdated = [this]() + { + for (const auto& channel : VBox::GetChannels()) + { + kodi::addon::CInstancePVRClient::TriggerEpgUpdate(ContentIdentifier::GetUniqueId(channel)); + } + }; + + // Create the timeshift buffer + if (VBox::GetSettings().m_timeshiftEnabled) + m_timeshiftBuffer = new timeshift::FilesystemBuffer(VBox::GetSettings().m_timeshiftBufferPath); + else + m_timeshiftBuffer = new timeshift::DummyBuffer(); + + m_timeshiftBuffer->SetReadTimeout(VBox::GetConnectionParams().timeout); + + // initializing TV Settings Client Specific menu hooks + std::vector hooks = {{MENUHOOK_ID_RESCAN_EPG, 30106, PVR_MENUHOOK_SETTING}, + {MENUHOOK_ID_SYNC_EPG, 30107, PVR_MENUHOOK_SETTING}}; + + for (auto& hook : hooks) + kodi::addon::CInstancePVRClient::AddMenuHook(hook); + } + catch (FirmwareVersionException& e) + { + kodi::QueueNotification(QUEUE_ERROR, "", e.what()); + status = ADDON_STATUS_PERMANENT_FAILURE; + } + catch (VBoxException& e) + { + VBox::LogException(e); + status = ADDON_STATUS_LOST_CONNECTION; + } + } + else + status = ADDON_STATUS_NEED_SETTINGS; + + return status; +} + +PVR_ERROR CVBoxInstance::GetCapabilities(kodi::addon::PVRCapabilities& capabilities) +{ + capabilities.SetSupportsTV(true); + capabilities.SetSupportsRadio(true); + capabilities.SetSupportsChannelGroups(false); + capabilities.SetSupportsEPG(true); + capabilities.SetHandlesInputStream(true); + + // Recording capability is determined further down, we'll assume false + // in case the real capabilities cannot be determined for some reason + capabilities.SetSupportsRecordings(false); + capabilities.SetSupportsTimers(false); + + // Unsupported features + capabilities.SetSupportsRecordingsUndelete(false); + capabilities.SetSupportsChannelScan(false); + capabilities.SetSupportsChannelSettings(false); + capabilities.SetHandlesDemuxing(false); + capabilities.SetSupportsRecordingPlayCount(false); + capabilities.SetSupportsLastPlayedPosition(false); + capabilities.SetSupportsRecordingEdl(false); + + // Wait for initialization until we decide if we support recordings or not. + // Recording is only possible when external media is present + if (VBox::GetStateHandler().WaitForState(StartupState::INITIALIZED) && VBox::SupportsRecordings()) + { + capabilities.SetSupportsRecordings(true); + capabilities.SetSupportsTimers(true); + } + + capabilities.SetSupportsRecordingsRename(false); + capabilities.SetSupportsRecordingsLifetimeChange(false); + capabilities.SetSupportsDescrambleInfo(false); + + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR CVBoxInstance::GetBackendName(std::string& name) +{ + name = VBox::GetBackendName(); + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR CVBoxInstance::GetBackendVersion(std::string& version) +{ + version = VBox::GetBackendVersion(); + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR CVBoxInstance::GetBackendHostname(std::string& hostname) +{ + hostname = VBox::GetBackendHostname(); + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR CVBoxInstance::GetConnectionString(std::string& connection) +{ + connection = VBox::GetConnectionString(); + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR CVBoxInstance::GetDriveSpace(uint64_t& total, uint64_t& used) +{ + total = VBox::GetRecordingTotalSpace() / 1024; + used = VBox::GetRecordingUsedSpace() / 1024; + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR CVBoxInstance::CallSettingsMenuHook(const kodi::addon::PVRMenuhook& menuhook) +{ + if (menuhook.GetHookId() == MENUHOOK_ID_RESCAN_EPG) + { + kodi::QueueNotification(QUEUE_INFO, "", "Rescanning EPG, this will take a while"); + VBox::StartEPGScan(); + return PVR_ERROR_NO_ERROR; + } + else if (menuhook.GetHookId() == MENUHOOK_ID_SYNC_EPG) + { + kodi::QueueNotification(QUEUE_INFO, "", "Getting EPG from VBox device"); + VBox::SyncEPGNow(); + return PVR_ERROR_NO_ERROR; + } + return PVR_ERROR_INVALID_PARAMETERS; +} + +PVR_ERROR CVBoxInstance::GetChannelsAmount(int& amount) +{ + try + { + amount = VBox::GetChannelsAmount(); + return PVR_ERROR_NO_ERROR; + } + catch (VBoxException& e) + { + VBox::LogException(e); + return PVR_ERROR_SERVER_ERROR; + } +} + +PVR_ERROR CVBoxInstance::GetChannels(bool radio, kodi::addon::PVRChannelsResultSet& results) +{ + auto& channels = VBox::GetChannels(); + unsigned int i = 0; + + for (const auto& item : channels) + { + // Skip those that are not of the correct type + if (item->m_radio != radio) + continue; + + kodi::addon::PVRChannel channel; + + channel.SetUniqueId(ContentIdentifier::GetUniqueId(item)); + channel.SetIsRadio(item->m_radio); + + // Override LCN if backend channel order should be forced + ++i; + if (VBox::GetSettings().m_setChannelIdUsingOrder == CH_ORDER_BY_INDEX) + channel.SetChannelNumber(i); + // default - CH_ORDER_BY_LCN + else + channel.SetChannelNumber(item->m_number); + + channel.SetEncryptionSystem(item->m_encrypted ? 0xFFFF : 0x0000); + + channel.SetChannelName(item->m_name); + channel.SetIconPath(item->m_iconUrl); + + // Set stream format for TV channels + if (!item->m_radio) + channel.SetMimeType("video/mp2t"); + + kodi::Log(ADDON_LOG_INFO, "Adding channel %d: %s. Icon: %s", channel.GetChannelNumber(), channel.GetChannelName().c_str(), + channel.GetIconPath().c_str()); + + results.Add(channel); + } + + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR CVBoxInstance::GetSignalStatus(int channelUid, kodi::addon::PVRSignalStatus& signalStatus) +{ + const ChannelPtr currentChannel = VBox::GetCurrentChannel(); + + if (!currentChannel) + return PVR_ERROR_NO_ERROR; + + try + { + ChannelStreamingStatus status = VBox::GetChannelStreamingStatus(currentChannel); + + // Adjust for Kodi's weird handling of the signal strength + signalStatus.SetSignal(static_cast(status.GetSignalStrength()) * 655); + signalStatus.SetSNR(static_cast(status.m_signalQuality) * 655); + signalStatus.SetBER(status.GetBer()); + + signalStatus.SetAdapterName(status.GetTunerName()); + signalStatus.SetAdapterStatus(status.m_lockStatus); + signalStatus.SetServiceName(status.GetServiceName()); + signalStatus.SetMuxName(status.GetMuxName()); + } + catch (VBoxException& e) + { + VBox::LogException(e); + } + + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR CVBoxInstance::GetRecordingsAmount(bool deleted, int& amount) +{ + amount = VBox::GetRecordingsAmount(); + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR CVBoxInstance::GetRecordings(bool deleted, kodi::addon::PVRRecordingsResultSet& results) +{ + auto& recordings = VBox::GetRecordingsAndTimers(); + + for (const auto& item : recordings) + { + // Skip timers + if (!item->IsRecording()) + continue; + + kodi::addon::PVRRecording recording; + recording.SetSeriesNumber(PVR_RECORDING_INVALID_SERIES_EPISODE); + recording.SetEpisodeNumber(PVR_RECORDING_INVALID_SERIES_EPISODE); + + time_t startTime = xmltv::Utilities::XmltvToUnixTime(item->m_startTime); + time_t endTime = xmltv::Utilities::XmltvToUnixTime(item->m_endTime); + unsigned int id = item->m_id; + + recording.SetRecordingTime(startTime); + std::time_t now = std::time(nullptr); + if (now > endTime) + recording.SetDuration(static_cast(endTime - startTime)); + else + recording.SetDuration(static_cast(now - startTime)); + recording.SetEPGEventId(id); + + recording.SetChannelName(item->m_channelName); + recording.SetRecordingId(std::to_string(id)); + recording.SetTitle(item->m_title); + recording.SetPlot(item->m_description); + + recording.SetChannelUid(PVR_CHANNEL_INVALID_UID); + recording.SetChannelType(PVR_RECORDING_CHANNEL_TYPE_UNKNOWN); + + // Find the recordings channel and use its unique ID if we find one + auto& channels = VBox::GetChannels(); + auto it = std::find_if( + channels.cbegin(), + channels.cend(), + [&item](const ChannelPtr& channel) { + return channel->m_xmltvName == item->m_channelId; + } + ); + + if (it != channels.cend()) + { + ChannelPtr channel = *it; + recording.SetChannelUid(ContentIdentifier::GetUniqueId(channel)); + if (channel->m_radio) + recording.SetChannelType(PVR_RECORDING_CHANNEL_TYPE_RADIO); + else + recording.SetChannelType(PVR_RECORDING_CHANNEL_TYPE_TV); + } + + results.Add(recording); + } + + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR CVBoxInstance::DeleteRecording(const kodi::addon::PVRRecording& recording) +{ + try + { + unsigned int id = static_cast(std::stoi(recording.GetRecordingId())); + + if (VBox::DeleteRecordingOrTimer(id)) + return PVR_ERROR_NO_ERROR; + else + return PVR_ERROR_FAILED; + } + catch (...) + { + return PVR_ERROR_INVALID_PARAMETERS; + } +} + +PVR_ERROR CVBoxInstance::GetTimerTypes(std::vector& types) +{ + // EPG based single recording + { + kodi::addon::PVRTimerType type; + type.SetId(vbox::TIMER_VBOX_TYPE_EPG_BASED_SINGLE); + type.SetDescription("EPG-based one time recording"); + type.SetAttributes( + PVR_TIMER_TYPE_REQUIRES_EPG_TAG_ON_CREATE | + PVR_TIMER_TYPE_SUPPORTS_START_TIME | + PVR_TIMER_TYPE_SUPPORTS_END_TIME); + types.emplace_back(type); + } + + // episode recording + { + kodi::addon::PVRTimerType type; + type.SetId(TIMER_VBOX_TYPE_EPISODE); + type.SetDescription("Episode recording"); + type.SetAttributes( + PVR_TIMER_TYPE_IS_READONLY | + PVR_TIMER_TYPE_SUPPORTS_START_TIME | + PVR_TIMER_TYPE_SUPPORTS_END_TIME); + types.emplace_back(type); + } + + // manual recording + { + kodi::addon::PVRTimerType type; + type.SetId(TIMER_VBOX_TYPE_MANUAL_SINGLE); + type.SetDescription("Manual one time recording"); + type.SetAttributes( + PVR_TIMER_TYPE_IS_MANUAL | + PVR_TIMER_TYPE_FORBIDS_EPG_TAG_ON_CREATE | + PVR_TIMER_TYPE_SUPPORTS_CHANNELS | + PVR_TIMER_TYPE_SUPPORTS_START_TIME | + PVR_TIMER_TYPE_SUPPORTS_END_TIME); + types.emplace_back(type); + } + + //Automatic series recording + { + kodi::addon::PVRTimerType type; + type.SetId(TIMER_VBOX_TYPE_EPG_BASED_AUTO_SERIES); + type.SetDescription("EPG-based automatic series recording"); + type.SetAttributes( + PVR_TIMER_TYPE_REQUIRES_EPG_SERIES_ON_CREATE); + types.emplace_back(type); + } + + // EPG based series recording + { + kodi::addon::PVRTimerType type; + type.SetId(TIMER_VBOX_TYPE_EPG_BASED_MANUAL_SERIES); + type.SetDescription("EPG-based manual series recording"); + type.SetAttributes( + PVR_TIMER_TYPE_IS_REPEATING | + PVR_TIMER_TYPE_REQUIRES_EPG_TAG_ON_CREATE | + PVR_TIMER_TYPE_SUPPORTS_START_TIME | + PVR_TIMER_TYPE_SUPPORTS_END_TIME | + PVR_TIMER_TYPE_SUPPORTS_WEEKDAYS); + types.emplace_back(type); + } + + //Manual series recording + { + kodi::addon::PVRTimerType type; + type.SetId(TIMER_VBOX_TYPE_MANUAL_SERIES); + type.SetDescription("Manual series recording"); + type.SetAttributes( + PVR_TIMER_TYPE_IS_MANUAL | + PVR_TIMER_TYPE_IS_REPEATING | + PVR_TIMER_TYPE_FORBIDS_EPG_TAG_ON_CREATE | + PVR_TIMER_TYPE_SUPPORTS_CHANNELS | + PVR_TIMER_TYPE_SUPPORTS_START_TIME | + PVR_TIMER_TYPE_SUPPORTS_END_TIME | + PVR_TIMER_TYPE_SUPPORTS_WEEKDAYS); + types.emplace_back(type); + } + + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR CVBoxInstance::GetTimersAmount(int& amount) +{ + amount = VBox::GetTimersAmount(); + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR CVBoxInstance::GetTimers(kodi::addon::PVRTimersResultSet& results) +{ + /* TODO: Change implementation to get support for the timer features introduced with PVR API 1.9.7 */ + auto& recordings = VBox::GetRecordingsAndTimers(); + + // first get timers from single recordings (scheduled) + for (const auto& item : recordings) + { + // Skip recordings + if (!item->IsTimer()) + continue; + + kodi::addon::PVRTimer timer; + timer.SetTimerType((item->m_seriesId > 0) ? vbox::TIMER_VBOX_TYPE_EPISODE : vbox::TIMER_VBOX_TYPE_MANUAL_SINGLE); + timer.SetStartTime(xmltv::Utilities::XmltvToUnixTime(item->m_startTime)); + timer.SetEndTime(xmltv::Utilities::XmltvToUnixTime(item->m_endTime)); + timer.SetClientIndex(item->m_id); + + // Convert the internal timer state to PVR_TIMER_STATE + switch (item->GetState()) + { + case RecordingState::SCHEDULED: + timer.SetState(PVR_TIMER_STATE_SCHEDULED); + break; + case RecordingState::RECORDED: + case RecordingState::EXTERNAL: + timer.SetState(PVR_TIMER_STATE_COMPLETED); + break; + case RecordingState::RECORDING: + timer.SetState(PVR_TIMER_STATE_RECORDING); + break; + case RecordingState::RECORDING_ERROR: + break; + } + + // Find the timer's channel and use its unique ID + auto& channels = VBox::GetChannels(); + auto it = std::find_if(channels.cbegin(), channels.cend(), + [&item](const ChannelPtr& channel) { + return channel->m_xmltvName == item->m_channelId; + } + ); + + if (it != channels.cend()) + timer.SetClientChannelUid(ContentIdentifier::GetUniqueId(*it)); + else + continue; + + timer.SetTitle(item->m_title); + timer.SetSummary(item->m_description); + + kodi::Log(ADDON_LOG_DEBUG, "GetTimers(): adding timer to show %s", item->m_title.c_str()); + // TODO: Set margins to whatever the API reports + results.Add(timer); + } + // second: get timer rules for series + auto& series = VBox::GetSeriesTimers(); + for (const auto& item : series) + { + kodi::addon::PVRTimer timer; + + timer.SetTimerType((item->m_fIsAuto) ? vbox::TIMER_VBOX_TYPE_EPG_BASED_AUTO_SERIES : vbox::TIMER_VBOX_TYPE_MANUAL_SERIES); + timer.SetClientIndex(item->m_id); + timer.SetState(PVR_TIMER_STATE_SCHEDULED); + + // Find the timer's channel and use its unique ID + auto& channels = VBox::GetChannels(); + auto it = std::find_if(channels.cbegin(), channels.cend(), + [&item](const ChannelPtr& channel) { + return channel->m_xmltvName == item->m_channelId; + } + ); + + if (it != channels.cend()) + timer.SetClientChannelUid(ContentIdentifier::GetUniqueId(*it)); + + unsigned int nextScheduledId = item->m_scheduledId; + // Find next recording of the series + auto recIt = std::find_if(recordings.begin(), recordings.end(), + [nextScheduledId](const RecordingPtr& recording) { + return nextScheduledId == recording->m_id; + } + ); + // if it doesn't exist (canceled) - don't add series + if (recIt == recordings.end()) + continue; + + timer.SetStartTime(xmltv::Utilities::XmltvToUnixTime(item->m_startTime)); + // automatic starts & stops whenever detected (will appear as episode) + if (item->m_fIsAuto) + { + timer.SetStartAnyTime(true); + timer.SetEndAnyTime(true); + } + else + { + // set periodic times + timer.SetFirstDay(xmltv::Utilities::XmltvToUnixTime(item->m_startTime)); + timer.SetWeekdays(item->m_weekdays); + timer.SetEndTime(xmltv::Utilities::XmltvToUnixTime(item->m_endTime)); + } + timer.SetTitle(item->m_title); + + timer.SetSummary(item->m_description); + + // TODO: Set margins to whatever the API reports + results.Add(timer); + } + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR CVBoxInstance::AddTimer(const kodi::addon::PVRTimer& timer) +{ + kodi::Log(ADDON_LOG_DEBUG, "AddTimer() : entering with timer type 0x%x", timer.GetTimerType()); + // Find the channel the timer is for + auto& channels = VBox::GetChannels(); + auto it = std::find_if(channels.cbegin(), channels.cend(), + [&timer](const ChannelPtr& channel) { + return timer.GetClientChannelUid() == ContentIdentifier::GetUniqueId(channel); + } + ); + + if (it == channels.end()) + return PVR_ERROR_INVALID_PARAMETERS; + + const ChannelPtr channel = *it; + + // Find the channel's schedule + const Schedule schedule = VBox::GetSchedule(channel); + + try + { + // update the recording margins in the backend + VBox::UpdateRecordingMargins({timer.GetMarginStart(), timer.GetMarginEnd()}); + // Set start time to now if it's missing + time_t startTime = timer.GetStartTime(); + time_t endTime = timer.GetEndTime(); + std::string title(timer.GetTitle()); + std::string desc(timer.GetSummary()); + + if (startTime == 0) + startTime = time(nullptr); + + // Add a programme-based timer if the programme exists in the schedule + const xmltv::ProgrammePtr programme = + (schedule.schedule) ? schedule.schedule->GetProgramme(timer.GetEPGUid()) : nullptr; + + switch (timer.GetTimerType()) + { + case TIMER_VBOX_TYPE_EPG_BASED_SINGLE: + case TIMER_VBOX_TYPE_EPISODE: + if (programme) + { + switch (schedule.origin) + { + case Schedule::Origin::INTERNAL_GUIDE: + VBox::AddTimer(channel, programme); + break; + case Schedule::Origin::EXTERNAL_GUIDE: + title = programme->m_title; + desc = programme->m_description; + VBox::AddTimer(channel, startTime, endTime, title, desc); + break; + } + return PVR_ERROR_NO_ERROR; + } + else + { + VBox::AddTimer(channel, startTime, endTime, title, desc); + return PVR_ERROR_NO_ERROR; + } + case TIMER_VBOX_TYPE_MANUAL_SINGLE: + VBox::AddTimer(channel, startTime, endTime, title, desc); + return PVR_ERROR_NO_ERROR; + case TIMER_VBOX_TYPE_EPG_BASED_AUTO_SERIES: + { + if (!programme) + return PVR_ERROR_INVALID_PARAMETERS; + VBox::AddSeriesTimer(channel, programme); + return PVR_ERROR_NO_ERROR; + } + case TIMER_VBOX_TYPE_EPG_BASED_MANUAL_SERIES: + { + if (!programme) + return PVR_ERROR_INVALID_PARAMETERS; + VBox::AddTimer(channel, startTime, endTime, title, desc, timer.GetWeekdays()); + return PVR_ERROR_NO_ERROR; + } + case TIMER_VBOX_TYPE_MANUAL_SERIES: + { + VBox::AddTimer(channel, startTime, endTime, title, desc, timer.GetWeekdays()); + return PVR_ERROR_NO_ERROR; + } + default: + // any other timer type is wrong + return PVR_ERROR_INVALID_PARAMETERS; + } + } + catch (VBoxException& e) + { + VBox::LogException(e); + return PVR_ERROR_FAILED; + } +} + +PVR_ERROR CVBoxInstance::DeleteTimer(const kodi::addon::PVRTimer& timer, bool forceDelete) +{ + if (VBox::DeleteRecordingOrTimer(timer.GetClientIndex())) + return PVR_ERROR_NO_ERROR; + + return PVR_ERROR_FAILED; +} + +PVR_ERROR CVBoxInstance::UpdateTimer(const kodi::addon::PVRTimer& timer) +{ + PVR_ERROR err = DeleteTimer(timer, true); + + if (err == PVR_ERROR_NO_ERROR) + return AddTimer(timer); + return err; +} + +PVR_ERROR CVBoxInstance::GetEPGForChannel(int channelUid, time_t start, time_t end, kodi::addon::PVREPGTagsResultSet& results) +{ + const ChannelPtr channelPtr = VBox::GetChannel(channelUid); + + if (!channelPtr) + return PVR_ERROR_INVALID_PARAMETERS; + + if (m_skippingInitialEpgLoad) + { + kodi::Log(ADDON_LOG_DEBUG, "%s Skipping Initial EPG for channel: %s", __FUNCTION__, channelPtr->m_name.c_str()); + VBox::MarkChannelAsInitialEpgSkipped(channelUid); + return PVR_ERROR_NO_ERROR; + } + + // Retrieve the schedule + const auto schedule = VBox::GetSchedule(channelPtr); + + if (!schedule.schedule) + return PVR_ERROR_NO_ERROR; + + // Transfer the programmes between the start and end times + for (const auto& programme : schedule.schedule->GetSegment(start, end)) + { + kodi::addon::PVREPGTag event; + + event.SetStartTime(xmltv::Utilities::XmltvToUnixTime(programme->m_startTime)); + event.SetEndTime(xmltv::Utilities::XmltvToUnixTime(programme->m_endTime)); + event.SetUniqueChannelId(channelUid); + event.SetUniqueBroadcastId(ContentIdentifier::GetUniqueId(programme.get())); + event.SetTitle(programme->m_title); + event.SetPlot(programme->m_description); + event.SetYear(programme->m_year); + event.SetEpisodeName(programme->m_subTitle); + event.SetIconPath(programme->m_icon); + event.SetSeriesNumber(EPG_TAG_INVALID_SERIES_EPISODE); + event.SetEpisodeNumber(EPG_TAG_INVALID_SERIES_EPISODE); + event.SetEpisodePartNumber(EPG_TAG_INVALID_SERIES_EPISODE); + + std::string directors = xmltv::Utilities::ConcatenateStringList(programme->GetDirectors()); + std::string writers = xmltv::Utilities::ConcatenateStringList(programme->GetWriters()); + std::vector categories = programme->GetCategories(); + std::string catStrings = xmltv::Utilities::ConcatenateStringList(categories); + + event.SetDirector(directors); + event.SetWriter(writers); + + // use genre mapper to find the most common genre type (from categories) + event.SetGenreType(VBox::GetCategoriesGenreType(categories)); + event.SetGenreDescription(catStrings); + + // Extract up to five cast members only + std::vector actorNames; + const auto& actors = programme->GetActors(); + int numActors = std::min(static_cast(actors.size()), 5); + + for (unsigned int i = 0; i < numActors; i++) + actorNames.push_back(actors.at(i).name); + + std::string cast = xmltv::Utilities::ConcatenateStringList(actorNames); + event.SetCast(cast); + + unsigned int flags = EPG_TAG_FLAG_UNDEFINED; + + if (!programme->m_seriesIds.empty()) + { + kodi::Log(ADDON_LOG_DEBUG, "GetEPGForChannel():programme %s marked as belonging to a series", programme->m_title.c_str()); + flags |= EPG_TAG_FLAG_IS_SERIES; + } + event.SetFlags(flags); + + results.Add(event); + } + + return PVR_ERROR_NO_ERROR; +} + +bool CVBoxInstance::OpenLiveStream(const kodi::addon::PVRChannel& channel) +{ + // Find the channel + const ChannelPtr channelPtr = VBox::GetChannel(channel.GetUniqueId()); + + if (!channelPtr) + return false; + + // Remember the current channel if the buffer was successfully opened + if (m_timeshiftBuffer->Open(channelPtr->m_url)) + { + VBox::SetCurrentChannel(channelPtr); + return true; + } + + CloseLiveStream(); + VBox::SetChannelStreamingStatus(channelPtr); + return false; +} + +void CVBoxInstance::CloseLiveStream() +{ + m_timeshiftBuffer->Close(); + VBox::SetCurrentChannel(nullptr); +} + +int CVBoxInstance::ReadLiveStream(unsigned char* pBuffer, unsigned int iBufferSize) +{ + return m_timeshiftBuffer->Read(pBuffer, iBufferSize); +} + +int64_t CVBoxInstance::LengthLiveStream() +{ + return m_timeshiftBuffer->Length(); +} + +int64_t CVBoxInstance::SeekLiveStream(int64_t iPosition, int iWhence /* = SEEK_SET */) +{ + return m_timeshiftBuffer->Seek(iPosition, iWhence); +} + +bool CVBoxInstance::CanPauseStream() +{ + return VBox::GetSettings().m_timeshiftEnabled; +} + +bool CVBoxInstance::CanSeekStream() +{ + return VBox::GetSettings().m_timeshiftEnabled; +} + +bool CVBoxInstance::IsRealTimeStream() +{ + const ChannelPtr currentChannel = VBox::GetCurrentChannel(); + + return currentChannel != nullptr; +} + +// Stream times +PVR_ERROR CVBoxInstance::GetStreamTimes(kodi::addon::PVRStreamTimes& times) +{ + // Addon API 5.8.0 + if (IsRealTimeStream() && m_timeshiftBuffer && VBox::GetSettings().m_timeshiftEnabled) + { + times.SetStartTime(m_timeshiftBuffer->GetStartTime()); + times.SetPTSStart(0); + times.SetPTSBegin(0); + times.SetPTSEnd((!m_timeshiftBuffer->CanSeekStream()) ? 0 + : (m_timeshiftBuffer->GetEndTime() - m_timeshiftBuffer->GetStartTime()) * STREAM_TIME_BASE); + + return PVR_ERROR_NO_ERROR; + } + else if (m_recordingReader) + { + times.SetStartTime(0); + times.SetPTSStart(0); + times.SetPTSBegin(0); + times.SetPTSEnd(static_cast(m_recordingReader->CurrentDuration()) * STREAM_TIME_BASE); + + return PVR_ERROR_NO_ERROR; + } + + return PVR_ERROR_NOT_IMPLEMENTED; +} + +void PauseStream(bool bPaused) +{ + // TODO: Setting for timeshift on pause as well as always +} + +// Recording stream methods +bool CVBoxInstance::OpenRecordedStream(const kodi::addon::PVRRecording & recording) +{ + CloseRecordedStream(); + + unsigned int id = static_cast(std::stoi(recording.GetRecordingId())); + auto& recordings = VBox::GetRecordingsAndTimers(); + auto recIt = std::find_if(recordings.begin(), recordings.end(), + [id](const RecordingPtr& item) { + return item->IsRecording() && id == item->m_id; + } + ); + + if (recIt == recordings.end()) + return PVR_ERROR_SERVER_ERROR; + + std::time_t now = std::time(nullptr), start = 0, end = 0; + std::string channelName = recording.GetChannelName(); + time_t recordingTime = recording.GetRecordingTime(); + auto timerIt = std::find_if(recordings.begin(), recordings.end(), + [now, channelName, recordingTime](const RecordingPtr& item) { + return item->IsTimer() && item->IsRunning(now, channelName, recordingTime); + } + ); + if (timerIt != recordings.end()) + { + auto& timer = *timerIt; + start = xmltv::Utilities::XmltvToUnixTime(timer->m_startTime); + end = xmltv::Utilities::XmltvToUnixTime(timer->m_endTime); + } + + m_recordingReader = new RecordingReader((*recIt)->m_url.c_str(), start, end, recording.GetDuration()); + + return m_recordingReader->Start(); +} + +void CVBoxInstance::CloseRecordedStream() +{ + delete m_recordingReader; + m_recordingReader = nullptr; +} + +int CVBoxInstance::ReadRecordedStream(unsigned char* buffer, unsigned int size) +{ + if (!m_recordingReader) + return 0; + + return m_recordingReader->ReadData(buffer, size); +} + +int64_t CVBoxInstance::SeekRecordedStream(int64_t position, int whence) +{ + if (!m_recordingReader) + return 0; + + return m_recordingReader->Seek(position, whence); +} + +int64_t CVBoxInstance::LengthRecordedStream() +{ + if (!m_recordingReader) + return -1; + + return m_recordingReader->Length(); +} diff -Nru kodi-pvr-vbox-4.7.0/src/VBoxInstance.h kodi-pvr-vbox-8.1.0/src/VBoxInstance.h --- kodi-pvr-vbox-4.7.0/src/VBoxInstance.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/VBoxInstance.h 2021-01-09 10:03:05.000000000 +0000 @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once + +#include "vbox/VBox.h" + +#include + +namespace timeshift +{ +class Buffer; +} + +namespace vbox +{ +class RecordingReader; +} + +class ATTRIBUTE_HIDDEN CVBoxInstance : public kodi::addon::CInstancePVRClient, private vbox::VBox +{ +public: + CVBoxInstance(const vbox::Settings& settings, KODI_HANDLE instance, const std::string& version); + ~CVBoxInstance(); + + ADDON_STATUS Initialize(); + const vbox::Settings& GetSettings() const { return vbox::VBox::GetSettings(); } + + PVR_ERROR GetCapabilities(kodi::addon::PVRCapabilities& capabilities) override; + PVR_ERROR GetBackendName(std::string& name) override; + PVR_ERROR GetBackendVersion(std::string& version) override; + PVR_ERROR GetBackendHostname(std::string& hostname) override; + PVR_ERROR GetConnectionString(std::string& connection) override; + PVR_ERROR GetDriveSpace(uint64_t& total, uint64_t& used) override; + + PVR_ERROR CallSettingsMenuHook(const kodi::addon::PVRMenuhook& menuhook) override; + + PVR_ERROR GetChannelsAmount(int& amount) override; + PVR_ERROR GetChannels(bool radio, kodi::addon::PVRChannelsResultSet& results) override; + PVR_ERROR GetSignalStatus(int channelUid, kodi::addon::PVRSignalStatus& signalStatus) override; + + PVR_ERROR GetRecordingsAmount(bool deleted, int& amount) override; + PVR_ERROR GetRecordings(bool deleted, kodi::addon::PVRRecordingsResultSet& results) override; + PVR_ERROR DeleteRecording(const kodi::addon::PVRRecording& recording) override; + + PVR_ERROR GetTimerTypes(std::vector& types) override; + PVR_ERROR GetTimersAmount(int& amount) override; + PVR_ERROR GetTimers(kodi::addon::PVRTimersResultSet& results) override; + PVR_ERROR AddTimer(const kodi::addon::PVRTimer& timer) override; + PVR_ERROR DeleteTimer(const kodi::addon::PVRTimer& timer, bool forceDelete) override; + PVR_ERROR UpdateTimer(const kodi::addon::PVRTimer& timer) override; + + PVR_ERROR GetEPGForChannel(int channelUid, time_t start, time_t end, kodi::addon::PVREPGTagsResultSet& results) override; + + bool OpenLiveStream(const kodi::addon::PVRChannel& channel) override; + void CloseLiveStream() override; + int ReadLiveStream(unsigned char* pBuffer, unsigned int iBufferSize) override; + int64_t LengthLiveStream() override; + int64_t SeekLiveStream(int64_t iPosition, int iWhence /* = SEEK_SET */) override; + bool CanPauseStream() override; + bool CanSeekStream() override; + bool IsRealTimeStream() override; + PVR_ERROR GetStreamTimes(kodi::addon::PVRStreamTimes& times) override; + + bool OpenRecordedStream(const kodi::addon::PVRRecording & recording) override; + void CloseRecordedStream() override; + int ReadRecordedStream(unsigned char* buffer, unsigned int size) override; + int64_t SeekRecordedStream(int64_t position, int whence) override; + int64_t LengthRecordedStream() override; + +private: + vbox::RecordingReader* m_recordingReader = nullptr; + timeshift::Buffer* m_timeshiftBuffer = nullptr; +}; diff -Nru kodi-pvr-vbox-4.7.0/src/xmltv/Channel.cpp kodi-pvr-vbox-8.1.0/src/xmltv/Channel.cpp --- kodi-pvr-vbox-4.7.0/src/xmltv/Channel.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/xmltv/Channel.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,23 +1,11 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "Channel.h" @@ -26,5 +14,4 @@ Channel::Channel(const std::string& id, const std::string& displayName) : m_id(id), m_displayName(displayName), m_icon("") { - } diff -Nru kodi-pvr-vbox-4.7.0/src/xmltv/Channel.h kodi-pvr-vbox-8.1.0/src/xmltv/Channel.h --- kodi-pvr-vbox-4.7.0/src/xmltv/Channel.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/xmltv/Channel.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,27 +1,16 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once -#include #include +#include namespace xmltv { @@ -35,12 +24,11 @@ class Channel { public: - - Channel(const std::string &id, const std::string &displayName); + Channel(const std::string& id, const std::string& displayName); ~Channel() = default; std::string m_id; std::string m_displayName; std::string m_icon; }; -} +} // namespace xmltv diff -Nru kodi-pvr-vbox-4.7.0/src/xmltv/Guide.cpp kodi-pvr-vbox-8.1.0/src/xmltv/Guide.cpp --- kodi-pvr-vbox-4.7.0/src/xmltv/Guide.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/xmltv/Guide.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,48 +1,40 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "Guide.h" -#include + +#include "../vbox/ContentIdentifier.h" #include "Channel.h" #include "Utilities.h" -#include "lib/tinyxml2/tinyxml2.h" -#include "p8-platform/util/StringUtils.h" -#include "../vbox/ContentIdentifier.h" +#include + +#include +#include + +using namespace kodi::tools; using namespace xmltv; using namespace tinyxml2; -Guide::Guide(const XMLElement *m_content) +Guide::Guide(const XMLElement* m_content) { - for (const XMLElement *element = m_content->FirstChildElement("channel"); - element != NULL; element = element->NextSiblingElement("channel")) + for (const XMLElement* element = m_content->FirstChildElement("channel"); element != NULL; + element = element->NextSiblingElement("channel")) { // Create the channel std::string channelId = Utilities::UrlDecode(element->Attribute("id")); - const char *pChannelName = element->FirstChildElement("display-name")->GetText(); + const char* pChannelName = element->FirstChildElement("display-name")->GetText(); std::string displayName = pChannelName ? pChannelName : ""; ChannelPtr channel = ChannelPtr(new Channel(channelId, displayName)); // Add channel icon if it exists - auto *iconElement = element->FirstChildElement("icon"); + auto* iconElement = element->FirstChildElement("icon"); if (iconElement) channel->m_icon = iconElement->Attribute("src"); @@ -53,8 +45,8 @@ m_schedules[channelId] = SchedulePtr(new Schedule(channel)); } - for (const XMLElement *element = m_content->FirstChildElement("programme"); - element != NULL; element = element->NextSiblingElement("programme")) + for (const XMLElement* element = m_content->FirstChildElement("programme"); element != NULL; + element = element->NextSiblingElement("programme")) { // Extract the channel name and the programme std::string channelId = Utilities::UrlDecode(element->Attribute("channel")); @@ -70,20 +62,20 @@ } } -std::string Guide::GetChannelId(const std::string &displayName) const +std::string Guide::GetChannelId(const std::string& displayName) const { auto it = std::find_if( m_displayNameMappings.cbegin(), m_displayNameMappings.cend(), - [displayName](const std::pair &mapping) - { - return StringUtils::CompareNoCase(mapping.first, displayName) == 0; - }); + [displayName](const std::pair& mapping) { + return StringUtils::CompareNoCase(mapping.first, displayName) == 0; + } + ); return it != m_displayNameMappings.cend() ? it->second : ""; } -const SchedulePtr Guide::GetSchedule(const std::string &channelId) const +const SchedulePtr Guide::GetSchedule(const std::string& channelId) const { auto it = m_schedules.find(channelId); diff -Nru kodi-pvr-vbox-4.7.0/src/xmltv/Guide.h kodi-pvr-vbox-8.1.0/src/xmltv/Guide.h --- kodi-pvr-vbox-4.7.0/src/xmltv/Guide.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/xmltv/Guide.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,30 +1,20 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once + +#include "Programme.h" +#include "Schedule.h" -#include #include +#include #include -#include "Schedule.h" -#include "Programme.h" // Forward declarations namespace tinyxml2 @@ -32,7 +22,8 @@ class XMLElement; } -namespace xmltv { +namespace xmltv +{ typedef std::map Schedules; @@ -43,28 +34,25 @@ class Guide { public: - Guide() = default; ~Guide() = default; /** * Creates a guide from the specified XMLTV contents */ - explicit Guide(const tinyxml2::XMLElement *m_content); + explicit Guide(const tinyxml2::XMLElement* m_content); /** * For combining the other guide into this one */ - Guide& operator+= (Guide &other) + Guide& operator+=(Guide& other) { // Add all schedules from the other object - for (auto &entry : other.m_schedules) + for (auto& entry : other.m_schedules) AddSchedule(entry.first, entry.second); // Merge the display name mappings - m_displayNameMappings.insert( - other.m_displayNameMappings.begin(), - other.m_displayNameMappings.end()); + m_displayNameMappings.insert(other.m_displayNameMappings.begin(), other.m_displayNameMappings.end()); return *this; } @@ -74,24 +62,21 @@ * @param channelId the channel name * @param schedule the schedule (ownership is taken) */ - void AddSchedule(const std::string &channelId, SchedulePtr schedule) - { - m_schedules[channelId] = schedule; - } + void AddSchedule(const std::string& channelId, SchedulePtr schedule) { m_schedules[channelId] = schedule; } /** * @param channelId the channel ID * @return the schedule for the specified channel, or nullptr if the * channel has no schedule */ - const SchedulePtr GetSchedule(const std::string &channelId) const; + const SchedulePtr GetSchedule(const std::string& channelId) const; /** * Adds a new mapping between the display name and the channel ID * @param displayName the display name * @param channelId the channel ID */ - void AddDisplayNameMapping(const std::string &displayName, const std::string &channelId) + void AddDisplayNameMapping(const std::string& displayName, const std::string& channelId) { m_displayNameMappings[displayName] = channelId; } @@ -101,7 +86,7 @@ * @param displayName the display name * @return the corresponding channel ID for specified display name */ - std::string GetChannelId(const std::string &displayName) const; + std::string GetChannelId(const std::string& displayName) const; /** * @return all the channel names in the guide @@ -110,7 +95,7 @@ { std::vector channelNames; - for (const auto &mapping : m_displayNameMappings) + for (const auto& mapping : m_displayNameMappings) channelNames.push_back(mapping.first); return channelNames; @@ -119,13 +104,9 @@ /** * @return the schedules */ - const Schedules& GetSchedules() const - { - return m_schedules; - } + const Schedules& GetSchedules() const { return m_schedules; } private: - /** * The schedules */ @@ -135,6 +116,5 @@ * Maps a display name to an XMLTV channel ID */ std::map m_displayNameMappings; - }; -} +} // namespace xmltv diff -Nru kodi-pvr-vbox-4.7.0/src/xmltv/Programme.cpp kodi-pvr-vbox-8.1.0/src/xmltv/Programme.cpp --- kodi-pvr-vbox-4.7.0/src/xmltv/Programme.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/xmltv/Programme.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,35 +1,24 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "Programme.h" + #include "Utilities.h" -#include "lib/tinyxml2/tinyxml2.h" + +#include using namespace xmltv; using namespace tinyxml2; const std::string Programme::STRING_FORMAT_NOT_SUPPORTED = "String format is not supported"; -Programme::Programme(const tinyxml2::XMLElement *xml) - : m_year(0) +Programme::Programme(const tinyxml2::XMLElement* xml) : m_year(0) { // Construct a basic event m_startTime = xmltv::Utilities::GetStdString(xml->Attribute("start")); @@ -37,7 +26,7 @@ m_channelName = Utilities::UrlDecode(xmltv::Utilities::GetStdString(xml->Attribute("channel"))); // Title - const XMLElement *element = xml->FirstChildElement("title"); + const XMLElement* element = xml->FirstChildElement("title"); if (element) m_title = xmltv::Utilities::GetStdString(element->GetText()); // Subtitle @@ -66,8 +55,7 @@ // Categories. Skip "movie" and "series" since most people treat categories // as genres - for (element = xml->FirstChildElement("category"); - element != NULL; element = element->NextSiblingElement("category")) + for (element = xml->FirstChildElement("category"); element != NULL; element = element->NextSiblingElement("category")) { std::string category = xmltv::Utilities::GetStdString(element->GetText()); if (category.empty()) @@ -90,8 +78,8 @@ } // series IDs - for (element = xml->FirstChildElement("episode-num"); - element != NULL; element = element->NextSiblingElement("episode-num")) + for (element = xml->FirstChildElement("episode-num"); element != NULL; + element = element->NextSiblingElement("episode-num")) { std::string seriesId = xmltv::Utilities::GetStdString(element->GetText()); if (seriesId.empty()) @@ -100,20 +88,20 @@ if (systemAttr.empty()) systemAttr = "xmltv_ns"; - m_seriesIds.insert(std::pair(systemAttr, seriesId)); + m_seriesIds.insert(std::pair(systemAttr, seriesId)); } } -void Programme::ParseCredits(const XMLElement *creditsElement) +void Programme::ParseCredits(const XMLElement* creditsElement) { // Actors - for (const XMLElement *element = creditsElement->FirstChildElement("actor"); - element != NULL; element = element->NextSiblingElement("actor")) + for (const XMLElement* element = creditsElement->FirstChildElement("actor"); element != NULL; + element = element->NextSiblingElement("actor")) { Actor actor; - auto *name = element->GetText(); - auto *role = element->Attribute("role"); + auto* name = element->GetText(); + auto* role = element->Attribute("role"); if (name) actor.name = element->GetText(); @@ -124,28 +112,28 @@ } // Directors - for (const XMLElement *element = creditsElement->FirstChildElement("director"); - element != NULL; element = element->NextSiblingElement("director")) + for (const XMLElement* element = creditsElement->FirstChildElement("director"); element != NULL; + element = element->NextSiblingElement("director")) { - auto *director = element->GetText(); + auto* director = element->GetText(); if (director) m_credits.directors.push_back(director); } // Producers - for (const XMLElement *element = creditsElement->FirstChildElement("producer"); - element != NULL; element = element->NextSiblingElement("producer")) + for (const XMLElement* element = creditsElement->FirstChildElement("producer"); element != NULL; + element = element->NextSiblingElement("producer")) { - auto *producer = element->GetText(); + auto* producer = element->GetText(); if (producer) m_credits.producers.push_back(producer); } // Writers - for (const XMLElement *element = creditsElement->FirstChildElement("writer"); - element != NULL; element = element->NextSiblingElement("writer")) + for (const XMLElement* element = creditsElement->FirstChildElement("writer"); element != NULL; + element = element->NextSiblingElement("writer")) { - auto *writer = element->GetText(); + auto* writer = element->GetText(); if (writer) m_credits.writers.push_back(writer); } diff -Nru kodi-pvr-vbox-4.7.0/src/xmltv/Programme.h kodi-pvr-vbox-8.1.0/src/xmltv/Programme.h --- kodi-pvr-vbox-4.7.0/src/xmltv/Programme.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/xmltv/Programme.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,29 +1,18 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * 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 // Forward declarations namespace tinyxml2 @@ -31,7 +20,8 @@ class XMLElement; } -namespace xmltv { +namespace xmltv +{ class Programme; typedef std::shared_ptr ProgrammePtr; @@ -62,7 +52,6 @@ class Programme { public: - /** * Title used by programmes where the VBox cannot figure out the character encoding */ @@ -71,33 +60,18 @@ /** * Creates a programme from the specified element */ - Programme(const tinyxml2::XMLElement *xml); + Programme(const tinyxml2::XMLElement* xml); virtual ~Programme() = default; - const std::vector& GetDirectors() const - { - return m_credits.directors; - } - - const std::vector& GetActors() const - { - return m_credits.actors; - } - - const std::vector& GetProducers() const - { - return m_credits.producers; - } - - const std::vector& GetWriters() const - { - return m_credits.writers; - } - - const std::vector& GetCategories() const - { - return m_categories; - } + const std::vector& GetDirectors() const { return m_credits.directors; } + + const std::vector& GetActors() const { return m_credits.actors; } + + const std::vector& GetProducers() const { return m_credits.producers; } + + const std::vector& GetWriters() const { return m_credits.writers; } + + const std::vector& GetCategories() const { return m_categories; } std::string m_startTime; std::string m_endTime; @@ -111,13 +85,12 @@ std::string m_starRating; private: - /** * Parses the credits from the specified element */ - void ParseCredits(const tinyxml2::XMLElement *creditsElement); + void ParseCredits(const tinyxml2::XMLElement* creditsElement); Credits m_credits; std::vector m_categories; }; -} +} // namespace xmltv diff -Nru kodi-pvr-vbox-4.7.0/src/xmltv/Schedule.cpp kodi-pvr-vbox-8.1.0/src/xmltv/Schedule.cpp --- kodi-pvr-vbox-4.7.0/src/xmltv/Schedule.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/xmltv/Schedule.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,35 +1,23 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "Schedule.h" + +#include "../vbox/ContentIdentifier.h" + #include #include -#include "../vbox/ContentIdentifier.h" using namespace xmltv; -Schedule::Schedule(ChannelPtr& channel) - : m_channel(channel) +Schedule::Schedule(ChannelPtr& channel) : m_channel(channel) { - } void Schedule::AddProgramme(ProgrammePtr programme) @@ -42,10 +30,10 @@ auto it = std::find_if( m_programmes.cbegin(), m_programmes.cend(), - [programmeUniqueId](const ProgrammePtr &programme) - { - return programmeUniqueId == vbox::ContentIdentifier::GetUniqueId(programme.get()); - }); + [programmeUniqueId](const ProgrammePtr& programme) { + return programmeUniqueId == vbox::ContentIdentifier::GetUniqueId(programme.get()); + } + ); if (it != m_programmes.cend()) return *it; @@ -62,13 +50,13 @@ m_programmes.cbegin(), m_programmes.cend(), std::back_inserter(segment), - [startTime, endTime](const ProgrammePtr &programme) - { - time_t programmeStartTime = Utilities::XmltvToUnixTime(programme->m_startTime); - time_t programmeEndTime = Utilities::XmltvToUnixTime(programme->m_endTime); - - return programmeStartTime >= startTime && programmeEndTime <= endTime; - }); + [startTime, endTime](const ProgrammePtr& programme) { + time_t programmeStartTime = Utilities::XmltvToUnixTime(programme->m_startTime); + time_t programmeEndTime = Utilities::XmltvToUnixTime(programme->m_endTime); + + return programmeStartTime >= startTime && programmeEndTime <= endTime; + } + ); return segment; } diff -Nru kodi-pvr-vbox-4.7.0/src/xmltv/Schedule.h kodi-pvr-vbox-8.1.0/src/xmltv/Schedule.h --- kodi-pvr-vbox-4.7.0/src/xmltv/Schedule.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/xmltv/Schedule.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,29 +1,19 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once -#include "Programme.h" #include "Channel.h" -#include +#include "Programme.h" + #include +#include // Visual Studio can't handle type names longer than 255 characters in debug // mode, disable that warning since it's not important @@ -31,7 +21,8 @@ #pragma warning(disable : 4503) #endif -namespace xmltv { +namespace xmltv +{ class Schedule; typedef std::shared_ptr SchedulePtr; @@ -43,12 +34,11 @@ class Schedule { public: - /** * Creates a new schedule * @param the channel this schedule is for */ - Schedule(ChannelPtr &channel); + Schedule(ChannelPtr& channel); /** * Adds the specified programme to the specified channel's schedule @@ -74,21 +64,15 @@ /** * @return the channel this schedule is for */ - const ChannelPtr GetChannel() const - { - return m_channel; - } + const ChannelPtr GetChannel() const { return m_channel; } /** * @return the number of programmes in the schedule */ - size_t GetLength() const - { - return m_programmes.size(); - } + size_t GetLength() const { return m_programmes.size(); } private: Segment m_programmes; ChannelPtr m_channel; }; -} +} // namespace xmltv diff -Nru kodi-pvr-vbox-4.7.0/src/xmltv/Utilities.cpp kodi-pvr-vbox-8.1.0/src/xmltv/Utilities.cpp --- kodi-pvr-vbox-4.7.0/src/xmltv/Utilities.cpp 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/xmltv/Utilities.cpp 2021-01-09 10:03:05.000000000 +0000 @@ -1,31 +1,21 @@ /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ #include "Utilities.h" -#include "lib/tinyxml2/tinyxml2.h" + #include +#include #include -#include #include -#include +#include + +#include using namespace xmltv; @@ -35,50 +25,51 @@ namespace { -// Adapted from https://stackoverflow.com/a/31533119 - -// Conversion from UTC date to second, signed 64-bit adjustable epoch version. -// Written by François Grieu, 2015-07-21; public domain. - -long long MakeTime(int year, int month, int day) -{ - return static_cast(year) * 365 + year / 4 - year / 100 * 3 / 4 + (month + 2) * 153 / 5 + day; -} + // Adapted from https://stackoverflow.com/a/31533119 -long long GetUTCTime(int year, int mon, int mday, int hour, int min, int sec) -{ - int m = mon - 1; - int y = year + 100; + // Conversion from UTC date to second, signed 64-bit adjustable epoch version. + // Written by François Grieu, 2015-07-21; public domain. - if (m < 2) + long long MakeTime(int year, int month, int day) { - m += 12; - --y; + return static_cast(year) * 365 + year / 4 - year / 100 * 3 / 4 + (month + 2) * 153 / 5 + day; } - return (((MakeTime(y, m, mday) - MakeTime(1970 + 99, 12, 1)) * 24 + hour) * 60 + min) * 60 + sec; -} + long long GetUTCTime(int year, int mon, int mday, int hour, int min, int sec) + { + int m = mon - 1; + int y = year + 100; -long long ParseDateTime(const std::string& strDate) -{ - int year = 2000; - int mon = 1; - int mday = 1; - int hour = 0; - int min = 0; - int sec = 0; - char offset_sign = '+'; - int offset_hours = 0; - int offset_minutes = 0; - - std::sscanf(strDate.c_str(), "%04d%02d%02d%02d%02d%02d %c%02d%02d", &year, &mon, &mday, &hour, &min, &sec, &offset_sign, &offset_hours, &offset_minutes); - - long offset_of_date = (offset_hours * 60 + offset_minutes) * 60; - if (offset_sign == '-') - offset_of_date = -offset_of_date; + if (m < 2) + { + m += 12; + --y; + } - return GetUTCTime(year, mon, mday, hour, min, sec) - offset_of_date; -} + return (((MakeTime(y, m, mday) - MakeTime(1970 + 99, 12, 1)) * 24 + hour) * 60 + min) * 60 + sec; + } + + long long ParseDateTime(const std::string& strDate) + { + int year = 2000; + int mon = 1; + int mday = 1; + int hour = 0; + int min = 0; + int sec = 0; + char offset_sign = '+'; + int offset_hours = 0; + int offset_minutes = 0; + + std::sscanf(strDate.c_str(), "%04d%02d%02d%02d%02d%02d %c%02d%02d", &year, &mon, &mday, &hour, &min, &sec, + &offset_sign, &offset_hours, &offset_minutes); + + long offset_of_date = (offset_hours * 60 + offset_minutes) * 60; + if (offset_sign == '-') + offset_of_date = -offset_of_date; + + return GetUTCTime(year, mon, mday, hour, min, sec) - offset_of_date; + } } // unnamed namespace @@ -114,13 +105,12 @@ return (hours * 3600) + (minutes * 60); } -time_t Utilities::XmltvToUnixTime(const std::string &time) +time_t Utilities::XmltvToUnixTime(const std::string& time) { return static_cast(ParseDateTime(time)); } -std::string Utilities::UnixTimeToXmltv(const time_t timestamp, - const std::string tzOffset /* = ""*/) +std::string Utilities::UnixTimeToXmltv(const time_t timestamp, const std::string tzOffset /* = ""*/) { // Adjust the timestamp according to the timezone time_t adjustedTimestamp = timestamp + GetTimezoneAdjustment(tzOffset); @@ -142,8 +132,7 @@ return xmltvTime; } -std::string Utilities::UnixTimeToDailyTime(const time_t timestamp, - const std::string tzOffset /* = ""*/) +std::string Utilities::UnixTimeToDailyTime(const time_t timestamp, const std::string tzOffset /* = ""*/) { // Adjust the timestamp according to the timezone time_t adjustedTimestamp = timestamp + GetTimezoneAdjustment(tzOffset); @@ -168,7 +157,10 @@ for (unsigned int i = 0; i < strURLData.size(); ++i) { int kar = static_cast(strURLData[i]); - if (kar == '+') strResult += ' '; + if (kar == '+') + { + strResult += ' '; + } else if (kar == '%') { if (i < strURLData.size() - 2) @@ -176,8 +168,8 @@ std::string strTmp; strTmp.assign(strURLData.substr(i + 1, 2)); int dec_num = -1; - sscanf(strTmp.c_str(), "%x", reinterpret_cast(&dec_num)); - if (dec_num < 0 || dec_num>255) + sscanf(strTmp.c_str(), "%x", reinterpret_cast(&dec_num)); + if (dec_num < 0 || dec_num > 255) strResult += kar; else { @@ -188,47 +180,52 @@ else strResult += kar; } - else strResult += kar; + else + { + strResult += kar; + } } return strResult; } -int Utilities::QueryIntText(const tinyxml2::XMLElement *element) +int Utilities::QueryIntText(const tinyxml2::XMLElement* element) { int value = 0; if (element->GetText()) { - try { - const char *pText = element->GetText(); + try + { + const char* pText = element->GetText(); if (!pText) throw std::invalid_argument("No text in element"); std::string content = pText; value = std::stoi(content); } - catch (std::invalid_argument) { - + catch (std::invalid_argument) + { } } return value; } -unsigned int Utilities::QueryUnsignedText(const tinyxml2::XMLElement *element) +unsigned int Utilities::QueryUnsignedText(const tinyxml2::XMLElement* element) { unsigned int value = 0; if (element->GetText()) { - try { - const char *pText = element->GetText(); + try + { + const char* pText = element->GetText(); if (!pText) throw std::invalid_argument("No text in element"); std::string content = pText; value = static_cast(std::stoi(content)); } - catch (std::invalid_argument) { - + catch (std::invalid_argument) + { } } @@ -236,7 +233,7 @@ } // Adapted from http://stackoverflow.com/a/17708801 -std::string Utilities::UrlEncode(const std::string &value) +std::string Utilities::UrlEncode(const std::string& value) { std::ostringstream escaped; escaped.fill('0'); @@ -261,15 +258,14 @@ } // Borrowed from http://stackoverflow.com/a/8581865 -std::string Utilities::ConcatenateStringList(const std::vector &vector, - const std::string &separator /* = ", "*/) +std::string Utilities::ConcatenateStringList(const std::vector& vector, + const std::string& separator /* = ", "*/) { std::ostringstream oss; if (!vector.empty()) { - std::copy(vector.begin(), vector.end() - 1, - std::ostream_iterator(oss, separator.c_str())); + std::copy(vector.begin(), vector.end() - 1, std::ostream_iterator(oss, separator.c_str())); oss << vector.back(); } diff -Nru kodi-pvr-vbox-4.7.0/src/xmltv/Utilities.h kodi-pvr-vbox-8.1.0/src/xmltv/Utilities.h --- kodi-pvr-vbox-4.7.0/src/xmltv/Utilities.h 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/src/xmltv/Utilities.h 2021-01-09 10:03:05.000000000 +0000 @@ -1,38 +1,28 @@ -#pragma once /* -* Copyright (C) 2015 Sam Stenvall -* -* 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 XBMC; see the file COPYING. If not, write to -* the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -* MA 02110-1301 USA -* http://www.gnu.org/copyleft/gpl.html -* -*/ + * Copyright (C) 2015-2020 Team Kodi + * Copyright (C) 2015 Sam Stenvall + * https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#pragma once #include #include #include -namespace tinyxml2 { +namespace tinyxml2 +{ class XMLElement; } -namespace xmltv { +namespace xmltv +{ class Utilities { public: - /** * The XMLTV datetime format string */ @@ -64,7 +54,7 @@ * @param time e.g. "20120228001500+0200" * @return a UTC UNIX timestamp */ - static time_t XmltvToUnixTime(const std::string &time); + static time_t XmltvToUnixTime(const std::string& time); /** * Converts a UTC time_t to an XMLTV datetime string, optionally adjusted @@ -88,13 +78,13 @@ * Parses the contents of the specified element into an integer. We need * this for backward-compatibility with older versions of tinyxml2. */ - static int QueryIntText(const tinyxml2::XMLElement *element); + static int QueryIntText(const tinyxml2::XMLElement* element); /** * Parses the contents of the specified element into an unsigned integer. * We need this for backward-compatibility with older versions of tinyxml2. */ - static unsigned int QueryUnsignedText(const tinyxml2::XMLElement *element); + static unsigned int QueryUnsignedText(const tinyxml2::XMLElement* element); /** * URL-encodes the specified string @@ -102,7 +92,7 @@ * @param name the string to encode * @return the encoded string */ - static std::string UrlEncode(const std::string &string); + static std::string UrlEncode(const std::string& string); /** * Decodes the specified URL @@ -110,7 +100,7 @@ * @param name the string to decode * @return the decoded string */ - static std::string UrlDecode(const std::string &string); + static std::string UrlDecode(const std::string& string); /** * Concatenates the contents of vector with the specified separator @@ -118,19 +108,19 @@ * @param separator the separator * @return a concatenated string */ - static std::string ConcatenateStringList(const std::vector &vector, - const std::string &separator = ", "); + static std::string ConcatenateStringList(const std::vector& vector, + const std::string& separator = ", "); /** * Validates the given text (if exists) and returns it as a valid std::string * @cStr the c-style string * @return value is "" if cStr is NULL, and an std::string of the cStr */ - static std::string GetStdString(const char *cStr) + static std::string GetStdString(const char* cStr) { if (cStr) return cStr; return ""; } }; -} +} // namespace xmltv diff -Nru kodi-pvr-vbox-4.7.0/.travis.yml kodi-pvr-vbox-8.1.0/.travis.yml --- kodi-pvr-vbox-4.7.0/.travis.yml 2013-05-31 22:59:22.000000000 +0000 +++ kodi-pvr-vbox-8.1.0/.travis.yml 2021-01-09 10:03:05.000000000 +0000 @@ -3,9 +3,7 @@ # # Define the build matrix # -# Travis defaults to building on Ubuntu Trusty when building on -# Linux. We need Xenial in order to get up to date versions of -# cmake and g++. +# Define the builds to get up to date versions of cmake and gcc # env: global: @@ -14,28 +12,45 @@ matrix: include: - os: linux - dist: xenial + dist: bionic sudo: required compiler: gcc - os: linux - dist: xenial + dist: bionic 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 - - 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 update; 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