diff options
author | amet <amet.nospam@gmail.com> | 2011-04-16 11:15:19 +0400 |
---|---|---|
committer | amet <amet.nospam@gmail.com> | 2011-04-17 00:41:34 +0400 |
commit | 3741c7fe114addbc298394d98b86cc373fad49b9 (patch) | |
tree | 3f56ff9cfdd092e00280e1dea6033888bd26f709 /addons | |
parent | ee4472524c0838327a34e07b99c5830daa6259e4 (diff) |
changed: moved RecentlyAdded to the core, and removed script.recentlyadded from addons and from Confluence
Diffstat (limited to 'addons')
-rw-r--r-- | addons/script.recentlyadded/LICENSE.txt | 282 | ||||
-rw-r--r-- | addons/script.recentlyadded/RecentlyAdded.py | 314 | ||||
-rw-r--r-- | addons/script.recentlyadded/addon.xml | 16 | ||||
-rw-r--r-- | addons/skin.confluence/720p/Home.xml | 30 | ||||
-rw-r--r-- | addons/skin.confluence/720p/Startup.xml | 18 | ||||
-rw-r--r-- | addons/skin.confluence/addon.xml | 3 |
6 files changed, 3 insertions, 660 deletions
diff --git a/addons/script.recentlyadded/LICENSE.txt b/addons/script.recentlyadded/LICENSE.txt deleted file mode 100644 index 4f8e8eb30c..0000000000 --- a/addons/script.recentlyadded/LICENSE.txt +++ /dev/null @@ -1,282 +0,0 @@ - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS -------------------------------------------------------------------------- diff --git a/addons/script.recentlyadded/RecentlyAdded.py b/addons/script.recentlyadded/RecentlyAdded.py deleted file mode 100644 index 7830c14d96..0000000000 --- a/addons/script.recentlyadded/RecentlyAdded.py +++ /dev/null @@ -1,314 +0,0 @@ -# * This Program is free software; you can redistribute it and/or modify -# * it under the terms of the GNU General Public License as published by -# * the Free Software Foundation; either version 2, or (at your option) -# * any later version. -# * -# * This Program is distributed in the hope that it will be useful, -# * but WITHOUT ANY WARRANTY; without even the implied warranty of -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# * GNU General Public License for more details. -# * -# * You should have received a copy of the GNU General Public License -# * along with XBMC; see the file COPYING. If not, write to -# * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -# * http://www.gnu.org/copyleft/gpl.html -# * -# * this file was taken from http://xbmc-addons.googlecode.com/svn/packages/scripts/RecentlyAdded.py -# * and modified to be a XBMC Add-on under gpl2 license on 20. November 2010. -# * -# * Thanks to: -# * -# * Nuka for the original RecentlyAdded.py -# * -# * ronie and Hitcher for the improvements made while in official repo -# * -# * Team XBMC - -import xbmc -from xbmcgui import Window -from urllib import quote_plus, unquote_plus -import re -import sys -import os -import random - -class Main: - # grab the home window - WINDOW = Window( 10000 ) - - def _clear_properties( self ): - # reset Totals property for visible condition - self.WINDOW.clearProperty( "Database.Totals" ) - # we enumerate thru and clear individual properties in case other scripts set window properties - for count in range( self.LIMIT ): - # we clear title for visible condition - self.WINDOW.clearProperty( "LatestMovie.%d.Title" % ( count + 1, ) ) - self.WINDOW.clearProperty( "LatestEpisode.%d.ShowTitle" % ( count + 1, ) ) - self.WINDOW.clearProperty( "LatestSong.%d.Title" % ( count + 1, ) ) - - def _get_media( self, path, file ): - # set default values - play_path = fanart_path = thumb_path = path + file - # we handle stack:// media special - if ( file.startswith( "stack://" ) ): - play_path = fanart_path = file - thumb_path = file[ 8 : ].split( " , " )[ 0 ] - # we handle rar:// and zip:// media special - if ( file.startswith( "rar://" ) or file.startswith( "zip://" ) ): - play_path = fanart_path = thumb_path = file - # return media info - return xbmc.getCacheThumbName( thumb_path ), xbmc.getCacheThumbName( fanart_path ), play_path - - def _parse_argv( self ): - try: - # parse sys.argv for params - params = dict( arg.split( "=" ) for arg in sys.argv[ 1 ].split( "&" ) ) - except: - # no params passed - params = {} - # set our preferences - self.LIMIT = int( params.get( "limit", "5" ) ) - self.RECENT = not params.get( "partial", "" ) == "True" - self.ALBUMS = params.get( "albums", "" ) == "True" - self.UNPLAYED = params.get( "unplayed", "" ) == "True" - self.TOTALS = params.get( "totals", "" ) == "True" - self.PLAY_TRAILER = params.get( "trailer", "" ) == "True" - self.ALARM = int( params.get( "alarm", "0" ) ) - self.RANDOM_ORDER = params.get( "random", "" ) == "True" - - def _set_alarm( self ): - # only run if user/skinner preference - if ( not self.ALARM ): return - # set the alarms command - command = "XBMC.RunScript(%s,limit=%d&partial=%s&albums=%s&unplayed=%s&totals=%s&trailer=%s&alarm=%d)" % ( os.path.join( os.getcwd(), __file__ ), self.LIMIT, str( not self.RECENT ), str( self.ALBUMS ), str( self.UNPLAYED ), str( self.TOTALS ), str( self.PLAY_TRAILER ), self.ALARM, ) - xbmc.executebuiltin( "AlarmClock(LatestAdded,%s,%d,true)" % ( command, self.ALARM, ) ) - - def __init__( self ): - # parse argv for any preferences - self._parse_argv() - # clear properties - self._clear_properties() - # set any alarm - self._set_alarm() - # format our records start and end - xbmc.executehttpapi( "SetResponseFormat()" ) - xbmc.executehttpapi( "SetResponseFormat(OpenRecord,%s)" % ( "<record>", ) ) - xbmc.executehttpapi( "SetResponseFormat(CloseRecord,%s)" % ( "</record>", ) ) - # fetch media info - self._fetch_totals() - self._fetch_movie_info() - self._fetch_tvshow_info() - self._fetch_music_info() - - def _fetch_totals( self ): - # only run if user/skinner preference - if ( not self.TOTALS ): return - import datetime - # get our regions format - date_format = xbmc.getRegion( "dateshort" ).replace( "MM", "%m" ).replace( "DD", "%d" ).replace( "YYYYY", "%Y" ).replace( "YYYY", "%Y" ).strip() - # only need to make Totals not empty - self.WINDOW.setProperty( "Database.Totals", "true" ) - # sql statement for movie totals - sql_totals = "select count(1), count(playCount), movieview.* from movieview group by lastPlayed" - totals_xml = xbmc.executehttpapi( "QueryVideoDatabase(%s)" % quote_plus( sql_totals ), ) - records = re.findall( "<record>(.+?)</record>", totals_xml, re.DOTALL ) - # initialize our list - movies_totals = [ 0 ] * 7 - # enumerate thru and total our numbers - for record in records: - fields = re.findall( "<field>(.*?)</field>", record, re.DOTALL ) - movies_totals[ 0 ] += int( fields[ 0 ] ) - movies_totals[ 1 ] += int( fields[ 1 ] ) - if ( fields[ 29 ] ): - movies_totals[ 2 ] = fields[ 3 ] # title - movies_totals[ 3 ] = fields[ 10 ] # year - movies_totals[ 4 ] = fields[ 14 ] # runningtime - movies_totals[ 5 ] = fields[ 17 ] # genre - movies_totals[ 6 ] = "" # last watched - date = fields[ 29 ].split( " " )[ 0 ].split( "-" ) - movies_totals[ 6 ] = datetime.date( int( date[ 0 ] ), int( date[ 1 ] ), int( date[ 2 ] ) ).strftime( date_format ) # last played - # sql statement for music videos totals - sql_totals = "select count(1), count(playCount) from musicvideoview" - totals_xml = xbmc.executehttpapi( "QueryVideoDatabase(%s)" % quote_plus( sql_totals ), ) - mvideos_totals = re.findall( "<field>(.+?)</field>", totals_xml, re.DOTALL ) - # sql statement for tv shows/episodes totals - sql_totals = "SELECT tvshow.*, path.strPath AS strPath, counts.totalcount AS totalCount, counts.watchedcount AS watchedCount, counts.totalcount=counts.watchedcount AS watched FROM tvshow JOIN tvshowlinkpath ON tvshow.idShow=tvshowlinkpath.idShow JOIN path ON path.idPath=tvshowlinkpath.idPath LEFT OUTER join (SELECT tvshow.idShow AS idShow, count(1) AS totalCount, count(files.playCount) AS watchedCount FROM tvshow JOIN tvshowlinkepisode ON tvshow.idShow=tvshowlinkepisode.idShow JOIN episode ON episode.idEpisode=tvshowlinkepisode.idEpisode JOIN files ON files.idFile=episode.idFile GROUP BY tvshow.idShow) counts ON tvshow.idShow=counts.idShow" - totals_xml = xbmc.executehttpapi( "QueryVideoDatabase(%s)" % quote_plus( sql_totals ), ) - # initialize our list - tvshows_totals = [ 0 ] * 4 - records = re.findall( "<record>(.+?)</record>", totals_xml, re.DOTALL ) - # enumerate thru and total our numbers - for record in records: - fields = re.findall( "<field>(.*?)</field>", record, re.DOTALL ) - if ( fields[ 25 ] ): - tvshows_totals[ 0 ] += 1 - tvshows_totals[ 1 ] += int( fields[ 24 ] ) # number of episodes - tvshows_totals[ 2 ] += int( fields[ 26 ] ) # watched? - tvshows_totals[ 3 ] += int( fields[ 25 ] ) # number of episodes watched - # sql statement for tv albums/songs totals - - sql_totals = "select count(1), count(distinct strAlbum), count(distinct strArtist) from songview" - totals_xml = xbmc.executehttpapi( "QueryMusicDatabase(%s)" % quote_plus( sql_totals ), ) - music_totals = re.findall( "<field>(.+?)</field>", totals_xml, re.DOTALL ) - - # set properties - self.WINDOW.setProperty( "Movies.Count" , str( movies_totals[ 0 ] ) or "" ) - self.WINDOW.setProperty( "Movies.Watched" , str( movies_totals[ 1 ] ) or "" ) - self.WINDOW.setProperty( "Movies.UnWatched" , str( movies_totals[ 0 ] - movies_totals[ 1 ] ) or "" ) - self.WINDOW.setProperty( "Movies.LastWatchedTitle" , movies_totals[ 2 ] or "" ) - self.WINDOW.setProperty( "Movies.LastWatchedYear" , movies_totals[ 3 ] or "" ) - self.WINDOW.setProperty( "Movies.LastWatchedRuntime" , movies_totals[ 4 ] or "" ) - self.WINDOW.setProperty( "Movies.LastWatchedGenre" , movies_totals[ 5 ] or "" ) - self.WINDOW.setProperty( "Movies.LastWatchedDate" , movies_totals[ 6 ] or "" ) - - self.WINDOW.setProperty( "MusicVideos.Count" , mvideos_totals[ 0 ] or "" ) - self.WINDOW.setProperty( "MusicVideos.Watched" , mvideos_totals[ 1 ] or "" ) - self.WINDOW.setProperty( "MusicVideos.UnWatched" , str( int( mvideos_totals[ 0 ] ) - int( mvideos_totals[ 1 ] ) ) or "" ) - - self.WINDOW.setProperty( "TVShows.Count" , str( tvshows_totals[ 0 ] ) or "" ) - self.WINDOW.setProperty( "TVShows.Watched" , str( tvshows_totals[ 2 ] ) or "" ) - self.WINDOW.setProperty( "TVShows.UnWatched" , str( tvshows_totals[ 0 ] - tvshows_totals[ 2 ] ) or "" ) - self.WINDOW.setProperty( "Episodes.Count" , str( tvshows_totals[ 1 ] ) or "" ) - self.WINDOW.setProperty( "Episodes.Watched" , str( tvshows_totals[ 3 ] ) or "" ) - self.WINDOW.setProperty( "Episodes.UnWatched" , str( tvshows_totals[ 1 ] - tvshows_totals[ 3 ] ) or "" ) - - self.WINDOW.setProperty( "Music.SongsCount" , music_totals[ 0 ] or "" ) - self.WINDOW.setProperty( "Music.AlbumsCount" , music_totals[ 1 ] or "" ) - self.WINDOW.setProperty( "Music.ArtistsCount" , music_totals[ 2 ] or "" ) - - def _fetch_movie_info( self ): - # set our unplayed query - unplayed = ( "", "where playCount is null ", )[ self.UNPLAYED ] - # sql statement - if ( self.RANDOM_ORDER ): - # random order - sql_movies = "select * from movieview %sorder by RANDOM() limit %d" % ( unplayed, self.LIMIT, ) - elif ( self.RECENT ): - # recently added - sql_movies = "select * from movieview %sorder by idMovie desc limit %d" % ( unplayed, self.LIMIT, ) - else: - # movies not finished - sql_movies = "select movieview.*, bookmark.timeInSeconds from movieview join bookmark on (movieview.idFile = bookmark.idFile) %sorder by movieview.c00 limit %d" % ( unplayed, self.LIMIT, ) - # query the database - movies_xml = xbmc.executehttpapi( "QueryVideoDatabase(%s)" % quote_plus( sql_movies ), ) - # separate the records - movies = re.findall( "<record>(.+?)</record>", movies_xml, re.DOTALL ) - # enumerate thru our records and set our properties - for count, movie in enumerate( movies ): - # separate individual fields - fields = re.findall( "<field>(.*?)</field>", movie, re.DOTALL ) - # set properties - - self.WINDOW.setProperty( "LatestMovie.%d.Title" % ( count + 1, ), fields[ 2 ] ) - self.WINDOW.setProperty( "LatestMovie.%d.Rating" % ( count + 1, ), fields[ 7 ] ) - self.WINDOW.setProperty( "LatestMovie.%d.Year" % ( count + 1, ), fields[ 9 ] ) - self.WINDOW.setProperty( "LatestMovie.%d.Plot" % ( count + 1, ), fields[ 3 ] ) - self.WINDOW.setProperty( "LatestMovie.%d.RunningTime" % ( count + 1, ), fields[ 13 ] ) - # get cache names of path to use for thumbnail/fanart and play path - thumb_cache, fanart_cache, play_path = self._get_media( fields[ 25 ], fields[ 24 ] ) - if os.path.isfile("%s.dds" % (xbmc.translatePath( "special://profile/Thumbnails/Video/%s/%s" % ( "Fanart", os.path.splitext(fanart_cache)[0],) ) )): - fanart_cache = "%s.dds" % (os.path.splitext(fanart_cache)[0],) - self.WINDOW.setProperty( "LatestMovie.%d.Path" % ( count + 1, ), ( play_path, fields[ 21 ], )[ fields[ 21 ] != "" and self.PLAY_TRAILER ] ) - self.WINDOW.setProperty( "LatestMovie.%d.Trailer" % ( count + 1, ), fields[ 21 ] ) - self.WINDOW.setProperty( "LatestMovie.%d.Fanart" % ( count + 1, ), "special://profile/Thumbnails/Video/%s/%s" % ( "Fanart", fanart_cache, ) ) - # initial thumb path - thumb = "special://profile/Thumbnails/Video/%s/%s" % ( thumb_cache[ 0 ], thumb_cache, ) - # if thumb does not exist use an auto generated thumb path - if ( not os.path.isfile( xbmc.translatePath( thumb ) ) ): - thumb = "special://profile/Thumbnails/Video/%s/auto-%s" % ( thumb_cache[ 0 ], thumb_cache, ) - self.WINDOW.setProperty( "LatestMovie.%d.Thumb" % ( count + 1, ), thumb ) - - def _fetch_tvshow_info( self ): - # set our unplayed query - unplayed = ( "", "where playCount is null ", )[ self.UNPLAYED ] - # sql statement - if ( self.RANDOM_ORDER ): - # random order - sql_episodes = "select * from episodeview %sorder by RANDOM() limit %d" % ( unplayed, self.LIMIT, ) - elif ( self.RECENT ): - # recently added - sql_episodes = "select * from episodeview %sorder by idEpisode desc limit %d" % ( unplayed, self.LIMIT, ) - else: - # tv shows not finished - sql_episodes = "select episodeview.*, bookmark.timeInSeconds from episodeview join bookmark on (episodeview.idFile = bookmark.idFile) %sorder by episodeview.strTitle limit %d" % ( unplayed, self.LIMIT, ) - # query the database - episodes_xml = xbmc.executehttpapi( "QueryVideoDatabase(%s)" % quote_plus( sql_episodes ), ) - # separate the records - episodes = re.findall( "<record>(.+?)</record>", episodes_xml, re.DOTALL ) - # enumerate thru our records and set our properties - for count, episode in enumerate( episodes ): - # separate individual fields - fields = re.findall( "<field>(.*?)</field>", episode, re.DOTALL ) - # set properties - self.WINDOW.setProperty( "LatestEpisode.%d.ShowTitle" % ( count + 1, ), fields[ 28 ] ) - self.WINDOW.setProperty( "LatestEpisode.%d.EpisodeTitle" % ( count + 1, ), fields[ 2 ] ) - self.WINDOW.setProperty( "LatestEpisode.%d.EpisodeNo" % ( count + 1, ), "s%02de%02d" % ( int( fields[ 14 ] ), int( fields[ 15 ] ), ) ) - self.WINDOW.setProperty( "LatestEpisode.%d.Rating" % ( count + 1, ), fields[ 5 ] ) - self.WINDOW.setProperty( "LatestEpisode.%d.EpisodeSeason" % ( count + 1, ), fields[ 14 ] ) - self.WINDOW.setProperty( "LatestEpisode.%d.EpisodeNumber" % ( count + 1, ), fields[ 15 ] ) - self.WINDOW.setProperty( "LatestEpisode.%d.Plot" % ( count + 1, ), fields[ 3 ] ) - # get cache names of path to use for thumbnail/fanart and play path - thumb_cache, fanart_cache, play_path = self._get_media( fields[ 25 ], fields[ 24 ] ) - if ( not os.path.isfile( xbmc.translatePath( "special://profile/Thumbnails/Video/%s/%s" % ( "Fanart", fanart_cache, ) ) ) ): - fanart_cache = xbmc.getCacheThumbName(os.path.join(os.path.split(os.path.split(fields[ 25 ])[0])[0], "")) - if os.path.isfile("%s.dds" % (xbmc.translatePath( "special://profile/Thumbnails/Video/%s/%s" % ( "Fanart", os.path.splitext(fanart_cache)[0],) ) )): - fanart_cache = "%s.dds" % (os.path.splitext(fanart_cache)[0],) - self.WINDOW.setProperty( "LatestEpisode.%d.Path" % ( count + 1, ), play_path ) - self.WINDOW.setProperty( "LatestEpisode.%d.Fanart" % ( count + 1, ), "special://profile/Thumbnails/Video/%s/%s" % ( "Fanart", fanart_cache, ) ) - # initial thumb path - thumb = "special://profile/Thumbnails/Video/%s/%s" % ( thumb_cache[ 0 ], thumb_cache, ) - # if thumb does not exist use an auto generated thumb path - if ( not os.path.isfile( xbmc.translatePath( thumb ) ) ): - thumb = "special://profile/Thumbnails/Video/%s/auto-%s" % ( thumb_cache[ 0 ], thumb_cache, ) - self.WINDOW.setProperty( "LatestEpisode.%d.Thumb" % ( count + 1, ), thumb ) - - def _fetch_music_info( self ): - # sql statement - if ( self.ALBUMS ): - sql_music = "select idAlbum from albumview order by idAlbum desc limit %d" % ( self.LIMIT, ) - # query the database for recently added albums - music_xml = xbmc.executehttpapi( "QueryMusicDatabase(%s)" % quote_plus( sql_music ), ) - # separate the records - albums = re.findall( "<record>(.+?)</record>", music_xml, re.DOTALL ) - # set our unplayed query - unplayed = ( "(idAlbum = %s)", "(idAlbum = %s and lastplayed is null)", )[ self.UNPLAYED ] - # sql statement - sql_music = "select songview.* from songview where %s limit 1" % ( unplayed, ) - # clear our xml data - music_xml = "" - # enumerate thru albums and fetch info - for album in albums: - # query the database and add result to our string - music_xml += xbmc.executehttpapi( "QueryMusicDatabase(%s)" % quote_plus( sql_music % ( album.replace( "<field>", "" ).replace( "</field>", "" ), ) ), ) - else: - # set our unplayed query - unplayed = ( "", "where lastplayed is null ", )[ self.UNPLAYED ] - # sql statement - sql_music = "select * from songview %sorder by idSong desc limit %d" % ( unplayed, self.LIMIT, ) - # query the database - music_xml = xbmc.executehttpapi( "QueryMusicDatabase(%s)" % quote_plus( sql_music ), ) - # separate the records - items = re.findall( "<record>(.+?)</record>", music_xml, re.DOTALL ) - # enumerate thru our records and set our properties - for count, item in enumerate( items ): - # separate individual fields - fields = re.findall( "<field>(.*?)</field>", item, re.DOTALL ) - # set properties - self.WINDOW.setProperty( "LatestSong.%d.Title" % ( count + 1, ), fields[ 3 ] ) - self.WINDOW.setProperty( "LatestSong.%d.Year" % ( count + 1, ), fields[ 6 ] ) - self.WINDOW.setProperty( "LatestSong.%d.Artist" % ( count + 1, ), fields[ 24 ] ) - self.WINDOW.setProperty( "LatestSong.%d.Album" % ( count + 1, ), fields[ 21 ] ) - self.WINDOW.setProperty( "LatestSong.%d.Rating" % ( count + 1, ), fields[ 18 ] ) - path = fields[ 22 ] - # don't add song for albums list TODO: figure out how toplay albums - ##if ( not self.ALBUMS ): - path += fields[ 8 ] - self.WINDOW.setProperty( "LatestSong.%d.Path" % ( count + 1, ), path ) - # get cache name of path to use for fanart - cache_name = xbmc.getCacheThumbName( fields[ 24 ] ) - self.WINDOW.setProperty( "LatestSong.%d.Fanart" % ( count + 1, ), "special://profile/Thumbnails/Music/%s/%s" % ( "Fanart", cache_name, ) ) - self.WINDOW.setProperty( "LatestSong.%d.Thumb" % ( count + 1, ), fields[ 27 ] ) - - -if ( __name__ == "__main__" ): - Main() diff --git a/addons/script.recentlyadded/addon.xml b/addons/script.recentlyadded/addon.xml deleted file mode 100644 index 62c393ff99..0000000000 --- a/addons/script.recentlyadded/addon.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<addon id="script.recentlyadded" - name="Recently Added XBMC Script" - version="2.0.2" - provider-name="alex"> - <requires> - <import addon="xbmc.python" version="1.0"/> - </requires> - <extension point="xbmc.python.library" - library="RecentlyAdded.py" /> - <extension point="xbmc.addon.metadata"> - <summary lang="en"></summary> - <description lang="en"></description> - <platform>all</platform> - </extension> -</addon> diff --git a/addons/skin.confluence/720p/Home.xml b/addons/skin.confluence/720p/Home.xml index 2ecd817e85..fb18f9f065 100644 --- a/addons/skin.confluence/720p/Home.xml +++ b/addons/skin.confluence/720p/Home.xml @@ -1,5 +1,5 @@ <window id="0"> - <defaultcontrol always="true">8999</defaultcontrol> + <defaultcontrol always="true">9000</defaultcontrol> <allowoverlay>no</allowoverlay> <controls> <control type="multiimage"> @@ -13,34 +13,6 @@ <fadetime>1000</fadetime> </control> <include>CommonMediaPlayingBackground</include> - <!-- weather Info --> - <control type="button" id="8999"> - <description>Run Recently added</description> - <posx>-20</posx> - <posy>-20</posy> - <width>1</width> - <height>1</height> - <label>-</label> - <font>-</font> - <onfocus>XBMC.RunScript(script.recentlyadded,limit=4)</onfocus> - <onfocus>SetFocus(9000)</onfocus> - <texturenofocus>-</texturenofocus> - <texturefocus>-</texturefocus> - <visible>Skin.HasSetting(homepageShowRecentlyAdded)</visible> - </control> - <control type="button" id="8999"> - <description>Don't run Recently added</description> - <posx>-20</posx> - <posy>-20</posy> - <width>1</width> - <height>1</height> - <label>-</label> - <font>-</font> - <onfocus>SetFocus(9000)</onfocus> - <texturenofocus>-</texturenofocus> - <texturefocus>-</texturefocus> - <visible>!Skin.HasSetting(homepageShowRecentlyAdded)</visible> - </control> <!-- Music Info --> <control type="group"> <posx>0</posx> diff --git a/addons/skin.confluence/720p/Startup.xml b/addons/skin.confluence/720p/Startup.xml index 940537460f..9407db9295 100644 --- a/addons/skin.confluence/720p/Startup.xml +++ b/addons/skin.confluence/720p/Startup.xml @@ -1,23 +1,7 @@ <window> - <defaultcontrol always="true">9</defaultcontrol> + <defaultcontrol always="true">10</defaultcontrol> <allowoverlay>no</allowoverlay> <controls> - <control type="button" id="9"> - <description>Trigger to Auto run the Latest media python after a 1 min delay if scan on startup is enabled</description> - <onfocus>XBMC.AlarmClock(UpdateRecentAdded,XBMC.RunScript(script.recentlyadded,limit=4),1,true)</onfocus> - <onfocus>SetFocus(10)</onfocus> - <texturenofocus>-</texturenofocus> - <texturefocus>-</texturefocus> - <visible>system.getbool(videolibrary.updateonstartup) + Skin.HasSetting(homepageShowRecentlyAdded)</visible> - </control> - <control type="button" id="9"> - <description>Don't run anything is scan on startup is Disabled and jump to the startup playlist</description> - <onfocus>SetFocus(10)</onfocus> - <texturenofocus>-</texturenofocus> - <texturefocus>-</texturefocus> - <visible>!system.getbool(videolibrary.updateonstartup) | !Skin.HasSetting(homepageShowRecentlyAdded)</visible> - </control> - <control type="button" id="10"> <description>trigger</description> <onfocus>ReplaceWindow(Home)</onfocus> diff --git a/addons/skin.confluence/addon.xml b/addons/skin.confluence/addon.xml index 3b21e9fa9e..a4055f2f08 100644 --- a/addons/skin.confluence/addon.xml +++ b/addons/skin.confluence/addon.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8"?> +<?xml version="1.0" encoding="UTF-8"?> <addon id="skin.confluence" version="1.2.0" @@ -6,7 +6,6 @@ provider-name="Jezz_X, Team XBMC"> <requires> <import addon="xbmc.gui" version="2.11"/> - <import addon="script.recentlyadded" version="1.0.4"/> </requires> <extension point="xbmc.gui.skin" |