From 134e73fe5ce007daac0c34d09ff83b1d6b666a65 Mon Sep 17 00:00:00 2001 From: Brian Wallen Date: Sun, 15 Dec 2024 18:48:03 -0500 Subject: [PATCH] [plugin.video.opentakserver] 1.0.0 --- plugin.video.opentakserver/LICENSE.txt | 619 ++++++++++++++++++ plugin.video.opentakserver/Readme.md | 3 + plugin.video.opentakserver/addon.py | 164 +++++ plugin.video.opentakserver/addon.xml | 25 + .../resources/images/ots-logo.png | Bin 0 -> 48416 bytes .../resources/settings.xml | 9 + 6 files changed, 820 insertions(+) create mode 100644 plugin.video.opentakserver/LICENSE.txt create mode 100644 plugin.video.opentakserver/Readme.md create mode 100644 plugin.video.opentakserver/addon.py create mode 100644 plugin.video.opentakserver/addon.xml create mode 100644 plugin.video.opentakserver/resources/images/ots-logo.png create mode 100644 plugin.video.opentakserver/resources/settings.xml diff --git a/plugin.video.opentakserver/LICENSE.txt b/plugin.video.opentakserver/LICENSE.txt new file mode 100644 index 000000000..281d399f1 --- /dev/null +++ b/plugin.video.opentakserver/LICENSE.txt @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/plugin.video.opentakserver/Readme.md b/plugin.video.opentakserver/Readme.md new file mode 100644 index 000000000..5bfc4987c --- /dev/null +++ b/plugin.video.opentakserver/Readme.md @@ -0,0 +1,3 @@ +# OpenTAKServer Kodi Plugin + +A simple plugin that allows you to watch live streams and recordings from your [OpenTAKServer](https://github.com/brian7704/OpenTAKServer) in [Kodi](https://kodi.tv). \ No newline at end of file diff --git a/plugin.video.opentakserver/addon.py b/plugin.video.opentakserver/addon.py new file mode 100644 index 000000000..aba7aac96 --- /dev/null +++ b/plugin.video.opentakserver/addon.py @@ -0,0 +1,164 @@ +import datetime +import os +import sys +import uuid +from urllib.parse import urlencode, parse_qsl +import requests + +import xbmc +import xbmcgui +import xbmcplugin +import xbmcvfs +import xbmcaddon +from xbmcaddon import Addon +from xbmcvfs import translatePath + +# Get the plugin url in plugin:// notation. +URL = sys.argv[0] +# Get a plugin handle as an integer number. +HANDLE = int(sys.argv[1]) +# Get addon base path +ADDON_PATH = translatePath(Addon().getAddonInfo('path')) +ICONS_DIR = os.path.join(ADDON_PATH, 'resources', 'images', 'icons') +FANART_DIR = os.path.join(ADDON_PATH, 'resources', 'images', 'fanart') +__addon__ = xbmcaddon.Addon(id='plugin.video.opentakserver') +__addondir__ = xbmcvfs.translatePath( __addon__.getAddonInfo('profile')) + +csrf_token = None + + +def get_auth_token_from_file(): + f = xbmcvfs.File(os.path.join(__addondir__, "auth_token"), 'r') + auth_token = f.read() + f.close() + return auth_token + + +def get(url): + auth_token = get_auth_token_from_file() + + r = requests.get(url, params={'auth_token': auth_token}, verify=bool(xbmcplugin.getSetting(HANDLE, "verify_certificates"))) + if r.status_code != 200: + xbmc.log(f"Failed to get {url}: {r.text}", xbmc.LOGERROR) + return r + + +def login(): + r = requests.post(xbmcplugin.getSetting(HANDLE, "server_url") + "/api/login?include_auth_token", + json={'username': xbmcplugin.getSetting(HANDLE, "username"), + 'password': xbmcplugin.getSetting(HANDLE, "password")}) + if r.status_code == 200: + auth_token = r.json()['response']['user']['authentication_token'] + xbmc.log(f"login() {auth_token}", xbmc.LOGINFO) + f = xbmcvfs.File(os.path.join(__addondir__, 'auth_token'), 'w') + f.write(auth_token) + f.close() + else: + dialog = xbmcgui.Dialog() + dialog.notification('Login Failed', 'Check the settings and try again', xbmcgui.NOTIFICATION_INFO, 5000) + + +def format_url(**kwargs): + """ + Create a URL for calling the plugin recursively from the given set of keyword arguments. + + :param kwargs: "argument=value" pairs + :return: plugin call URL + :rtype: str + """ + return '{}?{}'.format(URL, urlencode(kwargs)) + + +def router(paramstring): + """ + Router function that calls other functions + depending on the provided paramstring + + :param paramstring: URL encoded plugin paramstring + :type paramstring: str + """ + params = dict(parse_qsl(paramstring)) + xbmc.log("paramstring " + str(paramstring), xbmc.LOGINFO) + xbmcplugin.setPluginCategory(HANDLE, "OpenTAKServer") + xbmcplugin.setContent(HANDLE, 'videos') + auth_token = get_auth_token_from_file() + + window = xbmcgui.Window(10000) + + # Check the parameters passed to the plugin + if not params: + login() + xbmcplugin.addDirectoryItem(HANDLE, format_url(choice="streams", page="1"), xbmcgui.ListItem(label="Streams"), True) + xbmcplugin.addDirectoryItem(HANDLE, format_url(choice="recordings", page="1"), xbmcgui.ListItem(label="Recordings"), True) + xbmcplugin.endOfDirectory(HANDLE) + + elif params['choice'] == "streams": + page = params["page"] + if not page: + page = 1 + else: + page = int(page) + + if page > 1: + list_item = xbmcgui.ListItem(label="Previous Page") + xbmcplugin.addDirectoryItem(HANDLE, format_url(choice="streams", page=str(page - 1)), list_item, isFolder=True) + + streams = get(xbmcplugin.getSetting(HANDLE, "server_url") + "/api/video_streams").json() + for stream in streams['results']: + list_item = xbmcgui.ListItem(label=stream['path']) + + # The random UUID prevents Kodi from pulling the thumbnail from cache. The server ignores it + thumbnail = xbmcplugin.getSetting(HANDLE, "server_url") + '/api/videos/thumbnail?path={}&random={}&auth_token={} '.format(stream['path'], str(uuid.uuid4()), auth_token) + list_item.setArt({'thumb': thumbnail, 'fanart': thumbnail}) + + xbmcplugin.addDirectoryItem(HANDLE, f"{stream['rtsp_link']}?jwt={auth_token}", list_item, False) + + if page < streams['total_pages']: + list_item = xbmcgui.ListItem(label="Next Page") + xbmcplugin.addDirectoryItem(HANDLE, format_url(choice="streams", page=str(page + 1)), list_item, isFolder=True) + xbmcplugin.endOfDirectory(HANDLE) + + elif params['choice'] == 'recordings': + page = params["page"] + if not page: + page = 1 + else: + page = int(page) + + if page > 1: + list_item = xbmcgui.ListItem(label="Previous Page") + xbmcplugin.addDirectoryItem(HANDLE, format_url(choice="recordings", page=str(page - 1)), list_item, isFolder=True) + + server_url = xbmcplugin.getSetting(HANDLE, "server_url") + recordings = get("{}/api/videos/recordings?page={}".format(server_url, page)) + xbmc.log(recordings.text, xbmc.LOGINFO) + for recording in recordings.json()['results']: + url = "{}/api/videos/recording?id={}&auth_token={}|Cookie=Cookie: ".format(server_url, recording['id'], auth_token) + thumbnail = '{}/api/videos/thumbnail?path={}&recording={}&random={}&auth_token={}'.format(server_url, recording['path'], recording['filename'], str(uuid.uuid4()), auth_token) + list_item = xbmcgui.ListItem(label=recording['path'] + " - " + recording['start_time']) + list_item.setArt({'thumb': thumbnail}) + try: + start_time = datetime.datetime.strptime(recording['start_time'], "%Y-%m-%dT%H:%M:%SZ") + except: + start_time = datetime.datetime.now() + + tag = list_item.getVideoInfoTag() + tag.setDateAdded(start_time.strftime("%Y-%m-%d %H:%M:%S")) + tag.setPremiered(start_time.strftime("%Y-%m-%d %H:%M:%S")) + if recording['duration']: + tag.setDuration(recording['duration']) + xbmcplugin.addDirectoryItem(HANDLE, url, list_item) + + if page < recordings.json()['total_pages']: + list_item = xbmcgui.ListItem(label="Next Page") + xbmcplugin.addDirectoryItem(HANDLE, format_url(choice="recordings", page=str(page + 1)), list_item, isFolder=True) + + xbmcplugin.endOfDirectory(HANDLE) + else: + raise ValueError(f'Invalid paramstring: {paramstring}!') + + +if __name__ == '__main__': + if not xbmcplugin.getSetting(HANDLE, "server_url") or not xbmcplugin.getSetting(HANDLE, "username") or not xbmcplugin.getSetting(HANDLE, "password"): + xbmcaddon.Addon().openSettings() + router(sys.argv[2][1:]) diff --git a/plugin.video.opentakserver/addon.xml b/plugin.video.opentakserver/addon.xml new file mode 100644 index 000000000..19fd70e80 --- /dev/null +++ b/plugin.video.opentakserver/addon.xml @@ -0,0 +1,25 @@ + + + + + + + + video + + + OpenTAKServer Video Plugin + View your OpenTAKServer video streams and recordings in Kodi + GPL-3.0-only + en + https://docs.opentakserver.io + https://github.com/brian7704/OpenTAKServer-Kodi + brian@opentakserver.io + + resources/images/ots-logo.png + + + diff --git a/plugin.video.opentakserver/resources/images/ots-logo.png b/plugin.video.opentakserver/resources/images/ots-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6b515669e15bce725fb29d799182217c44746c29 GIT binary patch literal 48416 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 literal 0 HcmV?d00001 diff --git a/plugin.video.opentakserver/resources/settings.xml b/plugin.video.opentakserver/resources/settings.xml new file mode 100644 index 000000000..b52aa69e2 --- /dev/null +++ b/plugin.video.opentakserver/resources/settings.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file