summaryrefslogtreecommitdiff
path: root/plugin.video.nfl.gamepass
diff options
context:
space:
mode:
authorAlex Waite <Alexqw85@gmail.com>2017-01-09 15:31:14 +0100
committerAlex Waite <Alexqw85@gmail.com>2017-01-10 11:04:55 +0100
commit2e232f12364a1f0a253e0a1f522d5b53f7eda2ec (patch)
tree47c88eafda614ff530d1fedaa4542abf665ba5a8 /plugin.video.nfl.gamepass
parentf5e966f91c77dde6516858a6e2f03899b7578f77 (diff)
[plugin.video.nfl.gamepass] 0.10.1
Diffstat (limited to 'plugin.video.nfl.gamepass')
-rw-r--r--plugin.video.nfl.gamepass/.github/ISSUE_TEMPLATE.md6
-rw-r--r--plugin.video.nfl.gamepass/.gitignore3
-rw-r--r--plugin.video.nfl.gamepass/LICENSE.txt491
-rw-r--r--plugin.video.nfl.gamepass/README.md91
-rw-r--r--plugin.video.nfl.gamepass/__init__.py1
-rw-r--r--plugin.video.nfl.gamepass/addon.xml39
-rw-r--r--plugin.video.nfl.gamepass/changelog.txt210
-rw-r--r--plugin.video.nfl.gamepass/default.py629
-rw-r--r--plugin.video.nfl.gamepass/resources/__init__.py1
-rw-r--r--plugin.video.nfl.gamepass/resources/art/fanart.jpgbin0 -> 98548 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/art/icon.pngbin0 -> 7941 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/language/Dutch/strings.po166
-rw-r--r--plugin.video.nfl.gamepass/resources/language/English/strings.po174
-rw-r--r--plugin.video.nfl.gamepass/resources/language/German/strings.po166
-rw-r--r--plugin.video.nfl.gamepass/resources/language/Japanese/strings.po167
-rw-r--r--plugin.video.nfl.gamepass/resources/language/Russian/strings.po174
-rw-r--r--plugin.video.nfl.gamepass/resources/language/Ukrainian/strings.po174
-rw-r--r--plugin.video.nfl.gamepass/resources/lib/__init__.py1
-rw-r--r--plugin.video.nfl.gamepass/resources/lib/pigskin.py521
-rw-r--r--plugin.video.nfl.gamepass/resources/settings.xml21
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/1080i/script-gamepass-coach.xml171
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/1080i/script-gamepass.xml725
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/720p/script-gamepass-coach.xml171
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/720p/script-gamepass.xml725
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/colors/defaults.xml147
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/game_bg.pngbin0 -> 1084 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/game_focus.pngbin0 -> 1128 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_focus.pngbin0 -> 16368 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_normal.pngbin0 -> 26135 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_selected.pngbin0 -> 19826 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_focus.pngbin0 -> 16761 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_normal.pngbin0 -> 27002 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_selected.pngbin0 -> 20691 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/menubar.pngbin0 -> 161 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_bg.pngbin0 -> 17768 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_focus.pngbin0 -> 11525 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_focus2.pngbin0 -> 14391 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/progress.pngbin0 -> 243 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/progressbg.pngbin0 -> 329 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/settings.pngbin0 -> 6648 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/settings_focus.pngbin0 -> 7340 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/shadowbox.pngbin0 -> 490 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar.pngbin0 -> 1561 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar_focus.pngbin0 -> 695 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar_focus2.pngbin0 -> 618 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenuwide_focus.pngbin0 -> 970 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenuwide_focus2.pngbin0 -> 846 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/texturesliderbar.pngbin0 -> 125 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/texturesliderbar2.pngbin0 -> 124 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_bg.pngbin0 -> 601 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_focus.pngbin0 -> 624 bytes
-rw-r--r--plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_focus2.pngbin0 -> 588 bytes
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
new file mode 100644
index 0000000..3d8a9c1
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/art/fanart.jpg
Binary files differ
diff --git a/plugin.video.nfl.gamepass/resources/art/icon.png b/plugin.video.nfl.gamepass/resources/art/icon.png
new file mode 100644
index 0000000..4b5e76f
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/art/icon.png
Binary files differ
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
new file mode 100644
index 0000000..9708076
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/game_bg.png
Binary files differ
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
new file mode 100644
index 0000000..2661dc8
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/game_focus.png
Binary files differ
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
new file mode 100644
index 0000000..c419ac5
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_focus.png
Binary files differ
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
new file mode 100644
index 0000000..d60e924
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_normal.png
Binary files differ
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
new file mode 100644
index 0000000..7ea98e3
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_dom_selected.png
Binary files differ
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
new file mode 100644
index 0000000..5053796
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_focus.png
Binary files differ
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
new file mode 100644
index 0000000..78e9837
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_normal.png
Binary files differ
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
new file mode 100644
index 0000000..fec470a
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/gp_int_selected.png
Binary files differ
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
new file mode 100644
index 0000000..e3197f0
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/menubar.png
Binary files differ
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
new file mode 100644
index 0000000..4f19414
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_bg.png
Binary files differ
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
new file mode 100644
index 0000000..cd5b6f5
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_focus.png
Binary files differ
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
new file mode 100644
index 0000000..e2a236e
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/network_focus2.png
Binary files differ
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
new file mode 100644
index 0000000..e579001
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/progress.png
Binary files differ
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
new file mode 100644
index 0000000..3a1cd4d
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/progressbg.png
Binary files differ
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
new file mode 100644
index 0000000..c5e082e
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/settings.png
Binary files differ
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
new file mode 100644
index 0000000..86257bf
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/settings_focus.png
Binary files differ
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
new file mode 100644
index 0000000..1ef4344
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/shadowbox.png
Binary files differ
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
new file mode 100644
index 0000000..1795b80
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar.png
Binary files differ
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
new file mode 100644
index 0000000..0c8fd0a
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar_focus.png
Binary files differ
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
new file mode 100644
index 0000000..6cc98aa
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenubar_focus2.png
Binary files differ
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
new file mode 100644
index 0000000..be44da8
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenuwide_focus.png
Binary files differ
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
new file mode 100644
index 0000000..25578d8
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/submenuwide_focus2.png
Binary files differ
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
new file mode 100644
index 0000000..af3fab7
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/texturesliderbar.png
Binary files differ
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
new file mode 100644
index 0000000..8d2eda6
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/texturesliderbar2.png
Binary files differ
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
new file mode 100644
index 0000000..34ba191
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_bg.png
Binary files differ
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
new file mode 100644
index 0000000..dfa2133
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_focus.png
Binary files differ
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
new file mode 100644
index 0000000..2a517dd
--- /dev/null
+++ b/plugin.video.nfl.gamepass/resources/skins/Default/media/GamePass/week_focus2.png
Binary files differ