├── .gitignore ├── .gitmodules ├── LICENSE.txt ├── README.md ├── ToDo ├── addon.xml ├── changelog.txt ├── default.py ├── friends.py ├── icon.png ├── instant_sync.py ├── nbhttpconnection.py ├── nbhttpsconnection.py ├── notification_service.py ├── rating.py ├── raw_xbmc_database.py ├── recommend.py ├── resources ├── language │ ├── Dutch │ │ └── string.xml │ ├── English │ │ └── strings.xml │ ├── German │ │ └── strings.xml │ ├── Polish │ │ └── strings.xml │ └── Portuguese (Brazil) │ │ └── strings.xml ├── settings.xml └── skins │ ├── Default │ ├── 720p │ │ ├── Font.xml │ │ ├── includes.xml │ │ ├── movie.xml │ │ ├── movies.xml │ │ ├── rate.xml │ │ └── tvshows.xml │ └── media │ │ ├── current-hate.png │ │ ├── current-love.png │ │ ├── current-no-rating.png │ │ ├── hate.png │ │ ├── hate_f.png │ │ ├── local.png │ │ ├── love.png │ │ ├── love_f.png │ │ ├── skip-rating.png │ │ ├── w1x1.png │ │ └── watchlist.png │ ├── skin.aeon.nox │ ├── 720p │ │ ├── movie.xml │ │ ├── movies.xml │ │ ├── rate.xml │ │ └── tvshows.xml │ └── media │ │ ├── current-hate.png │ │ ├── current-love.png │ │ ├── current-no-rating.png │ │ ├── dontknow.png │ │ ├── dontknow_f.png │ │ ├── hate.png │ │ ├── hate_f.png │ │ ├── icon.png │ │ ├── local.png │ │ ├── love.png │ │ ├── love_f.png │ │ ├── skip-rating.png │ │ └── watchlist.png │ └── skin.aeonmq.3 │ ├── 720p │ ├── movie.xml │ ├── movies.xml │ ├── rate.xml │ └── tvshows.xml │ └── media │ ├── current-hate.png │ ├── current-love.png │ ├── current-no-rating.png │ ├── dontknow.png │ ├── dontknow_f.png │ ├── hate.png │ ├── hate_f.png │ ├── icon.png │ ├── local.png │ ├── love.png │ ├── love_f.png │ └── watchlist.png ├── scrobbler.py ├── service.py ├── sync_update.py ├── trending.py ├── utilities.py ├── watchlist.py └── windows.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyo 2 | *.pyc 3 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/.gitmodules -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | GNU GENERAL PUBLIC LICENSE 3 | Version 2, June 1991 4 | 5 | Copyright (C) 1989, 1991 Free Software Foundation, Inc. 6 | 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 7 | Everyone is permitted to copy and distribute verbatim copies 8 | of this license document, but changing it is not allowed. 9 | 10 | Preamble 11 | 12 | The licenses for most software are designed to take away your 13 | freedom to share and change it. By contrast, the GNU General Public 14 | License is intended to guarantee your freedom to share and change free 15 | software--to make sure the software is free for all its users. This 16 | General Public License applies to most of the Free Software 17 | Foundation's software and to any other program whose authors commit to 18 | using it. (Some other Free Software Foundation software is covered by 19 | the GNU Library General Public License instead.) You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | this service if you wish), that you receive source code or can get it 26 | if you want it, that you can change the software or use pieces of it 27 | in new free programs; and that you know you can do these things. 28 | 29 | To protect your rights, we need to make restrictions that forbid 30 | anyone to deny you these rights or to ask you to surrender the rights. 31 | These restrictions translate to certain responsibilities for you if you 32 | distribute copies of the software, or if you modify it. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must give the recipients all the rights that 36 | you have. You must make sure that they, too, receive or can get the 37 | source code. And you must show them these terms so they know their 38 | rights. 39 | 40 | We protect your rights with two steps: (1) copyright the software, and 41 | (2) offer you this license which gives you legal permission to copy, 42 | distribute and/or modify the software. 43 | 44 | Also, for each author's protection and ours, we want to make certain 45 | that everyone understands that there is no warranty for this free 46 | software. If the software is modified by someone else and passed on, we 47 | want its recipients to know that what they have is not the original, so 48 | that any problems introduced by others will not reflect on the original 49 | authors' reputations. 50 | 51 | Finally, any free program is threatened constantly by software 52 | patents. We wish to avoid the danger that redistributors of a free 53 | program will individually obtain patent licenses, in effect making the 54 | program proprietary. To prevent this, we have made it clear that any 55 | patent must be licensed for everyone's free use or not licensed at all. 56 | 57 | The precise terms and conditions for copying, distribution and 58 | modification follow. 59 | 60 | GNU GENERAL PUBLIC LICENSE 61 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 62 | 63 | 0. This License applies to any program or other work which contains 64 | a notice placed by the copyright holder saying it may be distributed 65 | under the terms of this General Public License. The "Program", below, 66 | refers to any such program or work, and a "work based on the Program" 67 | means either the Program or any derivative work under copyright law: 68 | that is to say, a work containing the Program or a portion of it, 69 | either verbatim or with modifications and/or translated into another 70 | language. (Hereinafter, translation is included without limitation in 71 | the term "modification".) Each licensee is addressed as "you". 72 | 73 | Activities other than copying, distribution and modification are not 74 | covered by this License; they are outside its scope. The act of 75 | running the Program is not restricted, and the output from the Program 76 | is covered only if its contents constitute a work based on the 77 | Program (independent of having been made by running the Program). 78 | Whether that is true depends on what the Program does. 79 | 80 | 1. You may copy and distribute verbatim copies of the Program's 81 | source code as you receive it, in any medium, provided that you 82 | conspicuously and appropriately publish on each copy an appropriate 83 | copyright notice and disclaimer of warranty; keep intact all the 84 | notices that refer to this License and to the absence of any warranty; 85 | and give any other recipients of the Program a copy of this License 86 | along with the Program. 87 | 88 | You may charge a fee for the physical act of transferring a copy, and 89 | you may at your option offer warranty protection in exchange for a fee. 90 | 91 | 2. You may modify your copy or copies of the Program or any portion 92 | of it, thus forming a work based on the Program, and copy and 93 | distribute such modifications or work under the terms of Section 1 94 | above, provided that you also meet all of these conditions: 95 | 96 | a) You must cause the modified files to carry prominent notices 97 | stating that you changed the files and the date of any change. 98 | 99 | b) You must cause any work that you distribute or publish, that in 100 | whole or in part contains or is derived from the Program or any 101 | part thereof, to be licensed as a whole at no charge to all third 102 | parties under the terms of this License. 103 | 104 | c) If the modified program normally reads commands interactively 105 | when run, you must cause it, when started running for such 106 | interactive use in the most ordinary way, to print or display an 107 | announcement including an appropriate copyright notice and a 108 | notice that there is no warranty (or else, saying that you provide 109 | a warranty) and that users may redistribute the program under 110 | these conditions, and telling the user how to view a copy of this 111 | License. (Exception: if the Program itself is interactive but 112 | does not normally print such an announcement, your work based on 113 | the Program is not required to print an announcement.) 114 | 115 | These requirements apply to the modified work as a whole. If 116 | identifiable sections of that work are not derived from the Program, 117 | and can be reasonably considered independent and separate works in 118 | themselves, then this License, and its terms, do not apply to those 119 | sections when you distribute them as separate works. But when you 120 | distribute the same sections as part of a whole which is a work based 121 | on the Program, the distribution of the whole must be on the terms of 122 | this License, whose permissions for other licensees extend to the 123 | entire whole, and thus to each and every part regardless of who wrote it. 124 | 125 | Thus, it is not the intent of this section to claim rights or contest 126 | your rights to work written entirely by you; rather, the intent is to 127 | exercise the right to control the distribution of derivative or 128 | collective works based on the Program. 129 | 130 | In addition, mere aggregation of another work not based on the Program 131 | with the Program (or with a work based on the Program) on a volume of 132 | a storage or distribution medium does not bring the other work under 133 | the scope of this License. 134 | 135 | 3. You may copy and distribute the Program (or a work based on it, 136 | under Section 2) in object code or executable form under the terms of 137 | Sections 1 and 2 above provided that you also do one of the following: 138 | 139 | a) Accompany it with the complete corresponding machine-readable 140 | source code, which must be distributed under the terms of Sections 141 | 1 and 2 above on a medium customarily used for software interchange; or, 142 | 143 | b) Accompany it with a written offer, valid for at least three 144 | years, to give any third party, for a charge no more than your 145 | cost of physically performing source distribution, a complete 146 | machine-readable copy of the corresponding source code, to be 147 | distributed under the terms of Sections 1 and 2 above on a medium 148 | customarily used for software interchange; or, 149 | 150 | c) Accompany it with the information you received as to the offer 151 | to distribute corresponding source code. (This alternative is 152 | allowed only for noncommercial distribution and only if you 153 | received the program in object code or executable form with such 154 | an offer, in accord with Subsection b above.) 155 | 156 | The source code for a work means the preferred form of the work for 157 | making modifications to it. For an executable work, complete source 158 | code means all the source code for all modules it contains, plus any 159 | associated interface definition files, plus the scripts used to 160 | control compilation and installation of the executable. However, as a 161 | special exception, the source code distributed need not include 162 | anything that is normally distributed (in either source or binary 163 | form) with the major components (compiler, kernel, and so on) of the 164 | operating system on which the executable runs, unless that component 165 | itself accompanies the executable. 166 | 167 | If distribution of executable or object code is made by offering 168 | access to copy from a designated place, then offering equivalent 169 | access to copy the source code from the same place counts as 170 | distribution of the source code, even though third parties are not 171 | compelled to copy the source along with the object code. 172 | 173 | 4. You may not copy, modify, sublicense, or distribute the Program 174 | except as expressly provided under this License. Any attempt 175 | otherwise to copy, modify, sublicense or distribute the Program is 176 | void, and will automatically terminate your rights under this License. 177 | However, parties who have received copies, or rights, from you under 178 | this License will not have their licenses terminated so long as such 179 | parties remain in full compliance. 180 | 181 | 5. You are not required to accept this License, since you have not 182 | signed it. However, nothing else grants you permission to modify or 183 | distribute the Program or its derivative works. These actions are 184 | prohibited by law if you do not accept this License. Therefore, by 185 | modifying or distributing the Program (or any work based on the 186 | Program), you indicate your acceptance of this License to do so, and 187 | all its terms and conditions for copying, distributing or modifying 188 | the Program or works based on it. 189 | 190 | 6. Each time you redistribute the Program (or any work based on the 191 | Program), the recipient automatically receives a license from the 192 | original licensor to copy, distribute or modify the Program subject to 193 | these terms and conditions. You may not impose any further 194 | restrictions on the recipients' exercise of the rights granted herein. 195 | You are not responsible for enforcing compliance by third parties to 196 | this License. 197 | 198 | 7. If, as a consequence of a court judgment or allegation of patent 199 | infringement or for any other reason (not limited to patent issues), 200 | conditions are imposed on you (whether by court order, agreement or 201 | otherwise) that contradict the conditions of this License, they do not 202 | excuse you from the conditions of this License. If you cannot 203 | distribute so as to satisfy simultaneously your obligations under this 204 | License and any other pertinent obligations, then as a consequence you 205 | may not distribute the Program at all. For example, if a patent 206 | license would not permit royalty-free redistribution of the Program by 207 | all those who receive copies directly or indirectly through you, then 208 | the only way you could satisfy both it and this License would be to 209 | refrain entirely from distribution of the Program. 210 | 211 | If any portion of this section is held invalid or unenforceable under 212 | any particular circumstance, the balance of the section is intended to 213 | apply and the section as a whole is intended to apply in other 214 | circumstances. 215 | 216 | It is not the purpose of this section to induce you to infringe any 217 | patents or other property right claims or to contest validity of any 218 | such claims; this section has the sole purpose of protecting the 219 | integrity of the free software distribution system, which is 220 | implemented by public license practices. Many people have made 221 | generous contributions to the wide range of software distributed 222 | through that system in reliance on consistent application of that 223 | system; it is up to the author/donor to decide if he or she is willing 224 | to distribute software through any other system and a licensee cannot 225 | impose that choice. 226 | 227 | This section is intended to make thoroughly clear what is believed to 228 | be a consequence of the rest of this License. 229 | 230 | 8. If the distribution and/or use of the Program is restricted in 231 | certain countries either by patents or by copyrighted interfaces, the 232 | original copyright holder who places the Program under this License 233 | may add an explicit geographical distribution limitation excluding 234 | those countries, so that distribution is permitted only in or among 235 | countries not thus excluded. In such case, this License incorporates 236 | the limitation as if written in the body of this License. 237 | 238 | 9. The Free Software Foundation may publish revised and/or new versions 239 | of the General Public License from time to time. Such new versions will 240 | be similar in spirit to the present version, but may differ in detail to 241 | address new problems or concerns. 242 | 243 | Each version is given a distinguishing version number. If the Program 244 | specifies a version number of this License which applies to it and "any 245 | later version", you have the option of following the terms and conditions 246 | either of that version or of any later version published by the Free 247 | Software Foundation. If the Program does not specify a version number of 248 | this License, you may choose any version ever published by the Free Software 249 | Foundation. 250 | 251 | 10. If you wish to incorporate parts of the Program into other free 252 | programs whose distribution conditions are different, write to the author 253 | to ask for permission. For software which is copyrighted by the Free 254 | Software Foundation, write to the Free Software Foundation; we sometimes 255 | make exceptions for this. Our decision will be guided by the two goals 256 | of preserving the free status of all derivatives of our free software and 257 | of promoting the sharing and reuse of software generally. 258 | 259 | NO WARRANTY 260 | 261 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 262 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 263 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 264 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 265 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 266 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 267 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 268 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 269 | REPAIR OR CORRECTION. 270 | 271 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 272 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 273 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 274 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 275 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 276 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 277 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 278 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 279 | POSSIBILITY OF SUCH DAMAGES. 280 | 281 | END OF TERMS AND CONDITIONS 282 | ------------------------------------------------------------------------- 283 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | seadog seems to continue this project. See: http://forum.xbmc.org/showthread.php?tid=139839 2 | 3 | I stopped working on this project. 4 | Feel free to fork and continue ... 5 | 6 | # Trakt Utilities 7 | Trakt Utilities is a XBMC Add-on for trakt. 8 | 9 | This add-on give XBMC the ability to synchronise seen movies, TV shows/episodes with trakt (trakt account required). 10 | More info about trakt: http://trakt.tv/ 11 | 12 | If you use this Addon, you no longer need the official anymore. 13 | 14 | This is an open-source project. 15 | We'll do our best, but use it at your own risk. 16 | 17 | You can download the latest release here: https://github.com/Manromen/script.TraktUtilities/wiki/Download 18 | 19 | **ATTENTION:** 20 | This Add-on needs library mode. All Movies / TV Shows, that are not in library mode will be ignored. 21 | 22 | ## Service Based Features: 23 | * Automatic updates on start-up 24 | * Rating dialog after watching movies or TV episodes 25 | 26 | ## Menu Based Features: 27 | * Watchlist 28 | * Watchlist Movies 29 | - Shows your current watchlist 30 | - Each movie has a thumbnail and background image 31 | - Tags on the thumbnail indicate whether you have got a local copy of the movie 32 | - Selecting a movie will play it locally 33 | 34 | * Watchlist TV Shows 35 | - Shows your current watchlist 36 | - Each show has a thumbnail and background image 37 | 38 | * Friends 39 | Coming soon, watch this space 40 | Currently able to list your friends and indicate what they are currently watching 41 | * Currently watching 42 | * Watch-list 43 | * Watched 44 | * Profile 45 | 46 | * Recommendations 47 | * Recommended Movies 48 | - Shows a list of movies that trakt thinks you will like 49 | - Each movie has a thumbnail and background image 50 | - Tags on the thumbnail indicate whether you have got a local copy of the movie 51 | - Tags on the thumbnail indicate whether the movie is in your watchlist 52 | - Selecting a movie will play it locally 53 | 54 | * Recommended TV Shows 55 | - Shows a list of TV shows that trakt thinks you will like 56 | - Each show has a thumbnail and background image 57 | 58 | * Trending 59 | * Trending Movies 60 | - Shows a list of movies that are trending on trakt 61 | - Each movie has a thumbnail and background image 62 | - Tags on the thumbnail indicate whether you have got a local copy of the movie 63 | - Selecting a movie will play it locally 64 | 65 | * Trending TV Shows 66 | - Shows a list of TV shows that are trending on trakt 67 | - Each show has a thumbnail and background image 68 | 69 | * Update / Sync / Clean 70 | * Update Movie Collection: 71 | - updates your trakt movie library (not the seen movies) with your xbmc collection 72 | 73 | * Sync seen Movies: 74 | - synchronise seen movies between xbmc and trakt 75 | - seen movies from xbmc will be set as seen on trakt 76 | - seen movies from trakt will be set as seen on xbmc 77 | - it don't sets movies as unseen 78 | 79 | * Update TV Show Collection: 80 | - same like Update Movie Collection, but for TV Shows. 81 | 82 | * Sync seen TV Shows: 83 | - same like Sync seen Movies, but for TV Shows. 84 | 85 | * Clean Movie Collection: 86 | - this will remove deleted movies from the trakt collection (unlibrary, it will not set movies as unseen). 87 | 88 | **ATTENTION:** 89 | - don't use this function, if you collect data about your DVDs, Blu-Rays, etc. 90 | - this will unlibrary all movies on tract, that are not in the xbmc database 91 | 92 | * Clean TV Show Collection: 93 | - same like Clean Movie Collection, but for TV Shows 94 | 95 | **ATTENTION:** 96 | - don't use this function, if you collect data about your DVDs, Blu-Rays, etc. 97 | - this will unlibrary all tvshows on trakt, that are not in the xbmc database 98 | 99 | The Utilities for TV Shows only work, if your scraper is TVDB ([[http://thetvdb.com/]]). 100 | 101 | Special Thanks to: Justin Nemeth and Sean Rudford, for the great trakt project. 102 | -------------------------------------------------------------------------------- /ToDo: -------------------------------------------------------------------------------- 1 | # insert todos and append yourself like (Manromen) if you are currently working on something 2 | 3 | - friends submenu redesign (Manromen) [branch: friends]] 4 | - browse friends library 5 | - display friends profile 6 | -------------------------------------------------------------------------------- /addon.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | video 13 | 14 | 15 | 16 | 17 | 18 | some trakt utilities 19 | Trakt Utilities 20 | Synchronise Movies / TVShows with Trakt (more infos and account creation: http://trakt.tv/). 21 | This plugin isn't a replacement for the official trakt plugin. It's a supplement to the trakt plugin. 22 | 23 | This is an open-source project. 24 | I'll do my best, but the use is at own risk. 25 | 26 | Utilities: 27 | - Update Movie Collection: 28 | updates your trakt movie library (not the seen movies) with your xbmc collection 29 | 30 | - Sync seen Movies: 31 | synchronise seen movies between xbmc and trakt 32 | seen movies from xbmc will be set as seen on trakt 33 | seen movies from trakt will be set as seen on xbmc 34 | it don't sets movies as unseen 35 | 36 | - Update TV Show Collection: 37 | same like Update Movie Collection, but for TV Shows. 38 | 39 | - Sync seen TV Shows: 40 | same like Sync seen Movies, but for TV Shows. 41 | 42 | - Clean Movie Collection: 43 | this will remove deleted movies from the trakt collection (unlibrary, it will not set movies as unseen). 44 | ATTENTION: 45 | don't use this function, if you collect data about your DVDs, Blu-Rays, etc. 46 | this will unlibrary all movies, that are not listed in xbmc 47 | 48 | - Clean TV Show Collection: 49 | same like Clean Movie Collection, but for TV Shows 50 | 51 | The Utilities for TV Shows only work yet, if your scraper is TVDB (http://thetvdb.com/). 52 | 53 | Special Thanks to: Justin Nemeth and Sean Rudford, for the great Trakt project. 54 | 55 | 56 | all 57 | 58 | 59 | -------------------------------------------------------------------------------- /changelog.txt: -------------------------------------------------------------------------------- 1 | Version 0.6.5: 2 | - Changed the logic for pausing to not treat it as a stop in the video 3 | - Fixed problem where connections to trakt were closed before readin the responce 4 | - Fixed syncing error that occured when a last played value was not a correctly formatted date 5 | - Fixed #110, Coping with unicoded names in sql quiries 6 | - Added polish translations 7 | - Skin updates for Aeon Nox 8 | - Fixed stupidity in playcount updater 9 | - Probable solution for #101, #61 the freezing of xbmc when syncing seen back to xbmc.Removed all uses of httpapi for sql db access, replaced with smart (db finding) direct access. 10 | - Fixed the list of tuples bug, where it talks about commas during syncing 11 | - Season limit changed 12 | - A possible fix for the error 'InterfaceError: an integer is required' 13 | - Posible fix for divide by 0 error 14 | - Added debug messages to aid in identifying quitting problems 15 | - Fixed bugs with sync debug statements 16 | 17 | Version 0.6.4: 18 | - Fixed broken syncing and scrobbling due to changes in xbmc json-rpc schema 19 | 20 | Version 0.6.3: 21 | - Repository hotfix 22 | 23 | Version 0.6.2: 24 | - Hotfix: bug that caused trakt connection reuse to throw and exception, this prevented tv show syncing 25 | 26 | Version 0.6.1: 27 | - Fixed (hopefully) major bug where Trakt Utilities prevented xbmc from closing, indefinatly, #91 28 | - Fixed major bug where items that where already marked as seen where not added to the collection #90 29 | - Fixed problems with changed json versions in xbmc #86 & #88 30 | - Fixed misc bugs #63, #67, #69, #74, #75, #86, #87 31 | - Added option to automatically clean the movie/tv collection on trakt 32 | - Scrobbling seems stable now and Trakt Utilities can be used safely by itself 33 | 34 | Version 0.6.0: 35 | - Added experimental scrobbling abilities (disabled by default) 36 | eventually this will mean you can run Trakt Utilities by itself 37 | - Support for newer jsonrpc notifications 38 | - Bugfix: "'NoneType' object is not iterable" error fixed by internal refactoring 39 | - trakt login details checked at startup and settings shown if missing or incorrect 40 | - Bugfix: rating dialog only appearing for items started after auto syncronisation compleated 41 | - Option to change the required percent viewed for rating dialog to appear 42 | - Instant syncronisation of changes to the 'watched' status in standard xmbc libraries 43 | - Option to diable rating dialogs during playlists that contain more than one item 44 | - Context menus for Movie and TV Show windows (eg watchlist, trending and recommended) 45 | including options for rating and changing the watchlist status 46 | - Added status tags to TV Shows in the relevent windows 47 | - Rating dialogs now show the current rating status and allow unrating 48 | 49 | Version 0.5.2: 50 | - fixed several bugs (for more information see tickets #35 #39 #42 #43 #47 and #49 on git) 51 | - switched from own simplejson to xbmc's simplejson: 52 | - Skin Aeon-Nox is now integrated. (Thanks: Big Noid) 53 | - Support for newer nighlties that require arbitrary resolution definitions 54 | - Improved handling of responces from the trakt api 55 | - Improved handling of timeouts when talking to trakt api 56 | - Ability to rate whole TV shows from current rating dialog 57 | 58 | Version 0.5.1: 59 | - rating dialog that appears after watching items is now optional 60 | - Can now rate whole tv shows after watching an episode 61 | - Bugfix: inability to access trending movies 62 | - Bugfix: items played via trakt utilities weren't added to the playlist correctly 63 | - Bugfix: using trakt utilities to play a movie that is no longer in the library fails silently 64 | - Better debug output during communication errors with trakt api 65 | 66 | Version 0.5.0: 67 | - rating dialog after watching a movie or tv episode 68 | - Bugfix: no duplicates in movie lists after watching 69 | - Bugfix: fixed an issue with setting tv show episodes as seen on xbmc 70 | - local tag on movies added, that indicate local presence 71 | - watchlist tag on movies added 72 | - trakt utilities icon added 73 | 74 | Version 0.4.2: 75 | - Bugfix release: movies can now be played again 76 | 77 | Version 0.4.1: 78 | - switched from sqlite to httpapi-sql queries (support for external mysql servers) 79 | - added menu for: 80 | - watchlist tv shows 81 | - trending tv shows 82 | - recommended movies 83 | - recommended tv shows 84 | 85 | Version 0.4.0: 86 | - movies can directly played from watchlist / trending window (othrayte) 87 | - added menu for movies: watchlist / trending (manromen / othrayte) 88 | - catching some more possible errors / added some debug output 89 | - changed some get functions to push functions (for protected users) (othrayte)) 90 | - accessing watchlists for protected accounts (othrayte) 91 | 92 | Version 0.3.1: 93 | - Bugfix Update 94 | 95 | Version 0.3.0: 96 | - menu restructured 97 | - you can show your watchlist now 98 | - updated compatibility to new json rpc since nightly build April, 5. 2011 99 | 100 | Version 0.2.2: 101 | - some bugfixes 102 | - added auto update movie / tvshow collection at startup 103 | 104 | Version 0.2.1: 105 | - small bugfix 106 | 107 | Version 0.2.0: 108 | - added auto sync seen movies / tv shows at startup 109 | - added warning for clean collection 110 | 111 | Version 0.1.6: 112 | - fixed a KeyError 113 | 114 | Version 0.1.5: 115 | - added german language 116 | - fixed a NameError 117 | - fixed a Database path issue 118 | 119 | Version 0.1.4: 120 | - added update functionality 121 | 122 | Version 0.1.3: 123 | - some small fixes (some possible tcp timeouts etc.) 124 | - correction of some spelling 125 | - fixed an linux issue (extension usage in addon.xml) 126 | 127 | Version 0.1.2: 128 | - fixed some possible freeze 129 | 130 | Version 0.1.1: 131 | - fixed some possible KeyError's 132 | - no need of API Key from user anymore 133 | 134 | Version 0.1: 135 | - Sync seen TVShows with Trakt 136 | - Sync seen Movies with Trakt 137 | - Update / Clean Movie Collection 138 | - Update / Clean TVShow Collection 139 | 140 | ToDo for future versions: 141 | - option to ask for rating at movie finished 142 | - option to ask for rating at tvshow episode finished 143 | 144 | -------------------------------------------------------------------------------- /default.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | 4 | import os 5 | import xbmcgui,xbmcaddon,xbmc 6 | from utilities import * 7 | from sync_update import * 8 | from watchlist import * 9 | from recommend import * 10 | from friends import * 11 | from trending import * 12 | 13 | __author__ = "Ralph-Gordon Paul, Adrian Cowan" 14 | __credits__ = ["Ralph-Gordon Paul", "Justin Nemeth", "Sean Rudford"] 15 | __license__ = "GPL" 16 | __maintainer__ = "Ralph-Gordon Paul" 17 | __email__ = "ralph-gordon.paul@uni-duesseldorf.de" 18 | __status__ = "Production" 19 | 20 | #read settings 21 | __settings__ = xbmcaddon.Addon( "script.traktutilities" ) 22 | __language__ = __settings__.getLocalizedString 23 | 24 | Debug("default: " + __settings__.getAddonInfo("id") + " - version: " + __settings__.getAddonInfo("version")) 25 | 26 | # Usermenu: 27 | def menu(): 28 | 29 | # check if needed settings are set 30 | if checkSettings() == False: 31 | return 32 | 33 | options = [__language__(1210).encode( "utf-8", "ignore" ), __language__(1211).encode( "utf-8", "ignore" ), __language__(1212).encode( "utf-8", "ignore" ), __language__(1213).encode( "utf-8", "ignore" ), __language__(1214).encode( "utf-8", "ignore" )] 34 | 35 | while True: 36 | select = xbmcgui.Dialog().select("Trakt Utilities", options) 37 | Debug("Select: " + str(select)) 38 | if select == -1: 39 | Debug ("menu quit by user") 40 | return 41 | else: 42 | if select == 0: # Watchlist 43 | submenuWatchlist() 44 | elif select == 1: # Friends 45 | showFriends() 46 | elif select == 2: # Recommendations 47 | submenuRecommendations() 48 | elif select == 3: # Trending Movies / TV Shows 49 | submenuTrendingMoviesTVShows() 50 | elif select == 4: # Update / Sync / Clean 51 | submenuUpdateSyncClean() 52 | 53 | 54 | def submenuUpdateSyncClean(): 55 | 56 | options = [__language__(1217).encode( "utf-8", "ignore" ), __language__(1218).encode( "utf-8", "ignore" ), __language__(1219).encode( "utf-8", "ignore" ), __language__(1220).encode( "utf-8", "ignore" ), __language__(1221).encode( "utf-8", "ignore" ), __language__(1222).encode( "utf-8", "ignore" )] 57 | 58 | while True: 59 | select = xbmcgui.Dialog().select("Trakt Utilities", options) 60 | Debug("Select: " + str(select)) 61 | if select == -1: 62 | Debug ("menu quit by user") 63 | return 64 | elif select == 0: # Update Movie Collection 65 | updateMovieCollection() 66 | elif select == 1: # Sync seen Movies 67 | syncSeenMovies() 68 | elif select == 2: # Update TV Show Collection 69 | updateTVShowCollection() 70 | elif select == 3: # Sync seen TV Shows 71 | syncSeenTVShows() 72 | elif select == 4: # Clean Movie Collection 73 | cleanMovieCollection() 74 | elif select == 5: # Clean TV Show Collection 75 | cleanTVShowCollection() 76 | 77 | def submenuTrendingMoviesTVShows(): 78 | 79 | options = [__language__(1250).encode( "utf-8", "ignore" ), __language__(1251).encode( "utf-8", "ignore" )] 80 | 81 | while True: 82 | select = xbmcgui.Dialog().select(__language__(1213).encode( "utf-8", "ignore" ), options) 83 | Debug("Select: " + str(select)) 84 | if select == -1: 85 | Debug ("menu quit by user") 86 | return 87 | if select == 0: # Trending Movies 88 | showTrendingMovies() 89 | elif select == 1: # Trending TV Shows 90 | showTrendingTVShows() 91 | 92 | def submenuWatchlist(): 93 | 94 | options = [__language__(1252).encode( "utf-8", "ignore" ), __language__(1253).encode( "utf-8", "ignore" )] 95 | 96 | while True: 97 | select = xbmcgui.Dialog().select(__language__(1210).encode( "utf-8", "ignore" ), options) 98 | Debug("Select: " + str(select)) 99 | if select == -1: 100 | Debug ("menu quit by user") 101 | return 102 | if select == 0: # Watchlist Movies 103 | showWatchlistMovies() 104 | elif select == 1: # Watchlist TV Shows 105 | showWatchlistTVShows() 106 | 107 | def submenuRecommendations(): 108 | 109 | options = [__language__(1255).encode( "utf-8", "ignore" ), __language__(1256).encode( "utf-8", "ignore" )] 110 | 111 | while True: 112 | select = xbmcgui.Dialog().select(__language__(1212).encode( "utf-8", "ignore" ), options) 113 | Debug("Select: " + str(select)) 114 | if select == -1: 115 | Debug ("menu quit by user") 116 | return 117 | if select == 0: # Watchlist Movies 118 | showRecommendedMovies() 119 | elif select == 1: # Watchlist TV Shows 120 | showRecommendedTVShows() 121 | 122 | menu() 123 | -------------------------------------------------------------------------------- /friends.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | 4 | import xbmc,xbmcaddon,xbmcgui 5 | from utilities import * 6 | 7 | __author__ = "Ralph-Gordon Paul, Adrian Cowan" 8 | __credits__ = ["Ralph-Gordon Paul", "Adrian Cowan", "Justin Nemeth", "Sean Rudford"] 9 | __license__ = "GPL" 10 | __maintainer__ = "Ralph-Gordon Paul" 11 | __email__ = "ralph-gordon.paul@uni-duesseldorf.de" 12 | __status__ = "Production" 13 | 14 | # read settings 15 | __settings__ = xbmcaddon.Addon( "script.traktutilities" ) 16 | __language__ = __settings__.getLocalizedString 17 | 18 | apikey = '0a698a20b222d0b8637298f6920bf03a' 19 | username = __settings__.getSetting("username") 20 | pwd = sha.new(__settings__.getSetting("password")).hexdigest() 21 | debug = __settings__.getSetting( "debug" ) 22 | https = __settings__.getSetting( "https" ) 23 | 24 | if (https == 'true'): 25 | conn = httplib.HTTPSConnection('api.trakt.tv') 26 | else: 27 | conn = httplib.HTTPConnection('api.trakt.tv') 28 | 29 | headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} 30 | 31 | def showFriends(): 32 | 33 | options = [] 34 | data = getFriendsFromTrakt() 35 | 36 | if data == None: # data = None => there was an error 37 | return # error already displayed in utilities.py 38 | 39 | for friend in data: 40 | try: 41 | if friend['full_name'] != None: 42 | options.append(friend['full_name']+" ("+friend['username']+")") 43 | else: 44 | options.append(friend['username']) 45 | except KeyError: 46 | pass # Error ? skip this movie 47 | 48 | if len(options) == 0: 49 | xbmcgui.Dialog().ok("Trakt Utilities", "you have not added any friends on Trakt") 50 | return 51 | 52 | while True: 53 | select = xbmcgui.Dialog().select(__language__(1211).encode( "utf-8", "ignore" ), options) # Friends 54 | Debug("Select: " + str(select)) 55 | if select == -1: 56 | Debug ("menu quit by user") 57 | return 58 | showFriendSubmenu(data[select]) 59 | 60 | def showFriendSubmenu(user): 61 | #check what (if anything) the user is watching 62 | watchdata = getWatchingFromTraktForUser(user['username']) 63 | currentitem = "Nothing" 64 | if len(watchdata) != 0: 65 | if watchdata['type'] == "movie": 66 | currentitem = watchdata['movie']['title']+" ["+str(watchdata['movie']['year'])+"]" 67 | elif watchdata['type'] == "episode": 68 | currentitem = watchdata['show']['title']+" "+str(watchdata['episode']['season'])+"x"+str(watchdata['episode']['number'])+" - "+watchdata['episode']['title'] 69 | 70 | options = [(__language__(1280)+": "+currentitem).encode( "utf-8", "ignore" ), __language__(1281).encode( "utf-8", "ignore" ), __language__(1282).encode( "utf-8", "ignore" ), __language__(1283).encode( "utf-8", "ignore" ), __language__(1284).encode( "utf-8", "ignore" )] 71 | while True: 72 | select = xbmcgui.Dialog().select((__language__(1211)+" - "+user['username']).encode( "utf-8", "ignore" ), options) 73 | Debug("Select: " + str(select)) 74 | if select == -1: 75 | Debug ("menu quit by user") 76 | return 77 | else: 78 | if select == 0: # Select (friends) currenty playing 79 | xbmcgui.Dialog().ok("Trakt Utilities", "comming soon") 80 | elif select == 1: # Friends watchlist 81 | showFriendsWatchlist(user) 82 | elif select == 2: # Friends watched 83 | showFriendsWatched(user) 84 | elif select == 3: # Friends library 85 | showFriendsLibrary(user) 86 | elif select == 4: # Friends profile 87 | showFriendsProfile(user) 88 | 89 | def showFriendsWatchlist(user): 90 | xbmcgui.Dialog().ok("Trakt Utilities", "comming soon") 91 | 92 | def showFriendsWatched(user): 93 | xbmcgui.Dialog().ok("Trakt Utilities", "comming soon") 94 | 95 | def showFriendsLibrary(user): 96 | xbmcgui.Dialog().ok("Trakt Utilities", "comming soon") 97 | 98 | def showFriendsProfile(user): 99 | xbmcgui.Dialog().ok("Trakt Utilities", "comming soon") -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/icon.png -------------------------------------------------------------------------------- /instant_sync.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | 4 | import xbmc,xbmcaddon,xbmcgui 5 | import telnetlib, time 6 | 7 | try: import simplejson as json 8 | except ImportError: import json 9 | 10 | import threading 11 | from utilities import * 12 | from instant_sync import * 13 | 14 | __author__ = "Ralph-Gordon Paul, Adrian Cowan" 15 | __credits__ = ["Ralph-Gordon Paul", "Adrian Cowan", "Justin Nemeth", "Sean Rudford"] 16 | __license__ = "GPL" 17 | __maintainer__ = "Ralph-Gordon Paul" 18 | __email__ = "ralph-gordon.paul@uni-duesseldorf.de" 19 | __status__ = "Production" 20 | 21 | __settings__ = xbmcaddon.Addon( "script.traktutilities" ) 22 | __language__ = __settings__.getLocalizedString 23 | 24 | # Move this to its own file 25 | def instantSyncPlayCount(data): 26 | if data['params']['data']['item']['type'] == 'episode': 27 | info = getEpisodeDetailsFromXbmc(data['params']['data']['item']['id'], ['tvshowid','showtitle', 'season', 'episode']) 28 | rpccmd = json.dumps({'jsonrpc': '2.0', 'method': 'VideoLibrary.GetTVShowDetails','params':{'tvshowid': info['tvshowid'], 'properties': ['imdbnumber']}, 'id': 1}) 29 | result = xbmc.executeJSONRPC(rpccmd) 30 | result = json.loads(result) 31 | Debug("[Instant-sync] (TheTVDB ID: )"+str(result)) 32 | if info == None: return 33 | Debug("[Instant-sync] (episode playcount): "+str(info)) 34 | if data['params']['data']['playcount'] == 0: 35 | res = setEpisodesUnseenOnTrakt(result['result']['tvshowdetails']['imdbnumber'], info['showtitle'], None, [{'season':info['season'], 'episode':info['episode']}]) 36 | elif data['params']['data']['playcount'] == 1: 37 | res = setEpisodesSeenOnTrakt(result['result']['tvshowdetails']['imdbnumber'], info['showtitle'], None, [{'season':info['season'], 'episode':info['episode']}]) 38 | else: 39 | return 40 | Debug("[Instant-sync] (episode playcount): responce "+str(res)) 41 | if data['params']['data']['item']['type'] == 'movie': 42 | info = getMovieDetailsFromXbmc(data['params']['data']['item']['id'], ['imdbnumber', 'title', 'year', 'playcount', 'lastplayed']) 43 | if info == None: return 44 | Debug("[Instant-sync] (movie playcount): "+str(info)) 45 | if 'lastplayed' not in info: info['lastplayed'] = None 46 | if data['params']['data']['playcount'] == 0: 47 | res = setMoviesUnseenOnTrakt([{'imdb_id':info['imdbnumber'], 'title':info['title'], 'year':info['year'], 'plays':data['params']['data']['playcount'], 'last_played':info['lastplayed']}]) 48 | elif data['params']['data']['playcount'] == 1: 49 | res = setMoviesSeenOnTrakt([{'imdb_id':info['imdbnumber'], 'title':info['title'], 'year':info['year'], 'plays':data['params']['data']['playcount'], 'last_played':info['lastplayed']}]) 50 | else: 51 | return 52 | Debug("[Instant-sync] (movie playcount): responce "+str(res)) -------------------------------------------------------------------------------- /nbhttpconnection.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | 4 | import os, sys 5 | import time, socket 6 | import urllib 7 | import thread 8 | import threading 9 | 10 | try: 11 | # Python 3.0 + 12 | import http.client as httplib 13 | except ImportError: 14 | # Python 2.7 and earlier 15 | import httplib 16 | 17 | try: 18 | # Python 2.6 + 19 | from hashlib import sha as sha 20 | except ImportError: 21 | # Python 2.5 and earlier 22 | import sha 23 | 24 | __author__ = "Ralph-Gordon Paul, Adrian Cowan" 25 | __credits__ = ["Ralph-Gordon Paul", "Adrian Cowan", "Justin Nemeth", "Sean Rudford"] 26 | __license__ = "GPL" 27 | __maintainer__ = "Ralph-Gordon Paul" 28 | __email__ = "ralph-gordon.paul@uni-duesseldorf.de" 29 | __status__ = "Production" 30 | 31 | # Allows non-blocking http requests 32 | class NBHTTPConnection(): 33 | def __init__(self, host, port = None, strict = None, timeout = None): 34 | self.rawConnection = httplib.HTTPConnection(host, port, strict, timeout) 35 | self.responce = None 36 | self.responceLock = threading.Lock() 37 | self.closing = False 38 | 39 | def request(self, method, url, body = None, headers = {}): 40 | self.rawConnection.request(method, url, body, headers); 41 | 42 | def hasResult(self): 43 | if self.responceLock.acquire(False): 44 | self.responceLock.release() 45 | return True 46 | else: 47 | return False 48 | 49 | def getResult(self): 50 | while not self.hasResult() and not self.closing: 51 | time.sleep(1) 52 | return self.responce 53 | 54 | def go(self): 55 | self.responceLock.acquire() 56 | thread.start_new_thread ( NBHTTPConnection._run, ( self, ) ) 57 | 58 | def _run(self): 59 | self.responce = self.rawConnection.getresponse() 60 | self.responceLock.release() 61 | 62 | def close(self): 63 | self.closing = True 64 | self.rawConnection.close() 65 | -------------------------------------------------------------------------------- /nbhttpsconnection.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | 4 | import os, sys 5 | import time, socket 6 | import urllib 7 | import thread 8 | import threading 9 | 10 | try: 11 | # Python 3.0 + 12 | import http.client as httplib 13 | except ImportError: 14 | # Python 2.7 and earlier 15 | import httplib 16 | 17 | try: 18 | # Python 2.6 + 19 | from hashlib import sha as sha 20 | except ImportError: 21 | # Python 2.5 and earlier 22 | import sha 23 | 24 | __author__ = "Ralph-Gordon Paul, Adrian Cowan" 25 | __credits__ = ["Ralph-Gordon Paul", "Adrian Cowan", "Justin Nemeth", "Sean Rudford"] 26 | __license__ = "GPL" 27 | __maintainer__ = "Ralph-Gordon Paul" 28 | __email__ = "ralph-gordon.paul@uni-duesseldorf.de" 29 | __status__ = "Production" 30 | 31 | # Allows non-blocking http requests 32 | class NBHTTPSConnection(): 33 | def __init__(self, host, port = None, strict = None, timeout = None): 34 | self.rawConnection = httplib.HTTPSConnection(host, port, strict, timeout) 35 | self.responce = None 36 | self.responceLock = threading.Lock() 37 | self.closing = False 38 | 39 | def request(self, method, url, body = None, headers = {}): 40 | self.rawConnection.request(method, url, body, headers); 41 | 42 | def hasResult(self): 43 | if self.responceLock.acquire(False): 44 | self.responceLock.release() 45 | return True 46 | else: 47 | return False 48 | 49 | def getResult(self): 50 | while not self.hasResult() and not self.closing: 51 | time.sleep(1) 52 | return self.responce 53 | 54 | def go(self): 55 | self.responceLock.acquire() 56 | thread.start_new_thread ( NBHTTPSConnection._run, ( self, ) ) 57 | 58 | def _run(self): 59 | self.responce = self.rawConnection.getresponse() 60 | self.responceLock.release() 61 | 62 | def close(self): 63 | self.closing = True 64 | self.rawConnection.close() 65 | 66 | -------------------------------------------------------------------------------- /notification_service.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | 4 | import xbmc,xbmcaddon,xbmcgui 5 | import telnetlib, time 6 | 7 | try: import simplejson as json 8 | except ImportError: import json 9 | 10 | import threading 11 | from utilities import * 12 | from rating import * 13 | from sync_update import * 14 | from instant_sync import * 15 | from scrobbler import Scrobbler 16 | 17 | __author__ = "Ralph-Gordon Paul, Adrian Cowan" 18 | __credits__ = ["Ralph-Gordon Paul", "Adrian Cowan", "Justin Nemeth", "Sean Rudford"] 19 | __license__ = "GPL" 20 | __maintainer__ = "Ralph-Gordon Paul" 21 | __email__ = "ralph-gordon.paul@uni-duesseldorf.de" 22 | __status__ = "Production" 23 | 24 | __settings__ = xbmcaddon.Addon( "script.traktutilities" ) 25 | __language__ = __settings__.getLocalizedString 26 | 27 | # Receives XBMC notifications and passes them off to the rating functions 28 | class NotificationService(threading.Thread): 29 | abortRequested = False 30 | def run(self): 31 | #while xbmc is running 32 | scrobbler = Scrobbler() 33 | scrobbler.start() 34 | 35 | while (not (self.abortRequested or xbmc.abortRequested)): 36 | time.sleep(1) 37 | try: 38 | tn = telnetlib.Telnet('localhost', 9090, 10) 39 | except IOError as (errno, strerror): 40 | #connection failed, try again soon 41 | Debug("[Notification Service] Telnet too soon? ("+str(errno)+") "+strerror) 42 | time.sleep(1) 43 | continue 44 | 45 | Debug("[Notification Service] Waiting~"); 46 | bCount = 0 47 | 48 | while (not (self.abortRequested or xbmc.abortRequested)): 49 | try: 50 | if bCount == 0: 51 | notification = "" 52 | inString = False 53 | [index, match, raw] = tn.expect(["(\\\\)|(\\\")|[{\"}]"], 0.2) #note, pre-compiled regex might be faster here 54 | notification += raw 55 | if index == -1: # Timeout 56 | continue 57 | if index == 0: # Found escaped quote 58 | match = match.group(0) 59 | if match == "\"": 60 | inString = not inString 61 | continue 62 | if match == "{": 63 | bCount += 1 64 | if match == "}": 65 | bCount -= 1 66 | if bCount > 0: 67 | continue 68 | if bCount < 0: 69 | bCount = 0 70 | except EOFError: 71 | break #go out to the other loop to restart the connection 72 | 73 | Debug("[Notification Service] message: " + str(notification)) 74 | 75 | # Parse recieved notification 76 | data = json.loads(notification) 77 | 78 | # Forward notification to functions 79 | if 'method' in data and 'params' in data and 'sender' in data['params'] and data['params']['sender'] == 'xbmc': 80 | if data['method'] == 'Player.OnStop': 81 | scrobbler.playbackEnded() 82 | elif data['method'] == 'Player.OnPlay': 83 | if 'data' in data['params'] and 'item' in data['params']['data'] and 'id' in data['params']['data']['item'] and 'type' in data['params']['data']['item']: 84 | scrobbler.playbackStarted(data['params']['data']) 85 | elif data['method'] == 'Player.OnPause': 86 | scrobbler.playbackPaused() 87 | elif data['method'] == 'VideoLibrary.OnUpdate': 88 | if 'data' in data['params'] and 'playcount' in data['params']['data']: 89 | instantSyncPlayCount(data) 90 | elif data['method'] == 'System.OnQuit': 91 | self.abortRequested = True 92 | try: 93 | tn.close() 94 | except: 95 | Debug("[NotificationService] Encountered error attempting to close the telnet connection") 96 | raise 97 | scrobbler.abortRequested = True 98 | Debug("Notification service stopping") -------------------------------------------------------------------------------- /rating.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | 4 | import os 5 | import xbmc,xbmcaddon,xbmcgui 6 | from utilities import * 7 | 8 | __author__ = "Ralph-Gordon Paul, Adrian Cowan" 9 | __credits__ = ["Ralph-Gordon Paul", "Adrian Cowan", "Justin Nemeth", "Sean Rudford"] 10 | __license__ = "GPL" 11 | __maintainer__ = "Ralph-Gordon Paul" 12 | __email__ = "ralph-gordon.paul@uni-duesseldorf.de" 13 | __status__ = "Production" 14 | 15 | # read settings 16 | __settings__ = xbmcaddon.Addon( "script.traktutilities" ) 17 | __language__ = __settings__.getLocalizedString 18 | 19 | apikey = '0a698a20b222d0b8637298f6920bf03a' 20 | username = __settings__.getSetting("username") 21 | pwd = sha.new(__settings__.getSetting("password")).hexdigest() 22 | debug = __settings__.getSetting( "debug" ) 23 | 24 | headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} 25 | 26 | def ratingCheck(curVideo, watchedTime, totalTime, playlistLength): 27 | __settings__ = xbmcaddon.Addon( "script.traktutilities" ) #read settings again, encase they have changed 28 | # you can disable rating in options 29 | rateMovieOption = __settings__.getSetting("rate_movie") 30 | rateEpisodeOption = __settings__.getSetting("rate_episode") 31 | rateEachInPlaylistOption = __settings__.getSetting("rate_each_playlist_item") 32 | rateMinViewTimeOption = __settings__.getSetting("rate_min_view_time") 33 | 34 | if (watchedTime/totalTime)*100>=float(rateMinViewTimeOption): 35 | if (playlistLength <= 1) or (rateEachInPlaylistOption == 'true'): 36 | if curVideo['type'] == 'movie' and rateMovieOption == 'true': 37 | doRateMovie(curVideo['id']) 38 | if curVideo['type'] == 'episode' and rateEpisodeOption == 'true': 39 | doRateEpisode(curVideo['id']) 40 | 41 | # ask user if they liked the movie 42 | def doRateMovie(movieid=None, imdbid=None, title=None, year=None): 43 | if (movieid <> None) : 44 | match = getMovieDetailsFromXbmc(movieid, ['imdbnumber','title','year']) 45 | if not match: 46 | #add error message here 47 | return 48 | 49 | imdbid = match['imdbnumber'] 50 | title = match['title'] 51 | year = match['year'] 52 | 53 | # display rate dialog 54 | import windows 55 | ui = windows.RateMovieDialog("rate.xml", __settings__.getAddonInfo('path'), "Default") 56 | ui.initDialog(imdbid, title, year, getMovieRatingFromTrakt(imdbid, title, year)) 57 | ui.doModal() 58 | del ui 59 | 60 | # ask user if they liked the episode 61 | def doRateEpisode(episodeId): 62 | match = getEpisodeDetailsFromXbmc(episodeId, ['showtitle', 'season', 'episode']) 63 | if not match: 64 | #add error message here 65 | return 66 | 67 | tvdbid = None #match['tvdbnumber'] 68 | title = match['showtitle'] 69 | year = None #match['year'] 70 | season = match['season'] 71 | episode = match['episode'] 72 | 73 | # display rate dialog 74 | import windows 75 | ui = windows.RateEpisodeDialog("rate.xml", __settings__.getAddonInfo('path'), "Default") 76 | ui.initDialog(tvdbid, title, year, season, episode, getEpisodeRatingFromTrakt(tvdbid, title, year, season, episode)) 77 | ui.doModal() 78 | del ui 79 | -------------------------------------------------------------------------------- /raw_xbmc_database.py: -------------------------------------------------------------------------------- 1 | import os, xbmc 2 | from utilities import Debug 3 | #provides access to the raw xbmc video database 4 | 5 | 6 | global _RawXbmcDb__conn 7 | _RawXbmcDb__conn = None 8 | class RawXbmcDb(): 9 | 10 | # make a httpapi based XBMC db query (get data) 11 | @staticmethod 12 | def query(str): 13 | global _RawXbmcDb__conn 14 | if _RawXbmcDb__conn is None: 15 | _RawXbmcDb__conn = _findXbmcDb() 16 | 17 | Debug("[RawXbmcDb] query: "+str) 18 | cursor = _RawXbmcDb__conn.cursor() 19 | cursor.execute(str) 20 | 21 | matches = [] 22 | for row in cursor: 23 | matches.append(row) 24 | 25 | Debug("[RawXbmcDb] matches: "+unicode(matches)) 26 | 27 | _RawXbmcDb__conn.commit() 28 | cursor.close() 29 | return matches 30 | 31 | # execute a httpapi based XBMC db query (set data) 32 | @staticmethod 33 | def execute(str): 34 | return RawXbmcDb.query(str) 35 | 36 | def _findXbmcDb(): 37 | import re 38 | type = None 39 | host = None 40 | port = 3306 41 | name = 'MyVideos' 42 | user = None 43 | passwd = None 44 | version = re.findall( "((?:[^<]|<(?!/))*)", xbmc.executehttpapi("QueryVideoDatabase(SELECT idVersion FROM version)"),)[0] 45 | Debug(version) 46 | if not os.path.exists(xbmc.translatePath("special://userdata/advancedsettings.xml")): 47 | type = 'sqlite3' 48 | else: 49 | from xml.etree.ElementTree import ElementTree 50 | advancedsettings = ElementTree() 51 | advancedsettings.parse(xbmc.translatePath("special://userdata/advancedsettings.xml")) 52 | settings = advancedsettings.getroot().find("videodatabase") 53 | if settings is not None: 54 | for setting in settings: 55 | if setting.tag == 'type': 56 | type = setting.text 57 | elif setting.tag == 'host': 58 | host = setting.text 59 | elif setting.tag == 'port': 60 | port = setting.text 61 | elif setting.tag == 'name': 62 | name = setting.text 63 | elif setting.tag == 'user': 64 | user = setting.text 65 | elif setting.tag == 'pass': 66 | passwd = setting.text 67 | else: 68 | type = 'sqlite3' 69 | 70 | if type == 'sqlite3': 71 | if host is None: 72 | path = xbmc.translatePath("special://userdata/Database") 73 | files = os.listdir(path) 74 | latest = "" 75 | for file in files: 76 | if file[:8] == 'MyVideos' and file[-3:] == '.db': 77 | if file > latest: 78 | latest = file 79 | host = os.path.join(path,latest) 80 | else: 81 | host += version+".db" 82 | Debug("[RawXbmcDb] Found sqlite3db: "+str(host)) 83 | import sqlite3 84 | return sqlite3.connect(host) 85 | if type == 'mysql': 86 | if version >= 60: 87 | database = name+version 88 | else: 89 | database = name 90 | Debug("[RawXbmcDb] Found mysqldb: "+str(host)+":"+str(port)+", "+str(database)) 91 | import mysql.connector 92 | return mysql.connector.Connect(host = str(host), port = int(port), database = str(database), user = str(user), password = str(passwd)) -------------------------------------------------------------------------------- /recommend.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | 4 | import xbmc,xbmcaddon,xbmcgui 5 | from utilities import * 6 | 7 | __author__ = "Ralph-Gordon Paul, Adrian Cowan" 8 | __credits__ = ["Ralph-Gordon Paul", "Adrian Cowan", "Justin Nemeth", "Sean Rudford"] 9 | __license__ = "GPL" 10 | __maintainer__ = "Ralph-Gordon Paul" 11 | __email__ = "ralph-gordon.paul@uni-duesseldorf.de" 12 | __status__ = "Production" 13 | 14 | # read settings 15 | __settings__ = xbmcaddon.Addon( "script.traktutilities" ) 16 | __language__ = __settings__.getLocalizedString 17 | 18 | apikey = '0a698a20b222d0b8637298f6920bf03a' 19 | username = __settings__.getSetting("username") 20 | pwd = sha.new(__settings__.getSetting("password")).hexdigest() 21 | debug = __settings__.getSetting( "debug" ) 22 | https = __settings__.getSetting('https') 23 | 24 | if (https == 'true'): 25 | conn = httplib.HTTPSConnection('api.trakt.tv') 26 | else: 27 | conn = httplib.HTTPConnection('api.trakt.tv') 28 | 29 | headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} 30 | 31 | # list reccomended movies 32 | def showRecommendedMovies(): 33 | 34 | movies = getRecommendedMoviesFromTrakt() 35 | watchlist = traktMovieListByImdbID(getWatchlistMoviesFromTrakt()) 36 | 37 | if movies == None: # movies = None => there was an error 38 | return # error already displayed in utilities.py 39 | 40 | if len(movies) == 0: 41 | xbmcgui.Dialog().ok(__language__(1201).encode( "utf-8", "ignore" ), __language__(1158).encode( "utf-8", "ignore" )) # Trakt Utilities, there are no movies recommended for you 42 | return 43 | 44 | for movie in movies: 45 | if movie['imdb_id'] in watchlist: 46 | movie['watchlist'] = True 47 | else: 48 | movie['watchlist'] = False 49 | 50 | # display recommended movies list 51 | import windows 52 | ui = windows.MoviesWindow("movies.xml", __settings__.getAddonInfo('path'), "Default") 53 | ui.initWindow(movies, 'recommended') 54 | ui.doModal() 55 | del ui 56 | 57 | # list reccomended tv shows 58 | def showRecommendedTVShows(): 59 | 60 | tvshows = getRecommendedTVShowsFromTrakt() 61 | 62 | if tvshows == None: # tvshows = None => there was an error 63 | return # error already displayed in utilities.py 64 | 65 | if len(tvshows) == 0: 66 | xbmcgui.Dialog().ok(__language__(1201).encode( "utf-8", "ignore" ), __language__(1159).encode( "utf-8", "ignore" )) # Trakt Utilities, there are no tv shows recommended for you 67 | return 68 | 69 | for tvshow in tvshows: 70 | tvshow['watchlist'] = tvshow['in_watchlist'] 71 | 72 | # display recommended tv shows 73 | import windows 74 | ui = windows.TVShowsWindow("tvshows.xml", __settings__.getAddonInfo('path'), "Default") 75 | ui.initWindow(tvshows, 'recommended') 76 | ui.doModal() 77 | del ui 78 | 79 | -------------------------------------------------------------------------------- /resources/language/Dutch/string.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Algemeen 5 | Activeer debug mode 6 | API Key (te vinden op trakt -> Settings -> API) 7 | Gebruikersnaam 8 | Wachtwoord 9 | Use secure connection (HTTPS) 10 | 11 | Automatisch synchroniseren 12 | Automatisch bijwerken Film Collectie bij opstarten 13 | Automatisch bijwerken TV Serie Collectie bij opstarten 14 | Automatisch synchroniseren bekeken Films bij het opstarten 15 | Automatisch synchroniseren bekeken TV Series bij het opstarten 16 | Automatisch opschonen Film Collectie bij opstarten 17 | Automatisch opschonen TV Serie Collectie bij opstarten 18 | 19 | Waardering 20 | Beoordeel Film na het bekijken 21 | Beoordeel TV Serie na het bekijken 22 | Beoordeel elk afspeellijst item 23 | Minimum percentage gezien om dialoogvenster beoordelen weer te geven 24 | 25 | Scrobblen 26 | Scrobble Films 27 | Scrobble TV Series 28 | Minimum percentage gezien om te scrobbelen 29 | 30 | 31 | 32 | Vul uw gebruikersnaam en wachtwoord in bij instellingen 33 | Voer uw wachtwoord in bij instellingen 34 | Kan geen verbinding maken met Trakt 35 | Fout 36 | Onjuiste gebruikersnaam of wachtwoord 37 | Controle Database voor Updates 38 | Fout bij uploaden Film collectie 39 | Geen nieuwe Films in XBMC Database om bij te werken 40 | Fout bij het uploaden van bekeken Films 41 | Geen nieuwe Films bekeken om bij te werken voor Trakt 42 | Films zullen worden toegevoegd aan Trakt Collectie 43 | Films worden bijgewerkt op Trakt 44 | Films worden toegevoegd als bekeken op Trakt 45 | Geen nieuwe bekeken Films om bij te werken voor XBMC 46 | Films bijgewerkt op XBMC 47 | Geen Films om uit database te verwijderen op Trakt 48 | TV Serie Afleveringen zullen worden toegevoegd aan Trakt Collectie 49 | Controle van XBMC Database voor nieuwe Films 50 | Controle van XBMC Database voor nieuwe Afleveringen 51 | Opdracht afgebroken door de gebruiker 52 | Fout bij het uploaden van TV Serie Collectie 53 | Geen nieuwe Afleveringen in XBMC Database om bij te werken 54 | Afleveringen met succes bijgewerkt op Trakt 55 | Films overgeslagen 56 | Controle van XBMC Database voor verwijderde Films 57 | Controle van XBMC Database voor verwijderde Afleveringen 58 | Afleveringen zullen worden verwijderd van Trakt Collectie 59 | Geen Afleveringen om te verwijderen van Trakt 60 | Controle van XBMC Database voor nieuwe bekeken Afleveringen 61 | Afleveringen zullen worden toegevoegd als gezien op Trakt 62 | Fout bij het uploaden van bekeken TV-series 63 | Geen nieuwe bekeken Afleveringen in XBMC database om bij te werken 64 | Films worden toegevoegd als bekeken in XBMC 65 | Controle Trakt Database voor nieuwe bekeken Afleveringen 66 | Afleveringen zullen worden ingesteld als gezien in XBMC 67 | Bijwerken XBMC Database 68 | Geen nieuwe afleveringen bekeken om bij te werken op Trakt 69 | Fout: XBMC Film Database kan niet worden geopend 70 | Dit zal alle Films verwijderen uit uw Trakt Collectie 71 | die niet in de XBMC Database aanwezig zijn. 72 | Wil je doorgaan? 73 | Dit zal alle TV Series verwijderen uit uw Trakt Collectie 74 | binnenkort 75 | Er zijn geen aanbevolen Films voor u 76 | Er zijn geen aanbevolen TV Series aanbevolen voor u 77 | Geen Films aanwezig in je volglijst 78 | Geen TV Series aanwezig in je volglijst 79 | Niet gevonden in uw XBMC Database 80 | Ontvangen van informatie van Trakt servers 81 | Doorverwijzing met lokale informatie 82 | Beoordeling met succes verwijderd 83 | Waardering met succes toegevoegd 84 | Fout bij het toevoegen van waardering 85 | Controle van XBMC Database voor nieuwe bekeken films 86 | Controle Trakt Database voor nieuwe bekeken films 87 | Kan film niet af spelen 88 | Beoordeel deze film? 89 | Beoordeel deze aflevering? 90 | Beoordeel hele serie? 91 | Beoordeel deze serie? 92 | Trek beoordeling in 93 | Niet beoordeeld 94 | Toevoegen aan volglijst mislukt 95 | Succesvol aan volglijst toegevoegd 96 | Fout bij verwijderen van volglijst 97 | Succesvol verwijderd van volglijst 98 | 99 | 100 | Beginnen bijwerken Film collectie 101 | Beginnen bijwerken TV Series collectie 102 | Start synchronisatie bekeken Films 103 | Start synchronisatie bekeken TV Series 104 | Bijwerken / synchroniseren gedaan 105 | 106 | 107 | Trakt Utilities 108 | 109 | 110 | Volglijst 111 | Vrienden 112 | Aanbevelingen 113 | Trending Films / TV Series 114 | Bijwerken / Synchroniseren / Opschonen 115 | 116 | 117 | 118 | 119 | Werk Film Collectie bij 120 | Synchroniseer bekeken Films 121 | Werk TV Serie Collectie bij 122 | Synchroniseer bekeken TV Series 123 | Opschonen Film Collectie 124 | Opschonen TV Serie Collectie 125 | 126 | Trending Films 127 | Trending TV Series 128 | 129 | Volglijst Films 130 | Volglijst TV Series 131 | Volglijst Afleveringen 132 | 133 | Aanbevolen Films 134 | Aanbevolen TV Series 135 | Aanbevolen Afleveringen 136 | 137 | 138 | Op dit moment aan het kijken 139 | Volglijst 140 | Bekeken 141 | Bibliotheek 142 | Profiel 143 | -------------------------------------------------------------------------------- /resources/language/English/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | General 5 | Enable debug mode 6 | API Key (optional) 7 | Username 8 | Password 9 | Use secure connection (HTTPS) 10 | 11 | Auto Syncing 12 | Auto update Movies Collection at startup 13 | Auto update TV Show Collection at startup 14 | Auto sync seen Movies at startup 15 | Auto sync seen TV Shows at startup 16 | Auto clean Movies Collection at startup 17 | Auto clean TV Show Collection at startup 18 | 19 | Rating 20 | Rate Movie after watching 21 | Rate TV Show Episode ater watching 22 | Rate each playlist item 23 | Minimum percent watched to display rate dialog 24 | 25 | Scrobbling 26 | Scrobble Movies 27 | Scrobble TV Show Episodes 28 | Minimum percent watched to scrobble item 29 | 30 | 31 | 32 | please enter your Username and Password in settings 33 | please enter your Password in settings 34 | can't connect to trakt 35 | Error 36 | Incorrect username or password 37 | Checking Database for Updates 38 | Error uploading movie collection 39 | No new movies in XBMC library to update 40 | Error uploading seen movies 41 | no new seen movies to update for trakt 42 | Movies will be added to Trakt Collection 43 | Movies updated on Trakt 44 | Movies will be added as seen on Trakt 45 | no new seen movies to update for xbmc 46 | Movies updated on XBMC 47 | No movies to unlibrary on trakt 48 | TV Show Episodes will be added to Trakt Collection 49 | Checking XBMC Database for new Movies 50 | Checking XBMC Database for new Episodes 51 | Progress aborted by user 52 | Error uploading TV Show Collection 53 | No new Episodes in XBMC library to update 54 | Episodes sucessfully updated to Trakt 55 | Movies skipped 56 | Checking XBMC Database for deleted Movies 57 | Checking XBMC Database for deleted Episodes 58 | TV Show Episodes will be removed from Trakt Collection 59 | No episodes to remove from trakt 60 | Checking XBMC Database for new seen Episodes 61 | TV Show Episodes will be added as seen on Trakt 62 | Error uploading seen TV Shows 63 | No new seen Episodes in XBMC Database to update 64 | Movies will be added as seen on XBMC 65 | Checking Trakt Database for new seen Episodes 66 | TV Show Episodes will be set as seen on XBMC 67 | updating XBMC Database 68 | No new seen Episodes on Trakt to update 69 | Error: can't open XBMC Movie Database 70 | This will remove all Movies from your Trakt Collection 71 | that are not in the XBMC library. 72 | Do you want to continue? 73 | This will remove all TV Shows from your Trakt Collection 74 | comming soon 75 | there are no movies recommended for you 76 | there are no tv shows recommended for you 77 | there are no movies in your watchlist 78 | there are no tv shows in your watchlist 79 | not found in your XBMC Library 80 | Retreiving information from Trakt servers 81 | Cross-referencing with local information 82 | Rating removed successfully 83 | Rating submitted successfully 84 | Error submitting rating 85 | Checking XBMC Database for new seen Movies 86 | Checking Trakt Database for new seen Movies 87 | Unable to play movie 88 | Rate that movie? 89 | Rate that episode? 90 | Rate whole show 91 | Rate that show? 92 | Unrate 93 | Unrated 94 | Failed to added to watch-list 95 | Successfully added to watch-list 96 | Failed to remove from watch-list 97 | Successfully removed from watch-list 98 | 99 | 100 | start movie collection update 101 | start tvshow collection update 102 | start sync seen movies 103 | start sync seen tv shows 104 | update / sync done 105 | 106 | 107 | Trakt Utilities 108 | 109 | 110 | Watchlist 111 | Friends 112 | Recommendations 113 | Trending Movies / TV Shows 114 | Update / Sync / Clean 115 | 116 | 117 | 118 | 119 | Update Movie Collection 120 | Sync seen Movies 121 | Update TV Show Collection 122 | Sync seen TV Shows 123 | Clean Movie Collection 124 | Clean TV Show Collection 125 | 126 | Trending Movies 127 | Trending TV Shows 128 | 129 | Watchlist Movies 130 | Watchlist TV Shows 131 | Watchlist Episodes 132 | 133 | Recommened Movies 134 | Recommened TV Shows 135 | Recommened Episodes 136 | 137 | 138 | Currently Watching 139 | Watch-list 140 | Watched 141 | Library 142 | Profile 143 | -------------------------------------------------------------------------------- /resources/language/German/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug Modus aktivieren 5 | API Key 6 | Benutzername 7 | Passwort 8 | Sichere Verbindung benutzen (HTTPS) 9 | Aktualisiere Filmsammlung beim start 10 | Aktualisiere Seriensammlung beim start 11 | Synchronisiere gesehene Filme beim start 12 | Synchronisiere gesehene Serien beim start 13 | 14 | 15 | 16 | Bitte gib deinen Benutzernamen und Passwort in den Einstellungen ein 17 | Bitte gib dein Passwort in den Einstellungen ein 18 | Kann keine Verbindung zu Trakt aufbauen 19 | Error 20 | Überprüfe Datenbank nach Updates 21 | Error beim hochladen der Film Sammlung 22 | Keine neuen Filme in der XBMC Datenbank 23 | Error beim hochladen der gesehenen Filme 24 | Keine gesehenen Filme für Trakt gefunden 25 | Filme werden der Trakt Filmsammlung hinzugefügt 26 | Filme aktualisiert auf Trakt 27 | Filme werden bei Trakt als gesehen hinzugefügt 28 | Keinen gesehenen Filme für XBMC gefunden 29 | Filme wurden in XBMC aktualisiert 30 | Keine Filme aus Traktsammlung zu entfernen 31 | Episoden werden zur Traktsammlung hinzugefügt 32 | Überprüfe XBMC Datenbank nach neuen Filmen 33 | Überprüfe XBMC Datenbank nach neuen Episoden 34 | Prozess vom Benutzer abgebrochen 35 | Fehler beim Hochladen der Seriensammlung 36 | Keine Episoden in XBMC zu aktualisieren 37 | Episoden erfolgreich auf Trakt aktualisiert 38 | Filme übersprungen 39 | Überprüfe XBMC Datenbank nach gelöschten Filmen 40 | Überprüfe XBMC Datenbank nach gelöschten Serien/Episoden 41 | Episoden werden von der Traktsammlung entfernt 42 | Keine Episoden von Trakt zu entfernen 43 | Überprüfe XBMC Datenbank nach gesehenen Episoden 44 | Episoden werden auf Trakt als gesehen hinzugefügt 45 | Fehler beim Hochladen gesehener Episoden 46 | Keine neuen gesehenen Episoden in XBMC Datenbank 47 | Filme werden in XBMC als gesehen markiert 48 | Überprüfe Trakt Datenbank nach gesehenen Episoden 49 | Episoden werden in XBMC als gesehen markiert 50 | aktualisiere XBMC Datenbank 51 | Keine gesehenen Episoden auf Trakt zu aktualisieren 52 | Error: kann XBMC Datenbank nicht öffnen 53 | 54 | 55 | Aktualisiere Filmsammlung 56 | Synchronisiere gesehene Filme 57 | Aktualisiere Seriensammlung 58 | Synchronisiere gesehene Serien 59 | Bereinige Filmsammlung 60 | Bereinige Seriensammlung 61 | 62 | -------------------------------------------------------------------------------- /resources/language/Polish/strings.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | Główne 9 | Włącz tryb debugowania 10 | Klucz API (dostępny na trakt --> Ustawienia --> API) 11 | Użytkownik 12 | Hasło 13 | Use secure connection (HTTPS) 14 | Auto synchronizacja 15 | Auto aktualizacja Kolekcji Filmów przy starcie 16 | Auto aktualizacja Kolekcji Seriali przy starcie 17 | Auto synchronizacja obejrzanych Filmów przy starcie 18 | Auto synchronizacja obejrzanych Seriali przy starcie 19 | Auto czyszczenie Kolekcji Filmów przy starcie 20 | Auto czyszczenie Kolekcji Seriali przy starcie 21 | Ocena 22 | Oceń Film po obejrzeniu 23 | Oceń odcinek Serialu po obejrzeniu 24 | Oceń każdą pozycję playlisty 25 | Minimalny procent obejrzenia, aby pokazać dialog oceny 26 | Scrobbling 27 | Scrobluj Filmy 28 | Scrobluj odcinki Seriali TV 29 | Minimalny procent obejrzenia, aby wyscroblować pozycję 30 | 31 | 32 | proszę podać nazwę Użytkownika i Hasło w ustawieniach 33 | proszę podać swoje Hasło w ustawieniach 34 | błąd połączenia z trakt 35 | Błąd 36 | Nieprawidłowa nazwa użytkownika lub hasło 37 | Szukam aktualizacji w bazie 38 | Błąd aktualizacji kolekcji filmów 39 | Brak nowych filmów w bibliotece XBMC do zaktualizowania 40 | Błąd aktualizacji obejrzanych filmów 41 | brak nowo obejrzanych filmów do zaktualizowania dla Trakt 42 | Filmy będą dodane do Kolekcji Trakt 43 | Filmy zaktualizowane 44 | Filmy będą dodane jako obejrzane do Trakt 45 | brak nowo obejrzanych filmów do zaktualizowania dla xbmc 46 | Filmy zaktualizowane w XBMC 47 | Brak filmów do usunięcia z biblioteki Trakt 48 | Odcinki Serialu TV będą dodane do Kolekcji Trakt 49 | Sprawdzam nowe filmy w bazie XBMC 50 | Sprawdzam nowe odcinki w bazie XBMC 51 | Postęp anulowany przez użytkownika 52 | Błąd aktualizowania Kolekcji Seriali TV 53 | Brak nowych Odcinków do zaktualizowania w bibliotece XBMC 54 | Odcinki pomyślnie zaktualizowane 55 | Pominięte filmy 56 | Sprawdzam usunięte filmy w bazie XBMC 57 | Sprawdzam usunięte odcinki w bazie XBMC 58 | Odcinki Seriali TV zostaną usunięte z Kolekcji Trakt 59 | Brak odcinków do usunięcia z Trakt 60 | Sprawdzam nowe obejrzane Odcinki w bazie XBMC 61 | Odcinki Seriali TV zostaną dodane jako obejrzane na Trakt 62 | Błąd aktualizowania obejrzanych Seriali TV 63 | Brak nowo obejrzanych Odcinków do zaktualizowania w bazie XBMC 64 | Filmy zostaną dodane jako obejrzane w XBMC 65 | Sprawdzam nowe Odcinki w bazie Trakt 66 | Odcinki Seriali TV zostaną oznaczone jako obejrzane w XBMC 67 | aktualizuję bazę XBMC 68 | Brak nowo obejrzanych Odcinków w Trakt do zaktualizowania 69 | Błąd: nie można otworzyć bazy Filmów XBMC 70 | To usunie wszystkie Filmy z Twojej Kolekcji Trakt, 71 | które nie są w bibliotece XBMC. 72 | Czy chcesz kontynuować? 73 | To usunie wszystkie Seriale TV z Twojej Kolekcji Trakt 74 | wkrótce 75 | brak filmów rekomendowanych dla Ciebie 76 | brak seriali tv rekomendowanych dla Ciebie 77 | brak filmów w Twojej liście do obejrzenia 78 | brak seriali tv w Twojej liście do obejrzenia 79 | nie znaleziony w Twojej bibliotece XBMC 80 | Pobieram informacje z serwerów Trakt 81 | Ocena usunięta pomyślnie 82 | Ocena wysłana pomyślnie 83 | Błąd wysyłania oceny 84 | rozpocznij aktualizację kolekcji filmów 85 | rozpocznij aktualizację kolekcji seriali tv 86 | rozpocznij synchronizację obejrzanych filmów 87 | rozpocznij synchronizację obejrzanych seriali tv 88 | aktualizacja / synchronizacja zakończona 89 | Narzędzia Trakt 90 | Lista do obejrzenia 91 | Znajomi 92 | Rekomendacje 93 | Popularne Filmy / Seriale TV 94 | Aktualizuj / Synchronizuj / Czyść 95 | 96 | 97 | 98 | 99 | Aktualizuj Kolekcję Filmów 100 | Synchronizuj obejrzane Filmy 101 | Aktualizuj Kolekcję Seriali TV 102 | Synchronizuj obejrzane Seriale TV 103 | Wyczyść Kolekcję Filmów 104 | Wyczyść Kolekcję Seriali TV 105 | Popularne Filmy 106 | Popularne Seriale TV 107 | Lista Filmów do obejrzenia 108 | Lista Seriali TV do obejrzenia 109 | Lista Odcinków do obejrzenia 110 | Rekomendowane Filmy 111 | Rekomendowane Seriale TV 112 | Rekomendowane Odcinki 113 | Aktualnie oglądasz 114 | Lista do obejrzenia 115 | Obejrzane 116 | Biblioteka 117 | Profil 118 | Sprawdzam nowe obejrzane Filmy w bazie XBMC 119 | Sprawdzam nowe obejrzane Filmy w bazie Trakt 120 | Nie mogę odtworzyć filmu 121 | Ocenić ten film? 122 | Ocenić ten odcinek? 123 | Oceń cały serial 124 | Ocenić ten serial? 125 | Usuń ocenę 126 | Nie oceniono 127 | Błąd przy dodawaniu do listy do obejrzenia 128 | Pomyślnie dodano do listy do obejrzenia 129 | Błąd przy usuwaniu z listy do obejrzenia 130 | Pomyślnie usunięto z listy do obejrzenia 131 | -------------------------------------------------------------------------------- /resources/language/Portuguese (Brazil)/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Geral 5 | Ativar modo debug 6 | Chave API (encontre em trakt --> Settings --> API) 7 | Usuário 8 | Senha 9 | Use secure connection (HTTPS) 10 | 11 | Auto Sincronia 12 | Auto atualizar Coleção de Filmes ao iniciar 13 | Auto atualizar Coleção de Seriados ao iniciar 14 | Auto sincronizar Filmes vistos ao iniciar 15 | Auto sincronizar Seriados vistos ao iniciar 16 | Auto limpar Coleção de Filmes ao iniciar 17 | Auto limpar Coleção de Seriados ao iniciar 18 | 19 | Classificação 20 | Classifique o Filme após assistir 21 | Classifique o Episódio de Seriado após assistir 22 | Classifique cada ítem da lista de reprodução 23 | Percentual mínimo ao assistir para mostrar o diálogo de classificação 24 | 25 | Scrobbling 26 | Fazer Scrobble dos Filmes 27 | Fazer Scrobble dos Episódios de Seriados 28 | Percentual mínimo ao assistir para fazer scrobble de um item 29 | 30 | 31 | 32 | por favor, coloque seu Usuário e Senha nas configurações 33 | por favor, coloque sua Senha nas configurações 34 | não foi possível conectar ao trakt 35 | Erro 36 | Usuário ou senha incorretos 37 | Checando Banco de Dados por Atualizações 38 | Erro ao enviar coleção de filmes 39 | Nenhum filme novo na biblioteca do XBMC para atualizar 40 | Erro ao enviar filmes vistos 41 | nenhum filme visto novo para atualizar para o trakt 42 | Filmes serão adicionados à Coleção Trakt 43 | Filmes atualizados no Trakt 44 | Filmes serão adicionados como vistos no Trakt 45 | nenhum filme visti novo para atualizar para o xbmc 46 | Filmes atualizados no XBMC 47 | Nenhum filme para retirar da biblioteca no trakt 48 | Episódios de Seriados serão adicionados à Coleção Trakt 49 | Checando Banco de Dados XBMC por novos Filmes 50 | Checando Banco de Dados XBMC por novos Episódios 51 | Progresso abortado pelo usuário 52 | Erro ao enviar Coleção de Seriados 53 | Nenhum Episídio novo na biblioteca XBMC para atualizar 54 | Epiódios atualizados com sucesso no Trakt 55 | Filmes ignorados 56 | Checando Banco de Dados XBMC por Filmes apagados 57 | Checando Banco de Dados XBMC por Episódios apagados 58 | Episódios de Seriados serão removidos da Coleção Trakt 59 | Nenhum episódio para remover do trakt 60 | Checando Banco de Dados XBMC por Episódios vistos novos 61 | Episódios de Seriados serão adicionados como vistos no Trakt 62 | Erro ao atualizar Seriados vistos 63 | Nenhum Episódio visto novo para atualizar no Banco de Dados do XBMC 64 | Filmes serão adicionados como vistos no XBMC 65 | Checando Banco de Dados Trakt por novos Episódios vistos 66 | Seriados serão ajustados como vistos no XBMC 67 | atualizado Banco de Dados XBMC 68 | Nunhum novo episódio visto no Trakt para atualizar 69 | Erro: não foi possível abrir o Banco de Dados de Filmes do XBMC 70 | Isso irá remover todos os Filmes de sua Coleção Trakt 71 | que não estão na biblioteca XBMC. 72 | Você quer continuar? 73 | Isso irá remover todos os Seriados de sua Coleção Trakt 74 | Em Breve 75 | não há filmes recomendados para você 76 | não há seriados recomendados para você 77 | não há filmes em sua watchlist 78 | não há seriados em sua watchlist 79 | não encontrado em sua Biblioteca XBMC 80 | Obtendo informação dos servidores Trakt 81 | Referência cruzada com informação local 82 | Remoção da avaliação bem sucedida 83 | Envio da avaliação bem sucedido 84 | Erro ao enviar avaliação 85 | Checando Banco de Dados XBMC por novos Filmes vistos 86 | Checando Banco de Dados Trakt por novos Filmes vistos 87 | Incapaz de tocar filme 88 | Avaliar esse filme? 89 | Avaliar esse episódio? 90 | Avaliar seriado inteiro 91 | Avaliar esse seriado? 92 | Desavaliar 93 | Não avaliadodo 94 | Falha ao adicionar a watch-list 95 | Adicionado com sucesso a watch-list 96 | Falha em remover da watch-list 97 | Removido com sucesso da watch-list 98 | 99 | 100 | iniciando atualização da coleção de filmes 101 | iniciando atualização da coleção de seriados 102 | iniciando sincronização dos filmes vistos 103 | iniciando sincronização dos seriados vistos 104 | atualização / sincronia pronta 105 | 106 | 107 | Serviços Trakt 108 | 109 | 110 | Watchlist 111 | Amigos 112 | Recomendações 113 | Tendências em Filmes / Seriados 114 | Atualizar / Sincronizar / Limpar 115 | 116 | 117 | 118 | 119 | Atualizar Coleção de Filmes 120 | Sincronizar Filmes vistos 121 | Atualizar Coleção de Seriados 122 | Sincronizar Seriados vistos 123 | Limpar Coleção de Filmes 124 | Limpar Coleção de Seriados 125 | 126 | Tendência para Filmes 127 | Tendência para Seriados 128 | 129 | Watchlist Movies 130 | Watchlist TV Shows 131 | Watchlist Episodes 132 | 133 | Filmes Recomendados 134 | Seriados Recomendados 135 | Episódios Recomendados 136 | 137 | 138 | Atualmente Assistindo 139 | Watch-list 140 | Assistido 141 | Biblioteca 142 | Perfil 143 | -------------------------------------------------------------------------------- /resources/settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /resources/skins/Default/720p/Font.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | font12 4 | Arialuni.TTF 5 | 12 6 | 7 | 0.75 8 | 9 | -------------------------------------------------------------------------------- /resources/skins/Default/720p/includes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /resources/skins/Default/720p/movie.xml: -------------------------------------------------------------------------------- 1 | 2 | 101 3 | 4 | WindowOpen 5 | WindowClose 6 | 7 | 8 | 9 | Background 10 | 0 11 | 0 12 | 1280 13 | 800 14 | scale down 15 | FF3E3E3E 16 | 17 | 18 | 19 | Movie Poster 20 | 50 21 | 100 22 | 250 23 | 350 24 | scale down 25 | 26 | 27 | 28 | Movie Title 29 | 0 30 | 30 31 | 1280 32 | 80 33 | center 34 | font20 35 | FFFFFFFF 36 | 37 | 38 | 39 | Movie Tagline 40 | 0 41 | 50 42 | 1280 43 | 80 44 | center 45 | font20 46 | FFFFFFFF 47 | 48 | 49 | 50 | Movie Overview 51 | 450 52 | 100 53 | 700 54 | 400 55 | font13 56 | true 57 | !Control.HasFocus(13) 58 | FFFFFFFF 59 | 60 | 61 | 62 | Play 63 | 0 64 | 600 65 | 1280 66 | 50 67 | font13 68 | FF444444 69 | 70 | FFFFFFFF 71 | FF009CFF 72 | 80FFFFFF 73 | center 74 | center 75 | 106 76 | 106 77 | 106 78 | 106 79 | 80 | 81 | 82 | Movie Year 83 | 50 84 | 500 85 | 200 86 | 40 87 | left 88 | font20 89 | FFFFFFFF 90 | 91 | 92 | 93 | 94 | Movie Runtime 95 | 50 96 | 520 97 | 300 98 | 40 99 | left 100 | font20 101 | FFFFFFFF 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /resources/skins/Default/720p/movies.xml: -------------------------------------------------------------------------------- 1 | 2 | 101 3 | 4 | WindowOpen 5 | WindowClose 6 | 7 | 8 | 9 | Background 10 | 0 11 | 0 12 | 1280 13 | 800 14 | scale down 15 | FF3E3E3E 16 | 17 | 18 | 19 | Movie Title 20 | 0 21 | 30 22 | 1280 23 | 80 24 | center 25 | font20 26 | FFFFFFFF 27 | 00000000 28 | 29 | 30 | 31 | Movie Tagline 32 | 0 33 | 50 34 | 1280 35 | 80 36 | center 37 | font20 38 | FFFFFFFF 39 | 00000000 40 | 41 | 42 | 43 | Movie Overview 44 | 30 45 | 100 46 | 700 47 | 300 48 | font13 49 | true 50 | !Control.HasFocus(13) 51 | FFFFFFFF 52 | 00000000 53 | 54 | 55 | 56 | Watchers 57 | 50 58 | 410 59 | 300 60 | 40 61 | left 62 | font20 63 | FFFFFFFF 64 | 00000000 65 | 66 | 67 | 68 | Movie Year 69 | 50 70 | 430 71 | 200 72 | 40 73 | left 74 | font20 75 | FFFFFFFF 76 | 00000000 77 | 78 | 79 | 80 | Movie Runtime 81 | 50 82 | 450 83 | 300 84 | 40 85 | left 86 | font20 87 | FFFFFFFF 88 | 00000000 89 | 90 | 91 | 92 | Movie Rating 93 | 50 94 | 470 95 | 300 96 | 40 97 | left 98 | font20 99 | FFFFFFFF 100 | 00000000 101 | 102 | 103 | 104 | List of Movies 105 | 20 106 | 500 107 | 1240 108 | 200 109 | 106 110 | 110 111 | true 112 | horizontal 113 | 114 | 115 | 0 116 | 45 117 | 100 118 | 150 119 | ListItem.Icon 120 | scale 121 | 122 | 123 | 58 124 | 45 125 | 42 126 | 42 127 | local.png 128 | ListItem.Property(Available) 129 | 130 | 131 | 58 132 | 45 133 | 42 134 | 42 135 | watchlist.png 136 | ListItem.Property(Watchlist) 137 | 138 | 139 | 140 | 141 | 0 142 | 0 143 | 130 144 | 195 145 | ListItem.Icon 146 | scale 147 | 148 | 149 | 77 150 | 0 151 | 53 152 | 53 153 | local.png 154 | ListItem.Property(Available) 155 | 156 | 157 | 77 158 | 0 159 | 53 160 | 53 161 | watchlist.png 162 | ListItem.Property(Watchlist) 163 | 164 | 165 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /resources/skins/Default/720p/rate.xml: -------------------------------------------------------------------------------- 1 | 2 | 104 3 | yes 4 | true 5 | 6 | 1 7 | 510 8 | 270 9 | 10 | 11 | 12 | Scene 13 | -510 14 | -250 15 | 1280 16 | 720 17 | true 18 | 66ffffff 19 | w1x1.png 20 | 20 21 | scale 22 | 23 | 24 | Header 25 | 0 26 | 0 27 | 260 28 | 50 29 | true 30 | f6111111 31 | w1x1.png 32 | 20 33 | scale 34 | 35 | 36 | Heading 37 | 0 38 | 0 39 | 260 40 | 50 41 | true 42 | center 43 | center 44 | 0 45 | font12 46 | false 47 | false 48 | ffffffff 49 | ff222222 50 | false 51 | 52 | 53 | Area 1 54 | 0 55 | 50 56 | 260 57 | 45 58 | true 59 | cc222222 60 | w1x1.png 61 | 20 62 | scale 63 | 64 | 65 | Area 2 66 | 0 67 | 95 68 | 260 69 | 95 70 | true 71 | cc111111 72 | w1x1.png 73 | 20 74 | scale 75 | 76 | 77 | Current Rating Group 78 | true 79 | 20 80 | 60 81 | 100 82 | 25 83 | ffffff 84 | ff666666 85 | ffffffff 86 | 80ffffff 87 | true 88 | 89 | Current not rated 90 | 0 91 | 0 92 | 100 93 | 25 94 | 95 | current-no-rating.png 96 | current-no-rating.png 97 | center 98 | center 99 | 100 | font12 101 | 104 102 | 97 103 | 104 | 105 | Current love 106 | 0 107 | 0 108 | 100 109 | 25 110 | 111 | current-love.png 112 | current-love.png 113 | 23 114 | 115 | font12 116 | 104 117 | 97 118 | 119 | 120 | Current hate 121 | 0 122 | 0 123 | 100 124 | 25 125 | 126 | current-hate.png 127 | current-hate.png 128 | 23 129 | 130 | font12 131 | 104 132 | 97 133 | 134 | 135 | 136 | Skip 137 | 140 138 | 60 139 | 100 140 | 25 141 | true 142 | skip-rating.png 143 | skip-rating.png 144 | ffffffff 145 | ff666666 146 | ffffffff 147 | 80ffffff 148 | true 149 | 95 150 | 97 151 | 152 | 153 | Love Hate Control Group 154 | 20 155 | 105 156 | 120 157 | 75 158 | true 159 | ffffffff 160 | ffffffff 161 | ffaaaaaa 162 | 80ffffff 163 | true 164 | 105 165 | 166 | Love 167 | 0 168 | 0 169 | 100 170 | love.png 171 | love_f.png 172 | 104 173 | 108 174 | 106 175 | 176 | 177 | Hate 178 | 0r 179 | 0 180 | 100 181 | hate.png 182 | hate_f.png 183 | 104 184 | 108 185 | 105 186 | 187 | 188 | 189 | extention for rate show button 190 | 0 191 | 210 192 | 260 193 | 50 194 | F6111111 195 | w1x1.png 196 | 197 | 198 | Rate show 199 | 0 200 | 210 201 | 260 202 | 50 203 | 0 204 | center 205 | center 206 | font13 207 | FFFFFFFF 208 | FF666666 209 | FFAAAAAA 210 | 97 211 | 212 | 213 | 214 | -------------------------------------------------------------------------------- /resources/skins/Default/720p/tvshows.xml: -------------------------------------------------------------------------------- 1 | 2 | 101 3 | 4 | WindowOpen 5 | WindowClose 6 | 7 | 8 | 9 | Background 10 | 0 11 | 0 12 | 1280 13 | 800 14 | scale down 15 | FF3E3E3E 16 | 17 | 18 | 19 | TV SHow Title 20 | 0 21 | 30 22 | 1280 23 | 80 24 | center 25 | font20 26 | FFFFFFFF 27 | 00000000 28 | 29 | 30 | 31 | TV Show Tagline 32 | 0 33 | 50 34 | 1280 35 | 80 36 | center 37 | font20 38 | FFFFFFFF 39 | 00000000 40 | 41 | 42 | 43 | TV Show Overview 44 | 30 45 | 100 46 | 700 47 | 300 48 | font13 49 | true 50 | !Control.HasFocus(13) 51 | FFFFFFFF 52 | 00000000 53 | 54 | 55 | 56 | Watchers 57 | 50 58 | 410 59 | 300 60 | 40 61 | left 62 | font20 63 | FFFFFFFF 64 | 00000000 65 | 66 | 67 | 68 | TV Show Year 69 | 50 70 | 430 71 | 200 72 | 40 73 | left 74 | font20 75 | FFFFFFFF 76 | 00000000 77 | 78 | 79 | 80 | TV Show Runtime 81 | 50 82 | 450 83 | 300 84 | 40 85 | left 86 | font20 87 | FFFFFFFF 88 | 00000000 89 | 90 | 91 | 92 | TV Show Rating 93 | 50 94 | 470 95 | 300 96 | 40 97 | left 98 | font20 99 | FFFFFFFF 100 | 00000000 101 | 102 | 103 | 104 | List of TV Shows 105 | 20 106 | 500 107 | 1240 108 | 200 109 | 106 110 | 110 111 | true 112 | horizontal 113 | 114 | 115 | 0 116 | 45 117 | 100 118 | 150 119 | ListItem.Icon 120 | scale 121 | 122 | 123 | 58 124 | 45 125 | 42 126 | 42 127 | local.png 128 | ListItem.Property(Available) 129 | 130 | 131 | 58 132 | 45 133 | 42 134 | 42 135 | watchlist.png 136 | ListItem.Property(Watchlist) 137 | 138 | 139 | 140 | 141 | 0 142 | 0 143 | 130 144 | 195 145 | ListItem.Icon 146 | scale 147 | 148 | 149 | 77 150 | 0 151 | 53 152 | 53 153 | local.png 154 | ListItem.Property(Available) 155 | 156 | 157 | 77 158 | 0 159 | 53 160 | 53 161 | watchlist.png 162 | ListItem.Property(Watchlist) 163 | 164 | 165 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /resources/skins/Default/media/current-hate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/Default/media/current-hate.png -------------------------------------------------------------------------------- /resources/skins/Default/media/current-love.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/Default/media/current-love.png -------------------------------------------------------------------------------- /resources/skins/Default/media/current-no-rating.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/Default/media/current-no-rating.png -------------------------------------------------------------------------------- /resources/skins/Default/media/hate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/Default/media/hate.png -------------------------------------------------------------------------------- /resources/skins/Default/media/hate_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/Default/media/hate_f.png -------------------------------------------------------------------------------- /resources/skins/Default/media/local.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/Default/media/local.png -------------------------------------------------------------------------------- /resources/skins/Default/media/love.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/Default/media/love.png -------------------------------------------------------------------------------- /resources/skins/Default/media/love_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/Default/media/love_f.png -------------------------------------------------------------------------------- /resources/skins/Default/media/skip-rating.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/Default/media/skip-rating.png -------------------------------------------------------------------------------- /resources/skins/Default/media/w1x1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/Default/media/w1x1.png -------------------------------------------------------------------------------- /resources/skins/Default/media/watchlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/Default/media/watchlist.png -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/720p/movie.xml: -------------------------------------------------------------------------------- 1 | 2 | 101 3 | 4 | WindowOpen 5 | WindowClose 6 | 7 | 8 | 9 | Background 10 | 0 11 | 0 12 | 1280 13 | 800 14 | scale down 15 | FF3E3E3E 16 | 17 | 18 | 19 | Movie Poster 20 | 50 21 | 100 22 | 250 23 | 350 24 | scale down 25 | 26 | 27 | 28 | Movie Title 29 | 0 30 | 30 31 | 1280 32 | 80 33 | center 34 | font20 35 | FFFFFFFF 36 | 37 | 38 | 39 | Movie Tagline 40 | 0 41 | 50 42 | 1280 43 | 80 44 | center 45 | font20 46 | FFFFFFFF 47 | 48 | 49 | 50 | Movie Overview 51 | 450 52 | 100 53 | 700 54 | 400 55 | font13 56 | true 57 | !Control.HasFocus(13) 58 | FFFFFFFF 59 | 60 | 61 | 62 | Play 63 | 0 64 | 600 65 | 1280 66 | 50 67 | font13 68 | FF444444 69 | 70 | FFFFFFFF 71 | FF009CFF 72 | 80FFFFFF 73 | center 74 | center 75 | 106 76 | 106 77 | 106 78 | 106 79 | 80 | 81 | 82 | Movie Year 83 | 50 84 | 500 85 | 200 86 | 40 87 | left 88 | font20 89 | FFFFFFFF 90 | 91 | 92 | 93 | 94 | Movie Runtime 95 | 50 96 | 520 97 | 300 98 | 40 99 | left 100 | font20 101 | FFFFFFFF 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/720p/movies.xml: -------------------------------------------------------------------------------- 1 | 2 | 101 3 | 4 | WindowOpen 5 | WindowClose 6 | 7 | 8 | 9 | Background 10 | 0 11 | 0 12 | 1280 13 | 800 14 | scale down 15 | 16 | 17 | WindowOpen 18 | WindowClose 19 | 20 | 0 21 | 315 22 | 1280 23 | 405 24 | views/showcase_floor.png 25 | 26 | 27 | -138 28 | 1280 29 | 720 30 | common/black.png 31 | aaffffff 32 | Visible 33 | Hidden 34 | Skin.HasSetting(darkinfopane) 35 | 36 | 37 | -70 38 | 0 39 | 464 40 | 720 41 | views/showcase_vignette.png 42 | vignette 43 | true 44 | 45 | 46 | 886 47 | 0 48 | 464 49 | 720 50 | true 51 | vignette 52 | views/showcase_vignette.png 53 | 54 | Neon_Floor 55 | 56 | 57 | 58 | Animation_OpenCloseZoom_New 59 | 60 | 25 61 | 45 62 | 1230 63 | 692 64 | wall/wall_bg.png 65 | 66 | 67 | 25 68 | 45 69 | 1230 70 | 692 71 | wall/wall_bg_reflection.png 72 | 73 | 74 | 75 | 76 | -20 77 | Animation_OpenCloseZoom 78 | 79 | 40 80 | 103 81 | 760 82 | 538 83 | 60 84 | 60 85 | 110 86 | 110 87 | 4 88 | 150 89 | true 90 | icon 91 | 60 92 | 93 | 94 | Conditional 95 | 96 | 0 97 | 0 98 | 126 99 | 179 100 | scale 101 | IconCrossfadeTime2 102 | $INFO[ListItem.Icon] 103 | thumbs/bordershadow4.png 104 | 5 105 | 106 | 107 | 81.5 108 | 5 109 | 40 110 | 40 111 | IconCrossfadeTime2 112 | local.png 113 | ListItem.Property(Available) 114 | 115 | 116 | 81.5 117 | 5 118 | 40 119 | 40 120 | IconCrossfadeTime2 121 | watchlist.png 122 | ListItem.Property(Watchlist) 123 | 124 | 125 | 126 | 127 | 128 | 0 129 | 0 130 | 126 131 | 179 132 | scale 133 | IconCrossfadeTime2 134 | $INFO[ListItem.Icon] 135 | featured/tile_fo.png 136 | 5 137 | 138 | 139 | 81.5 140 | 5 141 | 40 142 | 40 143 | IconCrossfadeTime2 144 | local.png 145 | ListItem.Property(Available) 146 | 147 | 148 | 81.5 149 | 5 150 | 40 151 | 40 152 | IconCrossfadeTime2 153 | watchlist.png 154 | ListItem.Property(Watchlist) 155 | 156 | 157 | 158 | 159 | 160 | 1230 161 | 103 162 | 6 163 | 538 164 | false 165 | CommonVerticalScrollbar 166 | 110 167 | 9000 168 | 169 | 170 | true 171 | 172 | HiddenObject 173 | 174 | 175 | HiddenObject 176 | 177 | 178 | HiddenObject 179 | 180 | 181 | 182 | -15 183 | 184 | 840 185 | 103 186 | 13 187 | 380 188 | Font_Bold25_Caps 189 | white2 190 | true 191 | 192 | 193 | 830 194 | 123 195 | 40 196 | 400 197 | osd/osd_settings_buttonnf.png 198 | 199 | 200 | 201 | 840 202 | 135 203 | 13 204 | 380 205 | Font_Reg18 206 | abFFFFFF 207 | true 208 | 209 | 210 | 1220 211 | 685 212 | 13 213 | 460 214 | Font_Reg18 215 | right 216 | floor 217 | true 218 | 219 | 220 | 1220 221 | 710 222 | 13 223 | 460 224 | Font_Reg18 225 | right 226 | floor 227 | 228 | 229 | 230 | 840 231 | 170 232 | 380 233 | 230 234 | Font_Reg18 235 | justify 236 | white6 237 | Skin.HasSetting(AutoScroll) 238 | 239 | 240 | 241 | 835 242 | 415 243 | 244 | -15 245 | -15 246 | 412 247 | 245 248 | common/black.png 249 | home/nowplaying/OverlayDialogBackground.png 250 | 15 251 | 252 | 253 | 0 254 | 0 255 | 382 256 | 215 257 | IconCrossfadeTime 258 | scale 259 | $INFO[Control.GetLabel(102)] 260 | !Player.Hasvideo 261 | Animation_VisibleChange200 262 | 263 | 264 | 0 265 | 0 266 | 382 267 | 215 268 | Player.Hasvideo + !VideoPlayer.IsFullscreen 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | Breadcrumbs 280 | Skin.HasSetting(breadcrumb) 281 | Animation_HideBreadCrumbs 282 | Breadcrumbs_BackBar 283 | 284 | 15 285 | 0 286 | 500 287 | left 288 | 289 | 0 290 | horizontal 291 | Animation_HideBreadCrumbs 292 | 293 | Items Icon 294 | 0 295 | 0 296 | 36 297 | 32 298 | keep 299 | common/tv_icon.png 300 | white2 301 | Conditional 302 | 303 | 304 | BreadcrumbsLabel 305 | 306 | 307 | 308 | 309 | 0 310 | 6 311 | 1280 312 | center 313 | center 314 | 10 315 | !IsEmpty(Container(110).NumItems) 316 | horizontal 317 | Visible 318 | Hidden 319 | 320 | 0 321 | 0 322 | 22 323 | center 324 | auto 325 | Font_Condensed20 326 | 327 | bclabel 328 | bcshadow 329 | false 330 | Conditional 331 | !IsEmpty(ListItem.Trailer) 332 | 333 | 334 | Items Icon 335 | 0 336 | 0 337 | 20 338 | 15 339 | stretch 340 | breadcrumbs/items.png 341 | bcicon 342 | 343 | 344 | 0 345 | 0 346 | 22 347 | center 348 | auto 349 | Font_Condensed20 350 | 351 | bclabel 352 | bcshadow 353 | false 354 | Conditional 355 | 356 | 357 | Items Icon 358 | 0 359 | 0 360 | 20 361 | 15 362 | stretch 363 | breadcrumbs/pages.png 364 | bcicon 365 | Visible 366 | Hidden 367 | 368 | 369 | 0 370 | 0 371 | 22 372 | center 373 | auto 374 | Font_Condensed20 375 | 376 | bclabel 377 | bcshadow 378 | false 379 | left 380 | Conditional 381 | 382 | 383 | Breadcrumbs_Furniture 384 | 385 | Furniture_NowPlayingWidget 386 | Furniture_Clock 387 | 388 | -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/720p/rate.xml: -------------------------------------------------------------------------------- 1 | 2 | 104 3 | yes 4 | true 5 | 1 6 | 7 | 1 8 | 0 9 | 0 10 | 11 | Animation_DialogPopup 12 | 13 | 14 | Scene 15 | 0 16 | 0 17 | 1280 18 | 720 19 | true 20 | DDFFFFFF 21 | - 22 | WindowOpen 23 | WindowClose 24 | 25 | 26 | 380 27 | 250 28 | 29 | 0 30 | 0 31 | 520 32 | 220 33 | dialogs/dialog_back.png 34 | 35 | 36 | 10 37 | 0 38 | 500 39 | 40 40 | osd/osd_settings_buttonnf.png 41 | 42 | 43 | 0 44 | 0 45 | 520 46 | 52 47 | selected 48 | center 49 | center 50 | Font_Reg18 51 | true 52 | 30 53 | 54 | 55 | 120 56 | -15 57 | 520 58 | center 59 | 60 | Current not rated 61 | 20 62 | 60 63 | 100 64 | 25 65 | 66 | current-no-rating.png 67 | current-no-rating.png 68 | ffffffff 69 | 70 | ff666666 71 | ffffffff 72 | 80ffffff 73 | center 74 | center 75 | 76 | 77 | true 78 | - 79 | - 80 | 105 81 | 102 82 | 104 83 | 102 84 | font12 85 | 86 | 87 | Current love 88 | 20 89 | 60 90 | 100 91 | 25 92 | 93 | current-love.png 94 | current-love.png 95 | ffffffff 96 | 97 | ff666666 98 | ffffffff 99 | 80ffffff 100 | center 101 | center 102 | 103 | 104 | true 105 | - 106 | - 107 | 101 108 | 103 109 | 101 110 | 103 111 | font12 112 | 113 | 114 | Current hate 115 | 20 116 | 60 117 | 100 118 | 25 119 | 120 | current-hate.png 121 | current-hate.png 122 | ffffffff 123 | 124 | ff666666 125 | ffffffff 126 | 80ffffff 127 | center 128 | center 129 | 130 | 131 | true 132 | - 133 | - 134 | 102 135 | 105 136 | 102 137 | 104 138 | font12 139 | 140 | 141 | Skip 142 | 140 143 | 60 144 | 100 145 | 25 146 | true 147 | skip-rating.png 148 | skip-rating.png 149 | ffffffff 150 | 151 | ff666666 152 | ffffffff 153 | 80ffffff 154 | center 155 | center 156 | 157 | 158 | true 159 | - 160 | - 161 | 106 162 | 106 163 | 103 164 | 101 165 | font12 166 | 167 | 168 | Love 169 | 20 170 | 105 171 | 100 172 | 75 173 | true 174 | love.png 175 | love_f.png 176 | ffffffff 177 | 178 | ffffffff 179 | ffaaaaaa 180 | 80ffffff 181 | 182 | 183 | 184 | 185 | true 186 | - 187 | - 188 | 103 189 | 108 190 | 106 191 | 106 192 | 193 | 194 | Hate 195 | 140 196 | 105 197 | 100 198 | 75 199 | true 200 | hate.png 201 | hate_f.png 202 | ffffffff 203 | 204 | ffffffff 205 | 80ffffff 206 | ffffffff 207 | 208 | 209 | 210 | 211 | true 212 | - 213 | - 214 | 104 215 | 108 216 | 105 217 | 105 218 | 219 | 220 | extention for rate show button 221 | 0 222 | 210 223 | 260 224 | 50 225 | F6111111 226 | w1x1.png 227 | 228 | 229 | 230 | No 231 | 160 232 | 172 233 | 200 234 | 30 235 | Font_Reg18 236 | 237 | grey2 238 | abFFFFFF 239 | 80FFFFFF 240 | center 241 | 20 242 | 243 | no 244 | 200 245 | 200 246 | 200 247 | 200 248 | 249 | 250 | 251 | -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/720p/tvshows.xml: -------------------------------------------------------------------------------- 1 | 2 | 101 3 | 4 | WindowOpen 5 | WindowClose 6 | 7 | 8 | 9 | Background 10 | 0 11 | 0 12 | 1280 13 | 800 14 | scale down 15 | 16 | 17 | WindowOpen 18 | WindowClose 19 | 20 | 0 21 | 315 22 | 1280 23 | 405 24 | views/showcase_floor.png 25 | 26 | 27 | -138 28 | 1280 29 | 720 30 | common/black.png 31 | aaffffff 32 | Visible 33 | Hidden 34 | Skin.HasSetting(darkinfopane) 35 | 36 | 37 | -70 38 | 0 39 | 464 40 | 720 41 | views/showcase_vignette.png 42 | vignette 43 | true 44 | 45 | 46 | 886 47 | 0 48 | 464 49 | 720 50 | true 51 | vignette 52 | views/showcase_vignette.png 53 | 54 | Neon_Floor 55 | 56 | 57 | 58 | Animation_OpenCloseZoom_New 59 | 60 | 25 61 | 45 62 | 1230 63 | 692 64 | wall/wall_bg.png 65 | 66 | 67 | 25 68 | 45 69 | 1230 70 | 692 71 | wall/wall_bg_reflection.png 72 | 73 | 74 | 75 | 76 | -20 77 | Animation_OpenCloseZoom 78 | 79 | 40 80 | 103 81 | 760 82 | 538 83 | 60 84 | 60 85 | 110 86 | 110 87 | 4 88 | 150 89 | true 90 | icon 91 | 60 92 | 93 | 94 | Conditional 95 | 96 | 0 97 | 0 98 | 126 99 | 179 100 | scale 101 | IconCrossfadeTime2 102 | $INFO[ListItem.Icon] 103 | thumbs/bordershadow4.png 104 | 5 105 | 106 | 107 | 81.5 108 | 5 109 | 40 110 | 40 111 | IconCrossfadeTime2 112 | local.png 113 | ListItem.Property(Available) 114 | 115 | 116 | 81.5 117 | 5 118 | 40 119 | 40 120 | IconCrossfadeTime2 121 | watchlist.png 122 | ListItem.Property(Watchlist) 123 | 124 | 125 | 126 | 127 | 128 | 0 129 | 0 130 | 126 131 | 179 132 | scale 133 | IconCrossfadeTime2 134 | $INFO[ListItem.Icon] 135 | featured/tile_fo.png 136 | 5 137 | 138 | 139 | 81.5 140 | 5 141 | 40 142 | 40 143 | IconCrossfadeTime2 144 | local.png 145 | ListItem.Property(Available) 146 | 147 | 148 | 81.5 149 | 5 150 | 40 151 | 40 152 | IconCrossfadeTime2 153 | watchlist.png 154 | ListItem.Property(Watchlist) 155 | 156 | 157 | 158 | 159 | 160 | 1230 161 | 103 162 | 6 163 | 538 164 | false 165 | CommonVerticalScrollbar 166 | 110 167 | 9000 168 | 169 | 170 | true 171 | 172 | HiddenObject 173 | 174 | 175 | HiddenObject 176 | 177 | 178 | HiddenObject 179 | 180 | 181 | 182 | -15 183 | 184 | 840 185 | 103 186 | 13 187 | 380 188 | Font_Bold25_Caps 189 | white2 190 | true 191 | 192 | 193 | 830 194 | 123 195 | 40 196 | 400 197 | osd/osd_settings_buttonnf.png 198 | 199 | 200 | 201 | 840 202 | 135 203 | 13 204 | 380 205 | Font_Reg18 206 | abFFFFFF 207 | true 208 | 209 | 210 | 1220 211 | 685 212 | 13 213 | 460 214 | Font_Reg18 215 | right 216 | floor 217 | true 218 | 219 | 220 | 1220 221 | 710 222 | 13 223 | 460 224 | Font_Reg18 225 | right 226 | floor 227 | 228 | 229 | 230 | 840 231 | 170 232 | 380 233 | 230 234 | Font_Reg18 235 | justify 236 | white6 237 | Skin.HasSetting(AutoScroll) 238 | 239 | 240 | 241 | 835 242 | 415 243 | 244 | -15 245 | -15 246 | 412 247 | 245 248 | common/black.png 249 | home/nowplaying/OverlayDialogBackground.png 250 | 15 251 | 252 | 253 | 0 254 | 0 255 | 382 256 | 215 257 | IconCrossfadeTime 258 | scale 259 | $INFO[Control.GetLabel(102)] 260 | !Player.Hasvideo 261 | Animation_VisibleChange200 262 | 263 | 264 | 0 265 | 0 266 | 382 267 | 215 268 | Player.Hasvideo + !VideoPlayer.IsFullscreen 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | Breadcrumbs 280 | Skin.HasSetting(breadcrumb) 281 | Animation_HideBreadCrumbs 282 | Breadcrumbs_BackBar 283 | 284 | 15 285 | 0 286 | 500 287 | left 288 | 289 | 0 290 | horizontal 291 | Animation_HideBreadCrumbs 292 | 293 | Items Icon 294 | 0 295 | 0 296 | 36 297 | 32 298 | keep 299 | common/tv_icon.png 300 | white2 301 | Conditional 302 | 303 | 304 | BreadcrumbsLabel 305 | 306 | 307 | 308 | 309 | 0 310 | 6 311 | 1280 312 | center 313 | center 314 | 10 315 | !IsEmpty(Container(110).NumItems) 316 | horizontal 317 | Visible 318 | Hidden 319 | 320 | 0 321 | 0 322 | 22 323 | center 324 | auto 325 | Font_Condensed20 326 | 327 | bclabel 328 | bcshadow 329 | false 330 | Conditional 331 | !IsEmpty(ListItem.Trailer) 332 | 333 | 334 | Items Icon 335 | 0 336 | 0 337 | 20 338 | 15 339 | stretch 340 | breadcrumbs/items.png 341 | bcicon 342 | 343 | 344 | 0 345 | 0 346 | 22 347 | center 348 | auto 349 | Font_Condensed20 350 | 351 | bclabel 352 | bcshadow 353 | false 354 | Conditional 355 | 356 | 357 | Items Icon 358 | 0 359 | 0 360 | 20 361 | 15 362 | stretch 363 | breadcrumbs/pages.png 364 | bcicon 365 | Visible 366 | Hidden 367 | 368 | 369 | 0 370 | 0 371 | 22 372 | center 373 | auto 374 | Font_Condensed20 375 | 376 | bclabel 377 | bcshadow 378 | false 379 | left 380 | Conditional 381 | 382 | 383 | Breadcrumbs_Furniture 384 | 385 | Furniture_NowPlayingWidget 386 | Furniture_Clock 387 | 388 | -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/media/current-hate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeon.nox/media/current-hate.png -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/media/current-love.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeon.nox/media/current-love.png -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/media/current-no-rating.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeon.nox/media/current-no-rating.png -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/media/dontknow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeon.nox/media/dontknow.png -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/media/dontknow_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeon.nox/media/dontknow_f.png -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/media/hate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeon.nox/media/hate.png -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/media/hate_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeon.nox/media/hate_f.png -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/media/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeon.nox/media/icon.png -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/media/local.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeon.nox/media/local.png -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/media/love.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeon.nox/media/love.png -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/media/love_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeon.nox/media/love_f.png -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/media/skip-rating.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeon.nox/media/skip-rating.png -------------------------------------------------------------------------------- /resources/skins/skin.aeon.nox/media/watchlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeon.nox/media/watchlist.png -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/720p/movie.xml: -------------------------------------------------------------------------------- 1 | 2 | 101 3 | 4 | WindowOpen 5 | WindowClose 6 | 7 | 8 | 9 | Background 10 | 0 11 | 0 12 | 1280 13 | 800 14 | scale down 15 | FF3E3E3E 16 | 17 | 18 | 19 | Movie Poster 20 | 50 21 | 100 22 | 250 23 | 350 24 | scale down 25 | 26 | 27 | 28 | Movie Title 29 | 0 30 | 30 31 | 1280 32 | 80 33 | center 34 | font20 35 | FFFFFFFF 36 | 37 | 38 | 39 | Movie Tagline 40 | 0 41 | 50 42 | 1280 43 | 80 44 | center 45 | font20 46 | FFFFFFFF 47 | 48 | 49 | 50 | Movie Overview 51 | 450 52 | 100 53 | 700 54 | 400 55 | font13 56 | true 57 | !Control.HasFocus(13) 58 | FFFFFFFF 59 | 60 | 61 | 62 | Play 63 | 0 64 | 600 65 | 1280 66 | 50 67 | font13 68 | FF444444 69 | 70 | FFFFFFFF 71 | FF009CFF 72 | 80FFFFFF 73 | center 74 | center 75 | 106 76 | 106 77 | 106 78 | 106 79 | 80 | 81 | 82 | Movie Year 83 | 50 84 | 500 85 | 200 86 | 40 87 | left 88 | font20 89 | FFFFFFFF 90 | 91 | 92 | 93 | 94 | Movie Runtime 95 | 50 96 | 520 97 | 300 98 | 40 99 | left 100 | font20 101 | FFFFFFFF 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/720p/rate.xml: -------------------------------------------------------------------------------- 1 | 2 | 104 3 | yes 4 | true 5 | 1 6 | 7 | 1 8 | 0 9 | 0 10 | 11 | Animation_DialogPopup 12 | 13 | 14 | Scene 15 | 0 16 | 0 17 | 1280 18 | 720 19 | true 20 | DDFFFFFF 21 | dialogs_scan_fill.png 22 | WindowOpen 23 | WindowClose 24 | 25 | 26 | Dialogs_Group 27 | 28 | Background 29 | 0 30 | 0 31 | 509 32 | 91 33 | true 34 | dialogs_scan_background.png 35 | 20 36 | 37 | 38 | 10 39 | 9 40 | 73 41 | 73 42 | dialogs_scan_icon.png 43 | 44 | 45 | Heading 46 | 8 47 | Dialogs_LabelVars 48 | true 49 | 50 | 51 | 52 | 200 53 | 31 54 | 500 55 | left 56 | true 57 | 10 58 | horizontal 59 | 108 60 | 108 61 | 62 | Love 63 | 40 64 | 30 65 | true 66 | love.png 67 | love_f.png 68 | ffffffff 69 | 70 | ffffffff 71 | ffaaaaaa 72 | 80ffffff 73 | 74 | 75 | 76 | 77 | true 78 | 79 | 80 | 81 | 82 | I dont know 83 | 40 84 | 30 85 | true 86 | dontknow.png 87 | dontknow_f.png 88 | - 89 | 90 | - 91 | - 92 | - 93 | 94 | 95 | 96 | 97 | true 98 | 99 | 100 | 101 | 102 | Hate 103 | 40 104 | 30 105 | true 106 | hate.png 107 | hate_f.png 108 | ffffffff 109 | 110 | ffffffff 111 | 80ffffff 112 | ffffffff 113 | 114 | 115 | 116 | 117 | true 118 | 119 | 120 | 121 | 122 | Current not rated 123 | 120 124 | 30 125 | true 126 | center 127 | Font_Info 128 | 2 129 | 5 130 | current-no-rating.png 131 | current-no-rating.png 132 | ffffffff 133 | 134 | ffffffff 135 | - 136 | 80ffffff 137 | ffffffff 138 | 139 | true 140 | 141 | 142 | Conditional 143 | 144 | 145 | Current love 146 | 120 147 | 30 148 | true 149 | current-love.png 150 | current-love.png 151 | ffffffff 152 | right 153 | Font_Info 154 | 20 155 | 5 156 | 157 | ffffffff 158 | 80ffffff 159 | ffffffff 160 | - 161 | 162 | true 163 | 164 | 165 | Conditional 166 | 167 | 168 | Current hate 169 | 120 170 | 30 171 | true 172 | current-hate.png 173 | current-hate.png 174 | ffffffff 175 | right 176 | Font_Info 177 | 20 178 | 5 179 | 180 | ffffffff 181 | 80ffffff 182 | ffffffff 183 | - 184 | 185 | true 186 | 187 | 188 | Conditional 189 | 190 | 191 | 192 | 193 | Background 194 | 0 195 | 0 196 | 509 197 | 91 198 | true 199 | - 200 | 20 201 | 202 | 203 | Rate show 204 | 62 205 | 105 206 | 376 207 | 21 208 | left 209 | 210 | 211 | Font_Info 212 | FFFFFFFF 213 | FF666666 214 | FFAAAAAA 215 | 216 | 217 | 105 218 | 105 219 | 108 220 | 108 221 | 222 | 223 | 224 | 225 | -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/media/current-hate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeonmq.3/media/current-hate.png -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/media/current-love.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeonmq.3/media/current-love.png -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/media/current-no-rating.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeonmq.3/media/current-no-rating.png -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/media/dontknow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeonmq.3/media/dontknow.png -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/media/dontknow_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeonmq.3/media/dontknow_f.png -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/media/hate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeonmq.3/media/hate.png -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/media/hate_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeonmq.3/media/hate_f.png -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/media/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeonmq.3/media/icon.png -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/media/local.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeonmq.3/media/local.png -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/media/love.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeonmq.3/media/love.png -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/media/love_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeonmq.3/media/love_f.png -------------------------------------------------------------------------------- /resources/skins/skin.aeonmq.3/media/watchlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RGPaul/script.traktutilities/056246a6ffbc170343166da9ce2d886efd7dcfdb/resources/skins/skin.aeonmq.3/media/watchlist.png -------------------------------------------------------------------------------- /scrobbler.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | 4 | import os 5 | import xbmc,xbmcaddon,xbmcgui 6 | import threading 7 | import time 8 | 9 | from utilities import * 10 | from rating import * 11 | 12 | __author__ = "Ralph-Gordon Paul, Adrian Cowan" 13 | __credits__ = ["Ralph-Gordon Paul", "Adrian Cowan", "Justin Nemeth", "Sean Rudford"] 14 | __license__ = "GPL" 15 | __maintainer__ = "Ralph-Gordon Paul" 16 | __email__ = "ralph-gordon.paul@uni-duesseldorf.de" 17 | __status__ = "Production" 18 | 19 | # read settings 20 | __settings__ = xbmcaddon.Addon( "script.traktutilities" ) 21 | __language__ = __settings__.getLocalizedString 22 | 23 | apikey = '0a698a20b222d0b8637298f6920bf03a' # scrobbling requires this dev key 24 | username = __settings__.getSetting("username") 25 | pwd = sha.new(__settings__.getSetting("password")).hexdigest() 26 | debug = __settings__.getSetting( "debug" ) 27 | 28 | headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} 29 | 30 | class Scrobbler(threading.Thread): 31 | totalTime = 1 32 | watchedTime = 0 33 | startTime = 0 34 | curVideo = None 35 | pinging = False 36 | playlistLength = 1 37 | abortRequested = False 38 | 39 | def run(self): 40 | # When requested ping trakt to say that the user is still watching the item 41 | count = 0 42 | while (not (self.abortRequested or xbmc.abortRequested)): 43 | time.sleep(5) # 1min wait 44 | #Debug("[Scrobbler] Cycling " + str(self.pinging)) 45 | if self.pinging: 46 | count += 1 47 | if count>=100: 48 | Debug("[Scrobbler] Pinging watching "+str(self.curVideo)) 49 | tmp = time.time() 50 | self.watchedTime += tmp - self.startTime 51 | self.startTime = tmp 52 | self.startedWatching() 53 | count = 0 54 | else: 55 | count = 0 56 | 57 | Debug("Scrobbler stopping") 58 | 59 | def playbackStarted(self, data): 60 | self.curVideo = data['item'] 61 | if self.curVideo <> None: 62 | if 'type' in self.curVideo and 'id' in self.curVideo: 63 | Debug("[Scrobbler] Watching: "+self.curVideo['type']+" - "+str(self.curVideo['id'])) 64 | try: 65 | if not xbmc.Player().isPlayingVideo(): 66 | Debug("[Scrobbler] Suddenly stopped watching item") 67 | return 68 | time.sleep(1) # Wait for possible silent seek (caused by resuming) 69 | self.watchedTime = xbmc.Player().getTime() 70 | self.totalTime = xbmc.Player().getTotalTime() 71 | if self.totalTime == 0: 72 | if self.curVideo['type'] == 'movie': 73 | self.totalTime = 90 74 | elif self.curVideo['type'] == 'episode': 75 | self.totalTime = 30 76 | else: 77 | self.totalTime = 1 78 | self.playlistLength = getPlaylistLengthFromXBMCPlayer(data['player']['playerid']) 79 | if (self.playlistLength == 0): 80 | Debug("[Scrobbler] Warning: Cant find playlist length?!, assuming that this item is by itself") 81 | self.playlistLength = 1 82 | except: 83 | Debug("[Scrobbler] Suddenly stopped watching item, or error: "+str(sys.exc_info()[0])) 84 | self.curVideo = None 85 | self.startTime = 0 86 | return 87 | self.startTime = time.time() 88 | self.startedWatching() 89 | self.pinging = True 90 | else: 91 | self.curVideo = None 92 | self.startTime = 0 93 | 94 | def playbackPaused(self): 95 | if self.startTime <> 0: 96 | self.watchedTime += time.time() - self.startTime 97 | Debug("[Scrobbler] Paused after: "+str(self.watchedTime)) 98 | self.startTime = 0 99 | 100 | def playbackEnded(self): 101 | if self.startTime <> 0: 102 | if self.curVideo == None: 103 | Debug("[Scrobbler] Warning: Playback ended but video forgotten") 104 | return 105 | self.watchedTime += time.time() - self.startTime 106 | self.pinging = False 107 | if self.watchedTime <> 0: 108 | if 'type' in self.curVideo and 'id' in self.curVideo: 109 | self.check() 110 | ratingCheck(self.curVideo, self.watchedTime, self.totalTime, self.playlistLength) 111 | self.watchedTime = 0 112 | self.startTime = 0 113 | 114 | def startedWatching(self): 115 | scrobbleMovieOption = __settings__.getSetting("scrobble_movie") 116 | scrobbleEpisodeOption = __settings__.getSetting("scrobble_episode") 117 | 118 | if self.curVideo['type'] == 'movie' and scrobbleMovieOption == 'true': 119 | match = getMovieDetailsFromXbmc(self.curVideo['id'], ['imdbnumber','title','year']) 120 | if match == None: 121 | return 122 | responce = watchingMovieOnTrakt(match['imdbnumber'], match['title'], match['year'], self.totalTime/60, int(100*self.watchedTime/self.totalTime)) 123 | if responce != None: 124 | Debug("[Scrobbler] Watch responce: "+str(responce)); 125 | elif self.curVideo['type'] == 'episode' and scrobbleEpisodeOption == 'true': 126 | match = getEpisodeDetailsFromXbmc(self.curVideo['id'], ['showtitle', 'season', 'episode']) 127 | if match == None: 128 | return 129 | responce = watchingEpisodeOnTrakt(None, match['showtitle'], None, match['season'], match['episode'], self.totalTime/60, int(100*self.watchedTime/self.totalTime)) 130 | if responce != None: 131 | Debug("[Scrobbler] Watch responce: "+str(responce)); 132 | 133 | def stoppedWatching(self): 134 | scrobbleMovieOption = __settings__.getSetting("scrobble_movie") 135 | scrobbleEpisodeOption = __settings__.getSetting("scrobble_episode") 136 | 137 | if self.curVideo['type'] == 'movie' and scrobbleMovieOption == 'true': 138 | responce = cancelWatchingMovieOnTrakt() 139 | if responce != None: 140 | Debug("[Scrobbler] Cancel watch responce: "+str(responce)); 141 | elif self.curVideo['type'] == 'episode' and scrobbleEpisodeOption == 'true': 142 | responce = cancelWatchingEpisodeOnTrakt() 143 | if responce != None: 144 | Debug("[Scrobbler] Cancel watch responce: "+str(responce)); 145 | 146 | def scrobble(self): 147 | scrobbleMovieOption = __settings__.getSetting("scrobble_movie") 148 | scrobbleEpisodeOption = __settings__.getSetting("scrobble_episode") 149 | 150 | if self.curVideo['type'] == 'movie' and scrobbleMovieOption == 'true': 151 | match = getMovieDetailsFromXbmc(self.curVideo['id'], ['imdbnumber','title','year']) 152 | if match == None: 153 | return 154 | responce = scrobbleMovieOnTrakt(match['imdbnumber'], match['title'], match['year'], self.totalTime/60, int(100*self.watchedTime/self.totalTime)) 155 | if responce != None: 156 | Debug("[Scrobbler] Scrobble responce: "+str(responce)); 157 | elif self.curVideo['type'] == 'episode' and scrobbleEpisodeOption == 'true': 158 | match = getEpisodeDetailsFromXbmc(self.curVideo['id'], ['showtitle', 'season', 'episode']) 159 | if match == None: 160 | return 161 | responce = scrobbleEpisodeOnTrakt(None, match['showtitle'], None, match['season'], match['episode'], self.totalTime/60, int(100*self.watchedTime/self.totalTime)) 162 | if responce != None: 163 | Debug("[Scrobbler] Scrobble responce: "+str(responce)); 164 | 165 | def check(self): 166 | __settings__ = xbmcaddon.Addon( "script.traktutilities" ) #read settings again, encase they have changed 167 | scrobbleMinViewTimeOption = __settings__.getSetting("scrobble_min_view_time") 168 | 169 | if (self.watchedTime/self.totalTime)*100>=float(scrobbleMinViewTimeOption): 170 | self.scrobble() 171 | else: 172 | self.stoppedWatching() 173 | -------------------------------------------------------------------------------- /service.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | 4 | import xbmc,xbmcaddon,xbmcgui 5 | from utilities import * 6 | from rating import * 7 | from sync_update import * 8 | from notification_service import * 9 | 10 | __author__ = "Ralph-Gordon Paul, Adrian Cowan" 11 | __credits__ = ["Ralph-Gordon Paul", "Adrian Cowan", "Justin Nemeth", "Sean Rudford"] 12 | __license__ = "GPL" 13 | __maintainer__ = "Ralph-Gordon Paul" 14 | __email__ = "ralph-gordon.paul@uni-duesseldorf.de" 15 | __status__ = "Production" 16 | 17 | __settings__ = xbmcaddon.Addon( "script.traktutilities" ) 18 | __language__ = __settings__.getLocalizedString 19 | 20 | Debug("service: " + __settings__.getAddonInfo("id") + " - version: " + __settings__.getAddonInfo("version")) 21 | 22 | # starts update/sync 23 | def autostart(): 24 | if checkSettings(True): 25 | notificationThread = NotificationService() 26 | notificationThread.start() 27 | 28 | autosync_moviecollection = __settings__.getSetting("autosync_moviecollection") 29 | autosync_tvshowcollection = __settings__.getSetting("autosync_tvshowcollection") 30 | autosync_cleanmoviecollection = __settings__.getSetting("autosync_cleanmoviecollection") 31 | autosync_cleantvshowcollection = __settings__.getSetting("autosync_cleantvshowcollection") 32 | autosync_seenmovies = __settings__.getSetting("autosync_seenmovies") 33 | autosync_seentvshows = __settings__.getSetting("autosync_seentvshows") 34 | try: 35 | if autosync_moviecollection == "true": 36 | notification("Trakt Utilities", __language__(1180).encode( "utf-8", "ignore" )) # start movie collection update 37 | updateMovieCollection(True) 38 | if autosync_cleanmoviecollection: cleanMovieCollection(True) 39 | if xbmc.abortRequested: raise SystemExit() 40 | 41 | if autosync_tvshowcollection == "true": 42 | notification("Trakt Utilities", __language__(1181).encode( "utf-8", "ignore" )) # start tvshow collection update 43 | updateTVShowCollection(True) 44 | if autosync_cleantvshowcollection: cleanTVShowCollection(True) 45 | if xbmc.abortRequested: raise SystemExit() 46 | 47 | if autosync_seenmovies == "true": 48 | Debug("autostart sync seen movies") 49 | notification("Trakt Utilities", __language__(1182).encode( "utf-8", "ignore" )) # start sync seen movies 50 | syncSeenMovies(True) 51 | if xbmc.abortRequested: raise SystemExit() 52 | 53 | if autosync_seentvshows == "true": 54 | Debug("autostart sync seen tvshows") 55 | notification("Trakt Utilities", __language__(1183).encode( "utf-8", "ignore" )) # start sync seen tv shows 56 | syncSeenTVShows(True) 57 | if xbmc.abortRequested: raise SystemExit() 58 | 59 | if autosync_moviecollection == "true" or autosync_tvshowcollection == "true" or autosync_seenmovies == "true" or autosync_seentvshows == "true": 60 | notification("Trakt Utilities", __language__(1184).encode( "utf-8", "ignore" )) # update / sync done 61 | except SystemExit: 62 | notificationThread.abortRequested = True 63 | Debug("[Service] Auto sync processes aborted due to shutdown request") 64 | 65 | notificationThread.join() 66 | 67 | autostart() 68 | -------------------------------------------------------------------------------- /trending.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | 4 | import os 5 | import xbmc,xbmcaddon,xbmcgui 6 | import time, socket 7 | 8 | try: import simplejson as json 9 | except ImportError: import json 10 | 11 | from utilities import * 12 | 13 | try: 14 | # Python 3.0 + 15 | import http.client as httplib 16 | except ImportError: 17 | # Python 2.7 and earlier 18 | import httplib 19 | 20 | try: 21 | # Python 2.6 + 22 | from hashlib import sha as sha 23 | except ImportError: 24 | # Python 2.5 and earlier 25 | import sha 26 | 27 | __author__ = "Ralph-Gordon Paul, Adrian Cowan" 28 | __credits__ = ["Ralph-Gordon Paul", "Adrian Cowan", "Justin Nemeth", "Sean Rudford"] 29 | __license__ = "GPL" 30 | __maintainer__ = "Ralph-Gordon Paul" 31 | __email__ = "ralph-gordon.paul@uni-duesseldorf.de" 32 | __status__ = "Production" 33 | 34 | # read settings 35 | __settings__ = xbmcaddon.Addon( "script.traktutilities" ) 36 | __language__ = __settings__.getLocalizedString 37 | 38 | apikey = '0a698a20b222d0b8637298f6920bf03a' 39 | username = __settings__.getSetting("username") 40 | pwd = sha.new(__settings__.getSetting("password")).hexdigest() 41 | debug = __settings__.getSetting( "debug" ) 42 | https = __settings__.getSetting('https') 43 | 44 | if (https == 'true'): 45 | conn = httplib.HTTPSConnection('api.trakt.tv') 46 | else: 47 | conn = httplib.HTTPConnection('api.trakt.tv') 48 | 49 | headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} 50 | 51 | def showTrendingMovies(): 52 | 53 | movies = getTrendingMoviesFromTrakt() 54 | watchlist = traktMovieListByImdbID(getWatchlistMoviesFromTrakt()) 55 | 56 | if movies == None: # movies = None => there was an error 57 | return # error already displayed in utilities.py 58 | 59 | if len(movies) == 0: 60 | xbmcgui.Dialog().ok("Trakt Utilities", "there are no trending movies") 61 | return 62 | 63 | for movie in movies: 64 | if movie['imdb_id'] in watchlist: 65 | movie['watchlist'] = True 66 | else: 67 | movie['watchlist'] = False 68 | 69 | # display trending movie list 70 | import windows 71 | ui = windows.MoviesWindow("movies.xml", __settings__.getAddonInfo('path'), "Default") 72 | ui.initWindow(movies, 'trending') 73 | ui.doModal() 74 | del ui 75 | 76 | def showTrendingTVShows(): 77 | 78 | tvshows = getTrendingTVShowsFromTrakt() 79 | watchlist = traktShowListByTvdbID(getWatchlistTVShowsFromTrakt()) 80 | 81 | if tvshows == None: # tvshows = None => there was an error 82 | return # error already displayed in utilities.py 83 | 84 | if len(tvshows) == 0: 85 | xbmcgui.Dialog().ok("Trakt Utilities", "there are no trending tv shows") 86 | return 87 | 88 | for tvshow in tvshows: 89 | if tvshow['imdb_id'] in watchlist: 90 | tvshow['watchlist'] = True 91 | else: 92 | tvshow['watchlist'] = False 93 | 94 | # display trending tv shows 95 | import windows 96 | ui = windows.TVShowsWindow("tvshows.xml", __settings__.getAddonInfo('path'), "Default") 97 | ui.initWindow(tvshows, 'trending') 98 | ui.doModal() 99 | del ui 100 | -------------------------------------------------------------------------------- /watchlist.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | 4 | import os 5 | import xbmc,xbmcaddon,xbmcgui 6 | import time, socket 7 | 8 | try: import simplejson as json 9 | except ImportError: import json 10 | 11 | from utilities import * 12 | 13 | try: 14 | # Python 3.0 + 15 | import http.client as httplib 16 | except ImportError: 17 | # Python 2.7 and earlier 18 | import httplib 19 | 20 | try: 21 | # Python 2.6 + 22 | from hashlib import sha as sha 23 | except ImportError: 24 | # Python 2.5 and earlier 25 | import sha 26 | 27 | __author__ = "Ralph-Gordon Paul, Adrian Cowan" 28 | __credits__ = ["Ralph-Gordon Paul", "Adrian Cowan", "Justin Nemeth", "Sean Rudford"] 29 | __license__ = "GPL" 30 | __maintainer__ = "Ralph-Gordon Paul" 31 | __email__ = "ralph-gordon.paul@uni-duesseldorf.de" 32 | __status__ = "Production" 33 | 34 | # read settings 35 | __settings__ = xbmcaddon.Addon( "script.traktutilities" ) 36 | __language__ = __settings__.getLocalizedString 37 | 38 | apikey = '0a698a20b222d0b8637298f6920bf03a' 39 | username = __settings__.getSetting("username") 40 | pwd = sha.new(__settings__.getSetting("password")).hexdigest() 41 | debug = __settings__.getSetting( "debug" ) 42 | https = __settings__.getSetting('https') 43 | 44 | if (https == 'true'): 45 | conn = httplib.HTTPSConnection('api.trakt.tv') 46 | else: 47 | conn = httplib.HTTPConnection('api.trakt.tv') 48 | 49 | headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} 50 | 51 | # list watchlist movies 52 | def showWatchlistMovies(): 53 | 54 | movies = getWatchlistMoviesFromTrakt() 55 | 56 | if movies == None: # movies = None => there was an error 57 | return # error already displayed in utilities.py 58 | 59 | if len(movies) == 0: 60 | xbmcgui.Dialog().ok(__language__(1201).encode( "utf-8", "ignore" ), __language__(1160).encode( "utf-8", "ignore" )) # Trakt Utilities, there are no movies in your watchlist 61 | return 62 | 63 | # display watchlist movie list 64 | import windows 65 | ui = windows.MoviesWindow("movies.xml", __settings__.getAddonInfo('path'), "Default") 66 | ui.initWindow(movies, 'watchlist') 67 | ui.doModal() 68 | del ui 69 | 70 | # list watchlist tv shows 71 | def showWatchlistTVShows(): 72 | 73 | tvshows = getWatchlistTVShowsFromTrakt() 74 | 75 | if tvshows == None: # tvshows = None => there was an error 76 | return # error already displayed in utilities.py 77 | 78 | if len(tvshows) == 0: 79 | xbmcgui.Dialog().ok(__language__(1201).encode( "utf-8", "ignore" ), __language__(1161).encode( "utf-8", "ignore" )) # Trakt Utilities, there are no tv shows in your watchlist 80 | return 81 | 82 | # display watchlist tv shows 83 | import windows 84 | ui = windows.TVShowsWindow("tvshows.xml", __settings__.getAddonInfo('path'), "Default") 85 | ui.initWindow(tvshows, 'watchlist') 86 | ui.doModal() 87 | del ui 88 | 89 | --------------------------------------------------------------------------------