The branch, frodo has been updated
       via  d1573782062a58a52d0be7920e75b51192d5d865 (commit)
       via  1f846d90a83322487d42385496c7c1835cc25d49 (commit)
       via  aa25bd20e994fbfcc1f1860257b4c275e61ca5ec (commit)
       via  c47e9d870a46c497e76b2d0c9b0c66340afed1d6 (commit)
      from  ff80138129fa320ca8d9873199313ec8f8e77adb (commit)

- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=d1573782062a58a52d0be7920e75b51192d5d865

commit d1573782062a58a52d0be7920e75b51192d5d865
Author: beenje <[email protected]>
Date:   Wed Jan 8 15:04:11 2014 +0100

    [plugin.video.trakt_list_manager] updated to version 0.1.4

diff --git a/plugin.video.trakt_list_manager/addon.py 
b/plugin.video.trakt_list_manager/addon.py
index eba9754..5a3e8c7 100644
--- a/plugin.video.trakt_list_manager/addon.py
+++ b/plugin.video.trakt_list_manager/addon.py
@@ -19,7 +19,7 @@
 
 from xbmcswift2 import Plugin, xbmc, xbmcgui
 from resources.lib.api import TraktListApi, AuthenticationError, \
-    LIST_PRIVACY_IDS
+    LIST_PRIVACY_IDS, NONE
 
 API_KEY = '2ce240ab6543ebd7d84abe5268a822d5'
 WATCHLIST_SLUG = 'WATCHLIST'  # hacky but reduces code amount...
@@ -156,8 +156,8 @@ def show_customlist(list_slug):
     for item in items:
         item['context_menu'] = context_menu(
             list_slug=list_slug,
-            imdb_id=item['info'].get('code', ''),
-            tmdb_id=item.get('tmdb_id', '')
+            imdb_id=item['info'].get('code', NONE),
+            tmdb_id=item.get('tmdb_id', NONE)
         )
     plugin.set_content('movies')
     items.append({
@@ -205,8 +205,8 @@ def show_watchlist():
     items = format_movies(api.get_watchlist())
     for item in items:
         item['context_menu'] = context_menu(
-            imdb_id=item['info'].get('code', ''),
-            tmdb_id=item.get('tmdb_id', '')
+            imdb_id=item['info'].get('code', NONE),
+            tmdb_id=item.get('tmdb_id', NONE)
         )
     items.append({
         'label': _('add_movie'),
diff --git a/plugin.video.trakt_list_manager/addon.xml 
b/plugin.video.trakt_list_manager/addon.xml
index d2fc98e..06356c4 100644
--- a/plugin.video.trakt_list_manager/addon.xml
+++ b/plugin.video.trakt_list_manager/addon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.trakt_list_manager" name="Trakt.tv List Manager" 
version="0.1.3" provider-name="Tristan Fischer ([email protected])">
+<addon id="plugin.video.trakt_list_manager" name="Trakt.tv List Manager" 
version="0.1.4" provider-name="Tristan Fischer ([email protected])">
     <requires>
         <import addon="xbmc.python" version="2.1.0"/>
         <import addon="script.module.xbmcswift2" version="2.4.0"/>
diff --git a/plugin.video.trakt_list_manager/changelog.txt 
b/plugin.video.trakt_list_manager/changelog.txt
index d3fa5d5..44abf2b 100644
--- a/plugin.video.trakt_list_manager/changelog.txt
+++ b/plugin.video.trakt_list_manager/changelog.txt
@@ -1,3 +1,7 @@
+0.1.4 (08.01.2014)
+ - fix adding or deleting of movies with only tmdb_id or imdb_id
+ - fix urlencoding bug (e.g. on movies with colon in title
+
 0.1.3 (23.06.2013)
  - Added "Add to CouchPotato"-Feature
  - Fix Delete Movie from List
diff --git a/plugin.video.trakt_list_manager/resources/lib/api.py 
b/plugin.video.trakt_list_manager/resources/lib/api.py
index b5e67f0..b41a5d6 100644
--- a/plugin.video.trakt_list_manager/resources/lib/api.py
+++ b/plugin.video.trakt_list_manager/resources/lib/api.py
@@ -18,13 +18,14 @@
 #
 
 import json
-from urllib import quote_plus as quote
+from urllib import quote_plus as quote, urlencode
 from urllib2 import urlopen, Request, HTTPError, URLError
 from hashlib import sha1
 
 
 API_URL = 'api.trakt.tv/'
 USER_AGENT = 'XBMC Add-on Trakt.tv List Manager'
+NONE = 'NONE'
 
 LIST_PRIVACY_IDS = (
     'private',
@@ -67,23 +68,23 @@ class TraktListApi():
         return self.connected
 
     def get_watchlist(self):
-        path = 'user/watchlist/movies.json/%(api_key)s/%(username)s'
+        path = 'user/watchlist/movies.json/{api_key}/{username}'
         return self._api_call(path, auth=True)
 
     def get_lists(self):
-        path = 'user/lists.json/%(api_key)s/%(username)s'
+        path = 'user/lists.json/{api_key}/{username}'
         return self._api_call(path, auth=True)
 
     def search_movie(self, query):
-        path = 'search/movies.json/%(api_key)s/' + quote(query)
+        path = 'search/movies.json/{api_key}/?' + urlencode({'query': query})
         return self._api_call(path)
 
     def get_list(self, list_slug):
-        path = 'user/list.json/%(api_key)s/%(username)s/' + quote(list_slug)
+        path = 'user/list.json/{api_key}/{username}/' + quote(list_slug)
         return self._api_call(path, auth=True)
 
     def add_list(self, name, privacy_id=None, description=None):
-        path = 'lists/add/%(api_key)s'
+        path = 'lists/add/{api_key}'
         post = {
             'name': name,
             'description': description or '',
@@ -92,7 +93,7 @@ class TraktListApi():
         return self._api_call(path, post=post, auth=True)
 
     def del_list(self, list_slug):
-        path = 'lists/delete/%(api_key)s'
+        path = 'lists/delete/{api_key}'
         post = {
             'slug': list_slug
         }
@@ -102,11 +103,11 @@ class TraktListApi():
         if not tmdb_id and not imdb_id:
             raise AttributeError('Need one of tmdb_id, imdb_id')
         item = {'type': 'movie'}
-        if tmdb_id:
+        if tmdb_id and tmdb_id != NONE:
             item['tmdb_id'] = tmdb_id
-        if imdb_id:
+        if imdb_id and imdb_id != NONE:
             item['imdb_id'] = imdb_id
-        path = 'lists/items/add/%(api_key)s'
+        path = 'lists/items/add/{api_key}'
         post = {
             'slug': list_slug,
             'items': [item],
@@ -117,11 +118,11 @@ class TraktListApi():
         if not tmdb_id and not imdb_id:
             raise AttributeError('Need one of tmdb_id, imdb_id')
         item = {'type': 'movie'}
-        if tmdb_id:
+        if tmdb_id and tmdb_id != NONE:
             item['tmdb_id'] = tmdb_id
-        if imdb_id:
+        if imdb_id and imdb_id != NONE:
             item['imdb_id'] = imdb_id
-        path = 'movie/watchlist/%(api_key)s'
+        path = 'movie/watchlist/{api_key}'
         post = {
             'movies': [item],
         }
@@ -131,11 +132,11 @@ class TraktListApi():
         if not tmdb_id and not imdb_id:
             raise AttributeError('Need one of tmdb_id, imdb_id')
         item = {'type': 'movie'}
-        if tmdb_id:
+        if tmdb_id and tmdb_id != NONE:
             item['tmdb_id'] = tmdb_id
-        if imdb_id:
+        if imdb_id and imdb_id != NONE:
             item['imdb_id'] = imdb_id
-        path = 'lists/items/delete/%(api_key)s'
+        path = 'lists/items/delete/{api_key}'
         post = {
             'slug': list_slug,
             'items': [item],
@@ -146,25 +147,25 @@ class TraktListApi():
         if not tmdb_id and not imdb_id:
             raise AttributeError('Need one of tmdb_id, imdb_id')
         item = {'type': 'movie'}
-        if tmdb_id:
+        if tmdb_id and tmdb_id != NONE:
             item['tmdb_id'] = tmdb_id
-        if imdb_id:
+        if imdb_id and imdb_id != NONE:
             item['imdb_id'] = imdb_id
-        path = 'movie/unwatchlist/%(api_key)s'
+        path = 'movie/unwatchlist/{api_key}'
         post = {
             'movies': [item],
         }
         return self._api_call(path, post=post, auth=True)
 
     def _test_credentials(self):
-        path = 'account/test/%(api_key)s'
+        path = 'account/test/{api_key}'
         return self._api_call(path, auth=True).get('status') == 'success'
 
     def _api_call(self, path, post={}, auth=False):
-        url = self._api_url + path % {
-            'api_key': self._api_key,
-            'username': self._username
-        }
+        url = self._api_url + path.format(
+            api_key=self._api_key,
+            username=self._username,
+        )
         self.log('_api_call using url: %s' % url)
         if auth:
             post.update({

http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=1f846d90a83322487d42385496c7c1835cc25d49

commit 1f846d90a83322487d42385496c7c1835cc25d49
Author: beenje <[email protected]>
Date:   Wed Jan 8 15:04:10 2014 +0100

    [plugin.video.myvideo_de] updated to version 0.9.5

diff --git a/plugin.video.myvideo_de/addon.py b/plugin.video.myvideo_de/addon.py
index c00b351..bef1d89 100644
--- a/plugin.video.myvideo_de/addon.py
+++ b/plugin.video.myvideo_de/addon.py
@@ -129,7 +129,7 @@ def __add_items(entries, next_page=None, prev_page=None):
         return context_menu
 
     def format_episode_title(title):
-        if fix_show_title and ('Folge' in title or 'Staffel' in title):
+        if fix_show_title and '-' in title and ('Folge' in title or 'Staffel' 
in title):
             title, show = title.rsplit('-', 1)
             title = title.replace('Staffel ', 'S').replace(' Folge ', 'E')
             title = title.replace('Folge ', 'E').replace('Ganze Folge', '')
diff --git a/plugin.video.myvideo_de/addon.xml 
b/plugin.video.myvideo_de/addon.xml
index cf26a00..15cd717 100644
--- a/plugin.video.myvideo_de/addon.xml
+++ b/plugin.video.myvideo_de/addon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.myvideo_de" name="MyVideo.de" version="0.9.4" 
provider-name="Tristan Fischer ([email protected])">
+<addon id="plugin.video.myvideo_de" name="MyVideo.de" version="0.9.5" 
provider-name="Tristan Fischer ([email protected])">
     <requires>
         <import addon="xbmc.python" version="2.1.0"/>
         <import addon="script.module.xbmcswift2" version="2.4.0"/>
diff --git a/plugin.video.myvideo_de/changelog.txt 
b/plugin.video.myvideo_de/changelog.txt
index 413ce15..96a6587 100644
--- a/plugin.video.myvideo_de/changelog.txt
+++ b/plugin.video.myvideo_de/changelog.txt
@@ -1,3 +1,6 @@
+0.9.5 (08.01.2014)
+ - added SpecialVideoChannelScraper (required for e.g. Spartacus, 
Millionaerswahl)
+
 0.9.4 (12.09.2013)
  - added "ProSieben Maxx", "YEP!" and "BBC" to TV->Channels
 
diff --git a/plugin.video.myvideo_de/resources/lib/scraper.py 
b/plugin.video.myvideo_de/resources/lib/scraper.py
index 84f71d6..50df6cf 100644
--- a/plugin.video.myvideo_de/resources/lib/scraper.py
+++ b/plugin.video.myvideo_de/resources/lib/scraper.py
@@ -360,6 +360,9 @@ class ChannelScraper(BaseScraper):
         if tree.find(*MusicChannelScraper.subtree_props):
             self.log('Redirecting to scraper-class: MusicChannelScraper')
             return MusicChannelScraper().parse(tree)
+        if tree.find(*SpecialVideoChannelScraper.subtree_props):
+            self.log('Redirecting to scraper-class: 
SpecialVideoChannelScraper')
+            return SpecialVideoChannelScraper().parse(tree)
         clips_found = tree.find(*VideoChannelClipScraper.subtree_props)
         full_found = tree.find(*VideoChannelFullScraper.subtree_props)
         if clips_found or full_found:
@@ -382,12 +385,20 @@ class ChannelScraper(BaseScraper):
             elif self.extra_arg == 'FULL':
                 return VideoChannelFullScraper().parse(tree)
             elif self.extra_arg == 'CLIPS':
-                return VideoChannelClipScraper().parse(tree)  
+                return VideoChannelClipScraper().parse(tree)
         elif clips_found:
             return VideoChannelClipScraper().parse(tree)
         elif full_found:
             return VideoChannelFullScraper().parse(tree)
-                
+
+
+class SpecialVideoChannelScraper(BaseScraper):
+    a_prop_re = re.compile('is-video')
+    section_re = re.compile('videolist--item')
+    subtree_props = ('div', {'class': 'layout--module is-eyecatcher'})
+    section_props = ('div', {'class': section_re})
+    a_props = ('a', {'class': a_prop_re})
+    img_props = ('img', {'class': 'thumbnail--pic'})
 
 
 class VideoChannelClipScraper(BaseScraper):

http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=aa25bd20e994fbfcc1f1860257b4c275e61ca5ec

commit aa25bd20e994fbfcc1f1860257b4c275e61ca5ec
Author: beenje <[email protected]>
Date:   Wed Jan 8 15:04:08 2014 +0100

    [plugin.video.nolife] updated to version 2.17.2

diff --git a/plugin.video.nolife/addon.xml b/plugin.video.nolife/addon.xml
index f2e2dfe..cfad4f1 100644
--- a/plugin.video.nolife/addon.xml
+++ b/plugin.video.nolife/addon.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="plugin.video.nolife"
        name="Nolife Online"
-       version="2.17.1"
+       version="2.17.2"
        provider-name="gormux">
   <requires>
     <import addon="xbmc.python" version="2.1.0"/>
diff --git a/plugin.video.nolife/default.py b/plugin.video.nolife/default.py
index c81d1e0..1786e69 100644
--- a/plugin.video.nolife/default.py
+++ b/plugin.video.nolife/default.py
@@ -174,8 +174,11 @@ def getlastVideos():
         
     Get the videos in the "last videos" menu option
     """
-    showseen   = settings.getSetting( "showseen" )
-    showlast   = int(settings.getSetting( "showlast" ).split('.')[0])
+    showseen       = settings.getSetting( "showseen" )
+    showpromo      = settings.getSetting( "showpromo" )
+    showannounce   = settings.getSetting( "showannounce" )
+    agelimit       = settings.getSetting( "agelimit" )
+    showlast       = int(settings.getSetting( "showlast" ).split('.')[0])
     i = 0
     emissions = []
     finished = False
@@ -194,13 +197,26 @@ def getlastVideos():
             videoInfo = extractVideoInfo(element)
             if videoInfo != None:
                 if (showseen == "true" or (showseen == "false" and 
videoInfo.seen == False)):
-                    if isAvailableForUser(videoInfo.availability):
-                        emissions.append([videoInfo.id,
-                                            videoInfo.name,
-                                            videoInfo.desc,
-                                            videoInfo.duration,
-                                            videoInfo.seen,
-                                            videoInfo.thumb])
+                    if videoInfo.videocat == "Autopromo" and showpromo == 
"false":
+                        continue
+                    if videoInfo.videocat == "Annonce" and showannounce == 
"false":
+                        continue
+                    if ( videoInfo.agelimit == None or agelimit == "Aucun" ):
+                        if isAvailableForUser(videoInfo.availability):
+                            emissions.append([videoInfo.id,
+                                    videoInfo.name,
+                                    videoInfo.desc,
+                                    videoInfo.duration,
+                                    videoInfo.seen,
+                                    videoInfo.thumb])
+                    elif int(videoInfo.agelimit) < int(agelimit):
+                        if isAvailableForUser(videoInfo.availability):
+                            emissions.append([videoInfo.id,
+                                    videoInfo.name,
+                                    videoInfo.desc,
+                                    videoInfo.duration,
+                                    videoInfo.seen,
+                                    videoInfo.thumb])
                 i = i + 1
 
     for emission in emissions:
@@ -527,6 +543,13 @@ def extractVideoInfo(element):
         info.desc  = 
remove_html_tags(re.compile(reg_desc).findall(str(element))[0][30:])
 
         info.name  = 
remove_html_tags(re.compile('<h3.*').findall(str(element))[0])
+        
+        info.videocat = 
remove_html_tags(re.compile('<strong.*').findall(str(element))[0])
+
+        try:
+            info.agelimit = 
re.compile('<img.*').findall(str(element))[1][56:][:2]
+        except:
+            info.agelimit = None
 
     return info
 
diff --git a/plugin.video.nolife/resources/settings.xml 
b/plugin.video.nolife/resources/settings.xml
index 7930cea..64eae2b 100644
--- a/plugin.video.nolife/resources/settings.xml
+++ b/plugin.video.nolife/resources/settings.xml
@@ -3,10 +3,10 @@
 
     <!-- Authentication -->
     <category label="30001">
-        <setting id="authenticate" type="bool" label="30002" default="false" />
-        <setting id="username" type="text" label="30003" enable="eq(-1,true)" 
default="" />
-        <setting id="password" type="text" option="hidden" label="30004" 
default="" enable="eq(-2,true)"/>
-        <setting id="extracts" type="bool" option="hidden" label="30005" 
default="" enable="eq(-3,false)"/>
+        <setting id="authenticate" type="bool" label="30010" default="false" />
+        <setting id="username" type="text" label="30011" enable="eq(-1,true)" 
default="" />
+        <setting id="password" type="text" option="hidden" label="30012" 
default="" enable="eq(-2,true)"/>
+        <setting id="extracts" type="bool" option="hidden" label="30013" 
default="" enable="eq(-3,false)"/>
     </category>
     <!-- Affichage -->
     <category label="30006">
@@ -14,6 +14,9 @@
         <setting id="showall" type="bool" label="30008" default="false"/>
         <setting id="show_n" subsetting="true" type="slider" label="30009" 
default="30" range="10,10,100" enable="!eq(-1,true)" option="int"/>
         <setting id="showseen" type="bool" label="30011" default="true"/>
+        <setting id="showpromo" type="bool" label="30024" default="true"/>
+        <setting id="showannounce" type="bool" label="30025" default="true"/>
+        <setting id="agelimit" type="labelenum" label="30026" 
values="Aucun|10|12|16|18" default="Aucun"/>
         <setting id="showlast" subsetting="true" type="slider" label="30012" 
default="30" range="5,5,60" option="int"/>
         <setting id="autorefresh" type="bool" label="30013" default="true"/>
         <setting id="quality" type="enum" label="30010" 
values="LQ|HQ|TV|720p|1080p" default="TV"/>

http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=c47e9d870a46c497e76b2d0c9b0c66340afed1d6

commit c47e9d870a46c497e76b2d0c9b0c66340afed1d6
Author: beenje <[email protected]>
Date:   Wed Jan 8 15:04:01 2014 +0100

    [plugin.audio.sky.fm] updated to version 3.0.3

diff --git a/plugin.audio.sky.fm/addon.xml b/plugin.audio.sky.fm/addon.xml
index d0642a6..80ced60 100644
--- a/plugin.audio.sky.fm/addon.xml
+++ b/plugin.audio.sky.fm/addon.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="plugin.audio.sky.fm"
        name="Sky.fm"
-       version="3.0.2"
+       version="3.0.3"
        provider-name="qualisoft.dk - Tim C. Steinmetz">
        <requires>
                <import addon="xbmc.python" version="2.1.0"/>
diff --git a/plugin.audio.sky.fm/changelog.txt 
b/plugin.audio.sky.fm/changelog.txt
index c9d9df6..4cfa0cc 100644
--- a/plugin.audio.sky.fm/changelog.txt
+++ b/plugin.audio.sky.fm/changelog.txt
@@ -3,6 +3,10 @@
 - Removed feature
 
 
+8. January 2014 v3.0.3
+* Fixed parsing of Favorites playlist
+
+
 3. January 2014 v3.0.2
 * Fixed file pathing for the config file as well - DOH!
 
diff --git a/plugin.audio.sky.fm/default.py b/plugin.audio.sky.fm/default.py
index 3caae20..ecf6c24 100644
--- a/plugin.audio.sky.fm/default.py
+++ b/plugin.audio.sky.fm/default.py
@@ -362,7 +362,7 @@ class musicAddonXbmc:
     """
     def getFavoriteChannels(self, html, allChannels):
         channels = []
-        re_favoriteData = 
re.compile("NS\('AudioAddict.API.Config.member'\).Favorites\s*=\s*([^;]+);", 
re.M | re.I)
+        re_favoriteData = 
re.compile("NS\('AudioAddict.API.Config.member'\).favorites\s*=\s*([^;]+);", 
re.M | re.I)
         m = re_favoriteData.findall(html)
 
         # if favorites list is empty, return empty list
@@ -371,12 +371,14 @@ class musicAddonXbmc:
         else:
             favorites = json.loads(re_favoriteData.findall(html)[0])
 
+        pprint(favorites)
+
         # sort favorites after user selected positions
-        favorites = sorted(favorites, key=lambda k: k['position'])
+        favorites = sorted(favorites, key=lambda k: 
k['channel']['favorite_position'])
 
         for fav in favorites:
             for channel in allChannels:
-                if fav['channel_id'] == channel['id']:
+                if fav['channel']['id'] == channel['id']:
                     channels.append(dict(channel))
 
         return channels
diff --git a/plugin.audio.sky.fm/resources/language/English/strings.xml 
b/plugin.audio.sky.fm/resources/language/English/strings.xml
index c1ff363..ce1e7b6 100644
--- a/plugin.audio.sky.fm/resources/language/English/strings.xml
+++ b/plugin.audio.sky.fm/resources/language/English/strings.xml
@@ -24,7 +24,7 @@
        <string id="30009">Homepage</string>
 
        <string id="30015">Get HQ 256kb/sec streams with Sky Premium at 
http://www.sky.fm</string>
-       <string id="30016">Version:  3.0.2</string>
+       <string id="30016">Version:  3.0.3</string>
        <string id="30017">Author:  Tim C. 'Bitcrusher' Steinmetz</string>
        <string id="30018">Homepage:  http://qualisoft.dk</string>
        <string id="30019">E-mail:  [email protected]</string>

-----------------------------------------------------------------------

Summary of changes:
 plugin.audio.sky.fm/addon.xml                      |    2 +-
 plugin.audio.sky.fm/changelog.txt                  |    4 ++
 plugin.audio.sky.fm/default.py                     |    8 ++-
 .../resources/language/English/strings.xml         |    2 +-
 plugin.video.myvideo_de/addon.py                   |    2 +-
 plugin.video.myvideo_de/addon.xml                  |    2 +-
 plugin.video.myvideo_de/changelog.txt              |    3 +
 plugin.video.myvideo_de/resources/lib/scraper.py   |   15 +++++-
 plugin.video.nolife/addon.xml                      |    2 +-
 plugin.video.nolife/default.py                     |   41 +++++++++++++----
 .../language/{english => English}/strings.xml      |    3 +
 .../language/{french => French}/strings.xml        |    3 +
 plugin.video.nolife/resources/settings.xml         |   11 +++--
 plugin.video.trakt_list_manager/addon.py           |   10 ++--
 plugin.video.trakt_list_manager/addon.xml          |    2 +-
 plugin.video.trakt_list_manager/changelog.txt      |    4 ++
 .../resources/lib/api.py                           |   49 ++++++++++----------
 17 files changed, 110 insertions(+), 53 deletions(-)
 rename plugin.video.nolife/resources/language/{english => English}/strings.xml 
(90%)
 rename plugin.video.nolife/resources/language/{french => French}/strings.xml 
(89%)


hooks/post-receive
-- 
Plugins

------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons

Reply via email to