diff options
author | Alex Waite <Alexqw85@gmail.com> | 2017-01-09 15:31:14 +0100 |
---|---|---|
committer | Alex Waite <Alexqw85@gmail.com> | 2017-01-10 11:04:55 +0100 |
commit | 2e232f12364a1f0a253e0a1f522d5b53f7eda2ec (patch) | |
tree | 47c88eafda614ff530d1fedaa4542abf665ba5a8 | |
parent | f5e966f91c77dde6516858a6e2f03899b7578f77 (diff) |
[plugin.video.nfl.gamepass] 0.10.1
52 files changed, 4974 insertions, 0 deletions
diff --git a/plugin.video.nfl.gamepass/.github/ISSUE_TEMPLATE.md b/plugin.video.nfl.gamepass/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..ec9d878 --- /dev/null +++ b/plugin.video.nfl.gamepass/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,6 @@ +<!--- We do not support setups which attempt to circumvent region restrictions + (proxies, etc) as it is against NFL Game Pass's Terms of Service. --> + +<!--- If you are reporting a bug, please enable debugging (in both Kodi and + the addon's settings) and provide Kodi's log file. For instructions on how + to do this, read http://kodi.wiki/view/Log_file --> diff --git a/plugin.video.nfl.gamepass/.gitignore b/plugin.video.nfl.gamepass/.gitignore new file mode 100644 index 0000000..c678a5e --- /dev/null +++ b/plugin.video.nfl.gamepass/.gitignore @@ -0,0 +1,3 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] diff --git a/plugin.video.nfl.gamepass/LICENSE.txt b/plugin.video.nfl.gamepass/LICENSE.txt new file mode 100644 index 0000000..0580b38 --- /dev/null +++ b/plugin.video.nfl.gamepass/LICENSE.txt @@ -0,0 +1,491 @@ +Files: * +Copyright: 2013-2014, see git for respective authors +License: GPL-2 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + . + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library 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 + 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 + ------------------------------------------------------------------------- + +Files: resources/skins/Default/media/GamePass/background.jpg +Copyright: 2010, charamelody + 2014, Erik Soderblom <erik.soderblom@gmail.com> +License: CC BY-NC 2.0 + THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS + PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR + OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS + LICENSE OR COPYRIGHT LAW IS PROHIBITED. + . + BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE + BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED + HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + . + 1. Definitions + . + "Collective Work" means a work, such as a periodical issue, anthology or + encyclopedia, in which the Work in its entirety in unmodified form, along with a + number of other contributions, constituting separate and independent works in + themselves, are assembled into a collective whole. A work that constitutes a + Collective Work will not be considered a Derivative Work (as defined below) for + the purposes of this License. "Derivative Work" means a work based upon the + Work or upon the Work and other pre-existing works, such as a translation, + musical arrangement, dramatization, fictionalization, motion picture version, + sound recording, art reproduction, abridgment, condensation, or any other form + in which the Work may be recast, transformed, or adapted, except that a work + that constitutes a Collective Work will not be considered a Derivative Work for + the purpose of this License. For the avoidance of doubt, where the Work is a + musical composition or sound recording, the synchronization of the Work in + timed-relation with a moving image ("synching") will be considered a Derivative + Work for the purpose of this License. "Licensor" means the individual or entity + that offers the Work under the terms of this License. "Original Author" means + the individual or entity who created the Work. "Work" means the copyrightable + work of authorship offered under the terms of this License. "You" means an + individual or entity exercising rights under this License who has not previously + violated the terms of this License with respect to the Work, or who has received + express permission from the Licensor to exercise rights under this License + despite a previous violation. + . + 2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or + restrict any rights arising from fair use, first sale or other limitations on + the exclusive rights of the copyright owner under copyright law or other + applicable laws. + . + 3. License Grant. Subject to the terms and conditions of this License, Licensor + hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the + duration of the applicable copyright) license to exercise the rights in the Work + as stated below: + . + to reproduce the Work, to incorporate the Work into one or more Collective + Works, and to reproduce the Work as incorporated in the Collective Works; to + create and reproduce Derivative Works; to distribute copies or phonorecords of, + display publicly, perform publicly, and perform publicly by means of a digital + audio transmission the Work including as incorporated in Collective Works; to + distribute copies or phonorecords of, display publicly, perform publicly, and + perform publicly by means of a digital audio transmission Derivative Works; + . + The above rights may be exercised in all media and formats whether now known or + hereafter devised. The above rights include the right to make such modifications + as are technically necessary to exercise the rights in other media and formats. + All rights not expressly granted by Licensor are hereby reserved, including but + not limited to the rights set forth in Sections 4(d) and 4(e). + . + 4. Restrictions.The license granted in Section 3 above is expressly made subject + to and limited by the following restrictions: + . + You may distribute, publicly display, publicly perform, or publicly + digitally perform the Work only under the terms of this License, and You must + include a copy of, or the Uniform Resource Identifier for, this License with + every copy or phonorecord of the Work You distribute, publicly display, publicly + perform, or publicly digitally perform. You may not offer or impose any terms on + the Work that alter or restrict the terms of this License or the recipients' + exercise of the rights granted hereunder. You may not sublicense the Work. You + must keep intact all notices that refer to this License and to the disclaimer of + warranties. You may not distribute, publicly display, publicly perform, or + publicly digitally perform the Work with any technological measures that control + access or use of the Work in a manner inconsistent with the terms of this + License Agreement. The above applies to the Work as incorporated in a Collective + Work, but this does not require the Collective Work apart from the Work itself + to be made subject to the terms of this License. If You create a Collective + Work, upon notice from any Licensor You must, to the extent practicable, remove + from the Collective Work any reference to such Licensor or the Original Author, + as requested. If You create a Derivative Work, upon notice from any Licensor You + must, to the extent practicable, remove from the Derivative Work any reference + to such Licensor or the Original Author, as requested. You may not exercise any + of the rights granted to You in Section 3 above in any manner that is primarily + intended for or directed toward commercial advantage or private monetary + compensation. The exchange of the Work for other copyrighted works by means of + digital file-sharing or otherwise shall not be considered to be intended for or + directed toward commercial advantage or private monetary compensation, provided + there is no payment of any monetary compensation in connection with the exchange + of copyrighted works. If you distribute, publicly display, publicly perform, or + publicly digitally perform the Work or any Derivative Works or Collective Works, + You must keep intact all copyright notices for the Work and give the Original + Author credit reasonable to the medium or means You are utilizing by conveying + the name (or pseudonym if applicable) of the Original Author if supplied; the + title of the Work if supplied; to the extent reasonably practicable, the Uniform + Resource Identifier, if any, that Licensor specifies to be associated with the + Work, unless such URI does not refer to the copyright notice or licensing + information for the Work; and in the case of a Derivative Work, a credit + identifying the use of the Work in the Derivative Work (e.g., "French + translation of the Work by Original Author," or "Screenplay based on original + Work by Original Author"). Such credit may be implemented in any reasonable + manner; provided, however, that in the case of a Derivative Work or Collective + Work, at a minimum such credit will appear where any other comparable authorship + credit appears and in a manner at least as prominent as such other comparable + authorship credit. + . + For the avoidance of doubt, where the Work is a musical composition: + Performance Royalties Under Blanket Licenses. Licensor reserves the exclusive + right to collect, whether individually or via a performance rights society (e.g. + ASCAP, BMI, SESAC), royalties for the public performance or public digital + performance (e.g. webcast) of the Work if that performance is primarily intended + for or directed toward commercial advantage or private monetary compensation. + Mechanical Rights and Statutory Royalties. Licensor reserves the exclusive right + to collect, whether individually or via a music rights agency or designated + agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the + Work ("cover version") and distribute, subject to the compulsory license created + by 17 USC Section 115 of the US Copyright Act (or the equivalent in other + jurisdictions), if Your distribution of such cover version is primarily intended + for or directed toward commercial advantage or private monetary compensation. + Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the + Work is a sound recording, Licensor reserves the exclusive right to collect, + whether individually or via a performance-rights society (e.g. SoundExchange), + royalties for the public digital performance (e.g. webcast) of the Work, subject + to the compulsory license created by 17 USC Section 114 of the US Copyright Act + (or the equivalent in other jurisdictions), if Your public digital performance + is primarily intended for or directed toward commercial advantage or private + monetary compensation. + . + 5. Representations, Warranties and Disclaimer + . + UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS + THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING + THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT + LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR + PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, + OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME + JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH + EXCLUSION MAY NOT APPLY TO YOU. + . + 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN + NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS + LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. + . + 7. Termination + . + This License and the rights granted hereunder will terminate automatically + upon any breach by You of the terms of this License. Individuals or entities who + have received Derivative Works or Collective Works from You under this License, + however, will not have their licenses terminated provided such individuals or + entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, + and 8 will survive any termination of this License. Subject to the above terms + and conditions, the license granted here is perpetual (for the duration of the + applicable copyright in the Work). Notwithstanding the above, Licensor reserves + the right to release the Work under different license terms or to stop + distributing the Work at any time; provided, however that any such election will + not serve to withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this License will + continue in full force and effect unless terminated as stated above. + . + 8. Miscellaneous + . + Each time You distribute or publicly digitally perform the Work or a + Collective Work, the Licensor offers to the recipient a license to the Work on + the same terms and conditions as the license granted to You under this License. + Each time You distribute or publicly digitally perform a Derivative Work, + Licensor offers to the recipient a license to the original Work on the same + terms and conditions as the license granted to You under this License. If any + provision of this License is invalid or unenforceable under applicable law, it + shall not affect the validity or enforceability of the remainder of the terms of + this License, and without further action by the parties to this agreement, such + provision shall be reformed to the minimum extent necessary to make such + provision valid and enforceable. No term or provision of this License shall be + deemed waived and no breach consented to unless such waiver or consent shall be + in writing and signed by the party to be charged with such waiver or consent. + This License constitutes the entire agreement between the parties with respect + to the Work licensed here. There are no understandings, agreements or + representations with respect to the Work not specified here. Licensor shall not + be bound by any additional provisions that may appear in any communication from + You. This License may not be modified without the mutual written agreement of + the Licensor and You. + +Files: resources/lib/m3u8/* +Copyright: 2012, globo.com webmedia@corp.globo.com +License: Expat + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + . + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/plugin.video.nfl.gamepass/README.md b/plugin.video.nfl.gamepass/README.md new file mode 100644 index 0000000..d2fb448 --- /dev/null +++ b/plugin.video.nfl.gamepass/README.md @@ -0,0 +1,91 @@ +# NFL Game Pass Kodi Plugin # +**version 0.10.1 — Barry Sanders Edition** + +Before reading any further, please understand that this addon is unofficial and +is not endorsed or supported by the NFL in any way. Not all features are +supported (see below) and it should be forever regarded as a beta release. It +may crash, spay your puppy, and/or cause your oven to not heat to 400°F +properly. + +If you're interested in helping out, just drop us an email or send a pull +request. Patches and (constructive) input are always welcome. + +## Any Dependencies? ## + +This addon requires Kodi Jarvis or later. XBMC Helix and Isengard will be +supported for awhile in the "Isengard" branch. + +This addon is in the official Kodi repository, and when installed from there, +all dependencies are installed automatically. However, if you're installing +directly from the source, make sure the following dependencies are installed: + * xmltodict (http://mirrors.kodi.tv/addons/jarvis/script.module.xmltodict/) + * Requests 2.x (http://mirrors.kodi.tv/addons/jarvis/script.module.requests/) + * m3u8 >= 0.2.10 (http://mirrors.kodi.tv/addons/jarvis/script.module.m3u8/) + * which needs iso8601 (http://mirrors.kodi.tv/addons/jarvis/script.module.iso8601/) + +## What is NFL Game Pass? ## + +NFL Game Pass is website that allows those with subscriptions to watch NFL +games. Archives of old games stretch back to 2009, coaches film (22 man view) is +available, as is audio from each team's radio network. Overall, it is a sweet +service offered by the NFL for those of us who must have our American Football +fix. + +## What is Game Pass Domestic? ## + +NFL Game Pass Domestic is the USA (and parts of Canada and UK) version of Game +Pass, but the service is blacked out during live games. Previously it lacked +other features, but with the mid-2015 revamping of their service, it seems the +two services have mostly converged (though we have yet to find a side-by-side +comparison). + +As most/all of the current developers are located outside of the Domestic +regions, testing, bug reports, and patches from Game Pass Domestic subscribers +is most appreciated. + +## Why write a plugin for Kodi? ## + +First off, we love Kodi and prefer consuming media through its interface. +Secondly, while there is a nice Flash interface, it's... well... written in +Flash. It's heavy, has limited browser support, and includes a bunch of bells +and whistles (social media, for example) that are simply distracting. We're here +to watch a game, nothing else. + +## What features are currently supported? ## + +By now, most core features are supported. + + * Archived games from 2011 to 2014 (both full and condensed) + * Live games + * Coaches Film (22 man view) + * NFL Network - Live + * A Football Life + * NFL Films Presents + * NFL Gameday + * Playbook + * NFL RedZone Archives + * NFL RedZone - Live + * Sound FX + * Super Bowl Archives + * Top 100 Players + * NFL Total Access + +Currently unsupported features: + * Archived games prior to 2011 + * Alternate team audio + * Coaches Show + +## Release names ## + +Want a release to be named after your player/coach of choice? Contribute to the +project in some way (code, art, debugging, beer, brazen — yet effective — +flattery, etc), and we'll gladly name a future release after them. + +## Roadmap ## + +A rough roadmap follows: + +* Kodi v17 (Krypton) Support +* Continue work towards feature completeness +* Stabilize Game Pass Domestic support +* Code cleanup diff --git a/plugin.video.nfl.gamepass/__init__.py b/plugin.video.nfl.gamepass/__init__.py new file mode 100644 index 0000000..da553a5 --- /dev/null +++ b/plugin.video.nfl.gamepass/__init__.py @@ -0,0 +1 @@ +# dummy file to init the directory
\ No newline at end of file diff --git a/plugin.video.nfl.gamepass/addon.xml b/plugin.video.nfl.gamepass/addon.xml new file mode 100644 index 0000000..707bc65 --- /dev/null +++ b/plugin.video.nfl.gamepass/addon.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<!-- Though the id says this is a plugin, it's actually a script (see extension + point). The addon started as a plugin, but became a script when it was + converted to a skinned addon. It is left unchanged so that users aren't + marooned on an old version. --> +<addon id="plugin.video.nfl.gamepass" + name="NFL Game Pass" + version="0.10.1" + provider-name="Alexqw,divingmule,BaumSchorle,eriksoderblom"> + <requires> + <import addon="xbmc.python" version="2.25.0"/> + <import addon="script.module.m3u8" version="0.2.10"/> + <import addon="script.module.requests" version="2.7.0"/> + <import addon="script.module.xmltodict" version="0.9.0"/> + <import addon="xbmc.gui" version="5.12.0"/> + </requires> + <extension point="xbmc.python.script" library="default.py"> + <provides>video</provides> + </extension> + <extension point="xbmc.addon.metadata"> + <summary lang="en">NFL Game Pass</summary> + <description lang="en">Watch NFL Game Pass streams.</description> + <platform>all</platform> + <language>en</language> + <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license> + <source>https://github.com/aqw/xbmc-gamepass</source> + <forum></forum> + <disclaimer lang="en">This addon requires you to have a subscription to NFL Game Pass.[CR]Please note that these subscriptions are region restricted by the NFL.[CR]This addon is completely unofficial and is /not/ endorsed by the NFL in any way.</disclaimer> + <news>2017.01.09 v0.10.1 -- Barry Sanders Edition + + Update for Krypton + + New Translations: Russian and Ukrainian + + Domestic users can now access NFL Network + </news> + <assets> + <icon>resources/art/icon.png</icon> + <fanart>resources/art/fanart.jpg</fanart> + </assets> + </extension> +</addon> diff --git a/plugin.video.nfl.gamepass/changelog.txt b/plugin.video.nfl.gamepass/changelog.txt new file mode 100644 index 0000000..7ca0193 --- /dev/null +++ b/plugin.video.nfl.gamepass/changelog.txt @@ -0,0 +1,210 @@ +2017.01.10 v0.10.1 -- Barry Sanders Edition ++ Bug fix caught by Kodi's Pull Request code checks. :-) + +2017.01.09 v0.10.0 -- Barry Sanders Edition ++ Update for Krypton ++ Update logging for Krypton (emilsvennesson) ++ Nicely inform user when week info isn't available yet ++ New Translations: Russian and Ukrainian (Igor Davydenko) ++ Domestic users can now access NFL Network ++ RedZone content is now acquired dynamically, like all other resources ++ Assorted cleanup + +2016.08.25 v0.9.2 -- Jimmy Johnson Edition ++ New Translation: Japanese (David Maiorino) ++ UI Fix: "Upcoming" game text overlapped with the game time (aqw) ++ The Rams are now correctly shown as the LA Rams (kaileu) ++ Autodetect subscription type; merge Domestic/International settings (emilsvennesson) ++ Show more informative dialogs in common error situations (emilsvennesson and aqw) ++ Bug fix: Game time wasn't localizing (aqw) ++ Removed last of the "Sans Login" setting; hasn't been used in two years (aqw) ++ Unbundle m3u8 as a dependency; use the one in the Kodi repos (aqw, emilsvennesson) ++ Slightly higher res team logos (kaileu) ++ Canceling bitrate/gametype dialogs will now (correctly) cancel and return to ++ the UI rather than start playing a game (emilsvennesson) ++ Assorted small improvements (aqw) + +2016.07.29 v0.9.1 -- Bart Starr Edition ++ Shows are now acquired dynamically (BaumSchorle) ++ This means new shows will be available immediately. However, Game Pass has ++ many ways of providing shows, so new shows may not always /work/ right away. ++ Game Pass Resource URLs (most of them) are now acquired dynamically (kaileu) ++ This means the addon should be more resilient to Game Pass service changes. ++ UI Fix: Blacked-Out games are now marked as non-playable (BaumSchorle) ++ Bug Fix: an empty season crashes the add-on (BaumSchorle) ++ Assorted small improvements (aqw) + +2015.12.02 v0.9.0 -- Charles Woodson Edition ++ Add support for Jarvis; drop Helix and Isengard + +2015.12.02 v0.8.1 -- Brett Favre Edition ++ Add NFL Honors and some old seasons (2010-2011) of other shows ++ Dropped non-functioning old (< 2014) NFL Total Access seasons ++ Make RedZone button show even when in "pre" mode ++ Fix proxy protocol selection (thanks to maguire for reporting) ++ Cleanup method to detect running games (kaileu) ++ Assorted small improvements + +2015.08.27 v0.8.0 -- Julius Peppers Edition ++ Fix regression; can now watch streams for more than ~20 minutes on all platforms ++ Replace Game Rewind with Game Pass Domestic ++ Preliminary Support (please report any bugs) ++ Renamed Game Pass to Game Pass International ++ New Logos for Game Pass Domestic and International (eriksoderblom) ++ Bug fix: Games after 2015 preseason Week 1 wouldn't play (kaileu) ++ Bump required version of Requests to 2.7.0 ++ Small improvements to debugging ++ Code cleanup + +2015.08.17 v0.7.4 -- Pete Carroll Edition ++ Revert skinutils font hack ++ New GamePass-only icon (eriksoderblom) ++ The NFL replaced Game Rewind with the "Game Pass Domestic" service ++ Correctly identify as a script now instead of a plugin (BaumSchorle) ++ Fixes an issue with not being able to exit the addon when using a shortcut ++ Code Cleanup (aqw) + +2015.08.13 v0.7.3 -- (Unreleased) ++ Add 2015 Season for Shows (kaileu) ++ 1080i skin (eriksoderblom) ++ Assorted bug fixes and tweaks (mostly for previous release's features) + +2015.08.11 v0.7.2 -- (Unreleased) ++ All streams now use same method (publishpoint) to play (kaileu) ++ fixes RedZone, TotalAccess, and likely a few other shows ++ Fix (mostly) font issues in non-Confluence skins (BaumSchorle) ++ Language Fixes/Clarifications (dmaiorino and aqw) ++ Translation: Update Dutch Translation (Vulpecula) ++ Bug fix: Coaches Tape XML now handles both UTF and ASCII (kaileu) ++ Bug fix: Close any open busy-dialogs before launching addon (aqw) ++ Code cleanup (aqw) + +2015.01.23 v0.7.1 -- Brian Urlacher Edition ++ Bug fix: Support Pro Bowl (kaileu) + +2015.01.09 v0.7.0 -- Kurt Warner Edition ++ Support for HTTP proxies (timewasted) ++ Direct support in lib/pigskin ++ Support via Kodi in the addon's settings ++ Skin support for Helix (eriksoderblom) ++ Reflect upstream rename from XBMC to Kodi (aqw) ++ Dropped support for Gotham and earlier + +2014.11.10 v0.6.0 -- Dan Marino Edition ++ New Feature: Coaches Film (22 man view) (BaumSchorle) ++ Interface work (BaumSchorle and eriksoderblom) ++ New Feature: Super Bowl Archives (BaumSchorle) ++ New Feature/Setting: Hide Game Duration (Veronit) ++ New Feature/Setting: Display time in 12 or 24 hour clock (dahlSTROM) ++ Bug fix: Hard Knocks 2013 fixed (BaumSchorle) ++ Bug fix: UTF-8 issues (aqw) ++ Split settings page into categories (eriksoderblom) ++ Unify stream logic so all use publishpoint (BaumSchorle) ++ New internal dependency: m3u8 ++ Assorted bug fixes ++ Code cleanup + +2014.08.03 v0.5.2 -- Reggie White "The Minister of Defense" Edition ++ Bug fix: Visually distinguish selected past week from unselected future week (eriksoderblom) ++ Bug fix: Skin opened despite login failure (aqw) ++ Bug fix: Playing Total Access 2014 froze addon (aqw) ++ Bug fix: Check for successful login without a subscription (aqw) ++ Bug fix: Fixed top-level click for Game Rewind (aqw) ++ Core module is now fully XBMC independent (aqw) ++ Code cleanup + +2014.07.28 v0.5.1 -- Tom Landry Edition ++ New Feature: Settings now available from within the skin (eriksoderblom) ++ New Setting: Localize game times (BaumSchorle) ++ Bug fix: First archived game played was wrong game (BaumSchorle) ++ Bug fix: Sometimes busy dialog wouldn't close when playing (BaumSchorle) ++ Bug fix: UI glitch playing Network-Live after browsing games (BaumSchorle) ++ Bug fix: XBMC on OpenElec wouldn't play archived games/shows (aqw) ++ Bug fix: Future weeks weren't greyed out (aqw) ++ Bug fix: Anything caching related; now always fresh data on addon start (aqw) ++ Bug fix: Super Bowl Archives now lists under all seasons (aqw) ++ Dropped dependency: plugin.cache (aka StorageServer) ++ Assorted performance improvements ++ Code/image cleanup + +2014.07.23 v0.5.0 -- Jerry Rice Edition ++ New Feature: Skin Interface! (BaumSchorle and eriksoderblom) ++ Tons of new features ++ Games now include team logos ++ Future/unplayable games are greyed out ++ New artwork ++ New background (original image by charamelody) ++ Bug fix: Some archived games wouldn't play. (aqw) ++ Will now prompt if preferred stream bitrate isn't available (aqw) ++ Many small performance improvements (aqw) ++ Significant code refactoring (aqw) + +2014.07.11 v0.4.0 -- "Doomsday Defense" Edition ++ New Feature: Support for Hard Knocks (thanks to BaumSchorle) ++ Bug fix: Top 100 Players works again (thanks to BaumSchorle) ++ Bug fix: cache didn't expire correctly (thanks to eriksoderblom) ++ New Translation: German (thanks to Ralph Schön) ++ Translations ported from XML to po (thanks to eriksoderblom) ++ Migrated from urllib2 to Requests (aqw) ++ New dependency: Requests2 ++ Code cleanup + +2014.05.16 v0.3.1 -- Vince Lombardi Edition ++ New Game Pass/Rewind icon (thanks to dahlSTROM) ++ Bug fix: workaround Android crash ++ Bug fix: RedZone live should work again (thanks to msoderberg) ++ Bug fix: fix service check for Rewind ++ Bug fix: display live games properly ++ Big fix: Fix live NFL Network streams (thanks to BaumSchorle) + +2013.09.20 v0.3.0 -- Don Shula Edition ++ New Feature: Initial Game Rewind support ++ New Setting: Choose Subscription (Game Pass vs Game Rewind) ++ New Feature: NFL Films Presents (thanks to msoderberg!) ++ New Feature: NFL RedZone Live (untested) (thanks to msoderberg!) ++ New Feature: Condensed Games (thanks to msoderberg!) ++ New Setting: Preferred Game Version (Full vs Condensed stream) ++ Updated Dutch locale (thanks to Vulpecula-nl!) ++ Bug fix: starting new streams after lengthy watching of another stream should be more robust ++ More strings localized ++ XML/HTML parsing cleanup ++ Major code refactoring ++ New dependency: xmltodict + +2013.09.13 v0.2.0 -- Donald Driver Edition +Credit goes to divingmule for most of the features added below. ++ New Feature: Live games work (Gotham only) ++ New Feature: NFL Network - Live (Gotham only) ++ New Feature: NFL Total Access ++ New Feature: Sound FX ++ New Feature: NFL Gameday ++ New Feature: NFL RedZone (thanks to msoderberg!) ++ New Feature: Playbook ++ New Feature: A Football Life ++ New Translation: Dutch (thanks to Vulpecula-nl!) ++ New fanart (thanks to dahlSTROM!) ++ Modified Setting: 'Always use best bitrate" is now "Preferred Stream Quality," ++ which lists possible stream values. ++ Untested Features: Superbowl Archives, Top 100 Players, Coaches Show ++ Future games now have date and time listed ++ Live games are noted as such in the interface + +2013.08.25 v0.1.3 ++ Bug fix: Super Bowl weeks now list properly. ++ Bug fix: Older streams now list (but don't necessarily play) properly. ++ Bug fix: Duration is now still calculated after the first dir listing. ++ Bug fix: Fixed misleading popup when login failed ++ New Setting: "Sans Login Region" for those who live in countries where Game Pass is free. + +2013.08.24 v0.1.2 ++ Bug fix. All 16 games (rather than 15) are listed now. ++ New Setting: Always use best bitrate + +2013.08.19 v0.1.1 ++ Critical bug fix. Streams play again. + +2013.08.18 v0.1.0 ++ Initial development release (divingmule, aqw) ++ Only supports normal game streams (no coaches film, NFL TV, etc) ++ Can select stream bit rate ++ Sexy icon (thanks to dahlSTROM!) diff --git a/plugin.video.nfl.gamepass/default.py b/plugin.video.nfl.gamepass/default.py new file mode 100644 index 0000000..7950cf9 --- /dev/null +++ b/plugin.video.nfl.gamepass/default.py @@ -0,0 +1,629 @@ +# -*- coding: utf-8 -*- +""" +A Kodi addon/skin for NFL Game Pass +""" +import calendar +from datetime import datetime +import os +import sys +import time +from traceback import format_exc + +import xbmc +import xbmcaddon +import xbmcgui +import xbmcvfs + +from resources.lib.pigskin import pigskin + +addon = xbmcaddon.Addon() +language = addon.getLocalizedString +ADDON_PATH = xbmc.translatePath(addon.getAddonInfo('path')) +ADDON_PROFILE = xbmc.translatePath(addon.getAddonInfo('profile')) +LOGGING_PREFIX = '[%s-%s]' % (addon.getAddonInfo('id'), addon.getAddonInfo('version')) + +if not xbmcvfs.exists(ADDON_PROFILE): + xbmcvfs.mkdir(ADDON_PROFILE) + +cookie_file = os.path.join(ADDON_PROFILE, 'cookie_file') +username = addon.getSetting('email') +password = addon.getSetting('password') + +proxy_config = None +if addon.getSetting('proxy_enabled') == 'true': + proxy_config = { + 'scheme': addon.getSetting('proxy_scheme'), + 'host': addon.getSetting('proxy_host'), + 'port': addon.getSetting('proxy_port'), + 'auth': { + 'username': addon.getSetting('proxy_username'), + 'password': addon.getSetting('proxy_password'), + }, + } + if addon.getSetting('proxy_auth') == 'false': + proxy_config['auth'] = None + +gp = pigskin(proxy_config, cookie_file=cookie_file, debug=True) + + +def addon_log(string): + msg = '%s: %s' % (LOGGING_PREFIX, string) + xbmc.log(msg=msg, level=xbmc.LOGDEBUG) + + +class GamepassGUI(xbmcgui.WindowXML): + def __init__(self, *args, **kwargs): + self.season_list = None + self.season_items = [] + self.clicked_season = -1 + self.weeks_list = None + self.weeks_items = [] + self.clicked_week = -1 + self.games_list = None + self.games_items = [] + self.clicked_game = -1 + self.live_list = None + self.live_items = [] + self.selected_season = '' + self.selected_week = '' + self.main_selection = None + self.player = None + self.list_refill = False + self.focusId = 100 + self.seasons_and_weeks = gp.get_seasons_and_weeks() + + xbmcgui.WindowXML.__init__(self, *args, **kwargs) + self.action_previous_menu = (9, 10, 92, 216, 247, 257, 275, 61467, 61448) + + def onInit(self): # pylint: disable=invalid-name + self.window = xbmcgui.Window(xbmcgui.getCurrentWindowId()) + self.season_list = self.window.getControl(210) + self.weeks_list = self.window.getControl(220) + self.games_list = self.window.getControl(230) + self.live_list = self.window.getControl(240) + + if gp.subscription == 'domestic': + self.window.setProperty('domestic', 'true') + + if self.list_refill: + self.season_list.reset() + self.season_list.addItems(self.season_items) + self.weeks_list.reset() + self.weeks_list.addItems(self.weeks_items) + self.games_list.reset() + self.games_list.addItems(self.games_items) + self.live_list.reset() + self.live_list.addItems(self.live_items) + else: + self.window.setProperty('NW_clicked', 'false') + self.window.setProperty('GP_clicked', 'false') + + xbmc.executebuiltin("Dialog.Close(busydialog)") + + try: + self.setFocus(self.window.getControl(self.focusId)) + except: + addon_log('Focus not possible: %s' % self.focusId) + + def coloring(self, text, meaning): + """Return the text wrapped in appropriate color markup.""" + if meaning == "disabled": + color = "FF000000" + elif meaning == "disabled-info": + color = "FF111111" + colored_text = "[COLOR=%s]%s[/COLOR]" % (color, text) + return colored_text + + def display_seasons(self): + """List seasons""" + self.season_items = [] + for season in sorted(self.seasons_and_weeks.keys(), reverse=True): + listitem = xbmcgui.ListItem(season) + self.season_items.append(listitem) + + self.season_list.addItems(self.season_items) + + def display_nfln_seasons(self): + """List seasons""" + self.season_items = [] + # sort so that years are first (descending) followed by text + for season in sorted(gp.nflnSeasons, key=lambda x: (x[0].isdigit(), x), reverse=True): + listitem = xbmcgui.ListItem(season) + self.season_items.append(listitem) + + self.season_list.addItems(self.season_items) + + def display_nfl_network_archive(self): + """List shows for a given season""" + self.weeks_items = [] + shows = gp.get_shows(self.selected_season) + for show_name in shows: + listitem = xbmcgui.ListItem(show_name) + self.weeks_items.append(listitem) + + self.weeks_list.addItems(self.weeks_items) + + def display_weeks_games(self): + """Show games for a given season/week""" + self.games_items = [] + games = gp.get_weeks_games(self.selected_season, self.selected_week) + + date_time_format = '%Y-%m-%dT%H:%M:%S.000' + if games: + for game in games: + if game['homeTeam']['id'] is None: # sometimes the first item is empty + continue + + game_info = '' + game_id = game['id'] + game_versions = [] + isPlayable = 'true' + isBlackedOut = 'false' + home_team = game['homeTeam'] + away_team = game['awayTeam'] + + # Pro-bowl doesn't have a team "name" only a team city, which is the + # team name... wtf + if game['homeTeam']['name'] is None: + game_name_shrt = '[B]%s[/B] at [B]%s[/B]' % (away_team['city'], home_team['city']) + game_name_full = game_name_shrt + else: + game_name_shrt = '[B]%s[/B] at [B]%s[/B]' % (away_team['name'], home_team['name']) + game_name_full = '[B]%s %s[/B] at [B]%s %s[/B]' % (away_team['city'], away_team['name'], home_team['city'], home_team['name']) + + for key, value in {'Condensed': 'condensedId', 'Full': 'programId'}.items(): + if value in game: + game_versions.append(key) + + if 'isLive' in game: + game_versions.append('Live') + + if 'gameEndTimeGMT' in game: + # Show game duration only if user wants to see it + if addon.getSetting('hide_game_length') == 'false': + try: + start_time = datetime(*(time.strptime(game['gameTimeGMT'], date_time_format)[0:6])) + end_time = datetime(*(time.strptime(game['gameEndTimeGMT'], date_time_format)[0:6])) + game_info = 'Final [CR] Duration: %s' % time.strftime('%H:%M:%S', time.gmtime((end_time - start_time).seconds)) + except: + addon_log(format_exc()) + if 'result' in game: + game_info = 'Final' + else: + game_info = 'Final' + else: + if 'isLive' in game: + game_info = '» Live «' + + try: + if addon.getSetting('local_tz') == '0': # don't localize + game_datetime = datetime(*(time.strptime(game['date'], date_time_format)[0:6])) + game_info = game_datetime.strftime('%A, %b %d - %I:%M %p') + else: + game_gmt = time.strptime(game['gameTimeGMT'], date_time_format) + secs = calendar.timegm(game_gmt) + game_local = time.localtime(secs) + + if addon.getSetting('local_tz') == '1': # localize and use 12-hour clock + game_info = time.strftime('%A, %b %d - %I:%M %p', game_local) + else: # localize and use 24-hour clock + game_info = time.strftime('%A, %b %d - %H:%M', game_local) + except: # all else fails, just use their raw date value + game_datetime = game['date'].split('T') + game_info = game_datetime[0] + '[CR]' + game_datetime[1].split('.')[0] + ' ET' + + if 'hasProgram' not in game: # if subscription doesn't allow + isPlayable = 'false' + game_name_full = self.coloring(game_name_full, "disabled") + game_name_shrt = self.coloring(game_name_shrt, "disabled") + game_info = self.coloring(game_info, "disabled-info") + + try: + if game['blocked'] == 'true': + isPlayable = 'false' + isBlackedOut = 'true' + game_info = '» Blacked Out «' + game_name_full = self.coloring(game_name_full, "disabled") + game_name_shrt = self.coloring(game_name_shrt, "disabled") + game_info = self.coloring(game_info, "disabled-info") + except KeyError: + pass + + listitem = xbmcgui.ListItem(game_name_shrt, game_name_full) + listitem.setProperty('away_thumb', 'http://i.nflcdn.com/static/site/7.4/img/logos/teams-matte-144x96/%s.png' % away_team['id']) + listitem.setProperty('home_thumb', 'http://i.nflcdn.com/static/site/7.4/img/logos/teams-matte-144x96/%s.png' % home_team['id']) + listitem.setProperty('game_info', game_info) + listitem.setProperty('is_game', 'true') + listitem.setProperty('is_show', 'false') + listitem.setProperty('isPlayable', isPlayable) + listitem.setProperty('isBlackedOut', isBlackedOut) + listitem.setProperty('game_id', game_id) + listitem.setProperty('game_date', game['date'].split('T')[0]) + listitem.setProperty('game_versions', ' '.join(game_versions)) + self.games_items.append(listitem) + + self.games_list.addItems(self.games_items) + + else: + dialog = xbmcgui.Dialog() + dialog.ok(language(30021), language(30046)) + + def display_seasons_weeks(self): + """List weeks for a given season""" + weeks = self.seasons_and_weeks[self.selected_season] + + for week_code, week in sorted(weeks.iteritems()): + future = 'false' + try: + # convert EST to GMT by adding 6 hours + week_date = week['@start'] + ' 06:00' + # avoid super annoying bug http://forum.kodi.tv/showthread.php?tid=112916 + week_datetime = datetime(*(time.strptime(week_date, '%Y%m%d %H:%M')[0:6])) + now_datetime = datetime.utcnow() + + if week_datetime > now_datetime: + future = 'true' + except KeyError: # some old seasons don't provide week dates + pass + + listitem = xbmcgui.ListItem(week['@label'].title()) + listitem.setProperty('week_code', week_code) + listitem.setProperty('future', future) + self.weeks_items.append(listitem) + self.weeks_list.addItems(self.weeks_items) + + def display_shows_episodes(self, show_name, season): + """Show episodes for a given season/show""" + self.games_items = [] + items = gp.get_shows_episodes(show_name, season) + + for i in items: + try: + listitem = xbmcgui.ListItem('[B]%s[/B]' % show_name) + listitem.setProperty('game_info', i['name']) + listitem.setProperty('away_thumb', gp.image_url + i['image']) + listitem.setProperty('url', i['publishPoint']) + listitem.setProperty('id', i['id']) + listitem.setProperty('type', i['type']) + listitem.setProperty('is_game', 'false') + listitem.setProperty('is_show', 'true') + listitem.setProperty('isPlayable', 'true') + self.games_items.append(listitem) + except: + addon_log('Exception adding archive directory: %s' % format_exc()) + addon_log('Directory name: %s' % i['name']) + self.games_list.addItems(self.games_items) + + def play_url(self, url): + xbmc.executebuiltin("Dialog.Close(busydialog)") + self.list_refill = True + xbmc.Player().play(url) + + def init(self, level): + if level == 'season': + self.weeks_items = [] + self.weeks_list.reset() + self.games_list.reset() + self.clicked_week = -1 + self.clicked_game = -1 + + if self.clicked_season > -1: # unset previously selected season + self.season_list.getListItem(self.clicked_season).setProperty('clicked', 'false') + + self.season_list.getSelectedItem().setProperty('clicked', 'true') + self.clicked_season = self.season_list.getSelectedPosition() + elif level == 'week/show': + self.games_list.reset() + self.clicked_game = -1 + + if self.clicked_week > -1: # unset previously selected week/show + self.weeks_list.getListItem(self.clicked_week).setProperty('clicked', 'false') + + self.weeks_list.getSelectedItem().setProperty('clicked', 'true') + self.clicked_week = self.weeks_list.getSelectedPosition() + elif level == 'game/episode': + if self.clicked_game > -1: # unset previously selected game/episode + self.games_list.getListItem(self.clicked_game).setProperty('clicked', 'false') + + self.games_list.getSelectedItem().setProperty('clicked', 'true') + self.clicked_game = self.games_list.getSelectedPosition() + + def ask_bitrate(self, bitrates): + """Presents a dialog for user to select from a list of bitrates. + Returns the value of the selected bitrate. + """ + options = [] + for bitrate in bitrates: + options.append(bitrate + ' Kbps') + dialog = xbmcgui.Dialog() + xbmc.executebuiltin("Dialog.Close(busydialog)") + ret = dialog.select(language(30003), options) + if ret > -1: + return bitrates[ret] + else: + return None + + def select_bitrate(self, manifest_bitrates=None): + """Returns a bitrate, while honoring the user's /preference/.""" + bitrate_setting = int(addon.getSetting('preferred_bitrate')) + bitrate_values = ['4500', '3000', '2400', '1600', '1200', '800', '400'] + + highest = False + preferred_bitrate = None + if bitrate_setting == 0: # 0 === "highest" + highest = True + elif 0 < bitrate_setting and bitrate_setting < 8: # a specific bitrate. '8' === "ask" + preferred_bitrate = bitrate_values[bitrate_setting - 1] + + if manifest_bitrates: + manifest_bitrates.sort(key=int, reverse=True) + if highest: + return manifest_bitrates[0] + elif preferred_bitrate and preferred_bitrate in manifest_bitrates: + return preferred_bitrate + else: # ask user + return self.ask_bitrate(manifest_bitrates) + else: + if highest: + return bitrate_values[0] + elif preferred_bitrate: + return preferred_bitrate + else: # ask user + return self.ask_bitrate(bitrate_values) + + def select_version(self, game_versions): + """Returns a game version, while honoring the user's /preference/. + Note: the full version is always available but not always the condensed. + """ + preferred_version = int(addon.getSetting('preferred_game_version')) + + # user wants to be asked to select version + if preferred_version == 2: + versions = [language(30014)] + if 'Condensed' in game_versions: + versions.append(language(30015)) + if 'Coach' in game_versions: + versions.append(language(30032)) + dialog = xbmcgui.Dialog() + xbmc.executebuiltin("Dialog.Close(busydialog)") + preferred_version = dialog.select(language(30016), versions) + + if preferred_version == 1 and 'Condensed' in game_versions: + game_version = 'condensed' + elif preferred_version == 2 and 'Coach' in game_versions: + game_version = 'coach' + else: + game_version = 'archive' + + if preferred_version > -1: + return game_version + else: + return None + + def onFocus(self, controlId): # pylint: disable=invalid-name + # save currently focused list + if controlId in [210, 220, 230, 240]: + self.focusId = controlId + + def onClick(self, controlId): # pylint: disable=invalid-name + try: + xbmc.executebuiltin("ActivateWindow(busydialog)") + if controlId in [110, 120, 130]: + self.games_list.reset() + self.weeks_list.reset() + self.season_list.reset() + self.live_list.reset() + self.games_items = [] + self.weeks_items = [] + self.live_items = [] + self.clicked_game = -1 + self.clicked_week = -1 + self.clicked_season = -1 + + if controlId in [110, 120]: + self.main_selection = 'GamePass' + self.window.setProperty('NW_clicked', 'false') + self.window.setProperty('GP_clicked', 'true') + + # display games of current week for usability purposes + cur_s_w = gp.get_current_season_and_week() + self.selected_season = cur_s_w.keys()[0] + self.selected_week = cur_s_w.values()[0] + self.display_seasons() + + try: + self.display_seasons_weeks() + self.display_weeks_games() + except: + addon_log('Error while reading seasons weeks and games') + elif controlId == 130: + self.main_selection = 'NFL Network' + self.window.setProperty('NW_clicked', 'true') + self.window.setProperty('GP_clicked', 'false') + + listitem = xbmcgui.ListItem('NFL Network - Live', 'NFL Network - Live') + self.live_items.append(listitem) + + if gp.redzone_on_air(): + listitem = xbmcgui.ListItem('NFL RedZone - Live', 'NFL RedZone - Live') + self.live_items.append(listitem) + + self.live_list.addItems(self.live_items) + self.display_nfln_seasons() + + xbmc.executebuiltin("Dialog.Close(busydialog)") + return + + if self.main_selection == 'GamePass': + if controlId == 210: # season is clicked + self.init('season') + self.selected_season = self.season_list.getSelectedItem().getLabel() + + self.display_seasons_weeks() + elif controlId == 220: # week is clicked + self.init('week/show') + self.selected_week = self.weeks_list.getSelectedItem().getProperty('week_code') + + self.display_weeks_games() + elif controlId == 230: # game is clicked + selectedGame = self.games_list.getSelectedItem() + if selectedGame.getProperty('isPlayable') == 'true': + self.init('game/episode') + game_id = selectedGame.getProperty('game_id') + game_versions = selectedGame.getProperty('game_versions') + + if 'Live' in game_versions: + if 'Final' in selectedGame.getProperty('game_info'): + game_version = self.select_version(game_versions) + if game_version == 'archive': + game_version = 'dvr' + else: + game_version = 'live' + else: + # Check for coaches film availability + if gp.check_for_coachestape(game_id, self.selected_season): + game_versions = game_versions + ' Coach' + + game_version = self.select_version(game_versions) + if game_version: + if game_version == 'coach': + xbmc.executebuiltin("ActivateWindow(busydialog)") + coachesItems = [] + game_date = selectedGame.getProperty('game_date').replace('-', '/') + self.playBackStop = False + + play_stream = gp.get_coaches_url(game_id, game_date, 'dummy') + plays = gp.get_coaches_playIDs(game_id, self.selected_season) + for playID in sorted(plays, key=int): + cf_url = str(play_stream).replace('dummy', playID) + item = xbmcgui.ListItem(plays[playID]) + item.setProperty('url', cf_url) + coachesItems.append(item) + + self.list_refill = True + xbmc.executebuiltin("Dialog.Close(busydialog)") + coachGui = CoachesFilmGUI('script-gamepass-coach.xml', ADDON_PATH, plays=coachesItems) + coachGui.doModal() + del coachGui + else: + game_streams = gp.get_publishpoint_streams(game_id, 'game', game_version) + bitrate = self.select_bitrate(game_streams.keys()) + if bitrate: + game_url = game_streams[bitrate] + self.play_url(game_url) + + elif self.main_selection == 'NFL Network': + if controlId == 210: # season is clicked + self.init('season') + self.selected_season = self.season_list.getSelectedItem().getLabel() + + self.display_nfl_network_archive() + elif controlId == 220: # show is clicked + self.init('week/show') + show_name = self.weeks_list.getSelectedItem().getLabel() + + self.display_shows_episodes(show_name, self.selected_season) + elif controlId == 230: # episode is clicked + self.init('game/episode') + video_id = self.games_list.getSelectedItem().getProperty('id') + video_streams = gp.get_publishpoint_streams(video_id, 'video') + if video_streams: + addon_log('Video-Streams: %s' % video_streams) + bitrate = self.select_bitrate(video_streams.keys()) + if bitrate: + video_url = video_streams[bitrate] + self.play_url(video_url) + else: + dialog = xbmcgui.Dialog() + dialog.ok(language(30043), language(30045)) + elif controlId == 240: # Live content (though not games) + show_name = self.live_list.getSelectedItem().getLabel() + if show_name == 'NFL RedZone - Live': + rz_live_streams = gp.get_publishpoint_streams('redzone') + if rz_live_streams: + bitrate = self.select_bitrate(rz_live_streams.keys()) + if bitrate: + rz_live_url = rz_live_streams[bitrate] + self.play_url(rz_live_url) + else: + dialog = xbmcgui.Dialog() + dialog.ok(language(30043), language(30045)) + elif show_name == 'NFL Network - Live': + nw_live_streams = gp.get_publishpoint_streams('nfl_network') + if nw_live_streams: + bitrate = self.select_bitrate(nw_live_streams.keys()) + if bitrate: + nw_live_url = nw_live_streams[bitrate] + self.play_url(nw_live_url) + else: + dialog = xbmcgui.Dialog() + dialog.ok(language(30043), language(30045)) + xbmc.executebuiltin("Dialog.Close(busydialog)") + except Exception: # catch anything that might fail + xbmc.executebuiltin("Dialog.Close(busydialog)") + addon_log(format_exc()) + + dialog = xbmcgui.Dialog() + if self.main_selection == 'NFL Network' and controlId == 230: # episode + # inform that not all shows will work + dialog.ok(language(30043), language(30044)) + else: + # generic oops + dialog.ok(language(30021), language(30024)) + + +class CoachesFilmGUI(xbmcgui.WindowXML): + def __init__(self, xmlFilename, scriptPath, plays, defaultSkin="Default", defaultRes="720p"): # pylint: disable=invalid-name + self.playsList = None + self.playsItems = plays + + xbmcgui.WindowXML.__init__(self, xmlFilename, scriptPath, defaultSkin, defaultRes) + self.action_previous_menu = (9, 10, 92, 216, 247, 257, 275, 61467, 61448) + + def onInit(self): # pylint: disable=invalid-name + self.window = xbmcgui.Window(xbmcgui.getCurrentWindowId()) + if addon.getSetting('coach_lite') == 'true': + self.window.setProperty('coach_lite', 'true') + + self.playsList = self.window.getControl(110) + self.window.getControl(99).setLabel(language(30032)) + self.playsList.addItems(self.playsItems) + self.setFocus(self.playsList) + url = self.playsList.getListItem(0).getProperty('url') + xbmc.executebuiltin("Dialog.Close(busydialog)") + xbmc.executebuiltin('PlayMedia(%s,False,1)' % url) + + def onClick(self, controlId): # pylint: disable=invalid-name + if controlId == 110: + url = self.playsList.getSelectedItem().getProperty('url') + xbmc.executebuiltin('PlayMedia(%s,False,1)' % url) + +if __name__ == "__main__": + addon_log('script starting') + xbmc.executebuiltin("Dialog.Close(busydialog)") + + try: + gp.login(username, password) + except gp.LoginFailure as error: + dialog = xbmcgui.Dialog() + if error.value == 'Game Pass Domestic Blackout': + addon_log('Game Pass Domestic is in blackout.') + dialog.ok(language(30021), + language(30022)) + else: + addon_log('login failed') + dialog.ok(language(30021), + language(30023)) + sys.exit(0) + except: + addon_log(format_exc()) + dialog = xbmcgui.Dialog() + dialog.ok('Epic Failure', + language(30024)) + sys.exit(0) + + gui = GamepassGUI('script-gamepass.xml', ADDON_PATH) + gui.doModal() + del gui + +addon_log('script finished') diff --git a/plugin.video.nfl.gamepass/resources/__init__.py b/plugin.video.nfl.gamepass/resources/__init__.py new file mode 100644 index 0000000..da553a5 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/__init__.py @@ -0,0 +1 @@ +# dummy file to init the directory
\ No newline at end of file diff --git a/plugin.video.nfl.gamepass/resources/art/fanart.jpg b/plugin.video.nfl.gamepass/resources/art/fanart.jpg Binary files differnew file mode 100644 index 0000000..3d8a9c1 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/art/fanart.jpg diff --git a/plugin.video.nfl.gamepass/resources/art/icon.png b/plugin.video.nfl.gamepass/resources/art/icon.png Binary files differnew file mode 100644 index 0000000..4b5e76f --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/art/icon.png diff --git a/plugin.video.nfl.gamepass/resources/language/Dutch/strings.po b/plugin.video.nfl.gamepass/resources/language/Dutch/strings.po new file mode 100644 index 0000000..9f61d78 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/language/Dutch/strings.po @@ -0,0 +1,166 @@ +# Kodi NFL Game Pass language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-GamePass\n" +"Report-Msgid-Bugs-To: https://github.com/aqw/xbmc-gamepass\n" +"POT-Creation-Date: 2013-11-18 16:15+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Vulpecula <kasjing@live.nl>\n" +"Language-Team: Dutch\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +msgctxt "#30001" +msgid "Username/E-Mail" +msgstr "E-mail adres" + +msgctxt "#30002" +msgid "Password" +msgstr "Wachtwoord" + +msgctxt "#30003" +msgid "Preferred Stream Quality" +msgstr "Gewenste stream kwaliteit" + +msgctxt "#30004" +msgid "Always Use Highest Bitrate" +msgstr "Gebruik altijd hoogste Bitrate" + +msgctxt "#30005" +msgid "1280x720 Bitrate 4.5 Mbps" +msgstr "1280x720 Bitrate 4.5 Mbps" + +msgctxt "#30006" +msgid "1280x720 Bitrate 3.0 Mbps" +msgstr "1280x720 Bitrate 3.0 Mbps" + +msgctxt "#30007" +msgid "960x540 Bitrate 2.4 Mbps" +msgstr "960x540 Bitrate 2.4 Mbps" + +msgctxt "#30008" +msgid "960x540 Bitrate 1.6 Mbps" +msgstr "960x540 Bitrate 1.6 Mbps" + +msgctxt "#30009" +msgid "640x360 Bitrate 1.2 Mbps" +msgstr "640x360 Bitrate 1.2 Mbps" + +msgctxt "#30010" +msgid "640x360 Bitrate 800 Kbps" +msgstr "640x360 Bitrate 800 Kbps" + +msgctxt "#30011" +msgid "400x224 Bitrate 400 Kbps" +msgstr "400x224 Bitrate 400 Kbps" + +msgctxt "#30012" +msgid "Ask" +msgstr "Vraag" + +msgctxt "#30013" +msgid "Preferred Game Version" +msgstr "Gewenste wedstrijd versie" + +msgctxt "#30014" +msgid "Full" +msgstr "Volledig" + +msgctxt "#30015" +msgid "Condensed" +msgstr "Samenvatting" + +msgctxt "#30016" +msgid "Choose a game version" +msgstr "Kies een wedstrijd versie" + +msgctxt "#30020" +msgid "Date/time in local time" +msgstr "Datum/tijd in lokale tijd" + +msgctxt "#30021" +msgid "Error" +msgstr "Fout" + +msgctxt "#30022" +msgid "Due to broadcast restrictions, NFL Game Pass Domestic is currently unavailable. Please try again later." +msgstr "Vanwege uitzend beperkingen, NFL Game Pass Domestic is momenteel niet beschikbaar. Probeer het later opnieuw." + +msgctxt "#30023" +msgid "Logging into NFL Game Pass failed. Make sure that your account information is correct and your subscription is valid." +msgstr "Inloggen in NFL Game Pass mislukt. Zorg ervoor dat uw account informatie correct zijn en uw abonnement geldig is." + +msgctxt "#30024" +msgid "Unexpected error ='(. Please enable debuging for both the addon and Kodi, and submit a bug report." +msgstr "" + +msgctxt "#30025" +msgid "Hide game length" +msgstr "Verberg wedstrijd lengte" + +msgctxt "#30026" +msgid "No" +msgstr "Nee" + +msgctxt "#30027" +msgid "Yes, with 12-hour clock (AM/PM)" +msgstr "Ja, met 12-uurs klok (AM/PM)" + +msgctxt "#30028" +msgid "Yes, with 24-hour clock" +msgstr "Ja, met 24-uurs klok" + +msgctxt "#30029" +msgid "General" +msgstr "Algemeen" + +msgctxt "#30030" +msgid "Display/Video" +msgstr "Weergave/Video" + +msgctxt "#30032" +msgid "Coaches Film" +msgstr "Coaches Film" + +msgctxt "#30033" +msgid "Proxy Settings" +msgstr "" + +msgctxt "#30034" +msgid "Use an HTTP proxy to access Game Pass" +msgstr "" + +msgctxt "#30035" +msgid "Protocol" +msgstr "" + +msgctxt "#30036" +msgid "Server" +msgstr "" + +msgctxt "#30037" +msgid "Port" +msgstr "" + +msgctxt "#30038" +msgid "Username" +msgstr "" + +msgctxt "#30039" +msgid "Password" +msgstr "" + +msgctxt "#30042" +msgid "Enable 'Basic' Authentication" +msgstr "" + +msgctxt "#30043" +msgid "There was a problem playing that stream" +msgstr "" + +msgctxt "#30044" +msgid "Some shows are known to not work. Please file a bug if the show is available and works in the official app." +msgstr "" diff --git a/plugin.video.nfl.gamepass/resources/language/English/strings.po b/plugin.video.nfl.gamepass/resources/language/English/strings.po new file mode 100644 index 0000000..2303fe4 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/language/English/strings.po @@ -0,0 +1,174 @@ +# Kodi NFL Game Pass language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-GamePass\n" +"Report-Msgid-Bugs-To: https://github.com/aqw/xbmc-gamepass\n" +"POT-Creation-Date: 2013-11-18 16:15+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: English\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +msgctxt "#30001" +msgid "Username/E-Mail" +msgstr "" + +msgctxt "#30002" +msgid "Password" +msgstr "" + +msgctxt "#30003" +msgid "Preferred Stream Quality" +msgstr "" + +msgctxt "#30004" +msgid "Always Use Highest Bitrate" +msgstr "" + +msgctxt "#30005" +msgid "1280x720 Bitrate 4.5 Mbps" +msgstr "" + +msgctxt "#30006" +msgid "1280x720 Bitrate 3.0 Mbps" +msgstr "" + +msgctxt "#30007" +msgid "960x540 Bitrate 2.4 Mbps" +msgstr "" + +msgctxt "#30008" +msgid "960x540 Bitrate 1.6 Mbps" +msgstr "" + +msgctxt "#30009" +msgid "640x360 Bitrate 1.2 Mbps" +msgstr "" + +msgctxt "#30010" +msgid "640x360 Bitrate 800 Kbps" +msgstr "" + +msgctxt "#30011" +msgid "400x224 Bitrate 400 Kbps" +msgstr "" + +msgctxt "#30012" +msgid "Ask" +msgstr "" + +msgctxt "#30013" +msgid "Preferred Game Version" +msgstr "" + +msgctxt "#30014" +msgid "Full" +msgstr "" + +msgctxt "#30015" +msgid "Condensed" +msgstr "" + +msgctxt "#30016" +msgid "Choose a game version" +msgstr "" + +msgctxt "#30020" +msgid "Localize Game Date/Time" +msgstr "" + +msgctxt "#30021" +msgid "Error" +msgstr "" + +msgctxt "#30022" +msgid "Due to broadcast restrictions, NFL Game Pass Domestic is currently unavailable. Please try again later." +msgstr "" + +msgctxt "#30023" +msgid "Logging into NFL Game Pass failed. Make sure that your account information is correct and your subscription is valid." +msgstr "" + +msgctxt "#30024" +msgid "Unexpected error ='(. Please enable debuging for both the addon and Kodi, and submit a bug report." +msgstr "" + +msgctxt "#30025" +msgid "Hide game length" +msgstr "" + +msgctxt "#30026" +msgid "No" +msgstr "" + +msgctxt "#30027" +msgid "Yes, with 12-hour clock (AM/PM)" +msgstr "" + +msgctxt "#30028" +msgid "Yes, with 24-hour clock" +msgstr "" + +msgctxt "#30029" +msgid "General" +msgstr "" + +msgctxt "#30030" +msgid "Display/Video" +msgstr "" + +msgctxt "#30032" +msgid "Coaches Film" +msgstr "" + +msgctxt "#30033" +msgid "Proxy Settings" +msgstr "" + +msgctxt "#30034" +msgid "Use an HTTP proxy to access Game Pass" +msgstr "" + +msgctxt "#30035" +msgid "Protocol" +msgstr "" + +msgctxt "#30036" +msgid "Server" +msgstr "" + +msgctxt "#30037" +msgid "Port" +msgstr "" + +msgctxt "#30038" +msgid "Username" +msgstr "" + +msgctxt "#30039" +msgid "Password" +msgstr "" + +msgctxt "#30042" +msgid "Enable 'Basic' Authentication" +msgstr "" + +msgctxt "#30043" +msgid "There was a problem playing that stream" +msgstr "" + +msgctxt "#30044" +msgid "Some shows are known to not work. Please file a bug if the show is available and works in the official app." +msgstr "" + +msgctxt "#30045" +msgid "No valid stream URL was found." +msgstr "" + +msgctxt "#30046" +msgid "There is currently no data available for this week." +msgstr "" diff --git a/plugin.video.nfl.gamepass/resources/language/German/strings.po b/plugin.video.nfl.gamepass/resources/language/German/strings.po new file mode 100644 index 0000000..19df51e --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/language/German/strings.po @@ -0,0 +1,166 @@ +# Kodi NFL Game Pass language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-GamePass\n" +"Report-Msgid-Bugs-To: https://github.com/aqw/xbmc-gamepass\n" +"POT-Creation-Date: 2013-11-18 16:15+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: German\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +msgctxt "#30001" +msgid "Username/E-Mail" +msgstr "Benutzername/E-Mail" + +msgctxt "#30002" +msgid "Password" +msgstr "Passwort" + +msgctxt "#30003" +msgid "Preferred Stream Quality" +msgstr "Bevorzugte Stream Qualität" + +msgctxt "#30004" +msgid "Always Use Highest Bitrate" +msgstr "Immer höchste Bitrate nutzen" + +msgctxt "#30005" +msgid "1280x720 Bitrate 4.5 Mbps" +msgstr "" + +msgctxt "#30006" +msgid "1280x720 Bitrate 3.0 Mbps" +msgstr "" + +msgctxt "#30007" +msgid "960x540 Bitrate 2.4 Mbps" +msgstr "" + +msgctxt "#30008" +msgid "960x540 Bitrate 1.6 Mbps" +msgstr "" + +msgctxt "#30009" +msgid "640x360 Bitrate 1.2 Mbps" +msgstr "" + +msgctxt "#30010" +msgid "640x360 Bitrate 800 Kbps" +msgstr "" + +msgctxt "#30011" +msgid "400x224 Bitrate 400 Kbps" +msgstr "" + +msgctxt "#30012" +msgid "Ask" +msgstr "Vorher fragen" + +msgctxt "#30013" +msgid "Preferred Game Version" +msgstr "Bevorzugte Spiel Version" + +msgctxt "#30014" +msgid "Full" +msgstr "Vollständig" + +msgctxt "#30015" +msgid "Condensed" +msgstr "Zusammengefasst" + +msgctxt "#30016" +msgid "Choose a game version" +msgstr "Wähle eine Spiel Version" + +msgctxt "#30020" +msgid "Date/time in local time" +msgstr "Uhrzeit in lokaler Zeitzone" + +msgctxt "#30021" +msgid "Error" +msgstr "" + +msgctxt "#30022" +msgid "Due to broadcast restrictions, NFL Game Pass Domestic is currently unavailable. Please try again later." +msgstr "" + +msgctxt "#30023" +msgid "Logging into NFL Game Pass failed. Make sure that your account information is correct and your subscription is valid." +msgstr "" + +msgctxt "#30024" +msgid "Unexpected error ='(. Please enable debuging for both the addon and Kodi, and submit a bug report." +msgstr "" + +msgctxt "#30025" +msgid "Hide game length" +msgstr "" + +msgctxt "#30026" +msgid "No" +msgstr "" + +msgctxt "#30027" +msgid "Yes, with 12-hour clock (AM/PM)" +msgstr "" + +msgctxt "#30028" +msgid "Yes, with 24-hour clock" +msgstr "" + +msgctxt "#30029" +msgid "General" +msgstr "" + +msgctxt "#30030" +msgid "Display/Video" +msgstr "" + +msgctxt "#30032" +msgid "Coaches Film" +msgstr "" + +msgctxt "#30033" +msgid "Proxy Settings" +msgstr "" + +msgctxt "#30034" +msgid "Use an HTTP proxy to access Game Pass" +msgstr "" + +msgctxt "#30035" +msgid "Protocol" +msgstr "" + +msgctxt "#30036" +msgid "Server" +msgstr "" + +msgctxt "#30037" +msgid "Port" +msgstr "" + +msgctxt "#30038" +msgid "Username" +msgstr "" + +msgctxt "#30039" +msgid "Password" +msgstr "" + +msgctxt "#30042" +msgid "Enable 'Basic' Authentication" +msgstr "" + +msgctxt "#30043" +msgid "There was a problem playing that stream" +msgstr "" + +msgctxt "#30044" +msgid "Some shows are known to not work. Please file a bug if the show is available and works in the official app." +msgstr "" diff --git a/plugin.video.nfl.gamepass/resources/language/Japanese/strings.po b/plugin.video.nfl.gamepass/resources/language/Japanese/strings.po new file mode 100644 index 0000000..fb818fb --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/language/Japanese/strings.po @@ -0,0 +1,167 @@ +# Kodi NFL Game Pass language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-GamePass\n" +"Report-Msgid-Bugs-To: https://github.com/aqw/xbmc-gamepass\n" +"POT-Creation-Date: 2013-11-18 16:15+0000\n" +"PO-Revision-Date: 2016-08-13 18:01+0900\n" +"Language-Team: Japan <maiorinodavid@gmail.com>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Last-Translator: \n" +"X-Generator: Poedit 1.8.8\n" + +msgctxt "#30001" +msgid "Username/E-Mail" +msgstr "ユーザー名/メールアドレス" + +msgctxt "#30002" +msgid "Password" +msgstr "パスワード" + +msgctxt "#30003" +msgid "Preferred Stream Quality" +msgstr "優先ストリーム品質" + +msgctxt "#30004" +msgid "Always Use Highest Bitrate" +msgstr "最大使用ビットレート" + +msgctxt "#30005" +msgid "1280x720 Bitrate 4.5 Mbps" +msgstr "1280x720 ビットレート 4.5 Mbps" + +msgctxt "#30006" +msgid "1280x720 Bitrate 3.0 Mbps" +msgstr "1280x720 ビットレート 3.0 Mbps" + +msgctxt "#30007" +msgid "960x540 Bitrate 2.4 Mbps" +msgstr "960x540 ビットレート 2.4 Mbps" + +msgctxt "#30008" +msgid "960x540 Bitrate 1.6 Mbps" +msgstr "960x540 ビットレート 1.6 Mbps" + +msgctxt "#30009" +msgid "640x360 Bitrate 1.2 Mbps" +msgstr "640x360 ビットレート 1.2 Mbps" + +msgctxt "#30010" +msgid "640x360 Bitrate 800 Kbps" +msgstr "640x360 ビットレート 800 Kbps" + +msgctxt "#30011" +msgid "400x224 Bitrate 400 Kbps" +msgstr "400x224 ビットレート 400 Kbps" + +msgctxt "#30012" +msgid "Ask" +msgstr "尋ねる" + +msgctxt "#30013" +msgid "Preferred Game Version" +msgstr "優先再生バージョン選択" + +msgctxt "#30014" +msgid "Full" +msgstr "フル" + +msgctxt "#30015" +msgid "Condensed" +msgstr "ハイライト" + +msgctxt "#30016" +msgid "Choose a game version" +msgstr "再生バージョン選択" + +msgctxt "#30020" +msgid "Localize Game Date/Time" +msgstr "現地時間" + +msgctxt "#30021" +msgid "Error" +msgstr "エラー" + +msgctxt "#30022" +msgid "Due to broadcast restrictions, NFL Game Pass Domestic is currently unavailable. Please try again later." +msgstr "放送制限により、NFL Game Pass ローカルは現在利用できません。時間を置いてから、再び試してください。" + +msgctxt "#30023" +msgid "Logging into NFL Game Pass failed. Make sure that your account information is correct and your subscription is valid." +msgstr "NFL Game Passにログインできませんでした。アカウントの確認、または契約が有効か確認ください。" + +msgctxt "#30024" +msgid "Unexpected error ='(. Please enable debuging for both the addon and Kodi, and submit a bug report." +msgstr "予測不可エラー発生 ( T o T ) このアプリとKodiのデバッグを有効にして、バグをレポートしてください。" + +msgctxt "#30025" +msgid "Hide game length" +msgstr "再生時間を非表示" + +msgctxt "#30026" +msgid "No" +msgstr "いいえ" + +msgctxt "#30027" +msgid "Yes, with 12-hour clock (AM/PM)" +msgstr "はい、12時間制 (AM/PM)" + +msgctxt "#30028" +msgid "Yes, with 24-hour clock" +msgstr "はい、24時間制" + +msgctxt "#30029" +msgid "General" +msgstr "一般" + +msgctxt "#30030" +msgid "Display/Video" +msgstr "デイスプレイ・ビデオ" + +msgctxt "#30032" +msgid "Coaches Film" +msgstr "監督フィルム集" + +msgctxt "#30033" +msgid "Proxy Settings" +msgstr "プロキシ設定" + +msgctxt "#30034" +msgid "Use an HTTP proxy to access Game Pass" +msgstr "Game Passをアクセスのため、HTTPプロキシ使用" + +msgctxt "#30035" +msgid "Protocol" +msgstr "プロトコル" + +msgctxt "#30036" +msgid "Server" +msgstr "サーバー" + +msgctxt "#30037" +msgid "Port" +msgstr "ポート" + +msgctxt "#30038" +msgid "Username" +msgstr "ユーザー名" + +msgctxt "#30039" +msgid "Password" +msgstr "パスワード" + +msgctxt "#30042" +msgid "Enable 'Basic' Authentication" +msgstr "基本認証を許可" + +msgctxt "#30043" +msgid "There was a problem playing that stream" +msgstr "再生に問題が発生しました" + +msgctxt "#30044" +msgid "Some shows are known to not work. Please file a bug if the show is available and works in the official app." +msgstr "再生できない試合があります。公式アプリで再生できる場合、バグをレポートしてください。" diff --git a/plugin.video.nfl.gamepass/resources/language/Russian/strings.po b/plugin.video.nfl.gamepass/resources/language/Russian/strings.po new file mode 100644 index 0000000..c5c9bfc --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/language/Russian/strings.po @@ -0,0 +1,174 @@ +# Kodi NFL Game Pass language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-GamePass\n" +"Report-Msgid-Bugs-To: https://github.com/aqw/xbmc-gamepass\n" +"POT-Creation-Date: 2013-11-18 16:15+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Igor Davydenko <iam@igordavydenko.com>\n" +"Language-Team: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\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 "#30001" +msgid "Username/E-Mail" +msgstr "Имя пользователя/E-Mail" + +msgctxt "#30002" +msgid "Password" +msgstr "Пароль" + +msgctxt "#30003" +msgid "Preferred Stream Quality" +msgstr "Предпочтительное качество" + +msgctxt "#30004" +msgid "Always Use Highest Bitrate" +msgstr "Наивысший битрейт" + +msgctxt "#30005" +msgid "1280x720 Bitrate 4.5 Mbps" +msgstr "1280x720, битрейт 4.5 Мб/с" + +msgctxt "#30006" +msgid "1280x720 Bitrate 3.0 Mbps" +msgstr "1280х720, битрейт 3.0 Мб/с" + +msgctxt "#30007" +msgid "960x540 Bitrate 2.4 Mbps" +msgstr "960х540, битрейт 2.4 Мб/с" + +msgctxt "#30008" +msgid "960x540 Bitrate 1.6 Mbps" +msgstr "960х540, битрейт 1.6 Мб/с" + +msgctxt "#30009" +msgid "640x360 Bitrate 1.2 Mbps" +msgstr "640х360, битрейт 1.2 Мб/с" + +msgctxt "#30010" +msgid "640x360 Bitrate 800 Kbps" +msgstr "640х360, битрейт 800 кб/с" + +msgctxt "#30011" +msgid "400x224 Bitrate 400 Kbps" +msgstr "400х224, битрейт 400 кб/с" + +msgctxt "#30012" +msgid "Ask" +msgstr "Всегда спрашивать" + +msgctxt "#30013" +msgid "Preferred Game Version" +msgstr "Предпочтительная версия игры" + +msgctxt "#30014" +msgid "Full" +msgstr "Полная" + +msgctxt "#30015" +msgid "Condensed" +msgstr "Сокращенная" + +msgctxt "#30016" +msgid "Choose a game version" +msgstr "Выбирать вручную" + +msgctxt "#30020" +msgid "Localize Game Date/Time" +msgstr "Локализировать время игр" + +msgctxt "#30021" +msgid "Error" +msgstr "Ошибка" + +msgctxt "#30022" +msgid "Due to broadcast restrictions, NFL Game Pass Domestic is currently unavailable. Please try again later." +msgstr "NFL Game Pass Domestic сейчас недоступен из-за ограничений вещания. Пожалуйста попробуйте еще раз позже." + +msgctxt "#30023" +msgid "Logging into NFL Game Pass failed. Make sure that your account information is correct and your subscription is valid." +msgstr "Не удалось зайти на NFL Game Pass. Убедитесь, что информация про аккаунт верна и ваша подписка действительна." + +msgctxt "#30024" +msgid "Unexpected error ='(. Please enable debuging for both the addon and Kodi, and submit a bug report." +msgstr "Неожиданная ошибка ='(. Пожалуйста включите дебаг для аддона и Kodi и отправьте баг репорт." + +msgctxt "#30025" +msgid "Hide game length" +msgstr "Скрыть продолжительность игры" + +msgctxt "#30026" +msgid "No" +msgstr "Нет" + +msgctxt "#30027" +msgid "Yes, with 12-hour clock (AM/PM)" +msgstr "Да, 12ч (AM/PM)" + +msgctxt "#30028" +msgid "Yes, with 24-hour clock" +msgstr "Да, 24ч" + +msgctxt "#30029" +msgid "General" +msgstr "Общие" + +msgctxt "#30030" +msgid "Display/Video" +msgstr "Воспроизведение/Видео" + +msgctxt "#30031" +msgid "Advanced" +msgstr "Продвинутые" + +msgctxt "#30032" +msgid "Coaches Film" +msgstr "Тренерская версия" + +msgctxt "#30033" +msgid "Proxy Settings" +msgstr "Настройки прокси" + +msgctxt "#30034" +msgid "Use an HTTP proxy to access Game Pass" +msgstr "Использовать HTTP прокси для доступа к Game Pass" + +msgctxt "#30035" +msgid "Protocol" +msgstr "Протокол" + +msgctxt "#30036" +msgid "Server" +msgstr "Сервер" + +msgctxt "#30037" +msgid "Port" +msgstr "Порт" + +msgctxt "#30038" +msgid "Username" +msgstr "Имя пользователя" + +msgctxt "#30039" +msgid "Password" +msgstr "Пароль" + +msgctxt "#30042" +msgid "Enable 'Basic' Authentication" +msgstr "Включить 'Basic' аутентификацию" + +msgctxt "#30043" +msgid "There was a problem playing that stream" +msgstr "Проблема при воспроизведении выбранного потока" + +msgctxt "#30044" +msgid "Some shows are known to not work. Please file a bug if the show is available and works in the official app." +msgstr "Некоторые шоу могут не работать. Пожалуйста сообщите нам если шоу доступно и работает в официальном приложении." + +msgctxt "#30045" +msgid "No valid stream URL was found." +msgstr "Не возможно найти URL для потока." diff --git a/plugin.video.nfl.gamepass/resources/language/Ukrainian/strings.po b/plugin.video.nfl.gamepass/resources/language/Ukrainian/strings.po new file mode 100644 index 0000000..383af0b --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/language/Ukrainian/strings.po @@ -0,0 +1,174 @@ +# Kodi NFL Game Pass language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-GamePass\n" +"Report-Msgid-Bugs-To: https://github.com/aqw/xbmc-gamepass\n" +"POT-Creation-Date: 2013-11-18 16:15+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Igor Davydenko <iam@igordavydenko.com>\n" +"Language-Team: Ukrainian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\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 "#30001" +msgid "Username/E-Mail" +msgstr "Ім'я користувача/E-Mail" + +msgctxt "#30002" +msgid "Password" +msgstr "Пароль" + +msgctxt "#30003" +msgid "Preferred Stream Quality" +msgstr "Переважна якість" + +msgctxt "#30004" +msgid "Always Use Highest Bitrate" +msgstr "Найвищий бітрейт" + +msgctxt "#30005" +msgid "1280x720 Bitrate 4.5 Mbps" +msgstr "1280х720, бітрейт 4.5 Мб/с" + +msgctxt "#30006" +msgid "1280x720 Bitrate 3.0 Mbps" +msgstr "1280х720, бітрейт 3.0 Мб/с" + +msgctxt "#30007" +msgid "960x540 Bitrate 2.4 Mbps" +msgstr "960х540, бітрейт 2.4 Мб/с" + +msgctxt "#30008" +msgid "960x540 Bitrate 1.6 Mbps" +msgstr "960х540, бітрейт 1.6 Мб/с" + +msgctxt "#30009" +msgid "640x360 Bitrate 1.2 Mbps" +msgstr "640х360, бітрейт 1.2 Мб/с" + +msgctxt "#30010" +msgid "640x360 Bitrate 800 Kbps" +msgstr "640х360, бітрейт 800 кб/с" + +msgctxt "#30011" +msgid "400x224 Bitrate 400 Kbps" +msgstr "400х224, бітрейт 400 кб/с" + +msgctxt "#30012" +msgid "Ask" +msgstr "Завжди питати" + +msgctxt "#30013" +msgid "Preferred Game Version" +msgstr "Переважна версія гри" + +msgctxt "#30014" +msgid "Full" +msgstr "Повна" + +msgctxt "#30015" +msgid "Condensed" +msgstr "Скорочена" + +msgctxt "#30016" +msgid "Choose a game version" +msgstr "Вибирати версію гри" + +msgctxt "#30020" +msgid "Localize Game Date/Time" +msgstr "Локалізувати час гри" + +msgctxt "#30021" +msgid "Error" +msgstr "Помилка" + +msgctxt "#30022" +msgid "Due to broadcast restrictions, NFL Game Pass Domestic is currently unavailable. Please try again later." +msgstr "NFL Game Pass Domestic зараз недоступний через обмеження мовлення. Будь ласка спробуйте ще раз пізніше." + +msgctxt "#30023" +msgid "Logging into NFL Game Pass failed. Make sure that your account information is correct and your subscription is valid." +msgstr "Неможливо увійти до NFL Game Pass. Переконайтесь що інформація про аккаунт корректа і ваша підписка дійсна." + +msgctxt "#30024" +msgid "Unexpected error ='(. Please enable debuging for both the addon and Kodi, and submit a bug report." +msgstr "Неочікувана помилка ='(. Будь ласка ввімкніть дебаг для аддону та Kodi і відправте баг репорт." + +msgctxt "#30025" +msgid "Hide game length" +msgstr "Сховати тривалість гри" + +msgctxt "#30026" +msgid "No" +msgstr "Ні" + +msgctxt "#30027" +msgid "Yes, with 12-hour clock (AM/PM)" +msgstr "Так, 12г (AM/PM)" + +msgctxt "#30028" +msgid "Yes, with 24-hour clock" +msgstr "Так, 24г" + +msgctxt "#30029" +msgid "General" +msgstr "Загальні" + +msgctxt "#30030" +msgid "Display/Video" +msgstr "Відображення/Відео" + +msgctxt "#30031" +msgid "Advanced" +msgstr "Просунуті" + +msgctxt "#30032" +msgid "Coaches Film" +msgstr "Тренерська версія" + +msgctxt "#30033" +msgid "Proxy Settings" +msgstr "Налаштування проксі" + +msgctxt "#30034" +msgid "Use an HTTP proxy to access Game Pass" +msgstr "Використовувати HTTP проксі для доступу до Game Pass" + +msgctxt "#30035" +msgid "Protocol" +msgstr "Протокол" + +msgctxt "#30036" +msgid "Server" +msgstr "Сервер" + +msgctxt "#30037" +msgid "Port" +msgstr "Порт" + +msgctxt "#30038" +msgid "Username" +msgstr "Ім'я користувача" + +msgctxt "#30039" +msgid "Password" +msgstr "Пароль" + +msgctxt "#30042" +msgid "Enable 'Basic' Authentication" +msgstr "Увімкнути 'Basic' аутентифікацію" + +msgctxt "#30043" +msgid "There was a problem playing that stream" +msgstr "Неможливо відобразити вибраний потік" + +msgctxt "#30044" +msgid "Some shows are known to not work. Please file a bug if the show is available and works in the official app." +msgstr "Деякі шоу можуть не працювати. Будь ласка сповістіть нас, якщо шоу доступне і працює в офіційній аплікації." + +msgctxt "#30045" +msgid "No valid stream URL was found." +msgstr "Неможливо знайти URL для потоку." diff --git a/plugin.video.nfl.gamepass/resources/lib/__init__.py b/plugin.video.nfl.gamepass/resources/lib/__init__.py new file mode 100644 index 0000000..da553a5 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/lib/__init__.py @@ -0,0 +1 @@ +# dummy file to init the directory
\ No newline at end of file diff --git a/plugin.video.nfl.gamepass/resources/lib/pigskin.py b/plugin.video.nfl.gamepass/resources/lib/pigskin.py new file mode 100644 index 0000000..0911774 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/lib/pigskin.py @@ -0,0 +1,521 @@ +""" +A Kodi-agnostic library for NFL Game Pass +""" +import codecs +import cookielib +import hashlib +import random +import m3u8 +import re +import sys +import urllib +from traceback import format_exc +from uuid import getnode as get_mac +from urlparse import urlsplit + +import requests +import xmltodict + + +class pigskin(object): + def __init__(self, proxy_config, cookie_file, debug=False): + self.debug = debug + self.subscription = '' + self.base_url = 'https://gamepass.nfl.com/nflgp' + self.servlets_url = 'http://gamepass.nfl.com/nflgp/servlets' + self.simpleconsole_url = self.servlets_url + '/simpleconsole' + self.boxscore_url = '' + self.image_url = '' + self.locEDLBaseUrl = '' + self.non_seasonal_shows = {} + self.seasonal_shows = {} + self.nflnSeasons = [] + + self.http_session = requests.Session() + if proxy_config is not None: + proxy_url = self.build_proxy_url(proxy_config) + if proxy_url != '': + self.http_session.proxies = { + 'http': proxy_url, + 'https': proxy_url, + } + self.cookie_jar = cookielib.LWPCookieJar(cookie_file) + try: + self.cookie_jar.load(ignore_discard=True, ignore_expires=True) + except IOError: + pass + self.http_session.cookies = self.cookie_jar + + # get needed URLs from simpleconsole + # no auth needed, so we can get this info without invoking a login + url = self.simpleconsole_url + post_data = {'isFlex': 'true'} + sc_data = self.make_request(url=url, method='post', payload=post_data) + try: + url_dict = xmltodict.parse(sc_data) + self.boxscore_url = url_dict['result']['pbpFeedPrefix'] + self.image_url = url_dict['result']['config']['locProgramImage'] + self.locEDLBaseUrl = url_dict['result']['config']['locEDL'].replace('/edl/nflgp/', '') + + self.log('boxscore url: %s' % self.boxscore_url) + self.log('image url: %s' % self.image_url) + self.log('locEDLBaseUrl: %s' % self.locEDLBaseUrl) + except xmltodict.expat.ExpatError: + self.log('Failed to parse contents of the "simpleconsole".') + self.log('pigskin __init__-ing failed. Time to debug!') + return None + + # get subscription type + if '<isGPDomestic>' in sc_data: + self.subscription = 'domestic' + self.log('NFL Game Pass Domestic detected.') + else: + self.subscription = 'international' + self.log('NFL Game Pass International detected.') + + self.log('Debugging enabled.') + self.log('Python Version: %s' % sys.version) + + class LoginFailure(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) + + def log(self, string): + if self.debug: + try: + print '[pigskin]: %s' % string + except UnicodeEncodeError: + # we can't anticipate everything in unicode they might throw at + # us, but we can handle a simple BOM + bom = unicode(codecs.BOM_UTF8, 'utf8') + print '[pigskin]: %s' % string.replace(bom, '') + except: + pass + + def build_proxy_url(self, config): + proxy_url = '' + + if 'scheme' in config: + scheme = config['scheme'].lower().strip() + if scheme != 'http' and scheme != 'https': + return '' + proxy_url += scheme + '://' + + if 'auth' in config and config['auth'] is not None: + try: + username = config['auth']['username'] + password = config['auth']['password'] + if username == '' or password == '': + return '' + proxy_url += '%s:%s@' % (urllib.quote(username), urllib.quote(password)) + except KeyError: + return '' + + if 'host' not in config or config['host'].strip() == '': + return '' + proxy_url += config['host'].strip() + + if 'port' in config: + try: + port = int(config['port']) + if port <= 0 or port > 65535: + return '' + proxy_url += ':' + str(port) + except ValueError: + return '' + + return proxy_url + + def check_for_coachestape(self, game_id, season): + """Return whether coaches tape is available for a given game.""" + url = self.boxscore_url + '/' + season + '/' + game_id + '.xml' + boxscore = self.make_request(url=url, method='get') + + try: + boxscore_dict = xmltodict.parse(boxscore, encoding='cp1252') + except xmltodict.expat.ExpatError: + try: + boxscore_dict = xmltodict.parse(boxscore) + except xmltodict.expat.ExpatError: + return False + + try: + if boxscore_dict['dataset']['@coach'] == 'true': + return True + else: + return False + except KeyError: + return False + + def check_for_subscription(self): + """Return whether a subscription and user name are detected. Determines + whether a login was successful.""" + url = self.simpleconsole_url + post_data = {'isFlex': 'true'} + sc_data = self.make_request(url=url, method='post', payload=post_data) + + if '</userName>' not in sc_data: + self.log('No user name detected in Game Pass response.') + return False + elif '</subscription>' not in sc_data: + self.log('No subscription detected in Game Pass response.') + return False + else: + self.log('Subscription and user name detected in Game Pass response.') + return True + + def gen_plid(self): + """Return a "unique" MD5 hash. Getting the video path requires a plid, + which looks like MD5 and always changes. Reusing a plid does not work, + so our guess is that it's a id for each instance of the player. + """ + rand = random.getrandbits(10) + mac_address = str(get_mac()) + md5 = hashlib.md5(str(rand) + mac_address) + return md5.hexdigest() + + def get_coaches_playIDs(self, game_id, season): + """Return a dict of play IDs with associated play descriptions.""" + playIDs = {} + url = self.boxscore_url + '/' + season + '/' + game_id + '.xml' + boxscore = self.make_request(url=url, method='get') + + try: + boxscore_dict = xmltodict.parse(boxscore, encoding='cp1252') + except xmltodict.expat.ExpatError: + try: + boxscore_dict = xmltodict.parse(boxscore) + except xmltodict.expat.ExpatError: + return False + + for row in boxscore_dict['dataset']['table']['row']: + playIDs[row['@PlayID']] = row['@PlayDescription'] + + return playIDs + + def get_coaches_url(self, game_id, game_date, event_id): + """Return the URL for a coaches-film play.""" + self.get_current_season_and_week() # set cookies + url = self.servlets_url + '/publishpoint' + + post_data = {'id': game_id, 'type': 'game', 'nt': '1', 'gt': 'coach', + 'event': event_id, 'bitrate': '1600', 'gdate': game_date} + headers = {'User-Agent': 'iPad'} + coach_data = self.make_request(url=url, method='post', payload=post_data, headers=headers) + coach_dict = xmltodict.parse(coach_data)['result'] + + return coach_dict['path'] + + def get_current_season_and_week(self): + """Return the current season and week_code (e.g. 210) in a dict.""" + url = self.simpleconsole_url + post_data = {'isFlex': 'true'} + sc_data = self.make_request(url=url, method='post', payload=post_data) + + sc_dict = xmltodict.parse(sc_data)['result'] + current_s_w = {sc_dict['currentSeason']: sc_dict['currentWeek']} + return current_s_w + + def parse_shows(self, sc_dict): + """Parse return from /simpleconsole request to build shows list dynamically""" + try: + # All (nearly) NFL Network Shows + show_dict = {} + for show in sc_dict['nflnShows']['show']: + name = show['name'] + season_dict = {} + + for season in show['seasons']['season']: + if isinstance(season, dict): + season_id = season['@catId'] + season_name = season['#text'] + else: + season_id = show['seasons']['season']['@catId'] + season_name = show['seasons']['season']['#text'] + + # Trim season name to just the year if year is present + # Common season names: '2014', 'Season 2014', and 'Archives' + try: + season_name = re.findall(r"\d{4}(?!\d)", season_name)[0] + except IndexError: + pass + + season_dict[season_name] = season_id + + if season_name not in self.nflnSeasons: + self.nflnSeasons.append(season_name) + + show_dict[name] = season_dict + + # RedZone is "special" and is returned separately in the XML + rz_dict = {} + for season in sc_dict['redZoneCats']['cat']: + rz_dict[season['@season']] = season['@id'] + + if season['@season'] not in self.nflnSeasons: + self.nflnSeasons.append(season['@season']) + + show_dict['RedZone Archives'] = rz_dict + + self.seasonal_shows.update(show_dict) + except KeyError: + self.log('Parsing shows failed') + raise + + def get_publishpoint_streams(self, video_id, stream_type=None, game_type=None): + """Return the URL for a stream.""" + streams = {} + self.get_current_season_and_week() # set cookies + url = self.servlets_url + '/publishpoint' + + if video_id == 'nfl_network': + post_data = {'id': '1', 'type': 'channel', 'nt': '1'} + elif video_id == 'redzone': + post_data = {'id': '2', 'type': 'channel', 'nt': '1'} + elif stream_type == 'game': + post_data = {'id': video_id, 'type': stream_type, 'nt': '1', 'gt': game_type} + else: + post_data = {'id': video_id, 'type': stream_type, 'nt': '1'} + + headers = {'User-Agent': 'iPad'} + m3u8_data = self.make_request(url=url, method='post', payload=post_data, headers=headers) + m3u8_dict = xmltodict.parse(m3u8_data)['result'] + self.log('NFL Dict %s' % m3u8_dict) + + m3u8_url = m3u8_dict['path'].replace('_ipad', '') + m3u8_param = m3u8_url.split('?', 1)[-1] + # I /hate/ lying with User-Agent. + # Huge points for making this work without lying. + m3u8_header = {'Cookie': 'nlqptid=' + m3u8_param, + 'User-Agent': 'Safari/537.36 Mozilla/5.0 AppleWebKit/537.36 Chrome/31.0.1650.57', + 'Accept-encoding': 'identity, gzip, deflate', + 'Connection': 'keep-alive'} + + try: + m3u8_manifest = self.make_request(url=m3u8_url, method='get') + except: + m3u8_manifest = False + + if m3u8_manifest: + m3u8_obj = m3u8.loads(m3u8_manifest) + if m3u8_obj.is_variant: # if this m3u8 contains links to other m3u8s + for playlist in m3u8_obj.playlists: + bitrate = int(playlist.stream_info.bandwidth) / 1000 + streams[str(bitrate)] = m3u8_url[:m3u8_url.rfind('/') + 1] + playlist.uri + '?' + m3u8_url.split('?')[1] + '|' + urllib.urlencode(m3u8_header) + else: + streams['sole available'] = m3u8_url + + return streams + + def get_shows(self, season): + """Return a list of all shows for a season.""" + seasons_shows = self.non_seasonal_shows.keys() + for show_name, show_codes in self.seasonal_shows.items(): + if season in show_codes: + seasons_shows.append(show_name) + + return sorted(seasons_shows) + + def get_shows_episodes(self, show_name, season=None): + """Return a list of episodes for a show. Return empty list if none are + found or if an error occurs. + """ + url = self.servlets_url + '/browse' + try: + cid = self.seasonal_shows[show_name][season] + except KeyError: + try: + cid = self.non_seasonal_shows[show_name] + except KeyError: + return [] + + if show_name == 'NFL RedZone Archives': + ps = 17 + else: + ps = 50 + + post_data = { + 'isFlex': 'true', + 'cid': cid, + 'pm': 0, + 'ps': ps, + 'pn': 1 + } + + archive_data = self.make_request(url=url, method='post', payload=post_data) + archive_dict = xmltodict.parse(archive_data)['result'] + + try: + items = archive_dict['programs']['program'] + # if only one episode is returned, we explicitly put it into a list + if isinstance(items, dict): + items = [items] + return items + except TypeError: + return [] + + def get_seasons_and_weeks(self): + """Return a multidimensional array of all seasons and weeks.""" + seasons_and_weeks = {} + + try: + url = self.locEDLBaseUrl + '/mobile/weeks_v2.xml' + s_w_data = self.make_request(url=url, method='get') + s_w_data_dict = xmltodict.parse(s_w_data) + except: + self.log('Acquiring season and week data failed.') + raise + + try: + for season in s_w_data_dict['seasons']['season']: + year = season['@season'] + season_dict = {} + + for week in season['week']: + if week['@section'] == "pre": # preseason + week_code = '1' + week['@value'].zfill(2) + season_dict[week_code] = week + else: # regular season and post season + week_code = '2' + week['@value'].zfill(2) + season_dict[week_code] = week + + seasons_and_weeks[year] = season_dict + except KeyError: + self.log('Parsing season and week data failed.') + raise + + return seasons_and_weeks + + def get_weeks_games(self, season, week_code): + """Return a list of games for a week.""" + url = self.servlets_url + '/games' + post_data = { + 'isFlex': 'true', + 'season': season, + 'week': week_code + } + + game_data = self.make_request(url=url, method='post', payload=post_data) + game_data_dict = xmltodict.parse(game_data)['result'] + if game_data_dict['games']: + games = game_data_dict['games']['game'] + # if only one game is returned, we explicitly put it into a list + if isinstance(games, dict): + games = [games] + + return games + else: + return None + + def login(self, username=None, password=None): + """Complete login process for Game Pass. Errors (auth issues, blackout, + etc) are raised as LoginFailure. + """ + if self.check_for_subscription(): + self.log('Already logged into Game Pass %s' % self.subscription) + else: + if username and password: + self.log('Not (yet) logged into %s' % self.subscription) + self.login_to_account(username, password) + if not self.check_for_subscription(): + raise self.LoginFailure('%s login failed' % self.subscription) + elif self.subscription == 'domestic' and self.service_blackout(): + raise self.LoginFailure('Game Pass Domestic Blackout') + else: + self.log('No username and password supplied.') + raise self.LoginFailure('No username and password supplied.') + + def login_to_account(self, username, password): + """Blindly authenticate to Game Pass. Use check_for_subscription() to + determine success. + """ + url = self.base_url + '/secure/nfllogin' + post_data = { + 'username': username, + 'password': password + } + self.make_request(url=url, method='post', payload=post_data) + + def make_request(self, url, method, payload=None, headers=None): + """Make an http request. Return the response.""" + self.log('Request URL: %s' % url) + self.log('Headers: %s' % headers) + + try: + if method == 'get': + req = self.http_session.get(url, params=payload, headers=headers, allow_redirects=False) + else: # post + req = self.http_session.post(url, data=payload, headers=headers, allow_redirects=False) + req.raise_for_status() + self.log('Response code: %s' % req.status_code) + self.log('Response: %s' % req.content) + self.cookie_jar.save(ignore_discard=True, ignore_expires=False) + return req.content + except requests.exceptions.HTTPError as error: + self.log('An HTTP error occurred: %s' % error) + raise + except requests.exceptions.ProxyError: + self.log('Error connecting to proxy server') + raise + except requests.exceptions.ConnectionError as error: + self.log('Connection Error: - %s' % error.message) + raise + except requests.exceptions.RequestException as error: + self.log('Error: - %s' % error.value) + raise + + def parse_manifest(self, manifest): + """Return a dict of the supplied XML manifest. Builds and adds + "full_url" for convenience. + """ + streams = {} + manifest_dict = xmltodict.parse(manifest) + + for stream in manifest_dict['channel']['streamDatas']['streamData']: + try: + url_path = stream['@url'] + bitrate = url_path[(url_path.rindex('_') + 1):url_path.rindex('.')] + try: + stream['full_url'] = 'http://%s%s.m3u8' % (stream['httpservers']['httpserver']['@name'], url_path) + except TypeError: # if multiple servers are returned, use the first in the list + stream['full_url'] = 'http://%s%s.m3u8' % (stream['httpservers']['httpserver'][0]['@name'], url_path) + + streams[bitrate] = stream + except KeyError: + self.log(format_exc()) + + return streams + + def redzone_on_air(self): + """Return whether RedZone Live is currently broadcasting.""" + url = self.simpleconsole_url + post_data = {'isFlex': 'true'} + sc_data = self.make_request(url=url, method='post', payload=post_data) + + sc_dict = xmltodict.parse(sc_data)['result'] + + # Dynamically parse NFL-Network shows + self.parse_shows(sc_dict) + + # Check if RedZone is Live + if sc_dict['rzPhase'] in ('pre', 'in'): + self.log('RedZone is on air.') + return True + else: + self.log('RedZone is not on air.') + return False + + def service_blackout(self): + """Return whether Game Pass is blacked out.""" + url = self.base_url + '/secure/schedule' + blackout_message = ('Due to broadcast restrictions, NFL Game Pass is currently unavailable.' + ' Please check back later.') + service_data = self.make_request(url=url, method='get') + + if blackout_message in service_data: + return True + else: + return False diff --git a/plugin.video.nfl.gamepass/resources/settings.xml b/plugin.video.nfl.gamepass/resources/settings.xml new file mode 100644 index 0000000..ee5512f --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/settings.xml @@ -0,0 +1,21 @@ +<settings> + <category label="30029"> + <setting id="email" type="text" label="30001" default=""/> + <setting id="password" type="text" label="30002" default="" option="hidden" visible="!eq(-1,)" enable="!eq(-1,)"/> + </category> + <category label="30030"> + <setting id="preferred_bitrate" type="select" label="30003" lvalues="30004|30005|30006|30007|30008|30009|30010|30011|30012" default="8"/> + <setting id="preferred_game_version" type="select" label="30013" lvalues="30014|30015|30012" default="0"/> + <setting id="local_tz" type="enum" label="30020" lvalues="30026|30027|30028" default="0"/> + <setting id="hide_game_length" type="bool" label="30025" default="false"/> + </category> + <category label="30033"> + <setting id="proxy_enabled" type="bool" label="30034" default="false"/> + <setting id="proxy_scheme" type="labelenum" label="30035" values="http|https" default="http" enable="eq(-1,true)"/> + <setting id="proxy_host" type="text" label="30036" default="" enable="eq(-2,true)"/> + <setting id="proxy_port" type="number" label="30037" default="" enable="eq(-3,true)"/> + <setting id="proxy_auth" type="bool" label="30042" default="false" enable="eq(-4,true)"/> + <setting id="proxy_username" type="text" label="30038" default="" enable="eq(-1,true)"/> + <setting id="proxy_password" type="text" label="30039" default="" option="hidden" enable="eq(-2,true)"/> + </category> +</settings> diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/1080i/script-gamepass-coach.xml b/plugin.video.nfl.gamepass/resources/skins/Default/1080i/script-gamepass-coach.xml new file mode 100644 index 0000000..5834edd --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/1080i/script-gamepass-coach.xml @@ -0,0 +1,171 @@ +<window type="window" id="9507"> + <allowoverlay>yes</allowoverlay> + <defaultcontrol always="true">110</defaultcontrol> + <controls> + <control type="image"> + <description>Normal Default Background Image</description> + <width>1920</width> + <height>1080</height> + <aspectratio>scale</aspectratio> + <texture>../../../../fanart.jpg</texture> + </control> + <control type="label" id="99"> + <description>Title text</description> + <left>15</left> + <height>60</height> + <top>10</top> + <width>1320</width> + <align>center</align> + <aligny>center</aligny> + <info></info> + <font>font30</font> + <textcolor>FFEEEEEE</textcolor> + <shadowcolor>ff000000</shadowcolor> + <wrapmultiline>false</wrapmultiline> + <visible>![Player.HasMedia + Control.IsVisible(101)]</visible> + </control> + + <control type="image"> + <description>Video shadow</description> + <left>17</left> + <top>175</top> + <width>1290</width> + <height>730</height> + <aspectratio>stretch</aspectratio> + <texture border="8">GamePass/shadowbox.png</texture> + <visible>Control.IsVisible(100) + Player.HasMedia</visible> + </control> + <control type="videowindow" id="100"> + <description>1280x720 Video</description> + <left>22</left> + <top>0</top> + <width>1280</width> + </control> + + <control type="group"> + <visible>Control.IsVisible(100) + Player.HasMedia</visible> + + <control type="progress"> + <left>18</left> + <top>920</top> + <width>1288</width> + <height>20</height> + <texturebg border="8" colordiffuse="66CCCCCC">GamePass/progressbg.png</texturebg> + <lefttexture>-</lefttexture> + <midtexture border="8" colordiffuse="CCFFFFFF">GamePass/progress.png</midtexture> + <righttexture>-</righttexture> + <overlaytexture>-</overlaytexture> + <info>Player.Progress</info> + </control> + + <control type="label"> + <description>Remaining time</description> + <top>940</top> + <left>988</left> + <height>30</height> + <width>300</width> + <align>right</align> + <aligny>center</aligny> + <label>$INFO[Player.Time] / $INFO[Player.Duration]</label> + <font>font12</font> + <textcolor>FFEEEEEE</textcolor> + </control> + </control> + + <control type="list" id="110"> + <description>Play list container</description> + <left>1329</left> + <top>0</top> + <width>580</width> + <height>1080</height> + <viewtype label="list">list</viewtype> + <orientation>vertical</orientation> + <autoscroll>false</autoscroll> + <pagecontrol>60</pagecontrol> + <onleft>90</onleft> + <onright>60</onright> + <visible>![Player.HasMedia + Control.IsVisible(101)]</visible> + <itemlayout width="580" height="60"> + <control type="image"> + <width>580</width> + <height>60</height> + <texture>GamePass/week_bg.png</texture> + </control> + <control type="label"> + <description>Clip description, not focused</description> + <left>5</left> + <width>570</width> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font12</font> + <textcolor>FF111111</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + </itemlayout> + <focusedlayout width="580" height="60"> + <control type="image"> + <width>580</width> + <height>60</height> + <texture>GamePass/week_focus.png</texture> + <visible>Control.HasFocus(110)</visible> + </control> + <control type="image"> + <width>580</width> + <height>60</height> + <texture>GamePass/week_focus2.png</texture> + <visible>!Control.HasFocus(110)</visible> + </control> + <control type="label"> + <description>Clip description, focused</description> + <left>5</left> + <width>570</width> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font12</font> + <textcolor>FFFFFFFF</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>Control.HasFocus(110)</visible> + </control> + <control type="label"> + <description>Clip description, not focused</description> + <left>5</left> + <width>570</width> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font12</font> + <textcolor>FF111111</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>!Control.HasFocus(110)</visible> + </control> + </focusedlayout> + </control> + <control type="scrollbar" id="60"> + <left>1910</left> + <top>0</top> + <width>10</width> + <height>720</height> + <onup>60</onup> + <ondown>60</ondown> + <onleft>110</onleft> + <onright>110</onright> + <texturesliderbackground>-</texturesliderbackground> + <texturesliderbar border="1" flipx="true">GamePass/texturesliderbar.png</texturesliderbar> + <texturesliderbarfocus border="1" flipx="true">GamePass/texturesliderbar2.png</texturesliderbarfocus> + <showonepage>false</showonepage> + <orientation>vertical</orientation> + <visible>![Player.HasMedia + Control.IsVisible(101)]</visible> + </control> + </controls> +</window> diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/1080i/script-gamepass.xml b/plugin.video.nfl.gamepass/resources/skins/Default/1080i/script-gamepass.xml new file mode 100644 index 0000000..8394c84 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/1080i/script-gamepass.xml @@ -0,0 +1,725 @@ +<window type="window" id="9506"> + <allowoverlay>yes</allowoverlay> + <defaultcontrol always="true">100</defaultcontrol> + <controls> + <control type="image"> + <description>Normal Default Background Image</description> + <width>1920</width> + <height>1080</height> + <aspectratio>scale</aspectratio> + <texture>../../../../fanart.jpg</texture> + </control> + <control type="image"> + <description>Menubar background</description> + <width>1920</width> + <height>84</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/menubar.png</texture> + </control> + <control type="image"> + <description>SubMenubar background</description> + <top>84</top> + <width>1920</width> + <height>54</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenubar.png</texture> + </control> + <control type="group" id="100"> + <description>Top row button group</description> + <left>210</left> + <width>1000</width> + <height>45</height> + <defaultcontrol>110</defaultcontrol> + <control type="button" id="110"> + <description>International Gamepass button</description> + <visible>String.IsEmpty(Window.Property(domestic))</visible> + <left>0</left> + <width>562</width> + <height>84</height> + <ondown>210</ondown> + <onleft>90</onleft> + <onright>130</onright> + <texturefocus>GamePass/gp_int_focus.png</texturefocus> + <texturenofocus>GamePass/gp_int_normal.png</texturenofocus> + </control> + <control type="button" id="110"> + <description>Domestic Gamepass button</description> + <visible>!String.IsEmpty(Window.Property(domestic))</visible> + <left>0</left> + <width>562</width> + <height>84</height> + <ondown>210</ondown> + <onleft>90</onleft> + <onright>130</onright> + <texturefocus>GamePass/gp_dom_focus.png</texturefocus> + <texturenofocus>GamePass/gp_dom_normal.png</texturenofocus> + </control> + <control type="button" id="130"> + <description>Network button</description> + <left>900</left> + <width>562</width> + <height>84</height> + <ondown>240</ondown> + <onleft>110</onleft> + <onright>90</onright> + <texturefocus>GamePass/network_focus.png</texturefocus> + <texturenofocus>GamePass/network_bg.png</texturenofocus> + </control> + </control> + + <control type="image"> + <description>International Gamepass active overlay</description> + <visible>String.IsEmpty(Window.Property(domestic))</visible> + <left>210</left> + <width>562</width> + <height>84</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/gp_int_selected.png</texture> + <visible>!Control.HasFocus(110) + SubString(Window.Property(GP_clicked),true) + Control.IsVisible(110)</visible> + </control> + <control type="image"> + <description>Domestic Gamepass active overlay</description> + <visible>!String.IsEmpty(Window.Property(domestic))</visible> + <left>210</left> + <width>562</width> + <height>84</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/gp_dom_selected.png</texture> + <visible>!Control.HasFocus(110) + SubString(Window.Property(GP_clicked),true) + Control.IsVisible(110)</visible> + </control> + <control type="image"> + <description>NFL Network active overlay</description> + <left>1110</left> + <width>562</width> + <height>84</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/network_focus2.png</texture> + <visible>!Control.HasFocus(130) + SubString(Window.Property(NW_clicked),true)</visible> + </control> + + <control type="button" id="90"> + <description>Addon Settings button</description> + <left>1810</left> + <width>84</width> + <height>84</height> + <ondown>210</ondown> + <onleft>130</onleft> + <onright>110</onright> + <texturefocus>GamePass/settings_focus.png</texturefocus> + <texturenofocus>GamePass/settings.png</texturenofocus> + <onclick>XBMC.Addon.OpenSettings(plugin.video.nfl.gamepass)</onclick> + </control> + + <control type="list" id="210"> + <description>Season list container</description> + <left>10</left> + <top>84</top> + <width>1200</width> + <height>54</height> + <onup>100</onup> + <ondown>220</ondown> + <onright>240</onright> + <viewtype label="list">list</viewtype> + <orientation>horizontal</orientation> + <itemlayout width="150" height="54"> + <control type="image"> + <width>150</width> + <height>54</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenubar_focus2.png</texture> + <visible>ListItem.Property(clicked)</visible> + </control> + <control type="label"> + <description>Season text</description> + <left>5</left> + <top>4</top> + <width>140</width> + <height>45</height> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + </itemlayout> + <focusedlayout width="150" height="54"> + <control type="image"> + <width>150</width> + <height>54</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenubar_focus2.png</texture> + <visible>ListItem.Property(clicked)</visible> + </control> + <control type="image"> + <width>150</width> + <height>54</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenubar_focus.png</texture> + <visible>Control.HasFocus(210)</visible> + </control> + <control type="label"> + <description>Season text</description> + <left>5</left> + <top>4</top> + <width>140</width> + <height>45</height> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF222222</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>!Control.HasFocus(210)</visible> + </control> + <control type="label"> + <description>Season text</description> + <left>5</left> + <top>4</top> + <width>140</width> + <height>45</height> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FFFFFFFF</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>Control.HasFocus(210)</visible> + </control> + </focusedlayout> + </control> + + <control type="list" id="240"> + <description>Live list container</description> + <left>1300</left> + <top>84</top> + <width>675</width> + <height>54</height> + <onup>100</onup> + <ondown>220</ondown> + <onleft>210</onleft> + <viewtype label="list">list</viewtype> + <orientation>horizontal</orientation> + <autoscroll>false</autoscroll> + <itemlayout width="300" height="54"> + <control type="image"> + <width>300</width> + <height>54</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenuwide_focus2.png</texture> + <visible>ListItem.Property(clicked)</visible> + </control> + <control type="label"> + <description>Live item text</description> + <left>5</left> + <top>5</top> + <width>290</width> + <height>45</height> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + </itemlayout> + <focusedlayout width="300" height="54"> + <control type="image"> + <width>300</width> + <height>54</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenuwide_focus2.png</texture> + <visible>ListItem.Property(clicked)</visible> + </control> + <control type="image"> + <width>300</width> + <height>54</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenuwide_focus.png</texture> + <visible>Control.HasFocus(240)</visible> + </control> + <control type="label"> + <description>Live item text</description> + <left>5</left> + <top>5</top> + <width>290</width> + <height>45</height> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF222222</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>!Control.HasFocus(240)</visible> + </control> + <control type="label"> + <description>Live item text</description> + <left>5</left> + <top>5</top> + <width>290</width> + <height>45</height> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FFFFFFFF</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>Control.HasFocus(240)</visible> + </control> + </focusedlayout> + </control> + + <control type="list" id="220"> + <description>Week/Show list container</description> + <left>20</left> + <top>160</top> + <width>320</width> + <height>840</height> + <onup>210</onup> + <onleft>60</onleft> + <onright>230</onright> + <viewtype label="list">list</viewtype> + <orientation>vertical</orientation> + <autoscroll>false</autoscroll> + <pagecontrol>60</pagecontrol> + <itemlayout width="320" height="60"> + <control type="image"> + <width>320</width> + <height>60</height> + <texture>GamePass/week_bg.png</texture> + <visible>!ListItem.Property(clicked) + !ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>320</width> + <height>60</height> + <texture>GamePass/week_bg.png</texture> + <colordiffuse>99CCCCCC</colordiffuse> + <visible>!ListItem.Property(clicked) + ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>320</width> + <height>60</height> + <texture>GamePass/week_focus2.png</texture> + <visible>ListItem.Property(clicked) + !ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>320</width> + <height>60</height> + <texture>GamePass/week_focus2.png</texture> + <colordiffuse>AAAAAAAA</colordiffuse> + <visible>ListItem.Property(clicked) + ListItem.Property(future)</visible> + </control> + <control type="label"> + <description>Week/Show Text</description> + <left>5</left> + <top>0</top> + <width>310</width> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF111111</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + </itemlayout> + <focusedlayout width="320" height="60"> + <control type="image"> + <width>320</width> + <height>60</height> + <texture>GamePass/week_bg.png</texture> + <visible>!Control.HasFocus(220) + !ListItem.Property(clicked) + !ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>320</width> + <height>60</height> + <texture>GamePass/week_bg.png</texture> + <colordiffuse>99CCCCCC</colordiffuse> + <visible>!Control.HasFocus(220) + !ListItem.Property(clicked) + ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>320</width> + <height>60</height> + <texture>GamePass/week_focus2.png</texture> + <visible>!Control.HasFocus(220) + ListItem.Property(clicked) + !ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>320</width> + <height>60</height> + <texture>GamePass/week_focus2.png</texture> + <colordiffuse>AAAAAAAA</colordiffuse> + <visible>!Control.HasFocus(220) + ListItem.Property(clicked) + ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>320</width> + <height>60</height> + <texture>GamePass/week_focus.png</texture> + <visible>Control.HasFocus(220) + !ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>320</width> + <height>60</height> + <texture>GamePass/week_focus.png</texture> + <colordiffuse>BBFFFFFF</colordiffuse> + <visible>Control.HasFocus(220) + ListItem.Property(future)</visible> + </control> + <control type="label"> + <description>Week/Show text</description> + <left>5</left> + <width>310</width> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FFFFFFFF</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>Control.HasFocus(220)</visible> + </control> + <control type="label"> + <description>Week/Show text</description> + <left>5</left> + <width>310</width> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF111111</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>!Control.HasFocus(220)</visible> + </control> + </focusedlayout> + </control> + <control type="panel" id="230"> + <description>Game/Episode panel container</description> + <left>350</left> + <top>160</top> + <width>1560</width> + <height>840</height> + <onup>210</onup> + <onleft>220</onleft> + <onright>61</onright> + <viewtype label="list">wide</viewtype> + <orientation>vertical</orientation> + <autoscroll>false</autoscroll> + <pagecontrol>61</pagecontrol> + <itemlayout width="780" height="105"> + <control type="image"> + <left>10</left> + <width>760</width> + <height>105</height> + <texture>GamePass/game_bg.png</texture> + <visible>ListItem.Property(isPlayable)</visible> + </control> + <control type="image"> + <left>10</left> + <width>760</width> + <height>105</height> + <texture>GamePass/game_bg.png</texture> + <colordiffuse>AAFFFFFF</colordiffuse> + <visible>!ListItem.Property(isPlayable)</visible> + </control> + <control type="image"> + <left>30</left> + <top>25</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(away_thumb)</info> + <visible>ListItem.Property(isPlayable)</visible> + </control> + <control type="image"> + <left>30</left> + <top>25</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(away_thumb)</info> + <colordiffuse>66FFFFFF</colordiffuse> + <visible>!ListItem.Property(isPlayable)</visible> + </control> + <control type="label"> + <description>Game competitors text</description> + <left>115</left> + <top>2</top> + <width>550</width> + <visible>ListItem.Property(is_game)</visible> + <align>center</align> + <aligny>top</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix></scrollsuffix> + </control> + <control type="label"> + <description>Game description text</description> + <left>115</left> + <top>36</top> + <width>550</width> + <visible>ListItem.Property(is_game)</visible> + <align>center</align> + <aligny>top</aligny> + <scroll>true</scroll> + <info>ListItem.Property(game_info)</info> + <font>font12</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>25</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="label"> + <description>Upcoming Game</description> + <left>115</left> + <top>64</top> + <width>550</width> + <visible>!ListItem.Property(isPlayable) + ListItem.Property(is_game)</visible> + <align>center</align> + <aligny>top</aligny> + <scroll>true</scroll> + <label>» Upcoming Game «</label> + <font>font12</font> + <textcolor>FF000000</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>25</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="label"> + <description>Show Name</description> + <left>130</left> + <top>15</top> + <width>670</width> + <visible>ListItem.Property(is_show)</visible> + <align>left</align> + <aligny>top</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix></scrollsuffix> + </control> + <control type="label"> + <description>Show description text</description> + <left>130</left> + <top>50</top> + <width>670</width> + <visible>ListItem.Property(is_show)</visible> + <align>left</align> + <aligny>top</aligny> + <scroll>false</scroll> + <info>ListItem.Property(game_info)</info> + <font>font12</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>0</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="image"> + <left>670</left> + <top>25</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(home_thumb)</info> + <visible>ListItem.Property(isPlayable) + ListItem.Property(is_game)</visible> + </control> + <control type="image"> + <left>670</left> + <top>25</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(home_thumb)</info> + <colordiffuse>66FFFFFF</colordiffuse> + <visible>!ListItem.Property(isPlayable) + ListItem.Property(is_game)</visible> + </control> + </itemlayout> + <focusedlayout width="780" height="105"> + <control type="image"> + <left>10</left> + <width>760</width> + <height>105</height> + <texture>GamePass/game_focus.png</texture> + <visible>ListItem.Property(isPlayable)</visible> + </control> + <control type="image"> + <left>10</left> + <width>760</width> + <height>105</height> + <texture>GamePass/game_focus.png</texture> + <colordiffuse>CCFFFFFF</colordiffuse> + <visible>!ListItem.Property(isPlayable)</visible> + </control> + <control type="image"> + <left>30</left> + <top>25</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(away_thumb)</info> + <visible>ListItem.Property(isPlayable)</visible> + </control> + <control type="image"> + <left>30</left> + <top>25</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(away_thumb)</info> + <colordiffuse>99FFFFFF</colordiffuse> + <visible>!ListItem.Property(isPlayable)</visible> + </control> + <control type="label"> + <description>Game competitors text</description> + <left>115</left> + <top>2</top> + <width>550</width> + <visible>ListItem.Property(is_game)</visible> + <align>center</align> + <aligny>top</aligny> + <scroll>true</scroll> + <info>ListItem.Label2</info> + <font>font13</font> + <textcolor>FF222222</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="label"> + <description>Game description text</description> + <left>115</left> + <top>36</top> + <width>550</width> + <visible>ListItem.Property(is_game)</visible> + <align>center</align> + <aligny>top</aligny> + <scroll>true</scroll> + <info>ListItem.Property(game_info)</info> + <font>font12</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>25</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="label"> + <description>Upcoming Game</description> + <left>115</left> + <top>64</top> + <width>550</width> + <visible>!ListItem.Property(isPlayable) + ListItem.Property(is_game)</visible> + <align>center</align> + <aligny>top</aligny> + <scroll>true</scroll> + <label>» Upcoming Game «</label> + <font>font12</font> + <textcolor>FF000000</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>25</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="label"> + <description>Show Name</description> + <left>130</left> + <top>15</top> + <width>670</width> + <visible>ListItem.Property(is_show)</visible> + <align>left</align> + <aligny>top</aligny> + <scroll>true</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF222222</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="label"> + <description>Show description text</description> + <left>130</left> + <top>50</top> + <width>670</width> + <visible>ListItem.Property(is_show)</visible> + <align>left</align> + <aligny>top</aligny> + <scroll>true</scroll> + <info>ListItem.Property(game_info)</info> + <font>font12</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>25</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="image"> + <left>670</left> + <top>25</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(home_thumb)</info> + <visible>ListItem.Property(isPlayable) + ListItem.Property(is_game)</visible> + </control> + <control type="image"> + <left>670</left> + <top>25</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(home_thumb)</info> + <colordiffuse>99FFFFFF</colordiffuse> + <visible>!ListItem.Property(isPlayable) + ListItem.Property(is_game)</visible> + </control> + </focusedlayout> + </control> + <control type="scrollbar" id="60"> + <left>9</left> + <top>160</top> + <width>10</width> + <height>840</height> + <onup>60</onup> + <ondown>60</ondown> + <onleft>220</onleft> + <onright>220</onright> + <texturesliderbackground>-</texturesliderbackground> + <texturesliderbar border="1">GamePass/texturesliderbar.png</texturesliderbar> + <texturesliderbarfocus border="1">GamePass/texturesliderbar2.png</texturesliderbarfocus> + <showonepage>false</showonepage> + <orientation>vertical</orientation> + </control> + <control type="scrollbar" id="61"> + <left>1901</left> + <top>160</top> + <width>10</width> + <height>560</height> + <onup>61</onup> + <ondown>61</ondown> + <onleft>230</onleft> + <onright>220</onright> + <texturesliderbackground>-</texturesliderbackground> + <texturesliderbar border="1" flipx="true">GamePass/texturesliderbar.png</texturesliderbar> + <texturesliderbarfocus border="1" flipx="true">GamePass/texturesliderbar2.png</texturesliderbarfocus> + <showonepage>false</showonepage> + <orientation>vertical</orientation> + </control> + </controls> +</window> diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/720p/script-gamepass-coach.xml b/plugin.video.nfl.gamepass/resources/skins/Default/720p/script-gamepass-coach.xml new file mode 100644 index 0000000..96a9515 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/720p/script-gamepass-coach.xml @@ -0,0 +1,171 @@ +<window type="window" id="9507"> + <allowoverlay>yes</allowoverlay> + <defaultcontrol always="true">110</defaultcontrol> + <controls> + <control type="image"> + <description>Normal Default Background Image</description> + <width>1280</width> + <height>720</height> + <aspectratio>scale</aspectratio> + <texture>../../../../fanart.jpg</texture> + </control> + <control type="label" id="99"> + <description>Title text</description> + <left>92</left> + <height>60</height> + <top>10</top> + <width>800</width> + <align>center</align> + <aligny>center</aligny> + <info></info> + <font>font30</font> + <textcolor>FFEEEEEE</textcolor> + <shadowcolor>ff000000</shadowcolor> + <wrapmultiline>false</wrapmultiline> + <visible>![Player.HasMedia + Control.IsVisible(101)]</visible> + </control> + + <control type="image"> + <description>Video shadow</description> + <left>7</left> + <top>85</top> + <width>970</width> + <height>550</height> + <aspectratio>stretch</aspectratio> + <texture border="8">GamePass/shadowbox.png</texture> + <visible>Control.IsVisible(100) + Player.HasMedia</visible> + </control> + <control type="videowindow" id="100"> + <description>960x540 Video</description> + <left>12</left> + <top>0</top> + <width>960</width> + </control> + + <control type="group"> + <visible>Control.IsVisible(100) + Player.HasMedia</visible> + + <control type="progress"> + <left>8</left> + <top>630</top> + <width>968</width> + <height>20</height> + <texturebg border="8" colordiffuse="66CCCCCC">GamePass/progressbg.png</texturebg> + <lefttexture>-</lefttexture> + <midtexture border="8" colordiffuse="CCFFFFFF">GamePass/progress.png</midtexture> + <righttexture>-</righttexture> + <overlaytexture>-</overlaytexture> + <info>Player.Progress</info> + </control> + + <control type="label"> + <description>Remaining time</description> + <top>645</top> + <left>760</left> + <height>30</height> + <width>200</width> + <align>right</align> + <aligny>center</aligny> + <label>$INFO[Player.Time] / $INFO[Player.Duration]</label> + <font>font12</font> + <textcolor>FFEEEEEE</textcolor> + </control> + </control> + + <control type="list" id="110"> + <description>Play list container</description> + <left>985</left> + <top>0</top> + <width>280</width> + <height>720</height> + <viewtype label="list">list</viewtype> + <orientation>vertical</orientation> + <autoscroll>false</autoscroll> + <pagecontrol>60</pagecontrol> + <onleft>90</onleft> + <onright>60</onright> + <visible>![Player.HasMedia + Control.IsVisible(101)]</visible> + <itemlayout width="280" height="40"> + <control type="image"> + <width>280</width> + <height>40</height> + <texture>GamePass/week_bg.png</texture> + </control> + <control type="label"> + <description>Clip description, not focused</description> + <left>5</left> + <width>270</width> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font12</font> + <textcolor>FF111111</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + </itemlayout> + <focusedlayout width="280" height="40"> + <control type="image"> + <width>280</width> + <height>40</height> + <texture>GamePass/week_focus.png</texture> + <visible>Control.HasFocus(110)</visible> + </control> + <control type="image"> + <width>280</width> + <height>40</height> + <texture>GamePass/week_focus2.png</texture> + <visible>!Control.HasFocus(110)</visible> + </control> + <control type="label"> + <description>Clip description, focused</description> + <left>5</left> + <width>270</width> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font12</font> + <textcolor>FFFFFFFF</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>Control.HasFocus(110)</visible> + </control> + <control type="label"> + <description>Clip description, not focused</description> + <left>5</left> + <width>270</width> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font12</font> + <textcolor>FF111111</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>!Control.HasFocus(110)</visible> + </control> + </focusedlayout> + </control> + <control type="scrollbar" id="60"> + <left>1270</left> + <top>0</top> + <width>10</width> + <height>720</height> + <onup>60</onup> + <ondown>60</ondown> + <onleft>110</onleft> + <onright>110</onright> + <texturesliderbackground>-</texturesliderbackground> + <texturesliderbar border="1" flipx="true">GamePass/texturesliderbar.png</texturesliderbar> + <texturesliderbarfocus border="1" flipx="true">GamePass/texturesliderbar2.png</texturesliderbarfocus> + <showonepage>false</showonepage> + <orientation>vertical</orientation> + <visible>![Player.HasMedia + Control.IsVisible(101)]</visible> + </control> + </controls> +</window> diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/720p/script-gamepass.xml b/plugin.video.nfl.gamepass/resources/skins/Default/720p/script-gamepass.xml new file mode 100644 index 0000000..04e5609 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/720p/script-gamepass.xml @@ -0,0 +1,725 @@ +<window type="window" id="9506"> + <allowoverlay>yes</allowoverlay> + <defaultcontrol always="true">100</defaultcontrol> + <controls> + <control type="image"> + <description>Normal Default Background Image</description> + <width>1280</width> + <height>720</height> + <aspectratio>scale</aspectratio> + <texture>../../../../fanart.jpg</texture> + </control> + <control type="image"> + <description>Menubar background</description> + <width>1280</width> + <height>56</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/menubar.png</texture> + </control> + <control type="image"> + <description>SubMenubar background</description> + <top>56</top> + <width>1280</width> + <height>36</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenubar.png</texture> + </control> + <control type="group" id="100"> + <description>Top row button group</description> + <left>140</left> + <width>1000</width> + <height>30</height> + <defaultcontrol>110</defaultcontrol> + <control type="button" id="110"> + <description>International Gamepass button</description> + <visible>String.IsEmpty(Window.Property(domestic))</visible> + <left>0</left> + <width>375</width> + <height>56</height> + <ondown>210</ondown> + <onleft>90</onleft> + <onright>130</onright> + <texturefocus>GamePass/gp_int_focus.png</texturefocus> + <texturenofocus>GamePass/gp_int_normal.png</texturenofocus> + </control> + <control type="button" id="110"> + <description>Domestic Gamepass button</description> + <visible>!String.IsEmpty(Window.Property(domestic))</visible> + <left>0</left> + <width>375</width> + <height>56</height> + <ondown>210</ondown> + <onleft>90</onleft> + <onright>130</onright> + <texturefocus>GamePass/gp_dom_focus.png</texturefocus> + <texturenofocus>GamePass/gp_dom_normal.png</texturenofocus> + </control> + <control type="button" id="130"> + <description>Network button</description> + <left>600</left> + <width>375</width> + <height>56</height> + <ondown>240</ondown> + <onleft>110</onleft> + <onright>90</onright> + <texturefocus>GamePass/network_focus.png</texturefocus> + <texturenofocus>GamePass/network_bg.png</texturenofocus> + </control> + </control> + + <control type="image"> + <description>International Gamepass active overlay</description> + <visible>String.IsEmpty(Window.Property(domestic))</visible> + <left>140</left> + <width>375</width> + <height>56</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/gp_int_selected.png</texture> + <visible>!Control.HasFocus(110) + SubString(Window.Property(GP_clicked),true) + Control.IsVisible(110)</visible> + </control> + <control type="image"> + <description>Domestic Gamepass active overlay</description> + <visible>!String.IsEmpty(Window.Property(domestic))</visible> + <left>140</left> + <width>375</width> + <height>56</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/gp_dom_selected.png</texture> + <visible>!Control.HasFocus(110) + SubString(Window.Property(GP_clicked),true) + Control.IsVisible(110)</visible> + </control> + <control type="image"> + <description>NFL Network active overlay</description> + <left>740</left> + <width>375</width> + <height>56</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/network_focus2.png</texture> + <visible>!Control.HasFocus(130) + SubString(Window.Property(NW_clicked),true)</visible> + </control> + + <control type="button" id="90"> + <description>Addon Settings button</description> + <left>1210</left> + <width>56</width> + <height>56</height> + <ondown>210</ondown> + <onleft>130</onleft> + <onright>110</onright> + <texturefocus>GamePass/settings_focus.png</texturefocus> + <texturenofocus>GamePass/settings.png</texturenofocus> + <onclick>XBMC.Addon.OpenSettings(plugin.video.nfl.gamepass)</onclick> + </control> + + <control type="list" id="210"> + <description>Season list container</description> + <left>10</left> + <top>56</top> + <width>700</width> + <height>50</height> + <onup>100</onup> + <ondown>220</ondown> + <onright>240</onright> + <viewtype label="list">list</viewtype> + <orientation>horizontal</orientation> + <itemlayout width="100" height="36"> + <control type="image"> + <width>100</width> + <height>36</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenubar_focus2.png</texture> + <visible>ListItem.Property(clicked)</visible> + </control> + <control type="label"> + <description>Season text</description> + <left>5</left> + <top>3</top> + <width>90</width> + <height>30</height> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + </itemlayout> + <focusedlayout width="100" height="36"> + <control type="image"> + <width>100</width> + <height>36</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenubar_focus2.png</texture> + <visible>ListItem.Property(clicked)</visible> + </control> + <control type="image"> + <width>100</width> + <height>36</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenubar_focus.png</texture> + <visible>Control.HasFocus(210)</visible> + </control> + <control type="label"> + <description>Season text</description> + <left>5</left> + <top>3</top> + <width>90</width> + <height>30</height> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF222222</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>!Control.HasFocus(210)</visible> + </control> + <control type="label"> + <description>Season text</description> + <left>5</left> + <top>3</top> + <width>90</width> + <height>30</height> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FFFFFFFF</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>Control.HasFocus(210)</visible> + </control> + </focusedlayout> + </control> + + <control type="list" id="240"> + <description>Live list container</description> + <left>870</left> + <top>56</top> + <width>450</width> + <height>50</height> + <onup>100</onup> + <ondown>220</ondown> + <onleft>210</onleft> + <viewtype label="list">list</viewtype> + <orientation>horizontal</orientation> + <autoscroll>false</autoscroll> + <itemlayout width="200" height="36"> + <control type="image"> + <width>200</width> + <height>36</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenuwide_focus2.png</texture> + <visible>ListItem.Property(clicked)</visible> + </control> + <control type="label"> + <description>Live item text</description> + <left>5</left> + <top>3</top> + <width>190</width> + <height>30</height> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + </itemlayout> + <focusedlayout width="200" height="36"> + <control type="image"> + <width>200</width> + <height>36</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenuwide_focus2.png</texture> + <visible>ListItem.Property(clicked)</visible> + </control> + <control type="image"> + <width>200</width> + <height>36</height> + <aspectratio>stretch</aspectratio> + <texture>GamePass/submenuwide_focus.png</texture> + <visible>Control.HasFocus(240)</visible> + </control> + <control type="label"> + <description>Live item text</description> + <left>5</left> + <top>3</top> + <width>190</width> + <height>30</height> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF222222</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>!Control.HasFocus(240)</visible> + </control> + <control type="label"> + <description>Live item text</description> + <left>5</left> + <top>3</top> + <width>190</width> + <height>30</height> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FFFFFFFF</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>Control.HasFocus(240)</visible> + </control> + </focusedlayout> + </control> + + <control type="list" id="220"> + <description>Week/Show list container</description> + <left>20</left> + <top>110</top> + <width>290</width> + <height>560</height> + <onup>210</onup> + <onleft>60</onleft> + <onright>230</onright> + <viewtype label="list">list</viewtype> + <orientation>vertical</orientation> + <autoscroll>false</autoscroll> + <pagecontrol>60</pagecontrol> + <itemlayout width="280" height="40"> + <control type="image"> + <width>280</width> + <height>40</height> + <texture>GamePass/week_bg.png</texture> + <visible>!ListItem.Property(clicked) + !ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>280</width> + <height>40</height> + <texture>GamePass/week_bg.png</texture> + <colordiffuse>99CCCCCC</colordiffuse> + <visible>!ListItem.Property(clicked) + ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>280</width> + <height>40</height> + <texture>GamePass/week_focus2.png</texture> + <visible>ListItem.Property(clicked) + !ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>280</width> + <height>40</height> + <texture>GamePass/week_focus2.png</texture> + <colordiffuse>AAAAAAAA</colordiffuse> + <visible>ListItem.Property(clicked) + ListItem.Property(future)</visible> + </control> + <control type="label"> + <description>Week/Show Text</description> + <left>5</left> + <top>0</top> + <width>270</width> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF111111</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + </itemlayout> + <focusedlayout width="280" height="40"> + <control type="image"> + <width>280</width> + <height>40</height> + <texture>GamePass/week_bg.png</texture> + <visible>!Control.HasFocus(220) + !ListItem.Property(clicked) + !ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>280</width> + <height>40</height> + <texture>GamePass/week_bg.png</texture> + <colordiffuse>99CCCCCC</colordiffuse> + <visible>!Control.HasFocus(220) + !ListItem.Property(clicked) + ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>280</width> + <height>40</height> + <texture>GamePass/week_focus2.png</texture> + <visible>!Control.HasFocus(220) + ListItem.Property(clicked) + !ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>280</width> + <height>40</height> + <texture>GamePass/week_focus2.png</texture> + <colordiffuse>AAAAAAAA</colordiffuse> + <visible>!Control.HasFocus(220) + ListItem.Property(clicked) + ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>280</width> + <height>40</height> + <texture>GamePass/week_focus.png</texture> + <visible>Control.HasFocus(220) + !ListItem.Property(future)</visible> + </control> + <control type="image"> + <width>280</width> + <height>40</height> + <texture>GamePass/week_focus.png</texture> + <colordiffuse>BBFFFFFF</colordiffuse> + <visible>Control.HasFocus(220) + ListItem.Property(future)</visible> + </control> + <control type="label"> + <description>Week/Show text</description> + <left>5</left> + <width>270</width> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FFFFFFFF</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>Control.HasFocus(220)</visible> + </control> + <control type="label"> + <description>Week/Show text</description> + <left>5</left> + <width>270</width> + <align>center</align> + <aligny>center</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF111111</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + <visible>!Control.HasFocus(220)</visible> + </control> + </focusedlayout> + </control> + <control type="panel" id="230"> + <description>Game/Episode panel container</description> + <left>330</left> + <top>110</top> + <width>920</width> + <height>560</height> + <onup>210</onup> + <onleft>220</onleft> + <onright>61</onright> + <viewtype label="list">wide</viewtype> + <orientation>vertical</orientation> + <autoscroll>false</autoscroll> + <pagecontrol>61</pagecontrol> + <itemlayout width="460" height="80"> + <control type="image"> + <left>10</left> + <width>440</width> + <height>80</height> + <texture>GamePass/game_bg.png</texture> + <visible>ListItem.Property(isPlayable)</visible> + </control> + <control type="image"> + <left>10</left> + <width>440</width> + <height>80</height> + <texture>GamePass/game_bg.png</texture> + <colordiffuse>AAFFFFFF</colordiffuse> + <visible>!ListItem.Property(isPlayable)</visible> + </control> + <control type="image"> + <left>22</left> + <top>12</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(away_thumb)</info> + <visible>ListItem.Property(isPlayable)</visible> + </control> + <control type="image"> + <left>22</left> + <top>12</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(away_thumb)</info> + <colordiffuse>66FFFFFF</colordiffuse> + <visible>!ListItem.Property(isPlayable)</visible> + </control> + <control type="label"> + <description>Game competitors text</description> + <left>110</left> + <top>5</top> + <width>240</width> + <visible>ListItem.Property(is_game)</visible> + <align>center</align> + <aligny>top</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font13</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix></scrollsuffix> + </control> + <control type="label"> + <description>Game description text</description> + <left>110</left> + <top>30</top> + <width>240</width> + <visible>ListItem.Property(is_game)</visible> + <align>center</align> + <aligny>top</aligny> + <scroll>true</scroll> + <info>ListItem.Property(game_info)</info> + <font>font12</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>25</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="label"> + <description>Upcoming Game</description> + <left>110</left> + <top>50</top> + <width>240</width> + <visible>!ListItem.Property(isPlayable) + ListItem.Property(is_game)</visible> + <align>center</align> + <aligny>top</aligny> + <scroll>true</scroll> + <label>» Upcoming Game «</label> + <font>font12</font> + <textcolor>FF000000</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>25</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="label"> + <description>Show Name</description> + <left>110</left> + <top>15</top> + <width>320</width> + <visible>ListItem.Property(is_show)</visible> + <align>left</align> + <aligny>top</aligny> + <scroll>false</scroll> + <info>ListItem.Label</info> + <font>font12</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix></scrollsuffix> + </control> + <control type="label"> + <description>Show description text</description> + <left>110</left> + <top>40</top> + <width>320</width> + <visible>ListItem.Property(is_show)</visible> + <align>left</align> + <aligny>top</aligny> + <scroll>false</scroll> + <info>ListItem.Property(game_info)</info> + <font>font10</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>0</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="image"> + <left>360</left> + <top>13</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(home_thumb)</info> + <visible>ListItem.Property(isPlayable) + ListItem.Property(is_game)</visible> + </control> + <control type="image"> + <left>360</left> + <top>13</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(home_thumb)</info> + <colordiffuse>66FFFFFF</colordiffuse> + <visible>!ListItem.Property(isPlayable) + ListItem.Property(is_game)</visible> + </control> + </itemlayout> + <focusedlayout width="450" height="80"> + <control type="image"> + <left>10</left> + <width>440</width> + <height>80</height> + <texture>GamePass/game_focus.png</texture> + <visible>ListItem.Property(isPlayable)</visible> + </control> + <control type="image"> + <left>10</left> + <width>440</width> + <height>80</height> + <texture>GamePass/game_focus.png</texture> + <colordiffuse>CCFFFFFF</colordiffuse> + <visible>!ListItem.Property(isPlayable)</visible> + </control> + <control type="image"> + <left>22</left> + <top>12</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(away_thumb)</info> + <visible>ListItem.Property(isPlayable)</visible> + </control> + <control type="image"> + <left>22</left> + <top>12</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(away_thumb)</info> + <colordiffuse>99FFFFFF</colordiffuse> + <visible>!ListItem.Property(isPlayable)</visible> + </control> + <control type="label"> + <description>Game competitors text</description> + <left>110</left> + <top>5</top> + <width>240</width> + <visible>ListItem.Property(is_game)</visible> + <align>center</align> + <aligny>top</aligny> + <scroll>true</scroll> + <info>ListItem.Label2</info> + <font>font13</font> + <textcolor>FF222222</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="label"> + <description>Game description text</description> + <left>110</left> + <top>30</top> + <width>240</width> + <visible>ListItem.Property(is_game)</visible> + <align>center</align> + <aligny>top</aligny> + <scroll>true</scroll> + <info>ListItem.Property(game_info)</info> + <font>font12</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>25</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="label"> + <description>Upcoming Game</description> + <left>110</left> + <top>50</top> + <width>240</width> + <visible>!ListItem.Property(isPlayable) + ListItem.Property(is_game)</visible> + <align>center</align> + <aligny>top</aligny> + <scroll>true</scroll> + <label>» Upcoming Game «</label> + <font>font12</font> + <textcolor>FF000000</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>25</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="label"> + <description>Show Name</description> + <left>110</left> + <top>15</top> + <width>320</width> + <visible>ListItem.Property(is_show)</visible> + <align>left</align> + <aligny>top</aligny> + <scroll>true</scroll> + <info>ListItem.Label</info> + <font>font12</font> + <textcolor>FF222222</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>50</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="label"> + <description>Show description text</description> + <left>110</left> + <top>40</top> + <width>320</width> + <visible>ListItem.Property(is_show)</visible> + <align>left</align> + <aligny>top</aligny> + <scroll>true</scroll> + <info>ListItem.Property(game_info)</info> + <font>font10</font> + <textcolor>FF333333</textcolor> + <wrapmultiline>false</wrapmultiline> + <scrollspeed>25</scrollspeed> + <scrollsuffix> - </scrollsuffix> + </control> + <control type="image"> + <left>360</left> + <top>13</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(home_thumb)</info> + <visible>ListItem.Property(isPlayable) + ListItem.Property(is_game)</visible> + </control> + <control type="image"> + <left>360</left> + <top>13</top> + <width>82</width> + <height>55</height> + <info>ListItem.Property(home_thumb)</info> + <colordiffuse>99FFFFFF</colordiffuse> + <visible>!ListItem.Property(isPlayable) + ListItem.Property(is_game)</visible> + </control> + </focusedlayout> + </control> + <control type="scrollbar" id="60"> + <left>9</left> + <top>110</top> + <width>10</width> + <height>560</height> + <onup>60</onup> + <ondown>60</ondown> + <onleft>220</onleft> + <onright>220</onright> + <texturesliderbackground>-</texturesliderbackground> + <texturesliderbar border="1">GamePass/texturesliderbar.png</texturesliderbar> + <texturesliderbarfocus border="1">GamePass/texturesliderbar2.png</texturesliderbarfocus> + <showonepage>false</showonepage> + <orientation>vertical</orientation> + </control> + <control type="scrollbar" id="61"> + <left>1241</left> + <top>110</top> + <width>10</width> + <height>560</height> + <onup>61</onup> + <ondown>61</ondown> + <onleft>230</onleft> + <onright>220</onright> + <texturesliderbackground>-</texturesliderbackground> + <texturesliderbar border="1" flipx="true">GamePass/texturesliderbar.png</texturesliderbar> + <texturesliderbarfocus border="1" flipx="true">GamePass/texturesliderbar2.png</texturesliderbarfocus> + <showonepage>false</showonepage> + <orientation>vertical</orientation> + </control> + </controls> +</window> diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/colors/defaults.xml b/plugin.video.nfl.gamepass/resources/skins/Default/colors/defaults.xml new file mode 100644 index 0000000..2246407 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/colors/defaults.xml @@ -0,0 +1,147 @@ +<colors> + +<!-----These colors are not defined by this document----------> +<!------This is a copy of the colors defined in Kodi core----> + + <color name="aliceblue">fff0f8ff</color> + <color name="antiquewhite">fffaebd7</color> + <color name="aqua">ff00ffff</color> + <color name="aquamarine">ff7fffd4</color> + <color name="azure">fff0ffff</color> + <color name="beige">fff5f5dc</color> + <color name="bisque">ffffe4c4</color> + <color name="black">ff000000</color> + <color name="blanchedalmond">ffffebcd</color> + <color name="blue">ff0000ff</color> + <color name="blueviolet">ff8a2be2</color> + <color name="brown">ffa52a2a</color> + <color name="burlywood">ffdeb887</color> + <color name="cadetblue">ff5f9ea0</color> + <color name="chartreuse">ff7fff00</color> + <color name="chocolate">ffd2691e</color> + <color name="coral">ffff7f50</color> + <color name="cornflowerblue">ff6495ed</color> + <color name="cornsilk">fffff8dc</color> + <color name="crimson">ffdc143c</color> + <color name="cyan">ff00ffff</color> + <color name="darkblue">ff00008b</color> + <color name="darkcyan">ff008b8b</color> + <color name="darkgoldenrod">ffb8860b</color> + <color name="darkgray">ffa9a9a9</color> + <color name="darkgreen">ff006400</color> + <color name="darkkhaki">ffbdb76b</color> + <color name="darkmagenta">ff8b008b</color> + <color name="darkolivegreen">ff556b2f</color> + <color name="darkorange">ffff8c00</color> + <color name="darkorchid">ff9932cc</color> + <color name="darkred">ff8b0000</color> + <color name="darksalmon">ffe9967a</color> + <color name="darkseagreen">ff8fbc8f</color> + <color name="darkslateblue">ff483d8b</color> + <color name="darkslategray">ff2f4f4f</color> + <color name="darkturquoise">ff00ced1</color> + <color name="darkviolet">ff9400d3</color> + <color name="deeppink">ffff1493</color> + <color name="deepskyblue">ff00bfff</color> + <color name="dimgray">ff696969</color> + <color name="dodgerblue">ff1e90ff</color> + <color name="firebrick">ffb22222</color> + <color name="floralwhite">fffffaf0</color> + <color name="forestgreen">ff228b22</color> + <color name="fuchsia">ffff00ff</color> + <color name="gainsboro">ffdcdcdc</color> + <color name="ghostwhite">fff8f8ff</color> + <color name="gold">ffffd700</color> + <color name="goldenrod">ffdaa520</color> + <color name="gray">ff808080</color> + <color name="green">ff008000</color> + <color name="greenyellow">ffadff2f</color> + <color name="honeydew">fff0fff0</color> + <color name="hotpink">ffff69b4</color> + <color name="indianred ">ffcd5c5c</color> + <color name="indigo ">ff4b0082</color> + <color name="ivory">fffffff0</color> + <color name="khaki">fff0e68c</color> + <color name="lavender">ffe6e6fa</color> + <color name="lavenderblush">fffff0f5</color> + <color name="lawngreen">ff7cfc00</color> + <color name="lemonchiffon">fffffacd</color> + <color name="lightblue">ffadd8e6</color> + <color name="lightcoral">fff08080</color> + <color name="lightcyan">ffe0ffff</color> + <color name="lightgoldenrodyellow">fffafad2</color> + <color name="lightgrey">ffd3d3d3</color> + <color name="lightgreen">ff90ee90</color> + <color name="lightpink">ffffb6c1</color> + <color name="lightsalmon">ffffa07a</color> + <color name="lightseagreen">ff20b2aa</color> + <color name="lightskyblue">ff87cefa</color> + <color name="lightslategray">ff778899</color> + <color name="lightsteelblue">ffb0c4de</color> + <color name="lightyellow">ffffffe0</color> + <color name="lime">ff00ff00</color> + <color name="limegreen">ff32cd32</color> + <color name="linen">fffaf0e6</color> + <color name="magenta">ffff00ff</color> + <color name="maroon">ff800000</color> + <color name="mediumaquamarine">ff66cdaa</color> + <color name="mediumblue">ff0000cd</color> + <color name="mediumorchid">ffba55d3</color> + <color name="mediumpurple">ff9370d8</color> + <color name="mediumseagreen">ff3cb371</color> + <color name="mediumslateblue">ff7b68ee</color> + <color name="mediumspringgreen">ff00fa9a</color> + <color name="mediumturquoise">ff48d1cc</color> + <color name="mediumvioletred">ffc71585</color> + <color name="midnightblue">ff191970</color> + <color name="mintcream">fff5fffa</color> + <color name="mistyrose">ffffe4e1</color> + <color name="moccasin">ffffe4b5</color> + <color name="navajowhite">ffffdead</color> + <color name="navy">ff000080</color> + <color name="none">00000000</color> + <color name="oldlace">fffdf5e6</color> + <color name="olive">ff808000</color> + <color name="olivedrab">ff6b8e23</color> + <color name="orange">ffffa500</color> + <color name="orangered">ffff4500</color> + <color name="orchid">ffda70d6</color> + <color name="palegoldenrod">ffeee8aa</color> + <color name="palegreen">ff98fb98</color> + <color name="paleturquoise">ffafeeee</color> + <color name="palevioletred">ffd87093</color> + <color name="papayawhip">ffffefd5</color> + <color name="peachpuff">ffffdab9</color> + <color name="peru">ffcd853f</color> + <color name="pink">ffffc0cb</color> + <color name="plum">ffdda0dd</color> + <color name="powderblue">ffb0e0e6</color> + <color name="purple">ff800080</color> + <color name="red">ffff0000</color> + <color name="rosybrown">ffbc8f8f</color> + <color name="royalblue">ff4169e1</color> + <color name="saddlebrown">ff8b4513</color> + <color name="salmon">fffa8072</color> + <color name="sandybrown">fff4a460</color> + <color name="seagreen">ff2e8b57</color> + <color name="seashell">fffff5ee</color> + <color name="sienna">ffa0522d</color> + <color name="silver">ffc0c0c0</color> + <color name="skyblue">ff87ceeb</color> + <color name="slateblue">ff6a5acd</color> + <color name="slategray">ff708090</color> + <color name="snow">fffffafa</color> + <color name="springgreen">ff00ff7f</color> + <color name="steelblue">ff4682b4</color> + <color name="tan">ffd2b48c</color> + <color name="teal">ff008080</color> + <color name="thistle">ffd8bfd8</color> + <color name="tomato">ffff6347</color> + <color name="turquoise">ff40e0d0</color> + <color name="violet">ffee82ee</color> + <color name="wheat">fff5deb3</color> + <color name="white">ffffffff</color> + <color name="whitesmoke">fff5f5f5</color> + <color name="yellow">ffffff00</color> + <color name="yellowgreen">ff9acd32</color> +</colors> diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/game_bg.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/game_bg.png Binary files differnew file mode 100644 index 0000000..9708076 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/game_bg.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/game_focus.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/game_focus.png Binary files differnew file mode 100644 index 0000000..2661dc8 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/game_focus.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_focus.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_focus.png Binary files differnew file mode 100644 index 0000000..c419ac5 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_focus.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_normal.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_normal.png Binary files differnew file mode 100644 index 0000000..d60e924 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_normal.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_selected.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_selected.png Binary files differnew file mode 100644 index 0000000..7ea98e3 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_selected.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_focus.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_focus.png Binary files differnew file mode 100644 index 0000000..5053796 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_focus.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_normal.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_normal.png Binary files differnew file mode 100644 index 0000000..78e9837 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_normal.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_selected.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_selected.png Binary files differnew file mode 100644 index 0000000..fec470a --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_selected.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/menubar.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/menubar.png Binary files differnew file mode 100644 index 0000000..e3197f0 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/menubar.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_bg.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_bg.png Binary files differnew file mode 100644 index 0000000..4f19414 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_bg.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_focus.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_focus.png Binary files differnew file mode 100644 index 0000000..cd5b6f5 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_focus.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_focus2.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_focus2.png Binary files differnew file mode 100644 index 0000000..e2a236e --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_focus2.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/progress.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/progress.png Binary files differnew file mode 100644 index 0000000..e579001 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/progress.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/progressbg.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/progressbg.png Binary files differnew file mode 100644 index 0000000..3a1cd4d --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/progressbg.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/settings.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/settings.png Binary files differnew file mode 100644 index 0000000..c5e082e --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/settings.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/settings_focus.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/settings_focus.png Binary files differnew file mode 100644 index 0000000..86257bf --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/settings_focus.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/shadowbox.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/shadowbox.png Binary files differnew file mode 100644 index 0000000..1ef4344 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/shadowbox.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar.png Binary files differnew file mode 100644 index 0000000..1795b80 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar_focus.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar_focus.png Binary files differnew file mode 100644 index 0000000..0c8fd0a --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar_focus.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar_focus2.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar_focus2.png Binary files differnew file mode 100644 index 0000000..6cc98aa --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar_focus2.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenuwide_focus.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenuwide_focus.png Binary files differnew file mode 100644 index 0000000..be44da8 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenuwide_focus.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenuwide_focus2.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenuwide_focus2.png Binary files differnew file mode 100644 index 0000000..25578d8 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenuwide_focus2.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/texturesliderbar.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/texturesliderbar.png Binary files differnew file mode 100644 index 0000000..af3fab7 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/texturesliderbar.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/texturesliderbar2.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/texturesliderbar2.png Binary files differnew file mode 100644 index 0000000..8d2eda6 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/texturesliderbar2.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_bg.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_bg.png Binary files differnew file mode 100644 index 0000000..34ba191 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_bg.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_focus.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_focus.png Binary files differnew file mode 100644 index 0000000..dfa2133 --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_focus.png diff --git a/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_focus2.png b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_focus2.png Binary files differnew file mode 100644 index 0000000..2a517dd --- /dev/null +++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_focus2.png |