GCC_MODEL_TUNING = "";
GCC_OPTIMIZATION_LEVEL = 2;
GCC_PREPROCESSOR_DEFINITIONS = (
- NDEBUG,
TARGET_POSIX,
TARGET_DARWIN,
TARGET_DARWIN_OSX,
"\"$(DEVELOPER_DIR)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/System/Library/Frameworks\"",
);
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = (
- _DEBUG,
- TARGET_DARWIN_IOS,
- TARGET_DARWIN_IOS_ATV2,
- "$(XBMC_GCC_PREPROCESSOR_DEFINITIONS_COMMON)",
- );
GCC_VERSION = 4.2;
HEADER_SEARCH_PATHS = (
$SRCROOT,
);
GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
- GCC_PREPROCESSOR_DEFINITIONS = (
- NDEBUG,
- TARGET_DARWIN_IOS,
- TARGET_DARWIN_IOS_ATV2,
- "$(XBMC_GCC_PREPROCESSOR_DEFINITIONS_COMMON)",
- );
GCC_VERSION = 4.2;
HEADER_SEARCH_PATHS = (
$SRCROOT,
"\"$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\"",
);
GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_PREPROCESSOR_DEFINITIONS = (
- _DEBUG,
- TARGET_DARWIN_IOS,
- "$(XBMC_GCC_PREPROCESSOR_DEFINITIONS_COMMON)",
- );
HEADER_SEARCH_PATHS = (
"$(inherited)",
$SRCROOT,
"\"$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\"",
);
GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_PREPROCESSOR_DEFINITIONS = (
- NDEBUG,
- TARGET_DARWIN_IOS,
- "$(XBMC_GCC_PREPROCESSOR_DEFINITIONS_COMMON)",
- );
HEADER_SEARCH_PATHS = (
"$(inherited)",
$SRCROOT,
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="metadata.album.universal"
name="Universal Album Scraper"
- version="1.7.7b"
+ version="2.1.0"
provider-name="Olympia, Team XBMC">
<requires>
<import addon="xbmc.metadata" version="2.1.0"/>
<import addon="metadata.common.musicbrainz.org" version="1.2.3"/>
<import addon="metadata.common.fanart.tv" version="2.1.2"/>
<import addon="metadata.common.amazon.de" version="1.0.0"/>
- <import addon="metadata.common.theaudiodb.com" version="1.4.0"/>
+ <import addon="metadata.common.theaudiodb.com" version="1.7.0"/>
</requires>
<extension point="xbmc.metadata.scraper.albums"
language="en"
<?xml version="1.0" encoding="UTF-8"?>
-<scraper framework="1.1" date="2012-06-09">
+<scraper framework="1.1" date="2013-05-29">
<NfoUrl dest="3">
<RegExp input="$$1" output="<url>http://musicbrainz.org/ws/2/release/\1?inc=recordings+release-groups+artists+labels+ratings</url>" dest="3">
<expression>release/(.+)</expression>
</RegExp>
</ResolveIDToUrl>
<CreateAlbumSearchUrl dest="3">
- <RegExp input="$$1" output="<url>http://search.musicbrainz.org/ws/2/release/?fmt=xml&query=release:\1%20AND%20artist:"$$4"</url>" dest="3">
+ <RegExp input="$$1" output="<url>http://search.musicbrainz.org/ws/2/release/?fmt=xml&query=release:"\1"%20AND%20artist:"$$4"</url>" dest="3">
<RegExp input="$$2" output="\1" dest="4">
<expression noclean="1">(.+)</expression>
</RegExp>
<GetAlbumSearchResults dest="8">
<RegExp input="$$5" output="<results sorted="yes">\1</results>" dest="8">
<RegExp input="$$1" output="<entity><year>\5-\4-T#\6</year><artist>\3</artist><title>\2</title><url cache="mb-\1-album.xml">http://musicbrainz.org/ws/2/release/\1?inc=recordings+release-groups+artists+labels+ratings</url></entity>" dest="5">
- <expression repeat="yes">id="([^"]*)"><title>([^<]*)</title><status>Official</status><text-representation>(?:<language>[^<]*</language>)*(?:<script>[^<]*</script>)*</text-representation><artist-credit><name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>([^<]*)</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>(?:<name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>[^<]*</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>)*</artist-credit><release-group\stype="Album"\sid="[^"]*">(?:<primary-type>[^<]*</primary-type>)*(?:<secondary-type-list><secondary-type>[^<]*</secondary-type></secondary-type-list>)*</release-group><date>(\d{4})[^<]*</date>(?:<country>)*([^<]*)?.*?<track-list\scount="(\d+)</expression>
+ <expression repeat="yes">id="([^"]*)"><title>([^<]*)</title><status>Official</status>(?:<disambiguation>[^<]*</disambiguation>)*<text-representation>(?:<language>[^<]*</language>)*(?:<script>[^<]*</script>)*</text-representation><artist-credit><name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>([^<]*)</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>(?:<name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>[^<]*</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>)*</artist-credit><release-group\stype="Album"\sid="[^"]*">(?:<primary-type>[^<]*</primary-type>)*(?:<secondary-type-list><secondary-type>[^<]*</secondary-type></secondary-type-list>)*</release-group><date>(\d{4})[^<]*</date>(?:<country>)*([^<]*)?.*?<track-list\scount="(\d+)</expression>
</RegExp>
<RegExp input="$$1" output="<entity><year>\5-\4-T#\6</year><artist>\3</artist><title>\2</title><url cache="mb-\1-album.xml">http://musicbrainz.org/ws/2/release/\1?inc=recordings+release-groups+artists+labels+ratings</url></entity>" dest="5+">
- <expression repeat="yes">id="([^"]*)"><title>([^<]*)</title><status>Official</status><text-representation>(?:<language>[^<]*</language>)*(?:<script>[^<]*</script>)*</text-representation><artist-credit><name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>([^<]*)</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>(?:<name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>[^<]*</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>)*</artist-credit><release-group(?:\stype="[^"]*")*\sid="[^"]*">(?:<primary-type>[^<]*</primary-type>)*(?:<secondary-type-list><secondary-type>[^<]*</secondary-type></secondary-type-list>)*</release-group><date>(\d{4})[^<]*</date>(?:<country>)*([^<]*)?.*?<track-list\scount="(\d+)</expression>
+ <expression repeat="yes">id="([^"]*)"><title>([^<]*)</title><status>Official</status>(?:<disambiguation>[^<]*</disambiguation>)*<text-representation>(?:<language>[^<]*</language>)*(?:<script>[^<]*</script>)*</text-representation><artist-credit><name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>([^<]*)</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>(?:<name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>[^<]*</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>)*</artist-credit><release-group(?:\stype="[^"]*")*\sid="[^"]*">(?:<primary-type>[^<]*</primary-type>)*(?:<secondary-type-list><secondary-type>[^<]*</secondary-type></secondary-type-list>)*</release-group><date>(\d{4})[^<]*</date>(?:<country>)*([^<]*)?.*?<track-list\scount="(\d+)</expression>
</RegExp>
<RegExp input="$$1" output="<entity><year>\5-\4-T#\6</year><artist>\3</artist><title>\2</title><url cache="mb-\1-album.xml">http://musicbrainz.org/ws/2/release/\1?inc=recordings+release-groups+artists+labels+ratings</url></entity>" dest="5">
- <expression repeat="yes">id="([^"]*)" ext:score="[^"]*"><title>([^<]*)</title><status>Official</status><text-representation>(?:<language>[^<]*</language>)*(?:<script>[^<]*</script>)*</text-representation><artist-credit><name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>([^<]*)</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>(?:<name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>[^<]*</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>)*</artist-credit><release-group\sid="[^"]*"\stype="Album">(?:<primary-type>[^<]*</primary-type>)*(?:<secondary-type-list><secondary-type>[^<]*</secondary-type></secondary-type-list>)*</release-group><date>(\d{4})[^<]*</date>(?:<country>)*([^<]*)?.*?<track-list\scount="(\d+)</expression>
+ <expression repeat="yes">id="([^"]*)" ext:score="[^"]*"><title>([^<]*)</title><status>Official</status>(?:<disambiguation>[^<]*</disambiguation>)*<text-representation>(?:<language>[^<]*</language>)*(?:<script>[^<]*</script>)*</text-representation><artist-credit><name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>([^<]*)</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>(?:<name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>[^<]*</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>)*</artist-credit><release-group\sid="[^"]*"\stype="Album">(?:<primary-type>[^<]*</primary-type>)*(?:<secondary-type-list><secondary-type>[^<]*</secondary-type></secondary-type-list>)*</release-group><date>(\d{4})[^<]*</date>(?:<country>)*([^<]*)?.*?<track-list\scount="(\d+)</expression>
</RegExp>
<RegExp input="$$1" output="<entity><year>\5-\4-T#\6</year><artist>\3</artist><title>\2</title><url cache="mb-\1-album.xml">http://musicbrainz.org/ws/2/release/\1?inc=recordings+release-groups+artists+labels+ratings</url></entity>" dest="5+">
- <expression repeat="yes">id="([^"]*)" ext:score="[^"]*"><title>([^<]*)</title><status>Official</status><text-representation>(?:<language>[^<]*</language>)*(?:<script>[^<]*<)*/script></text-representation><artist-credit><name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>([^<]*)</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>(?:<name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>[^<]*</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>)*</artist-credit><release-group\sid="[^"]*"(?:\stype="[^"]*")*>(?:<primary-type>[^<]*</primary-type>)*(?:<secondary-type-list><secondary-type>[^<]*</secondary-type></secondary-type-list>)*</release-group><date>(\d{4})[^<]*</date>(?:<country>)*([^<]*)?.*?<track-list\scount="(\d+)</expression>
+ <expression repeat="yes">id="([^"]*)" ext:score="[^"]*"><title>([^<]*)</title><status>Official</status>(?:<disambiguation>[^<]*</disambiguation>)*<text-representation>(?:<language>[^<]*</language>)*(?:<script>[^<]*</script>)*</text-representation><artist-credit><name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>([^<]*)</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>(?:<name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>[^<]*</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>)*</artist-credit><release-group\sid="[^"]*"(?:\stype="[^"]*")*>(?:<primary-type>[^<]*</primary-type>)*(?:<secondary-type-list><secondary-type>[^<]*</secondary-type></secondary-type-list>)*</release-group><date>(\d{4})[^<]*</date>(?:<country>)*([^<]*)?.*?<track-list\scount="(\d+)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<RegExp input="$INFO[albumratingsource]" output="<url function="GetAMGAlbumRating" cache="mb-$$4-rg.xml">http://musicbrainz.org/ws/2/release-group/$$4?inc=url-rels</url>" dest="5+">
<expression>allmusic.com</expression>
</RegExp>
+ <RegExp input="$INFO[albumratingsource]" output="<chain function="GetTADBAlbumRatingByMBID">$$4</chain>" dest="5+">
+ <expression>TheAudioDb.com</expression>
+ </RegExp>
<RegExp input="$INFO[albumstylessource]" output="<url function="GetAMGAlbumStyles" cache="mb-$$4-rg.xml">http://musicbrainz.org/ws/2/release-group/$$4?inc=url-rels</url>" dest="5+">
<expression>allmusic.com</expression>
</RegExp>
+[B]2.1.0[/B]
+Added: option to fetch album Rating from TheAudioDB.com
+
+[B]2.0.0[/B]
+Added: ResolveIDToUrl
+Fixed: album won't find some times (thanks and credits to crankylemur & ezechiel1917)
+
[B]1.7.6[/B]
Updated language files from Transifex
<setting label="30002" type="labelenum" values="TheAudioDb.com|amazon.de|None" id="albumreviewsource" default="TheAudioDb.com"/>
<setting label="30003" type="labelenum" values="en|de|es|fr|it|cn|jp|ru|pt|se|nl|hu" id="tadbalbumlanguage" default="en" visible="eq(-1,0)"/>
<setting type="sep"/>
- <setting label="30004" type="labelenum" values="MusicBrainz|allmusic.com|None" id="albumratingsource" default="MusicBrainz"/>
+ <setting label="30004" type="labelenum" values="MusicBrainz|allmusic.com|TheAudioDb.com|None" id="albumratingsource" default="MusicBrainz"/>
<setting label="30005" type="labelenum" values="allmusic.com|None" id="albumstylessource" default="allmusic.com"/>
<setting label="30006" type="labelenum" values="allmusic.com|None" id="albummoodssource" default="allmusic.com"/>
<setting label="30007" type="labelenum" values="allmusic.com|None" id="albumthemessource" default="allmusic.com"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="metadata.artists.universal"
name="Universal Artist Scraper"
- version="2.6.6b"
+ version="3.3.0"
provider-name="Olympia, Team XBMC">
<requires>
<import addon="xbmc.metadata" version="2.1.0"/>
<import addon="metadata.common.last.fm" version="1.6.0"/>
- <import addon="metadata.common.allmusic.com" version="2.6.0"/>
+ <import addon="metadata.common.allmusic.com" version="3.0.0"/>
<import addon="metadata.common.musicbrainz.org" version="1.3.0"/>
- <import addon="metadata.common.htbackdrops.com" version="1.2.0"/>
<import addon="metadata.common.fanart.tv" version="2.1.2"/>
<import addon="metadata.common.theaudiodb.com" version="1.5.0"/>
+ <import addon="metadata.common.htbackdrops.com" version="1.3.0"/>
</requires>
<extension point="xbmc.metadata.scraper.artists"
language="en"
<?xml version="1.0" encoding="UTF-8"?>
-<scraper framework="1.1" date="2013-02-27">
+<scraper framework="1.1" date="2013-05-29">
<NfoUrl dest="3">
<RegExp input="$$1" output="<url>http://musicbrainz.org/ws/2/artist/\1?inc=url-rels</url>" dest="3">
<expression>http://musicbrainz.org/artist/(.+)</expression>
<RegExp input="$$1" output="\1" dest="4">
<expression noclean="1">(.+)</expression>
</RegExp>
+ <RegExp input="$$1" output="\1/\2\3" dest="7">
+ <expression noclean="1">(.+)([-!])(.+)</expression>
+ </RegExp>
<RegExp input="$$1" output="\1" dest="6">
<expression noclean="1">(.+)(?:Ft%2e|Feat%2e|%20Ft\.|%20Feat\.|%20and%20)</expression>
</RegExp>
+ <RegExp input="$$7" output="\1" dest="4">
+ <expression>(.+)</expression>
+ </RegExp>
<RegExp input="$$6" output="\1" dest="4">
<expression>(.+)</expression>
</RegExp>
+[B]3.3.0[/B]
+Added: Restore scraping from HTBackdrops.com using their new domain htbackdrops.org
+
+[B]3.2.0[/B]
+Added: An attempt to handle dash and exclamation mark in the artist name
+
+[B]3.1.0[/B]
+Added: Polish for theaudiodb.com language selection
+Removed: htbackdrops.com scraping since site is dead for a good while
+Fixed: allmusic.com scraping
+
+[B]3.0.0[/B]
+Added: ResolveIDToUrl
+
[B]2.6.5[/B]
Updated language files from Transifex
<settings>
<category label="128">
<setting label="30006" type="labelenum" values="TheAudioDb.com|None" id="biogsource" default="TheAudioDb.com"/>
- <setting label="30015" type="labelenum" values="en|de|es|fr|it|cn|jp|ru|pt|se|nl|hu" id="tadbartistlanguage" default="en" visible="eq(-1,0)"/>
+ <setting label="30015" type="labelenum" values="en|de|es|fr|it|cn|jp|ru|pt|se|nl|hu|pl" id="tadbartistlanguage" default="en" visible="eq(-1,0)"/>
<setting type="sep"/>
<setting label="30008" type="labelenum" values="MusicBrainz|allmusic.com|TheAudioDb.com|None" id="discogsource" default="MusicBrainz"/>
<setting type="sep"/>
<category label="30021">
<setting label="30016" type="labelenum" values="TheAudioDb.com|None" id="biogfbsource" default="None"/>
- <setting label="30015" type="labelenum" values="en|de|es|fr|it|cn|jp|ru|pt|se|nl|hu" id="tadbartistlanguage" default="en" visible="eq(-1,0)"/>
+ <setting label="30015" type="labelenum" values="en|de|es|fr|it|cn|jp|ru|pt|se|nl|hu|pl" id="tadbartistlanguage" default="en" visible="eq(-1,0)"/>
<setting type="sep"/>
<setting label="30020" type="labelenum" values="TheAudioDb.com|MusicBrainz|allmusic.com|None" id="lifespanfbsource" default="None"/>
<setting type="sep"/>
<setting type="lsep" label="Thumb Sources"/>
<setting label="30005" type="bool" id="fanarttvthumbs" default="true"/>
<setting label="30022" type="bool" id="tadbthumbs" default="true"/>
- <setting label="30003" type="bool" id="htbthumbs" default="true"/>
<setting label="30002" type="bool" id="lastfmartistthumbs" default="false"/>
<setting label="30001" type="bool" id="allmusicartistthumbs" default="true"/>
+ <setting label="30003" type="bool" id="htbthumbs" default="true"/>
<setting type="lsep" label="Fanart Sources"/>
<setting label="30004" type="bool" id="fanarttvfanart" default="true"/>
<setting label="30023" type="bool" id="tadbfanart" default="true"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="metadata.common.allmusic.com"
name="AllMusic"
- version="2.6.0"
+ version="3.0.1"
provider-name="Team XBMC">
<requires>
<import addon="xbmc.metadata" version="2.1.0"/>
<scraperfunctions>
<GetAMGDiscographyByAMGID dest="5" clearbuffers="no">
- <RegExp input="$$1" output="<details><url cache="am-\1-artist.html" function="ParseAMGDiscography">http://www.allmusic.com/artist/\1</url></details>" dest="5">
+ <RegExp input="$$1" output="<details><url cache="am-\1-artist-discography.html" function="ParseAMGDiscography">http://www.allmusic.com/artist/\1/discography</url></details>" dest="5">
<expression clear="yes" noclean="1"/>
</RegExp>
</GetAMGDiscographyByAMGID>
<expression />
</RegExp>
<RegExp input="$$1" output="<album><year>\1</year><title>\2</title><label>\3</label></album>" dest="3">
- <expression repeat="yes" clear="yes" trim="1"><td class="year[^"]*"(?:\stitle="[^"]*")*\s*data-sort-value="[^>]*>([^<]*)</td>[^<]*<td class=".*?title="([^"]*)</expression>
+ <expression repeat="yes" clear="yes" trim="1"><td\sclass="year[^"]*"(?:\stitle="[^"]*")*\s*data-sort-value="[^>]*>\s*([^<]*)</td>[^<]*<td\sclass=".*?title="([^"]*)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
</RegExp>
</ParseAMGFallbackBiography>
- <GetAMGArtistNameByAMGID dest="5">
- <RegExp input="$$1" output="<details><url cache="am-\1-artist.html" function="ParseAMGArtistName">http://www.allmusic.com/artist/\1</url></details>" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetAMGArtistNameByAMGID>
- <ParseAMGArtistName dest="5">
- <RegExp input="$$2" output="<details>\1</details>" dest="5">
- <RegExp input="$$1" output="<name>\1</name>" dest="2">
- <expression noclean="1">http://schema.org/MusicGroup">[^<]*<span itemprop="name">([^<]*)</span></expression>
- </RegExp>
- <expression noclean="1"/>
- </RegExp>
- </ParseAMGArtistName>
-
<GetAMGArtistLifeSpanByAMGID dest="5" clearbuffers="no">
<RegExp input="$$1" output="<details><url cache="am-\1-artist.html" function="ParseAMGArtistLifeSpan">http://www.allmusic.com/artist/\1</url></details>" dest="5">
<expression noclean="1"/>
<expression />
</RegExp>
<RegExp input="$$1" output="<born>\1 \2</born>" dest="11+">
- <expression trim="1,2"><dt>\s*Born[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)?</expression>
+ <expression trim="1,2"><h4>\s*Born\s*</h4>\s*<div>(.*?\d{4})\s*([^<]*)?</expression>
</RegExp>
<RegExp input="$$1" output="<died>\1 \2</died>" dest="11+">
- <expression trim="1,2"><dt>\s*Died[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)?</expression>
+ <expression trim="1,2"><h4>\s*Died\s*</h4>\s*<div>(.*?\d{4})\s*([^<]*)?</expression>
</RegExp>
<RegExp input="$$1" output="<formed>\1</formed>" dest="11+">
- <expression trim="1,2"><dt>\s*Formed[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)?</expression>
+ <expression trim="1,2"><h4>\s*Formed\s*</h4>\s*<div>(.*?\d{4})\s*([^<]*)?</expression>
</RegExp>
<RegExp input="$$1" output="<disbanded>\1</disbanded>" dest="11+">
- <expression trim="1,2"><dt>\s*Disbanded[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)?</expression>
+ <expression trim="1,2"><h4>\s*Disbanded\s*</h4>\s*<div>(.*?\d{4})\s*([^<]*)?</expression>
</RegExp>
<RegExp input="$$11" output="$$12" dest="2">
<RegExp input="$INFO[lifespanfbsource]" output="<chain function="GetMBFallbackLafeSpanByMBID">$$8</chain>" dest="12">
<expression />
</RegExp>
<RegExp input="$$1" output="<born>\1 \2</born>" dest="2">
- <expression trim="1,2"><dt>\s*Born[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)?</expression>
+ <expression trim="1,2"><h4>\s*Born\s*</h4>\s*<div>(.*?\d{4})\s*([^<]*)?</expression>
</RegExp>
<RegExp input="$$1" output="<died>\1 \2</died>" dest="2+">
- <expression trim="1,2"><dt>\s*Died[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)?</expression>
+ <expression trim="1,2"><h4>\s*Died\s*</h4>\s*<div>(.*?\d{4})\s*([^<]*)?</expression>
</RegExp>
<RegExp input="$$1" output="<formed>\1</formed>" dest="2">
- <expression trim="1,2"><dt>\s*Formed[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)?</expression>
+ <expression trim="1,2"><h4>\s*Formed\s*</h4>\s*<div>(.*?\d{4})\s*([^<]*)?</expression>
</RegExp>
<RegExp input="$$1" output="<disbanded>\1</disbanded>" dest="2+">
- <expression trim="1,2"><dt>\s*Disbanded[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)?</expression>
+ <expression trim="1,2"><h4>\s*Disbanded\s*</h4>\s*<div>(.*?\d{4})\s*([^<]*)?</expression>
</RegExp>
<expression noclean="1"/>
</RegExp>
<expression />
</RegExp>
<RegExp input="$$1" output="<yearsactive>\1</yearsactive>" dest="2">
- <expression trim="1" noclean="1"><dd class="active">([^<]*)<</expression>
+ <expression trim="1" noclean="1"><h\d>Active</h\d>[^>]*>([^<]*)<</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<expression />
</RegExp>
<RegExp input="$$1" output="\1" dest="6">
- <expression noclean="1"><dt>Genres</dt>(.*?)</dd></expression>
+ <expression noclean="1"><h4>Genre</h4>\s*<div>(.*?)</div></expression>
</RegExp>
- <RegExp input="$$6" output="<genre>\2</genre>" dest="11">
- <expression repeat="yes" noclean="1"><li><a href="/genre/[^"]*">(<strong>)?([^<]*)</expression>
+ <RegExp input="$$6" output="<genre>\1</genre>" dest="11">
+ <expression repeat="yes" noclean="1"><a\shref="http://www.allmusic.com/genre/[^"]*">([^<]*)</expression>
</RegExp>
<RegExp input="$$11" output="$$12" dest="2">
<RegExp input="$INFO[genresfbsource]" output="<chain function="GetLastFMFallbackArtistGenresByMBID">$$8</chain>" dest="12">
<expression />
</RegExp>
<RegExp input="$$1" output="\1" dest="6">
- <expression noclean="1"><dt>Genres</dt>(.*?)</dd></expression>
+ <expression noclean="1"><h4>Genre</h4>\s*<div>(.*?)</div></expression>
</RegExp>
- <RegExp input="$$6" output="<genre>\2</genre>" dest="2">
- <expression repeat="yes" noclean="1"><li><a href="/genre/[^"]*">(<strong>)?([^<]*)</expression>
+ <RegExp input="$$6" output="<genre>\1</genre>" dest="2">
+ <expression repeat="yes" noclean="1"><a\shref="http://www.allmusic.com/genre/[^"]*">([^<]*)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<expression />
</RegExp>
<RegExp input="$$1" output="\1" dest="7">
- <expression noclean="1"><dt>Styles</dt>(.*?)</dd></expression>
+ <expression noclean="1"><h4>Styles</h4>\s*<div>(.*?)</div></expression>
</RegExp>
<RegExp input="$$7" output="<style>\1</style>" dest="11">
- <expression repeat="yes" noclean="1"><li><a href="/style/[^"]*">([^<]*)</expression>
+ <expression repeat="yes" noclean="1"><a\shref="http://www.allmusic.com/style/[^"]*">([^<]*)</expression>
</RegExp>
<RegExp input="$$11" output="$$12" dest="2">
<RegExp input="$INFO[stylesfbsource]" output="<chain function="GetLastFMFallbackArtistStylesByMBID">$$8</chain>" dest="12">
<expression />
</RegExp>
<RegExp input="$$1" output="\1" dest="7">
- <expression noclean="1"><dt>Styles</dt>(.*?)</dd></expression>
+ <expression noclean="1"><h4>Styles</h4>\s*<div>(.*?)</div></expression>
</RegExp>
<RegExp input="$$7" output="<style>\1</style>" dest="2">
- <expression repeat="yes" noclean="1"><li><a href="/style/[^"]*">([^<]*)</expression>
+ <expression repeat="yes" noclean="1"><a\shref="http://www.allmusic.com/style/[^"]*">([^<]*)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<expression />
</RegExp>
<RegExp input="$$1" output="\1" dest="10">
- <expression noclean="1"><h4>artist moods</h4>(.*?)</ul></expression>
+ <expression noclean="1">>Artists\sMoods</h\d*>(.*?)</ul></expression>
</RegExp>
<RegExp input="$$10" output="<mood>\1</mood>" dest="2">
- <expression repeat="yes" noclean="1"><li>[^>]*>([^<]*)</a></li></expression>
+ <expression repeat="yes" noclean="1"><li>[^>]*>([^<]*)</a>\s*</li></expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<expression />
</RegExp>
<RegExp input="$$1" output="\1" dest="4">
- <expression noclean="1"><h4>photo gallery</h4>(.*?)<h4></expression>
+ <expression noclean="1"><h\d>Photo\sGallery</h\d>(.*?)<h2\sclass="artist-name"</expression>
</RegExp>
<RegExp input="$$4" output="<thumb>http://cps-static.rovicorp.com/3/JPG_1080/\1</thumb>" dest="2">
<expression repeat="yes" noclean="1"><img src="http://cps-static.rovicorp.com/3/JPG_[^/]*/([^"]*)</expression>
</GetAMGAlbumRatingByAMGID>
<ParseAMGAlbumRating dest="5">
<RegExp input="$$2" output="<details>\1</details>" dest="5">
- <RegExp input="$$1" output="<rating max="5.0">\1</rating>" dest="2">
- <expression noclean="1">itemprop="rating">([0-9^]*)</expression>
+ <RegExp input="$$1" output="<rating max="10.0">\1</rating>" dest="2">
+ <expression noclean="1">rating-allmusic-([0-9^]*)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<ParseAMGAlbumGenres dest="5">
<RegExp input="$$2" output="<details>\1</details>" dest="5">
<RegExp input="$$1" output="\1" dest="6">
- <expression noclean="1"><dd class="genres">(.*?)</dd></expression>
+ <expression noclean="1"><h4>Genre</h4>\s*<div>(.*?)</div></expression>
</RegExp>
<RegExp input="$$6" output="<genre>\1</genre>" dest="2">
- <expression repeat="yes" trim="1" noclean="1"><li>[^>]*>([^<]*)</a></li></expression>
+ <expression repeat="yes" noclean="1"><a\shref="http://www.allmusic.com/genre/[^"]*">([^<]*)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<ParseAMGAlbumStyles dest="5">
<RegExp input="$$2" output="<details>\1</details>" dest="5">
<RegExp input="$$1" output="\1" dest="7">
- <expression noclean="1"><dd class="styles">(.*?)</dd></expression>
+ <expression noclean="1"><h4>Styles</h4>\s*<div>(.*?)</div></expression>
</RegExp>
<RegExp input="$$7" output="<style>\1</style>" dest="2">
- <expression repeat="yes" trim="1" noclean="1"><li>[^>]*>([^<]*)</a></li></expression>
+ <expression repeat="yes" noclean="1"><a\shref="http://www.allmusic.com/style/[^"]*">([^<]*)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<ParseAMGAlbumMoods dest="5">
<RegExp input="$$2" output="<details>\1</details>" dest="5">
<RegExp input="$$1" output="\1" dest="8">
- <expression trim="1" noclean="1">>\s*<h4>album moods</h4>(.*?)</ul></expression>
+ <expression trim="1" noclean="1">>\s*<h4>Album\sMoods</h4>(.*?)</section></expression>
</RegExp>
<RegExp input="$$8" output="<mood>\1</mood>" dest="2">
- <expression repeat="yes" noclean="1"><li>[^>]*>([^<]*)</a></li></expression>
+ <expression repeat="yes" noclean="1"><a\shref="http://www.allmusic.com/mood/[^"]*">([^<]*)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<ParseAMGAlbumThemes dest="5">
<RegExp input="$$2" output="<details>\1</details>" dest="5">
<RegExp input="$$1" output="\1" dest="4">
- <expression noclean="1"><h4>album themes</h4>(.*?)</ul></expression>
+ <expression trim="1" noclean="1">>\s*<h4>Themes</h4>(.*?)</ul></expression>
</RegExp>
<RegExp input="$$4" output="<theme>\1</theme>" dest="2">
- <expression repeat="yes" noclean="1"><li>[^>]*>([^<]*)</a></li></expression>
+ <expression repeat="yes" noclean="1"><a\shref="http://www.allmusic.com/theme/[^"]*">([^<]*)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<ParseAMGAlbumThumbs dest="5">
<RegExp input="$$2" output="<details>\1</details>" dest="5">
<RegExp input="$$1" output="<thumb>http://cps-static.rovicorp.com/3/JPG_500/\1</thumb>" dest="2">
- <expression noclean="1"><meta property="og:image" content="http://cps-static.rovicorp.com/3/JPG_[^/]*/([^"]*)</expression>
+ <expression noclean="1">"http://cps-static.rovicorp.com/3/JPG_[^/]*/([^"]*)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="metadata.common.hdtrailers.net"
name="HD-Trailers common scraper functions"
- version="1.0.9"
+ version="2.0.2"
provider-name="Bence Nádas (olympia)">
<requires>
<import addon="xbmc.metadata" version="2.1.0"/>
<GetHDTrailersnet480p dest="3">
<RegExp input="$$6" output="<details><url function="Parse480pTrailer" cache="hd-trailers-\1.xml">http://xbmc.hd-trailers.net/movie/\1</url></details>" dest="3">
<RegExp input="$$1" output="\1-" dest="6">
- <expression repeat="yes" fixchars="1" trim="1">([\w]+)</expression>
+ <expression repeat="yes" trim="1">([\w]+)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<GetHDTrailersnet720p dest="3">
<RegExp input="$$6" output="<details><url function="Parse720pTrailer" cache="hd-trailers-\1.xml">http://xbmc.hd-trailers.net/movie/\1</url></details>" dest="3">
<RegExp input="$$1" output="\1-" dest="6">
- <expression repeat="yes" fixchars="1" trim="1">([\w]+)</expression>
+ <expression repeat="yes" trim="1">([\w]+)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<GetHDTrailersnet1080p dest="3">
<RegExp input="$$6" output="<details><url function="Parse1080pTrailer" cache="hd-trailers-\1.xml">http://xbmc.hd-trailers.net/movie/\1</url></details>" dest="3">
<RegExp input="$$1" output="\1-" dest="6">
- <expression repeat="yes" fixchars="1" trim="1">([\w]+)</expression>
+ <expression repeat="yes" trim="1">([\w]+)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
</GetHDTrailersnet1080p>
<Parse480pTrailer dest="5">
- <RegExp input="$$6" output="<details><trailer>\1</trailer></details>" dest="5">
+ <RegExp input="$$6" output="<details>\1</details>" dest="5">
<!--fetch 480p trailer link from hdtrailers.net-->
- <RegExp input="$$1" output="http://playlist.yahoo.com/makeplaylist.dll?sdm=web&pt=rd&sid=\2" dest="6">
- <expression noclean="1">">(Theatrical )?Trailer</span></td>.*?sid=(\d*)" rel="lightbox\[res480p</expression>
- </RegExp>
- <RegExp input="$$1" output="http://playlist.yahoo.com/makeplaylist.dll?sdm=web&pt=rd&sid=\2" dest="6+">
- <expression noclean="1">">(Teaser )?Trailer</span></td>.*?sid=(\d*)" rel="lightbox\[res480p</expression>
+ <RegExp input="$$1" output="<trailer>http://pdl.stream.aol.com/\1</trailer>" dest="6">
+ <expression noclean="1">http://pdl\.stream\.aol\.com/([^"]*?_480p_dl.mov)"\srel="lightbox\[res480p</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
</Parse480pTrailer>
<Parse720pTrailer dest="5">
- <RegExp input="$$6" output="<details><trailer>\1</trailer></details>" dest="5">
+ <RegExp input="$$6" output="<details>\1</details>" dest="5">
<!--Fallback to fetch 480p trailer link if 720p is not available-->
- <RegExp input="$$1" output="http://playlist.yahoo.com/makeplaylist.dll?sdm=web&pt=rd&sid=\2" dest="6">
- <expression noclean="1">">(Theatrical )?Trailer</span></td>.*?sid=(\d*)" rel="lightbox\[res480p</expression>
- </RegExp>
- <RegExp input="$$1" output="http://playlist.yahoo.com/makeplaylist.dll?sdm=web&pt=rd&sid=\2" dest="6+">
- <expression noclean="1">">(Teaser )?Trailer</span></td>.*?sid=(\d*)" rel="lightbox\[res480p</expression>
+ <RegExp input="$$1" output="<trailer>http://pdl.stream.aol.com/\1</trailer>" dest="6">
+ <expression noclean="1">http://pdl\.stream\.aol\.com/([^"]*?_480p_dl.mov)"\srel="lightbox\[res480p</expression>
</RegExp>
<!--Fetch 720p trailer link from hdtrailers.net-->
- <RegExp input="$$1" output="http://playlist.yahoo.com/makeplaylist.dll?sdm=web&pt=rd&sid=\2" dest="6">
- <expression noclean="1">">(Theatrical )?Trailer</span></td>.*?sid=(\d*)" rel="lightbox\[res720p</expression>
- </RegExp>
- <RegExp input="$$1" output="http://playlist.yahoo.com/makeplaylist.dll?sdm=web&pt=rd&sid=\2" dest="6+">
- <expression noclean="1">">(Teaser )?Trailer</span></td>.*?sid=(\d*)" rel="lightbox\[res720p</expression>
+ <RegExp input="$$1" output="<trailer>http://pdl.stream.aol.com/\1</trailer>" dest="6">
+ <expression noclean="1">http://pdl\.stream\.aol\.com/([^"]*?_720p_dl.mov)"\srel="lightbox\[res720p</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
</Parse720pTrailer>
<Parse1080pTrailer dest="5">
- <RegExp input="$$6" output="<details><trailer>\1</trailer></details>" dest="5">
+ <RegExp input="$$6" output="<details>\1</details>" dest="5">
<!--Fallback to fetch 480p trailer link if 720p and 1080p are not available-->
- <RegExp input="$$1" output="http://playlist.yahoo.com/makeplaylist.dll?sdm=web&pt=rd&sid=\2" dest="6">
- <expression noclean="1">">(Theatrical )?Trailer</span></td>.*?sid=(\d*)" rel="lightbox\[res480p</expression>
- </RegExp>
- <RegExp input="$$1" output="http://playlist.yahoo.com/makeplaylist.dll?sdm=web&pt=rd&sid=\2" dest="6+">
- <expression noclean="1">">(Teaser )?Trailer</span></td>.*?sid=(\d*)" rel="lightbox\[res480p</expression>
+ <RegExp input="$$1" output="<trailer>http://pdl.stream.aol.com/\1</trailer>" dest="6">
+ <expression noclean="1">http://pdl\.stream\.aol\.com/([^"]*?_480p_dl.mov)"\srel="lightbox\[res480p</expression>
</RegExp>
- <!--Fallback to fetch 720p trailer link if 1080p is not available-->
- <RegExp input="$$1" output="http://playlist.yahoo.com/makeplaylist.dll?sdm=web&pt=rd&sid=\2" dest="6">
- <expression noclean="1">">(Theatrical )?Trailer</span></td>.*?sid=(\d*)" rel="lightbox\[res720p</expression>
- </RegExp>
- <RegExp input="$$1" output="http://playlist.yahoo.com/makeplaylist.dll?sdm=web&pt=rd&sid=\2" dest="6+">
- <expression noclean="1">">(Teaser )?Trailer</span></td>.*?sid=(\d*)" rel="lightbox\[res720p</expression>
+ <!--Fetch 720p trailer link from hdtrailers.net-->
+ <RegExp input="$$1" output="<trailer>http://pdl.stream.aol.com/\1</trailer>" dest="6">
+ <expression noclean="1">http://pdl\.stream\.aol\.com/([^"]*?_720p_dl.mov)"\srel="lightbox\[res720p</expression>
</RegExp>
<!--Fetch 1080p trailer link from hdtrailers.net-->
- <RegExp input="$$1" output="http://playlist.yahoo.com/makeplaylist.dll?sdm=web&pt=rd&sid=\2" dest="6">
- <expression noclean="1">">(Theatrical )?Trailer</span></td>.*?sid=(\d*)" rel="lightbox\[res1080p</expression>
- </RegExp>
- <RegExp input="$$1" output="http://playlist.yahoo.com/makeplaylist.dll?sdm=web&pt=rd&sid=\2" dest="6+">
- <expression noclean="1">">(Teaser )?Trailer</span></td>.*?sid=(\d*)" rel="lightbox\[res1080p</expression>
+ <RegExp input="$$1" output="<trailer>http://pdl.stream.aol.com/\1</trailer>" dest="6">
+ <expression noclean="1">http://pdl\.stream\.aol\.com/([^"]*?_1080p_dl.mov)"\srel="lightbox\[res1080p</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
</Parse1080pTrailer>
-</scraperfunctions>
+</scraperfunctions>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="metadata.common.htbackdrops.com"
name="HTBackdrops"
- version="1.2.0"
+ version="1.3.0"
provider-name="Team XBMC">
<requires>
<import addon="xbmc.metadata" version="1.0"/>
<scraperfunctions>
<GetHTBThumbsByMBID dest="5" clearbuffers="no">
- <RegExp input="$$1" output="<details><url function="ParseHTBThumbs" post="yes" cache="htb-images-\1.xml">http://htbackdrops.com/api/7681a907c805e0670330c694e788e8e8/searchXML?mbid=\1&aid=1,5</url></details>" dest="5">
+ <RegExp input="$$1" output="<details><url function="ParseHTBThumbs" post="yes" cache="htb-images-\1.xml">http://htbackdrops.org/api/7681a907c805e0670330c694e788e8e8/searchXML?mbid=\1&aid=1,5</url></details>" dest="5">
<expression noclean="1" />
</RegExp>
</GetHTBThumbsByMBID>
<GetHTBThumbs dest="5">
- <RegExp input="$$1" output="<details><url function="ParseHTBThumbs" post="yes" cache="htb-images-\1.xml">http://htbackdrops.com/api/7681a907c805e0670330c694e788e8e8/searchXML?keywords=\1&default_operator=and&aid=1,5</url></details>" dest="5">
+ <RegExp input="$$1" output="<details><url function="ParseHTBThumbs" post="yes" cache="htb-images-\1.xml">http://htbackdrops.org/api/7681a907c805e0670330c694e788e8e8/searchXML?keywords=\1&default_operator=and&aid=1,5</url></details>" dest="5">
<expression noclean="1" />
</RegExp>
</GetHTBThumbs>
<RegExp input="" output="" dest="13">
<expression />
</RegExp>
- <RegExp input="$$1" output="<thumb preview="http://www.htbackdrops.com/api/7681a907c805e0670330c694e788e8e8/download/\1/thumbnail">http://www.htbackdrops.com/api/7681a907c805e0670330c694e788e8e8/download/\1/fullsize</thumb>" dest="13">
+ <RegExp input="$$1" output="<thumb preview="http://www.htbackdrops.org/api/7681a907c805e0670330c694e788e8e8/download/\1/thumbnail">http://www.htbackdrops.org/api/7681a907c805e0670330c694e788e8e8/download/\1/fullsize</thumb>" dest="13">
<expression repeat="yes" noclean="1"><id>([^<]+)</id>\n[^<]+<aid>5</aid></expression>
</RegExp>
<expression noclean="1" />
</ParseHTBThumbs>
<GetHTBFanartByMBID dest="5" clearbuffers="no">
- <RegExp input="$$1" output="<details><url function="ParseHTBFanart" post="yes" cache="htb-images-\1.xml">http://htbackdrops.com/api/7681a907c805e0670330c694e788e8e8/searchXML?mbid=\1&aid=1,5</url></details>" dest="5">
+ <RegExp input="$$1" output="<details><url function="ParseHTBFanart" post="yes" cache="htb-images-\1.xml">http://htbackdrops.org/api/7681a907c805e0670330c694e788e8e8/searchXML?mbid=\1&aid=1,5</url></details>" dest="5">
<expression noclean="1" />
</RegExp>
</GetHTBFanartByMBID>
<GetHTBFanart dest="5">
- <RegExp input="$$1" output="<details><url function="ParseHTBFanart" post="yes" cache="htb-images-\1.xml">http://htbackdrops.com/api/7681a907c805e0670330c694e788e8e8/searchXML?keywords=\1&default_operator=and&aid=1,5</url></details>" dest="5">
+ <RegExp input="$$1" output="<details><url function="ParseHTBFanart" post="yes" cache="htb-images-\1.xml">http://htbackdrops.org/api/7681a907c805e0670330c694e788e8e8/searchXML?keywords=\1&default_operator=and&aid=1,5</url></details>" dest="5">
<expression noclean="1" />
</RegExp>
</GetHTBFanart>
<RegExp input="" output="" dest="14">
<expression />
</RegExp>
- <RegExp input="$$1" output="<thumb preview="http://www.htbackdrops.com/api/7681a907c805e0670330c694e788e8e8/download/\1/thumbnail">http://www.htbackdrops.com/api/7681a907c805e0670330c694e788e8e8/download/\1/fullsize</thumb>" dest="14">
+ <RegExp input="$$1" output="<thumb preview="http://www.htbackdrops.org/api/7681a907c805e0670330c694e788e8e8/download/\1/thumbnail">http://www.htbackdrops.org/api/7681a907c805e0670330c694e788e8e8/download/\1/fullsize</thumb>" dest="14">
<expression repeat="yes" noclean="1"><id>([^<]+)</id>\n[^<]+<aid>1</aid></expression>
</RegExp>
<RegExp input="$$14" output="\1" dest="13">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="metadata.common.imdb.com"
name="IMDB Scraper Library"
- version="2.7.6"
+ version="2.7.7"
provider-name="Team XBMC">
<requires>
<import addon="xbmc.metadata" version="2.1.0"/>
+[B]2.7.7[/B]
+- fixed: MetaCritic Score for 100/100 films
+
[B]2.7.6[/B]
- fixed: IMDb studio/director/writer after layout change
<ParseMetaCriticRating dest="5">
<RegExp input="$$2" output="<details>\1</details>" dest="5">
<RegExp input="$$1" output="<rating>\1.\2</rating>" dest="2">
- <expression><a\shref="criticreviews[^"]*?"\stitle[^>]*?>\s(\d)(\d*)</expression>
+ <expression><a\shref="criticreviews[^"]*?"\stitle[^>]*?>\s(\d*)(\d)/</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="metadata.common.musicbrainz.org"
name="musicbrainz"
- version="1.3.1b"
+ version="2.0.1"
provider-name="Team XBMC">
<requires>
<import addon="xbmc.metadata" version="2.1.0"/>
<ParseMBAlbumTracks dest="5">
<RegExp input="$$2" output="<details>\1</details>" dest="5">
<RegExp input="$$1" output="<track><position>\1</position><title>\4</title><duration>\2</duration></track>" dest="2">
- <expression repeat="yes"><track><position>(\d+)</position><number>\d*</number>(?:<length>(\d*?)\d{3}</length>)*(?:<recording id="([^"]*)">)*<title>([^<]*)<</expression>
+ <expression repeat="yes"><track[^>]+><position>(\d+)</position><number>\d*</number>(?:<length>(\d*?)\d{3}</length>)*(?:<recording id="([^"]*)">)*<title>([^<]*)<</expression>
</RegExp>
<expression noclean="1">(.+)</expression>
</RegExp>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="metadata.common.theaudiodb.com"
name="TheAudioDb Common Scraper Functions"
- version="1.6.1"
+ version="1.7.1"
provider-name="Team XBMC">
<requires>
<import addon="xbmc.metadata" version="2.1.0"/>
<RegExp input="" output="" dest="11">
<expression />
</RegExp>
+ <RegExp input="" output="" dest="12">
+ <expression />
+ </RegExp>
<RegExp input="$$1" output="\1" dest="11">
<expression fixchars="1">strBiographyEN":"(.*?)","</expression>
</RegExp>
<RegExp input="" output="" dest="11">
<expression />
</RegExp>
+ <RegExp input="" output="" dest="12">
+ <expression />
+ </RegExp>
<RegExp input="$$1" output="<formed>\2 (\1)</formed>" dest="11">
<expression fixchars="2" noclean="1">intFormedYear":"([^"]*).*?strCountry":"([^"]*)</expression>
</RegExp>
<RegExp input="" output="" dest="11">
<expression />
</RegExp>
+ <RegExp input="" output="" dest="12">
+ <expression />
+ </RegExp>
<RegExp input="$$1" output="<formed>\2 (\1)</formed>" dest="11">
<expression fixchars="2" noclean="1">intFormedYear":"([^"]*).*?strCountry":"([^"]*)</expression>
</RegExp>
<RegExp input="" output="" dest="11">
<expression />
</RegExp>
+ <RegExp input="" output="" dest="12">
+ <expression />
+ </RegExp>
<RegExp input="$$1" output="\1" dest="11">
<expression fixchars="1">strSubGenre":"([^"]*)</expression>
</RegExp>
</RegExp>
</ParseTADBAlbumReview>
+ <GetTADBAlbumRating dest="5">
+ <RegExp input="$$1" output="<details><url function="ParseTADBAlbumRating" cache="tadb-\1-album.json">http://www.theaudiodb.com/api/v1/json/58424d43204d6564696120/album.php?m=\1</url></details>" dest="5">
+ <expression noclean="1"/>
+ </RegExp>
+ </GetTADBAlbumRating>
+ <GetTADBAlbumRatingByMBID dest="5" clearbuffers="no">
+ <RegExp input="$$1" output="<details><url function="ParseTADBAlbumRating">http://www.theaudiodb.com/api/v1/json/58424d43204d6564696120/album-mb.php?i=\1</url></details>" dest="5">
+ <expression noclean="1"/>
+ </RegExp>
+ </GetTADBAlbumRatingByMBID>
+ <ParseTADBAlbumRating dest="5">
+ <RegExp input="$$2" output="<details>\1</details>" dest="5">
+ <RegExp input="$$1" output="<rating max="10.0">\1</rating>" dest="2">
+ <expression fixchars="1">intScore":"(.*?)","</expression>
+ </RegExp>
+ <expression noclean="1" />
+ </RegExp>
+ </ParseTADBAlbumRating>
+
<GetTADBAlbumTitleByID dest="5">
<RegExp input="$$1" output="<details><url function="ParseTADBAlbumTitle" cache="tadb-\1-album.json">http://www.theaudiodb.com/api/v1/json/58424d43204d6564696120/album.php?m=\1</url></details>" dest="5">
<expression noclean="1"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="metadata.common.themoviedb.org"
name="The Movie Database Scraper Library"
- version="2.9.3"
+ version="2.9.4"
provider-name="Team XBMC">
<requires>
<import addon="xbmc.metadata" version="2.1.0"/>
<RegExp input="$$1" output="\1" dest="7">
<expression clear="yes" noclean="1">"cast":\[([^\]]*)</expression>
</RegExp>
- <RegExp input="$$7" output="<actor><name>\1</name><role>\2</role><thumb>http://cf2.imgobject.com/t/p/original\3</thumb></actor>" dest="2">
- <expression repeat="yes" fixchars="1">"name":"([^"]*)","character":"([^"]*)","order":[0-9]*,"cast_id":[0-9]*,"profile_path":"([^"]*)"</expression>
+ <RegExp input="$$7" output="<actor><name>\1</name><role>\2</role><order>\3</order><thumb>http://cf2.imgobject.com/t/p/original\4</thumb></actor>" dest="2">
+ <expression repeat="yes" fixchars="1">"name":"([^"]*)","character":"([^"]*)","order":([0-9]*),"cast_id":[0-9]*,"profile_path":"([^"]*)"</expression>
</RegExp>
- <RegExp input="$$7" output="<actor><name>\1</name><role>\2</role></actor>" dest="2+">
- <expression repeat="yes" fixchars="1">"name":"([^"]*)","character":"([^"]*)","order":[0-9]*,"cast_id":[0-9]*,"profile_path":null</expression>
+ <RegExp input="$$7" output="<actor><name>\1</name><role>\2</role><order>\3</order></actor>" dest="2+">
+ <expression repeat="yes" fixchars="1">"name":"([^"]*)","character":"([^"]*)","order":([0-9]*),"cast_id":[0-9]*,"profile_path":null</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="script.module.simplejson"
- name="simplejson"
- version="2.0.10"
- provider-name="code.google.com/simplejson">
- <requires>
- <import addon="xbmc.python" version="2.0.0"/>
- </requires>
- <extension point="xbmc.python.module"
- library="lib" />
- <extension point="xbmc.addon.metadata">
- <platform>all</platform>
- </extension>
-</addon>
+++ /dev/null
-Copyright (c) 2006 Bob Ippolito
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+++ /dev/null
-r"""JSON (JavaScript Object Notation) <http://json.org> is a subset of
-JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data
-interchange format.
-
-:mod:`simplejson` exposes an API familiar to users of the standard library
-:mod:`marshal` and :mod:`pickle` modules. It is the externally maintained
-version of the :mod:`json` library contained in Python 2.6, but maintains
-compatibility with Python 2.4 and Python 2.5 and (currently) has
-significant performance advantages, even without using the optional C
-extension for speedups.
-
-Encoding basic Python object hierarchies::
-
- >>> import simplejson as json
- >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
- '["foo", {"bar": ["baz", null, 1.0, 2]}]'
- >>> print json.dumps("\"foo\bar")
- "\"foo\bar"
- >>> print json.dumps(u'\u1234')
- "\u1234"
- >>> print json.dumps('\\')
- "\\"
- >>> print json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
- {"a": 0, "b": 0, "c": 0}
- >>> from StringIO import StringIO
- >>> io = StringIO()
- >>> json.dump(['streaming API'], io)
- >>> io.getvalue()
- '["streaming API"]'
-
-Compact encoding::
-
- >>> import simplejson as json
- >>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':'))
- '[1,2,3,{"4":5,"6":7}]'
-
-Pretty printing::
-
- >>> import simplejson as json
- >>> s = json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
- >>> print '\n'.join([l.rstrip() for l in s.splitlines()])
- {
- "4": 5,
- "6": 7
- }
-
-Decoding JSON::
-
- >>> import simplejson as json
- >>> obj = [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
- >>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') == obj
- True
- >>> json.loads('"\\"foo\\bar"') == u'"foo\x08ar'
- True
- >>> from StringIO import StringIO
- >>> io = StringIO('["streaming API"]')
- >>> json.load(io)[0] == 'streaming API'
- True
-
-Specializing JSON object decoding::
-
- >>> import simplejson as json
- >>> def as_complex(dct):
- ... if '__complex__' in dct:
- ... return complex(dct['real'], dct['imag'])
- ... return dct
- ...
- >>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',
- ... object_hook=as_complex)
- (1+2j)
- >>> import decimal
- >>> json.loads('1.1', parse_float=decimal.Decimal) == decimal.Decimal('1.1')
- True
-
-Specializing JSON object encoding::
-
- >>> import simplejson as json
- >>> def encode_complex(obj):
- ... if isinstance(obj, complex):
- ... return [obj.real, obj.imag]
- ... raise TypeError(repr(o) + " is not JSON serializable")
- ...
- >>> json.dumps(2 + 1j, default=encode_complex)
- '[2.0, 1.0]'
- >>> json.JSONEncoder(default=encode_complex).encode(2 + 1j)
- '[2.0, 1.0]'
- >>> ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j))
- '[2.0, 1.0]'
-
-
-Using simplejson.tool from the shell to validate and pretty-print::
-
- $ echo '{"json":"obj"}' | python -m simplejson.tool
- {
- "json": "obj"
- }
- $ echo '{ 1.2:3.4}' | python -m simplejson.tool
- Expecting property name: line 1 column 2 (char 2)
-"""
-__version__ = '2.0.9'
-__all__ = [
- 'dump', 'dumps', 'load', 'loads',
- 'JSONDecoder', 'JSONEncoder',
-]
-
-__author__ = 'Bob Ippolito <bob@redivi.com>'
-
-from decoder import JSONDecoder
-from encoder import JSONEncoder
-
-_default_encoder = JSONEncoder(
- skipkeys=False,
- ensure_ascii=True,
- check_circular=True,
- allow_nan=True,
- indent=None,
- separators=None,
- encoding='utf-8',
- default=None,
-)
-
-def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
- allow_nan=True, cls=None, indent=None, separators=None,
- encoding='utf-8', default=None, **kw):
- """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
- ``.write()``-supporting file-like object).
-
- If ``skipkeys`` is true then ``dict`` keys that are not basic types
- (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``)
- will be skipped instead of raising a ``TypeError``.
-
- If ``ensure_ascii`` is false, then the some chunks written to ``fp``
- may be ``unicode`` instances, subject to normal Python ``str`` to
- ``unicode`` coercion rules. Unless ``fp.write()`` explicitly
- understands ``unicode`` (as in ``codecs.getwriter()``) this is likely
- to cause an error.
-
- If ``check_circular`` is false, then the circular reference check
- for container types will be skipped and a circular reference will
- result in an ``OverflowError`` (or worse).
-
- If ``allow_nan`` is false, then it will be a ``ValueError`` to
- serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``)
- in strict compliance of the JSON specification, instead of using the
- JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
-
- If ``indent`` is a non-negative integer, then JSON array elements and object
- members will be pretty-printed with that indent level. An indent level
- of 0 will only insert newlines. ``None`` is the most compact representation.
-
- If ``separators`` is an ``(item_separator, dict_separator)`` tuple
- then it will be used instead of the default ``(', ', ': ')`` separators.
- ``(',', ':')`` is the most compact JSON representation.
-
- ``encoding`` is the character encoding for str instances, default is UTF-8.
-
- ``default(obj)`` is a function that should return a serializable version
- of obj or raise TypeError. The default simply raises TypeError.
-
- To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
- ``.default()`` method to serialize additional types), specify it with
- the ``cls`` kwarg.
-
- """
- # cached encoder
- if (not skipkeys and ensure_ascii and
- check_circular and allow_nan and
- cls is None and indent is None and separators is None and
- encoding == 'utf-8' and default is None and not kw):
- iterable = _default_encoder.iterencode(obj)
- else:
- if cls is None:
- cls = JSONEncoder
- iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii,
- check_circular=check_circular, allow_nan=allow_nan, indent=indent,
- separators=separators, encoding=encoding,
- default=default, **kw).iterencode(obj)
- # could accelerate with writelines in some versions of Python, at
- # a debuggability cost
- for chunk in iterable:
- fp.write(chunk)
-
-
-def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
- allow_nan=True, cls=None, indent=None, separators=None,
- encoding='utf-8', default=None, **kw):
- """Serialize ``obj`` to a JSON formatted ``str``.
-
- If ``skipkeys`` is false then ``dict`` keys that are not basic types
- (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``)
- will be skipped instead of raising a ``TypeError``.
-
- If ``ensure_ascii`` is false, then the return value will be a
- ``unicode`` instance subject to normal Python ``str`` to ``unicode``
- coercion rules instead of being escaped to an ASCII ``str``.
-
- If ``check_circular`` is false, then the circular reference check
- for container types will be skipped and a circular reference will
- result in an ``OverflowError`` (or worse).
-
- If ``allow_nan`` is false, then it will be a ``ValueError`` to
- serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in
- strict compliance of the JSON specification, instead of using the
- JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
-
- If ``indent`` is a non-negative integer, then JSON array elements and
- object members will be pretty-printed with that indent level. An indent
- level of 0 will only insert newlines. ``None`` is the most compact
- representation.
-
- If ``separators`` is an ``(item_separator, dict_separator)`` tuple
- then it will be used instead of the default ``(', ', ': ')`` separators.
- ``(',', ':')`` is the most compact JSON representation.
-
- ``encoding`` is the character encoding for str instances, default is UTF-8.
-
- ``default(obj)`` is a function that should return a serializable version
- of obj or raise TypeError. The default simply raises TypeError.
-
- To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
- ``.default()`` method to serialize additional types), specify it with
- the ``cls`` kwarg.
-
- """
- # cached encoder
- if (not skipkeys and ensure_ascii and
- check_circular and allow_nan and
- cls is None and indent is None and separators is None and
- encoding == 'utf-8' and default is None and not kw):
- return _default_encoder.encode(obj)
- if cls is None:
- cls = JSONEncoder
- return cls(
- skipkeys=skipkeys, ensure_ascii=ensure_ascii,
- check_circular=check_circular, allow_nan=allow_nan, indent=indent,
- separators=separators, encoding=encoding, default=default,
- **kw).encode(obj)
-
-
-_default_decoder = JSONDecoder(encoding=None, object_hook=None)
-
-
-def load(fp, encoding=None, cls=None, object_hook=None, parse_float=None,
- parse_int=None, parse_constant=None, **kw):
- """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
- a JSON document) to a Python object.
-
- If the contents of ``fp`` is encoded with an ASCII based encoding other
- than utf-8 (e.g. latin-1), then an appropriate ``encoding`` name must
- be specified. Encodings that are not ASCII based (such as UCS-2) are
- not allowed, and should be wrapped with
- ``codecs.getreader(fp)(encoding)``, or simply decoded to a ``unicode``
- object and passed to ``loads()``
-
- ``object_hook`` is an optional function that will be called with the
- result of any object literal decode (a ``dict``). The return value of
- ``object_hook`` will be used instead of the ``dict``. This feature
- can be used to implement custom decoders (e.g. JSON-RPC class hinting).
-
- To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
- kwarg.
-
- """
- return loads(fp.read(),
- encoding=encoding, cls=cls, object_hook=object_hook,
- parse_float=parse_float, parse_int=parse_int,
- parse_constant=parse_constant, **kw)
-
-
-def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None,
- parse_int=None, parse_constant=None, **kw):
- """Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON
- document) to a Python object.
-
- If ``s`` is a ``str`` instance and is encoded with an ASCII based encoding
- other than utf-8 (e.g. latin-1) then an appropriate ``encoding`` name
- must be specified. Encodings that are not ASCII based (such as UCS-2)
- are not allowed and should be decoded to ``unicode`` first.
-
- ``object_hook`` is an optional function that will be called with the
- result of any object literal decode (a ``dict``). The return value of
- ``object_hook`` will be used instead of the ``dict``. This feature
- can be used to implement custom decoders (e.g. JSON-RPC class hinting).
-
- ``parse_float``, if specified, will be called with the string
- of every JSON float to be decoded. By default this is equivalent to
- float(num_str). This can be used to use another datatype or parser
- for JSON floats (e.g. decimal.Decimal).
-
- ``parse_int``, if specified, will be called with the string
- of every JSON int to be decoded. By default this is equivalent to
- int(num_str). This can be used to use another datatype or parser
- for JSON integers (e.g. float).
-
- ``parse_constant``, if specified, will be called with one of the
- following strings: -Infinity, Infinity, NaN, null, true, false.
- This can be used to raise an exception if invalid JSON numbers
- are encountered.
-
- To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
- kwarg.
-
- """
- if (cls is None and encoding is None and object_hook is None and
- parse_int is None and parse_float is None and
- parse_constant is None and not kw):
- return _default_decoder.decode(s)
- if cls is None:
- cls = JSONDecoder
- if object_hook is not None:
- kw['object_hook'] = object_hook
- if parse_float is not None:
- kw['parse_float'] = parse_float
- if parse_int is not None:
- kw['parse_int'] = parse_int
- if parse_constant is not None:
- kw['parse_constant'] = parse_constant
- return cls(encoding=encoding, **kw).decode(s)
+++ /dev/null
-"""Implementation of JSONDecoder
-"""
-import re
-import sys
-import struct
-
-from simplejson.scanner import make_scanner
-try:
- from simplejson._speedups import scanstring as c_scanstring
-except ImportError:
- c_scanstring = None
-
-__all__ = ['JSONDecoder']
-
-FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL
-
-def _floatconstants():
- _BYTES = '7FF80000000000007FF0000000000000'.decode('hex')
- if sys.byteorder != 'big':
- _BYTES = _BYTES[:8][::-1] + _BYTES[8:][::-1]
- nan, inf = struct.unpack('dd', _BYTES)
- return nan, inf, -inf
-
-NaN, PosInf, NegInf = _floatconstants()
-
-
-def linecol(doc, pos):
- lineno = doc.count('\n', 0, pos) + 1
- if lineno == 1:
- colno = pos
- else:
- colno = pos - doc.rindex('\n', 0, pos)
- return lineno, colno
-
-
-def errmsg(msg, doc, pos, end=None):
- # Note that this function is called from _speedups
- lineno, colno = linecol(doc, pos)
- if end is None:
- #fmt = '{0}: line {1} column {2} (char {3})'
- #return fmt.format(msg, lineno, colno, pos)
- fmt = '%s: line %d column %d (char %d)'
- return fmt % (msg, lineno, colno, pos)
- endlineno, endcolno = linecol(doc, end)
- #fmt = '{0}: line {1} column {2} - line {3} column {4} (char {5} - {6})'
- #return fmt.format(msg, lineno, colno, endlineno, endcolno, pos, end)
- fmt = '%s: line %d column %d - line %d column %d (char %d - %d)'
- return fmt % (msg, lineno, colno, endlineno, endcolno, pos, end)
-
-
-_CONSTANTS = {
- '-Infinity': NegInf,
- 'Infinity': PosInf,
- 'NaN': NaN,
-}
-
-STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS)
-BACKSLASH = {
- '"': u'"', '\\': u'\\', '/': u'/',
- 'b': u'\b', 'f': u'\f', 'n': u'\n', 'r': u'\r', 't': u'\t',
-}
-
-DEFAULT_ENCODING = "utf-8"
-
-def py_scanstring(s, end, encoding=None, strict=True, _b=BACKSLASH, _m=STRINGCHUNK.match):
- """Scan the string s for a JSON string. End is the index of the
- character in s after the quote that started the JSON string.
- Unescapes all valid JSON string escape sequences and raises ValueError
- on attempt to decode an invalid string. If strict is False then literal
- control characters are allowed in the string.
-
- Returns a tuple of the decoded string and the index of the character in s
- after the end quote."""
- if encoding is None:
- encoding = DEFAULT_ENCODING
- chunks = []
- _append = chunks.append
- begin = end - 1
- while 1:
- chunk = _m(s, end)
- if chunk is None:
- raise ValueError(
- errmsg("Unterminated string starting at", s, begin))
- end = chunk.end()
- content, terminator = chunk.groups()
- # Content is contains zero or more unescaped string characters
- if content:
- if not isinstance(content, unicode):
- content = unicode(content, encoding)
- _append(content)
- # Terminator is the end of string, a literal control character,
- # or a backslash denoting that an escape sequence follows
- if terminator == '"':
- break
- elif terminator != '\\':
- if strict:
- msg = "Invalid control character %r at" % (terminator,)
- #msg = "Invalid control character {0!r} at".format(terminator)
- raise ValueError(errmsg(msg, s, end))
- else:
- _append(terminator)
- continue
- try:
- esc = s[end]
- except IndexError:
- raise ValueError(
- errmsg("Unterminated string starting at", s, begin))
- # If not a unicode escape sequence, must be in the lookup table
- if esc != 'u':
- try:
- char = _b[esc]
- except KeyError:
- msg = "Invalid \\escape: " + repr(esc)
- raise ValueError(errmsg(msg, s, end))
- end += 1
- else:
- # Unicode escape sequence
- esc = s[end + 1:end + 5]
- next_end = end + 5
- if len(esc) != 4:
- msg = "Invalid \\uXXXX escape"
- raise ValueError(errmsg(msg, s, end))
- uni = int(esc, 16)
- # Check for surrogate pair on UCS-4 systems
- if 0xd800 <= uni <= 0xdbff and sys.maxunicode > 65535:
- msg = "Invalid \\uXXXX\\uXXXX surrogate pair"
- if not s[end + 5:end + 7] == '\\u':
- raise ValueError(errmsg(msg, s, end))
- esc2 = s[end + 7:end + 11]
- if len(esc2) != 4:
- raise ValueError(errmsg(msg, s, end))
- uni2 = int(esc2, 16)
- uni = 0x10000 + (((uni - 0xd800) << 10) | (uni2 - 0xdc00))
- next_end += 6
- char = unichr(uni)
- end = next_end
- # Append the unescaped character
- _append(char)
- return u''.join(chunks), end
-
-
-# Use speedup if available
-scanstring = c_scanstring or py_scanstring
-
-WHITESPACE = re.compile(r'[ \t\n\r]*', FLAGS)
-WHITESPACE_STR = ' \t\n\r'
-
-def JSONObject((s, end), encoding, strict, scan_once, object_hook, _w=WHITESPACE.match, _ws=WHITESPACE_STR):
- pairs = {}
- # Use a slice to prevent IndexError from being raised, the following
- # check will raise a more specific ValueError if the string is empty
- nextchar = s[end:end + 1]
- # Normally we expect nextchar == '"'
- if nextchar != '"':
- if nextchar in _ws:
- end = _w(s, end).end()
- nextchar = s[end:end + 1]
- # Trivial empty object
- if nextchar == '}':
- return pairs, end + 1
- elif nextchar != '"':
- raise ValueError(errmsg("Expecting property name", s, end))
- end += 1
- while True:
- key, end = scanstring(s, end, encoding, strict)
-
- # To skip some function call overhead we optimize the fast paths where
- # the JSON key separator is ": " or just ":".
- if s[end:end + 1] != ':':
- end = _w(s, end).end()
- if s[end:end + 1] != ':':
- raise ValueError(errmsg("Expecting : delimiter", s, end))
-
- end += 1
-
- try:
- if s[end] in _ws:
- end += 1
- if s[end] in _ws:
- end = _w(s, end + 1).end()
- except IndexError:
- pass
-
- try:
- value, end = scan_once(s, end)
- except StopIteration:
- raise ValueError(errmsg("Expecting object", s, end))
- pairs[key] = value
-
- try:
- nextchar = s[end]
- if nextchar in _ws:
- end = _w(s, end + 1).end()
- nextchar = s[end]
- except IndexError:
- nextchar = ''
- end += 1
-
- if nextchar == '}':
- break
- elif nextchar != ',':
- raise ValueError(errmsg("Expecting , delimiter", s, end - 1))
-
- try:
- nextchar = s[end]
- if nextchar in _ws:
- end += 1
- nextchar = s[end]
- if nextchar in _ws:
- end = _w(s, end + 1).end()
- nextchar = s[end]
- except IndexError:
- nextchar = ''
-
- end += 1
- if nextchar != '"':
- raise ValueError(errmsg("Expecting property name", s, end - 1))
-
- if object_hook is not None:
- pairs = object_hook(pairs)
- return pairs, end
-
-def JSONArray((s, end), scan_once, _w=WHITESPACE.match, _ws=WHITESPACE_STR):
- values = []
- nextchar = s[end:end + 1]
- if nextchar in _ws:
- end = _w(s, end + 1).end()
- nextchar = s[end:end + 1]
- # Look-ahead for trivial empty array
- if nextchar == ']':
- return values, end + 1
- _append = values.append
- while True:
- try:
- value, end = scan_once(s, end)
- except StopIteration:
- raise ValueError(errmsg("Expecting object", s, end))
- _append(value)
- nextchar = s[end:end + 1]
- if nextchar in _ws:
- end = _w(s, end + 1).end()
- nextchar = s[end:end + 1]
- end += 1
- if nextchar == ']':
- break
- elif nextchar != ',':
- raise ValueError(errmsg("Expecting , delimiter", s, end))
-
- try:
- if s[end] in _ws:
- end += 1
- if s[end] in _ws:
- end = _w(s, end + 1).end()
- except IndexError:
- pass
-
- return values, end
-
-class JSONDecoder(object):
- """Simple JSON <http://json.org> decoder
-
- Performs the following translations in decoding by default:
-
- +---------------+-------------------+
- | JSON | Python |
- +===============+===================+
- | object | dict |
- +---------------+-------------------+
- | array | list |
- +---------------+-------------------+
- | string | unicode |
- +---------------+-------------------+
- | number (int) | int, long |
- +---------------+-------------------+
- | number (real) | float |
- +---------------+-------------------+
- | true | True |
- +---------------+-------------------+
- | false | False |
- +---------------+-------------------+
- | null | None |
- +---------------+-------------------+
-
- It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as
- their corresponding ``float`` values, which is outside the JSON spec.
-
- """
-
- def __init__(self, encoding=None, object_hook=None, parse_float=None,
- parse_int=None, parse_constant=None, strict=True):
- """``encoding`` determines the encoding used to interpret any ``str``
- objects decoded by this instance (utf-8 by default). It has no
- effect when decoding ``unicode`` objects.
-
- Note that currently only encodings that are a superset of ASCII work,
- strings of other encodings should be passed in as ``unicode``.
-
- ``object_hook``, if specified, will be called with the result
- of every JSON object decoded and its return value will be used in
- place of the given ``dict``. This can be used to provide custom
- deserializations (e.g. to support JSON-RPC class hinting).
-
- ``parse_float``, if specified, will be called with the string
- of every JSON float to be decoded. By default this is equivalent to
- float(num_str). This can be used to use another datatype or parser
- for JSON floats (e.g. decimal.Decimal).
-
- ``parse_int``, if specified, will be called with the string
- of every JSON int to be decoded. By default this is equivalent to
- int(num_str). This can be used to use another datatype or parser
- for JSON integers (e.g. float).
-
- ``parse_constant``, if specified, will be called with one of the
- following strings: -Infinity, Infinity, NaN.
- This can be used to raise an exception if invalid JSON numbers
- are encountered.
-
- """
- self.encoding = encoding
- self.object_hook = object_hook
- self.parse_float = parse_float or float
- self.parse_int = parse_int or int
- self.parse_constant = parse_constant or _CONSTANTS.__getitem__
- self.strict = strict
- self.parse_object = JSONObject
- self.parse_array = JSONArray
- self.parse_string = scanstring
- self.scan_once = make_scanner(self)
-
- def decode(self, s, _w=WHITESPACE.match):
- """Return the Python representation of ``s`` (a ``str`` or ``unicode``
- instance containing a JSON document)
-
- """
- obj, end = self.raw_decode(s, idx=_w(s, 0).end())
- end = _w(s, end).end()
- if end != len(s):
- raise ValueError(errmsg("Extra data", s, end, len(s)))
- return obj
-
- def raw_decode(self, s, idx=0):
- """Decode a JSON document from ``s`` (a ``str`` or ``unicode`` beginning
- with a JSON document) and return a 2-tuple of the Python
- representation and the index in ``s`` where the document ended.
-
- This can be used to decode a JSON document from a string that may
- have extraneous data at the end.
-
- """
- try:
- obj, end = self.scan_once(s, idx)
- except StopIteration:
- raise ValueError("No JSON object could be decoded")
- return obj, end
+++ /dev/null
-"""Implementation of JSONEncoder
-"""
-import re
-
-try:
- from simplejson._speedups import encode_basestring_ascii as c_encode_basestring_ascii
-except ImportError:
- c_encode_basestring_ascii = None
-try:
- from simplejson._speedups import make_encoder as c_make_encoder
-except ImportError:
- c_make_encoder = None
-
-ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]')
-ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
-HAS_UTF8 = re.compile(r'[\x80-\xff]')
-ESCAPE_DCT = {
- '\\': '\\\\',
- '"': '\\"',
- '\b': '\\b',
- '\f': '\\f',
- '\n': '\\n',
- '\r': '\\r',
- '\t': '\\t',
-}
-for i in range(0x20):
- #ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i))
- ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,))
-
-# Assume this produces an infinity on all machines (probably not guaranteed)
-INFINITY = float('1e66666')
-FLOAT_REPR = repr
-
-def encode_basestring(s):
- """Return a JSON representation of a Python string
-
- """
- def replace(match):
- return ESCAPE_DCT[match.group(0)]
- return '"' + ESCAPE.sub(replace, s) + '"'
-
-
-def py_encode_basestring_ascii(s):
- """Return an ASCII-only JSON representation of a Python string
-
- """
- if isinstance(s, str) and HAS_UTF8.search(s) is not None:
- s = s.decode('utf-8')
- def replace(match):
- s = match.group(0)
- try:
- return ESCAPE_DCT[s]
- except KeyError:
- n = ord(s)
- if n < 0x10000:
- #return '\\u{0:04x}'.format(n)
- return '\\u%04x' % (n,)
- else:
- # surrogate pair
- n -= 0x10000
- s1 = 0xd800 | ((n >> 10) & 0x3ff)
- s2 = 0xdc00 | (n & 0x3ff)
- #return '\\u{0:04x}\\u{1:04x}'.format(s1, s2)
- return '\\u%04x\\u%04x' % (s1, s2)
- return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"'
-
-
-encode_basestring_ascii = c_encode_basestring_ascii or py_encode_basestring_ascii
-
-class JSONEncoder(object):
- """Extensible JSON <http://json.org> encoder for Python data structures.
-
- Supports the following objects and types by default:
-
- +-------------------+---------------+
- | Python | JSON |
- +===================+===============+
- | dict | object |
- +-------------------+---------------+
- | list, tuple | array |
- +-------------------+---------------+
- | str, unicode | string |
- +-------------------+---------------+
- | int, long, float | number |
- +-------------------+---------------+
- | True | true |
- +-------------------+---------------+
- | False | false |
- +-------------------+---------------+
- | None | null |
- +-------------------+---------------+
-
- To extend this to recognize other objects, subclass and implement a
- ``.default()`` method with another method that returns a serializable
- object for ``o`` if possible, otherwise it should call the superclass
- implementation (to raise ``TypeError``).
-
- """
- item_separator = ', '
- key_separator = ': '
- def __init__(self, skipkeys=False, ensure_ascii=True,
- check_circular=True, allow_nan=True, sort_keys=False,
- indent=None, separators=None, encoding='utf-8', default=None):
- """Constructor for JSONEncoder, with sensible defaults.
-
- If skipkeys is false, then it is a TypeError to attempt
- encoding of keys that are not str, int, long, float or None. If
- skipkeys is True, such items are simply skipped.
-
- If ensure_ascii is true, the output is guaranteed to be str
- objects with all incoming unicode characters escaped. If
- ensure_ascii is false, the output will be unicode object.
-
- If check_circular is true, then lists, dicts, and custom encoded
- objects will be checked for circular references during encoding to
- prevent an infinite recursion (which would cause an OverflowError).
- Otherwise, no such check takes place.
-
- If allow_nan is true, then NaN, Infinity, and -Infinity will be
- encoded as such. This behavior is not JSON specification compliant,
- but is consistent with most JavaScript based encoders and decoders.
- Otherwise, it will be a ValueError to encode such floats.
-
- If sort_keys is true, then the output of dictionaries will be
- sorted by key; this is useful for regression tests to ensure
- that JSON serializations can be compared on a day-to-day basis.
-
- If indent is a non-negative integer, then JSON array
- elements and object members will be pretty-printed with that
- indent level. An indent level of 0 will only insert newlines.
- None is the most compact representation.
-
- If specified, separators should be a (item_separator, key_separator)
- tuple. The default is (', ', ': '). To get the most compact JSON
- representation you should specify (',', ':') to eliminate whitespace.
-
- If specified, default is a function that gets called for objects
- that can't otherwise be serialized. It should return a JSON encodable
- version of the object or raise a ``TypeError``.
-
- If encoding is not None, then all input strings will be
- transformed into unicode using that encoding prior to JSON-encoding.
- The default is UTF-8.
-
- """
-
- self.skipkeys = skipkeys
- self.ensure_ascii = ensure_ascii
- self.check_circular = check_circular
- self.allow_nan = allow_nan
- self.sort_keys = sort_keys
- self.indent = indent
- if separators is not None:
- self.item_separator, self.key_separator = separators
- if default is not None:
- self.default = default
- self.encoding = encoding
-
- def default(self, o):
- """Implement this method in a subclass such that it returns
- a serializable object for ``o``, or calls the base implementation
- (to raise a ``TypeError``).
-
- For example, to support arbitrary iterators, you could
- implement default like this::
-
- def default(self, o):
- try:
- iterable = iter(o)
- except TypeError:
- pass
- else:
- return list(iterable)
- return JSONEncoder.default(self, o)
-
- """
- raise TypeError(repr(o) + " is not JSON serializable")
-
- def encode(self, o):
- """Return a JSON string representation of a Python data structure.
-
- >>> JSONEncoder().encode({"foo": ["bar", "baz"]})
- '{"foo": ["bar", "baz"]}'
-
- """
- # This is for extremely simple cases and benchmarks.
- if isinstance(o, basestring):
- if isinstance(o, str):
- _encoding = self.encoding
- if (_encoding is not None
- and not (_encoding == 'utf-8')):
- o = o.decode(_encoding)
- if self.ensure_ascii:
- return encode_basestring_ascii(o)
- else:
- return encode_basestring(o)
- # This doesn't pass the iterator directly to ''.join() because the
- # exceptions aren't as detailed. The list call should be roughly
- # equivalent to the PySequence_Fast that ''.join() would do.
- chunks = self.iterencode(o, _one_shot=True)
- if not isinstance(chunks, (list, tuple)):
- chunks = list(chunks)
- return ''.join(chunks)
-
- def iterencode(self, o, _one_shot=False):
- """Encode the given object and yield each string
- representation as available.
-
- For example::
-
- for chunk in JSONEncoder().iterencode(bigobject):
- mysocket.write(chunk)
-
- """
- if self.check_circular:
- markers = {}
- else:
- markers = None
- if self.ensure_ascii:
- _encoder = encode_basestring_ascii
- else:
- _encoder = encode_basestring
- if self.encoding != 'utf-8':
- def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding):
- if isinstance(o, str):
- o = o.decode(_encoding)
- return _orig_encoder(o)
-
- def floatstr(o, allow_nan=self.allow_nan, _repr=FLOAT_REPR, _inf=INFINITY, _neginf=-INFINITY):
- # Check for specials. Note that this type of test is processor- and/or
- # platform-specific, so do tests which don't depend on the internals.
-
- if o != o:
- text = 'NaN'
- elif o == _inf:
- text = 'Infinity'
- elif o == _neginf:
- text = '-Infinity'
- else:
- return _repr(o)
-
- if not allow_nan:
- raise ValueError(
- "Out of range float values are not JSON compliant: " +
- repr(o))
-
- return text
-
-
- if _one_shot and c_make_encoder is not None and not self.indent and not self.sort_keys:
- _iterencode = c_make_encoder(
- markers, self.default, _encoder, self.indent,
- self.key_separator, self.item_separator, self.sort_keys,
- self.skipkeys, self.allow_nan)
- else:
- _iterencode = _make_iterencode(
- markers, self.default, _encoder, self.indent, floatstr,
- self.key_separator, self.item_separator, self.sort_keys,
- self.skipkeys, _one_shot)
- return _iterencode(o, 0)
-
-def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, _key_separator, _item_separator, _sort_keys, _skipkeys, _one_shot,
- ## HACK: hand-optimized bytecode; turn globals into locals
- False=False,
- True=True,
- ValueError=ValueError,
- basestring=basestring,
- dict=dict,
- float=float,
- id=id,
- int=int,
- isinstance=isinstance,
- list=list,
- long=long,
- str=str,
- tuple=tuple,
- ):
-
- def _iterencode_list(lst, _current_indent_level):
- if not lst:
- yield '[]'
- return
- if markers is not None:
- markerid = id(lst)
- if markerid in markers:
- raise ValueError("Circular reference detected")
- markers[markerid] = lst
- buf = '['
- if _indent is not None:
- _current_indent_level += 1
- newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
- separator = _item_separator + newline_indent
- buf += newline_indent
- else:
- newline_indent = None
- separator = _item_separator
- first = True
- for value in lst:
- if first:
- first = False
- else:
- buf = separator
- if isinstance(value, basestring):
- yield buf + _encoder(value)
- elif value is None:
- yield buf + 'null'
- elif value is True:
- yield buf + 'true'
- elif value is False:
- yield buf + 'false'
- elif isinstance(value, (int, long)):
- yield buf + str(value)
- elif isinstance(value, float):
- yield buf + _floatstr(value)
- else:
- yield buf
- if isinstance(value, (list, tuple)):
- chunks = _iterencode_list(value, _current_indent_level)
- elif isinstance(value, dict):
- chunks = _iterencode_dict(value, _current_indent_level)
- else:
- chunks = _iterencode(value, _current_indent_level)
- for chunk in chunks:
- yield chunk
- if newline_indent is not None:
- _current_indent_level -= 1
- yield '\n' + (' ' * (_indent * _current_indent_level))
- yield ']'
- if markers is not None:
- del markers[markerid]
-
- def _iterencode_dict(dct, _current_indent_level):
- if not dct:
- yield '{}'
- return
- if markers is not None:
- markerid = id(dct)
- if markerid in markers:
- raise ValueError("Circular reference detected")
- markers[markerid] = dct
- yield '{'
- if _indent is not None:
- _current_indent_level += 1
- newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
- item_separator = _item_separator + newline_indent
- yield newline_indent
- else:
- newline_indent = None
- item_separator = _item_separator
- first = True
- if _sort_keys:
- items = dct.items()
- items.sort(key=lambda kv: kv[0])
- else:
- items = dct.iteritems()
- for key, value in items:
- if isinstance(key, basestring):
- pass
- # JavaScript is weakly typed for these, so it makes sense to
- # also allow them. Many encoders seem to do something like this.
- elif isinstance(key, float):
- key = _floatstr(key)
- elif key is True:
- key = 'true'
- elif key is False:
- key = 'false'
- elif key is None:
- key = 'null'
- elif isinstance(key, (int, long)):
- key = str(key)
- elif _skipkeys:
- continue
- else:
- raise TypeError("key " + repr(key) + " is not a string")
- if first:
- first = False
- else:
- yield item_separator
- yield _encoder(key)
- yield _key_separator
- if isinstance(value, basestring):
- yield _encoder(value)
- elif value is None:
- yield 'null'
- elif value is True:
- yield 'true'
- elif value is False:
- yield 'false'
- elif isinstance(value, (int, long)):
- yield str(value)
- elif isinstance(value, float):
- yield _floatstr(value)
- else:
- if isinstance(value, (list, tuple)):
- chunks = _iterencode_list(value, _current_indent_level)
- elif isinstance(value, dict):
- chunks = _iterencode_dict(value, _current_indent_level)
- else:
- chunks = _iterencode(value, _current_indent_level)
- for chunk in chunks:
- yield chunk
- if newline_indent is not None:
- _current_indent_level -= 1
- yield '\n' + (' ' * (_indent * _current_indent_level))
- yield '}'
- if markers is not None:
- del markers[markerid]
-
- def _iterencode(o, _current_indent_level):
- if isinstance(o, basestring):
- yield _encoder(o)
- elif o is None:
- yield 'null'
- elif o is True:
- yield 'true'
- elif o is False:
- yield 'false'
- elif isinstance(o, (int, long)):
- yield str(o)
- elif isinstance(o, float):
- yield _floatstr(o)
- elif isinstance(o, (list, tuple)):
- for chunk in _iterencode_list(o, _current_indent_level):
- yield chunk
- elif isinstance(o, dict):
- for chunk in _iterencode_dict(o, _current_indent_level):
- yield chunk
- else:
- if markers is not None:
- markerid = id(o)
- if markerid in markers:
- raise ValueError("Circular reference detected")
- markers[markerid] = o
- o = _default(o)
- for chunk in _iterencode(o, _current_indent_level):
- yield chunk
- if markers is not None:
- del markers[markerid]
-
- return _iterencode
+++ /dev/null
-"""JSON token scanner
-"""
-import re
-try:
- from simplejson._speedups import make_scanner as c_make_scanner
-except ImportError:
- c_make_scanner = None
-
-__all__ = ['make_scanner']
-
-NUMBER_RE = re.compile(
- r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?',
- (re.VERBOSE | re.MULTILINE | re.DOTALL))
-
-def py_make_scanner(context):
- parse_object = context.parse_object
- parse_array = context.parse_array
- parse_string = context.parse_string
- match_number = NUMBER_RE.match
- encoding = context.encoding
- strict = context.strict
- parse_float = context.parse_float
- parse_int = context.parse_int
- parse_constant = context.parse_constant
- object_hook = context.object_hook
-
- def _scan_once(string, idx):
- try:
- nextchar = string[idx]
- except IndexError:
- raise StopIteration
-
- if nextchar == '"':
- return parse_string(string, idx + 1, encoding, strict)
- elif nextchar == '{':
- return parse_object((string, idx + 1), encoding, strict, _scan_once, object_hook)
- elif nextchar == '[':
- return parse_array((string, idx + 1), _scan_once)
- elif nextchar == 'n' and string[idx:idx + 4] == 'null':
- return None, idx + 4
- elif nextchar == 't' and string[idx:idx + 4] == 'true':
- return True, idx + 4
- elif nextchar == 'f' and string[idx:idx + 5] == 'false':
- return False, idx + 5
-
- m = match_number(string, idx)
- if m is not None:
- integer, frac, exp = m.groups()
- if frac or exp:
- res = parse_float(integer + (frac or '') + (exp or ''))
- else:
- res = parse_int(integer)
- return res, m.end()
- elif nextchar == 'N' and string[idx:idx + 3] == 'NaN':
- return parse_constant('NaN'), idx + 3
- elif nextchar == 'I' and string[idx:idx + 8] == 'Infinity':
- return parse_constant('Infinity'), idx + 8
- elif nextchar == '-' and string[idx:idx + 9] == '-Infinity':
- return parse_constant('-Infinity'), idx + 9
- else:
- raise StopIteration
-
- return _scan_once
-
-make_scanner = c_make_scanner or py_make_scanner
+++ /dev/null
-r"""Command-line tool to validate and pretty-print JSON
-
-Usage::
-
- $ echo '{"json":"obj"}' | python -m simplejson.tool
- {
- "json": "obj"
- }
- $ echo '{ 1.2:3.4}' | python -m simplejson.tool
- Expecting property name: line 1 column 2 (char 2)
-
-"""
-import sys
-import simplejson
-
-def main():
- if len(sys.argv) == 1:
- infile = sys.stdin
- outfile = sys.stdout
- elif len(sys.argv) == 2:
- infile = open(sys.argv[1], 'rb')
- outfile = sys.stdout
- elif len(sys.argv) == 3:
- infile = open(sys.argv[1], 'rb')
- outfile = open(sys.argv[2], 'wb')
- else:
- raise SystemExit(sys.argv[0] + " [infile [outfile]]")
- try:
- obj = simplejson.load(infile)
- except ValueError, e:
- raise SystemExit(e)
- simplejson.dump(obj, outfile, sort_keys=True, indent=4)
- outfile.write('\n')
-
-
-if __name__ == '__main__':
- main()
This service checks the installed XBMC version against the next available one and notifies you if there is a new version available.
When a new version comes out the versions.txt should be updated to reflect the latest version available.
-When updating the version.txt always put latest release at the top since the list is read in chronological order.
+When updating the version.txt always put latest release at the top since the list is read in chronilogical order.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="service.xbmc.versioncheck"
name="XBMC Version Check"
- version="0.1.2"
+ version="0.1.11"
provider-name="Team XBMC">
<requires>
<import addon="xbmc.addon" version="12.0.0"/>
<import addon="xbmc.python" version="2.1.0"/>
- <import addon="script.module.simplejson" version="2.0.10"/>
</requires>
<extension point="xbmc.service" library="service.py" start="login"/>
<extension point="xbmc.addon.metadata">
+ <summary lang="be">XBMC Version Check checks if you are running latest released version.</summary>
+ <summary lang="bg">XBMC Version Check проверява ползвате ли най-новата версия на XBMC.</summary>
+ <summary lang="de">XBMC Version-Check prüft, ob die neuste Version von XBMC installiert ist.</summary>
+ <summary lang="el">Ο Έλεγχος Έκδοσης XBMC εξετάζει αν έχετε την πιο πρόσφατη έκδοση του προγράμματος.</summary>
<summary lang="en">XBMC Version Check checks if you are running latest released version.</summary>
+ <summary lang="es">XBMC Version Check comprueba si está ejecutando la última versión de XBMC.</summary>
+ <summary lang="es_MX">Comprobador de Version de XBMC comprueba si se esta ejecutando ultima version publicada.</summary>
+ <summary lang="fr">XBMC Version Check vérifie si vous utilisez la dernière version disponible.</summary>
+ <summary lang="gl">XBMC Version Check verifica se está a executar a última versión.</summary>
+ <summary lang="he">XBMC Version Check בודק אם אתה מפעיל את הגרסה הרשמית האחרונה.</summary>
+ <summary lang="hr">XBMC provjeritelj inačice provjerava imate li posljednju inačicu izdanja.</summary>
+ <summary lang="hu">Az XBMC verzió ellenőrző megvizsgálja, hogy a legújabb kiadást futtatja-e.</summary>
+ <summary lang="id">XBMC Version Check mengecek apakah Anda menggunakan versi rilis terbaru.</summary>
+ <summary lang="it">XBMC Version Check verifica se hai l'ultima versione rilasciata</summary>
+ <summary lang="ko">XBMC Version Checks는 최신 정식 릴리즈 버전을 사용중인지 검사해줍니다.</summary>
+ <summary lang="nl">XBMC Versie Check controleert of je de laatst beschikbare versie hebt.</summary>
+ <summary lang="no">XBMC Versjonsettersyn sjekker om du kjører den sist utgitte versjonen.</summary>
+ <summary lang="pl">XBMC Version Check sprawdza czy używasz najnowszą wersję.</summary>
+ <summary lang="pt">O XBMC Version Check verifica se a sua versão de lançamento do XBMC está actualizada.</summary>
+ <summary lang="pt_BR">XBMC Version Check verifica se você está executando a versão mais recente.</summary>
+ <summary lang="ru">XBMC Version Check проверяет если вы используете последнюю версию</summary>
+ <summary lang="sv">XBMC Version Check kontrollerar om du använder den senaste versionen.</summary>
+ <summary lang="zh">XBMC版本检查检查你使用的是否为最新发布的版本。</summary>
+ <description lang="be">XBMC Version Check only supports a number of platforms/distros as releases may differ between them. For more information visit the xbmc.org website.</description>
+ <description lang="bg">XBMC Version Check поддържа няколко платформи/дистрибуции. За повече информация посетете страницата www.xbmc.org.</description>
+ <description lang="de">XBMC Versions-Check unterstützt nur ein paar Plattformen/Distributionen, da sich die jeweiligen Veröffentlichungen unterscheiden können. Für weitere Informationen besuche die xbmc.org-Website.</description>
+ <description lang="el">Ο Έλεγχος Έκδοσης XBMC υποστηρίζει μόνο ορισμένα λειτουργικά συστήματα/διανομές, καθώς οι εκδόσεις διαφέρουν για το καθένα. Για περισσότερες πληροφορίες επισκεφθείτε το xbmc.org</description>
<description lang="en">XBMC Version Check only supports a number of platforms/distros as releases may differ between them. For more information visit the xbmc.org website.</description>
+ <description lang="es">XBMC Version Check solo soporta un número limitado de plataformas/distribuciones, ya que los lanzamientos pueden diferir entre ellos. Para más información, visite la web de xbmc.org.</description>
+ <description lang="fr">XBMC Version Check supporte seulement un nombre de plateformes/distributions qui peuvent varier entre elles. Visitez le site internet xbmc.org pour plus d'informations.</description>
+ <description lang="gl">XBMC Version Check só soporta un número limitado de plataformas/distribucións, xa que os lanzamentos poden diferir entre eles. Para máis información visitar o sitio web de xbmc.org.</description>
+ <description lang="he">XBMC Version Check תומך רק במספר פלטפורמות/הפצות מאחר שסימון הגרסאות שונה בין אחת לשניה. למידע נוסף בקר באתר xbmc.org.</description>
+ <description lang="hr">XBMC provjeritelj inačice samo podržava broj platformi/distribucija koliko to dopuštaju pojedina izdanja. Za više informacija posjetite xbmc.org web stranicu.</description>
+ <description lang="hu">Az XBMC verzió-ellenőrző csak néhány platformot / disztribúciót támogat, mert a kiadások között különbségek lehetnek. További információkért keresse fel az xbmc.org oldalt.</description>
+ <description lang="id">XBMC Version Check hanya mendukung beberapa platform/distro karena rilisnya mungkin berbeda-beda. Untuk informasi lebih lanjut kunjungi situs xbmc.org.</description>
+ <description lang="it">XBMC Version Check supporta un numero di piattaforme e distribuzioni diverse tra loro. Per più informazioni visita il sito xbmc.org</description>
+ <description lang="nl">XBMC Version Check ondersteunt maar enkele platforms/distros omdat er verschil kan zijn tussen versies. Voor meer informatie bezoek XBMC.org website.</description>
+ <description lang="no">XBMC Versjonsettersyn støtter kun noen plattformer/distribusjoner fordi utgivelser kan være forskjellige mellom dem. Besøk xbmc.org for mer informasjon.</description>
+ <description lang="pl">XBMC Version Check wspiera część platform/dystrybucji, jako że wydania mogą się różnić. Po więcej informacji odwiedź stronę xbmc.org.</description>
+ <description lang="pt">O XBMC Version Check suporta apenas algumas plataformas/distribuições, porque os lançamentos podem não ser sempre idênticos. Para mais informação, visite o site xbmc.org.</description>
+ <description lang="pt_BR">XBMC Version Check somente suporta algumas plataformas/distros, que podem variar entre si. Para maiores informações visite o website xbmc.org</description>
+ <description lang="sv">XBMC Version Check stöder endeast ett antal plattformar/distributioner eftersom utgivningar kan skilja mellan dessa. För mer information besök xbmc.org webplatsen.</description>
+ <description lang="zh">XBMC版本检查只支持部分平台/发行版,它们之间的版本可能会有所不同。欲了解更多信息,请访问的xbmc.org网站。</description>
+ <disclaimer lang="be">Feel free to use this script. For information visit xbmc.org</disclaimer>
+ <disclaimer lang="bg">Спокойно можете да ползвате скрипта за собствени цели. За информация посетете www.xbmc.org</disclaimer>
+ <disclaimer lang="de">Zögere nicht dieses Script zu benutzen. Für Informationen besuche xbmc.org</disclaimer>
+ <disclaimer lang="el">Χρησιμοποιήστε αυτό το script ελεύθερα. Για πληροφορίες επισκεφθείτε το xbmc.org</disclaimer>
<disclaimer lang="en">Feel free to use this script. For information visit xbmc.org</disclaimer>
+ <disclaimer lang="es">Puede usar libremente este programa. Para más información, visite xbmc.org</disclaimer>
+ <disclaimer lang="es_MX">Sientase libre de utilizar este script. Para mas información visita xbmc.org</disclaimer>
+ <disclaimer lang="fr">Utilisez ce script si vous le désirez. Visitez le site Internet xbmc.org pour plus d'informations.</disclaimer>
+ <disclaimer lang="gl">Síntase libre de usar este script, para máis información visitar xbmc.org.</disclaimer>
+ <disclaimer lang="he">תרגיש חופשי להשתמש בסקריפט זה. למידע נוסף בקר בכתובת xbmc.org</disclaimer>
+ <disclaimer lang="hr">Slobodno koristite ovu skriptu. Za više informacija posjetite xbmc.org</disclaimer>
+ <disclaimer lang="hu">Használja bátran ezt a szkriptet! Információkért keresse fel az xbmc.org oldalt!</disclaimer>
+ <disclaimer lang="id">Jangan sungkan menggunakan script ini. Untuk informasi hubungi xbmc.org</disclaimer>
+ <disclaimer lang="it">Usa liberamente lo script. Per informazioni visita xbmc.org</disclaimer>
+ <disclaimer lang="ko">이 스크립트를 자유롭게 사용하세요. 관련 정보는 xbmc.org를 방문하세요.</disclaimer>
+ <disclaimer lang="nl">Gebruik dit script vrijblijvend. Voor meer informatie bezoek XBMC.org</disclaimer>
+ <disclaimer lang="no">Du har fri tillatelse til å benytte dette skriptet. Besøk xbmc.org for informasjon</disclaimer>
+ <disclaimer lang="pl">Zapraszamy do używania skryptu. Po więcej informacji odwiedź xbmc.org</disclaimer>
+ <disclaimer lang="pt">Esteja à vontade para usar este script. Para mais informação, visite xbmc.org.</disclaimer>
+ <disclaimer lang="pt_BR">Sinta-se livre para usar este script. Para informações, visite xbmc.org</disclaimer>
+ <disclaimer lang="ru">Используйте этот скрипт на свое усмотрение. Для информации посетите xbmc.org</disclaimer>
+ <disclaimer lang="sv">Använd gärna detta skript. För information, besök xbmc.org</disclaimer>
+ <disclaimer lang="zh">请随意使用此脚本,更多信息访问xbmc.org</disclaimer>
<license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
<platform>osx osx32 osx64 ios windx wingl linux</platform>
<website>http://xbmc.org</website>
<source>https://github.com/XBMC-Addons/service.xbmc.versioncheck</source>
<forum>http://forum.xbmc.org/showthread.php?tid=160228</forum>
- <email></email>
+ <email></email>
</extension>
</addon>
+v0.1.11
+- Updated language files from Transifex
+- Fix problems with python2.7.5
+- Update with 13.0 Gotham_alpha8
+
+v0.1.11
+- Update with 13.0 Gotham_alpha7
+
+v0.1.9
+- Update with 13.0 Gotham_alpha6
+- Updated language files from Transifex
+
+v0.1.7
+- Update with 13.0 Gotham_alpha5
+
+v0.1.7
+- Update with 13.0 Gotham_alpha4
+
+v0.1.6
+- Update with 12.2 Frodo stable
+- Added Linux full system upgrade
+
+v0.1.5
+- Update with 13.0 Gotham_alpha3
+
+v0.1.4
+- We can now upgrade xbmc on Linux. This works either via polkit or shell wrapper as fallback
+
+v0.1.3
+- Update with 13.0 Gotham_alpha2
+
v0.1.2
- Add notification for Ubuntu users checking through apt command
v0.1.1
-- Initial version
\ No newline at end of file
+- Initial version
--- /dev/null
+from common import *
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013 Team-XBMC
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+import xbmc
+from common import *
+
+try:
+ #import apt
+ import apt
+ from aptdaemon import client
+ from aptdaemon import errors
+except:
+ log('python apt import error')
+
+class AptdeamonHandler:
+
+ def __init__(self):
+ self.aptclient = client.AptClient()
+
+ def _check_versions(self, package):
+ if not self._update_cache():
+ return False, False
+ try:
+ trans = self.aptclient.upgrade_packages([package])
+ #trans = self.aptclient.upgrade_packages("bla")
+ trans.simulate(reply_handler=self._apttransstarted, error_handler=self._apterrorhandler)
+ pkg = trans.packages[4][0]
+ if pkg == package:
+ cache=apt.Cache()
+ cache.open(None)
+ cache.upgrade()
+ if cache[pkg].installed:
+ return cache[pkg].installed.version, cache[pkg].candidate.version
+
+ return False, False
+
+ except Exception as error:
+ log("Exception while checking versions: %s" %error)
+ return False, False
+
+ def _update_cache(self):
+ try:
+ if self.aptclient.update_cache(wait=True) == "exit-success":
+ return True
+ else:
+ return False
+ except errors.NotAuthorizedError:
+ log("You are not allowed to update the cache")
+ return False
+
+ def check_upgrade_available(self, package):
+ '''returns True if newer package is available in the repositories'''
+ installed, candidate = self._check_versions(package)
+ if installed and candidate:
+ if installed != candidate:
+ log("Version installed %s" %installed)
+ log("Version available %s" %candidate)
+ return True
+ else:
+ log("Already on newest version")
+ elif not installed:
+ log("No installed package found")
+ return False
+ else:
+ return False
+
+ def upgrade_package(self, package):
+ try:
+ log("Installing new version")
+ if self.aptclient.upgrade_packages([package], wait=True) == "exit-success":
+ log("Upgrade successful")
+ return True
+ except Exception as error:
+ log("Exception during upgrade: %s" %error)
+ return False
+
+ def upgrade_system(self):
+ try:
+ log("Upgrading system")
+ if self.aptclient.upgrade_system(wait=True) == "exit-success":
+ return True
+ except Exception as error:
+ log("Exception during system upgrade: %s" %error)
+ return False
+
+ def _getpassword(self):
+ if len(self._pwd) == 0:
+ self._pwd = get_password_from_user()
+ return self._pwd
+
+ def _apttransstarted(self):
+ pass
+
+ def _apterrorhandler(self, error):
+ log("Apt Error %s" %error)
\ No newline at end of file
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013 Team-XBMC
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+import xbmc
+import xbmcaddon
+import xbmcgui
+import xbmcvfs
+
+__addon__ = xbmcaddon.Addon()
+__addonversion__ = __addon__.getAddonInfo('version')
+__addonname__ = __addon__.getAddonInfo('name')
+__addonpath__ = __addon__.getAddonInfo('path').decode('utf-8')
+__icon__ = __addon__.getAddonInfo('icon')
+__localize__ = __addon__.getLocalizedString
+
+def log(txt):
+ if isinstance (txt,str):
+ txt = txt.decode("utf-8")
+ message = u'%s: %s' % ("XBMC Version Check", txt)
+ xbmc.log(msg=message.encode("utf-8"), level=xbmc.LOGDEBUG)
+
+def get_password_from_user():
+ keyboard = xbmc.Keyboard("", __addonname__ + "," +__localize__(32022), True)
+ keyboard.doModal()
+ if (keyboard.isConfirmed()):
+ pwd = keyboard.getText()
+ return pwd
+
+def message_upgrade_success():
+ xbmc.executebuiltin("XBMC.Notification(%s, %s, %d, %s)" %(__addonname__,
+ __localize__(32013),
+ 15000,
+ __icon__))
+
+def message_restart():
+ if dialog_yesno(32014):
+ xbmc.executebuiltin("RestartApp")
+
+def dialog_yesno(line1 = 0, line2 = 0):
+ return xbmcgui.Dialog().yesno(__addonname__,
+ __localize__(line1),
+ __localize__(line2))
+
+def upgrade_message(msg, upgrade):
+ # Don't show while watching a video
+ while(xbmc.Player().isPlayingVideo() and not xbmc.abortRequested):
+ xbmc.sleep(1000)
+ i = 0
+ while(i < 5 and not xbmc.abortRequested):
+ xbmc.sleep(1000)
+ i += 1
+ # Detect if it's first run and only show OK dialog + ask to disable on that
+ firstrun = __addon__.getSetting("versioncheck_firstrun") != 'false'
+ if firstrun and not xbmc.abortRequested:
+ xbmcgui.Dialog().ok(__addonname__,
+ __localize__(msg),
+ __localize__(32001),
+ __localize__(32002))
+ # sets check to false which is checked on startup
+ if dialog_yesno(32009, 32010):
+ __addon__.setSetting("versioncheck_enable", 'false')
+ # set first run to false to only show a popup next startup / every two days
+ __addon__.setSetting("versioncheck_firstrun", 'false')
+ # Show notification after firstrun
+ elif not xbmc.abortRequested:
+ if upgrade:
+ return dialog_yesno(msg)
+ else:
+ xbmc.executebuiltin("XBMC.Notification(%s, %s, %d, %s)" %(__addonname__,
+ __localize__(32001) + '' + __localize__(32002),
+ 15000,
+ __icon__))
+ else:
+ pass
\ No newline at end of file
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013 Team-XBMC
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+import os
+import sys
+import xbmc
+import xbmcaddon
+import xbmcvfs
+import lib.common
+from lib.common import log
+
+__addonpath__ = lib.common.__addonpath__
+
+import json as jsoninterface
+
+def get_installedversion():
+ # retrieve current installed version
+ json_query = xbmc.executeJSONRPC('{ "jsonrpc": "2.0", "method": "Application.GetProperties", "params": {"properties": ["version", "name"]}, "id": 1 }')
+ json_query = unicode(json_query, 'utf-8', errors='ignore')
+ json_query = jsoninterface.loads(json_query)
+ version_installed = []
+ if json_query.has_key('result') and json_query['result'].has_key('version'):
+ version_installed = json_query['result']['version']
+ log("Version installed %s" %version_installed)
+ return version_installed
+
+def get_versionfilelist():
+ # retrieve versionlists from supplied version file
+ version_file = os.path.join(__addonpath__, 'resources/versions.txt')
+ # Eden didn't have xbmcvfs.File()
+ if xbmcaddon.Addon('xbmc.addon').getAddonInfo('version') < "11.9.3":
+ file = open(version_file, 'r')
+ else:
+ file = xbmcvfs.File(version_file)
+ data = file.read()
+ file.close()
+ version_query = unicode(data, 'utf-8', errors='ignore')
+ version_query = jsoninterface.loads(version_query)
+ return version_query
\ No newline at end of file
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013 Team-XBMC
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+import xbmc
+from common import *
+
+try:
+ from subprocess import check_output
+ from subprocess import call
+except:
+ log('subprocess import error')
+
+
+class ShellHandlerApt:
+
+ _pwd = ""
+
+ def __init__(self, usesudo=False):
+ self.sudo = usesudo
+ installed, candidate = self._check_versions("xbmc", False)
+ if not installed:
+ # there is no package installed via repo, so we exit here
+ log("No installed package found, exiting")
+ import sys
+ sys.exit(0)
+
+ def _check_versions(self, package, update=True):
+ _cmd = "apt-cache policy " + package
+
+ if update and not self._update_cache():
+ return False, False
+
+ try:
+ result = check_output([_cmd], shell=True).split("\n")
+ except Exception as error:
+ log("ShellHandlerApt: exception while executing shell command %s: %s" %(_cmd, error))
+ return False, False
+
+ if result[0].replace(":", "") == package:
+ installed = result[1].split()[1]
+ candidate = result[2].split()[1]
+ if installed == "(none)":
+ installed = False
+ if candidate == "(none)":
+ candiate = False
+ return installed, candidate
+ else:
+ log("ShellHandlerApt: error during version check")
+ return False, False
+
+ def _update_cache(self):
+ _cmd = 'apt-get update'
+ try:
+ if self.sudo:
+ x = check_output('echo \'%s\' | sudo -S %s' %(self._getpassword(), _cmd), shell=True)
+ else:
+ x = check_output(_cmd.split())
+ except Exception as error:
+ log("Exception while executing shell command %s: %s" %(_cmd, error))
+ return False
+
+ return True
+
+ def check_upgrade_available(self, package):
+ '''returns True if newer package is available in the repositories'''
+ installed, candidate = self._check_versions(package)
+ if installed and candidate:
+ if installed != candidate:
+ log("Version installed %s" %installed)
+ log("Version available %s" %candidate)
+ return True
+ else:
+ log("Already on newest version")
+ elif not installed:
+ log("No installed package found")
+ return False
+ else:
+ return False
+
+ def upgrade_package(self, package):
+ _cmd = "apt-get install -y " + package
+ try:
+ if self.sudo:
+ x = check_output('echo \'%s\' | sudo -S %s' %(self._getpassword(), _cmd), shell=True)
+ else:
+ x = check_output(_cmd.split())
+ log("Upgrade successful")
+ except Exception as error:
+ log("Exception while executing shell command %s: %s" %(_cmd, error))
+ return False
+
+ return True
+
+ def upgrade_system(self):
+ _cmd = "apt-get upgrade -y"
+ try:
+ log("Upgrading system")
+ if self.sudo:
+ x = check_output('echo \'%s\' | sudo -S %s' %(self._getpassword(), _cmd), shell=True)
+ else:
+ x = check_output(_cmd.split())
+ except Exception as error:
+ log("Exception while executing shell command %s: %s" %(_cmd, error))
+ return False
+
+ return True
+
+ def _getpassword(self):
+ if len(self._pwd) == 0:
+ self._pwd = get_password_from_user()
+ return self._pwd
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013 Team-XBMC
+#
+# 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 3 of the License, 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+from lib.common import log
+
+def compare_version(version_installed, versionlist):
+ # Create seperate version lists
+ versionlist_stable = versionlist['releases']['stable']
+ versionlist_rc = versionlist['releases']['releasecandidate']
+ versionlist_beta = versionlist['releases']['beta']
+ versionlist_alpha = versionlist['releases']['alpha']
+ versionlist_prealpha = versionlist['releases']['prealpha']
+ ### Check to upgrade to newest available stable version
+ # check on smaller major version. Smaller version than available always notify
+ oldversion = False
+ msg = ''
+ if version_installed['major'] < int(versionlist_stable[0]['major']):
+ msg = 32003
+ oldversion = True
+ log("Version available %s" %versionlist_stable[0])
+
+ # check on same major version installed and available
+ elif version_installed['major'] == int(versionlist_stable[0]['major']):
+ # check on smaller minor version
+ if version_installed['minor'] < int(versionlist_stable[0]['minor']):
+ msg = 32003
+ oldversion = True
+ log("Version available %s" %versionlist_stable[0])
+ # check if not installed a stable so always notify
+ elif version_installed['minor'] == int(versionlist_stable[0]['minor']) and version_installed['tag'] != "stable":
+ msg = 32008
+ oldversion = True
+ log("Version available %s" %versionlist_stable[0])
+ else:
+ log("Last available stable installed")
+
+ ### Check to upgrade to newest available RC version if not installed stable
+ ## Check also oldversion hasn't been set true by previous check because if so this need to be skipped
+ if not oldversion and version_installed['tag'] != "stable":
+ if 'revision' in version_installed.keys():
+ # only check on equal or lower major because newer installed beta/alpha/prealpha version will be higher
+ if versionlist_rc and version_installed['major'] <= int(versionlist_rc[0]['major']):
+ if version_installed['revision'] <= versionlist_rc[0]['revision']:
+ msg = 32004
+ oldversion = True
+ log("Version available %s" %versionlist_rc[0])
+
+ # exclude if installed RC on checking for newer beta
+ if not oldversion and versionlist_beta and version_installed['tag'] not in ["releasecandidate"]:
+ if version_installed['major'] <= int(versionlist_beta[0]['major']):
+ if version_installed['revision'] < versionlist_beta[0]['revision']:
+ msg = 32005
+ oldversion = True
+ log("Version available %s" %versionlist_beta[0])
+
+ # exclude if installed RC or beta on checking for newer alpha
+ if not oldversion and versionlist_alpha and version_installed['tag'] not in ["releasecandidate", "beta"]:
+ if version_installed['major'] <= int(versionlist_alpha[0]['major']):
+ if version_installed['revision'] < versionlist_alpha[0]['revision']:
+ msg = 32006
+ oldversion = True
+ log("Version available %s" %versionlist_alpha[0])
+
+ # exclude if installed RC, beta or alpha on checking for newer prealpha
+ if not oldversion and versionlist_prealpha and version_installed['tag'] not in ["releasecandidate", "beta", "alpha"]:
+ if version_installed['major'] <= int(versionlist_prealpha[0]['major']):
+ if version_installed['revision'] < versionlist_prealpha[0]['revision']:
+ msg = 32007
+ oldversion = True
+ log("Version available %s" %versionlist_prealpha[0])
+
+ log("Nothing to see here, move along. Running a latest non stable release")
+ # Nothing to see here, move along
+ else:
+ log("Nothing to see here, move along. Running a stable release")
+ # Nothing to see here, move along
+ pass
+ return oldversion, msg
\ No newline at end of file
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Afrikaans (http://www.transifex.com/projects/p/xbmc-addons/language/af/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: af\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Algemeen"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Albanian (http://www.transifex.com/projects/p/xbmc-addons/language/sq/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sq\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Të përgjithshëm"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Amharic (http://www.transifex.com/projects/p/xbmc-addons/language/am/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: am\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "ባጠቃላይ"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Arabic (http://www.transifex.com/projects/p/xbmc-addons/language/ar/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ar\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "عام"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Basque (http://www.transifex.com/projects/p/xbmc-addons/language/eu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: eu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Orokorra"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Belarusian (http://www.transifex.com/projects/p/xbmc-addons/language/be/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: be\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "We would like to recommend you to upgrade."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Visit XBMC.org for more information."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "You are still using an older stable version of XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "You are still using an older RC version of XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "You are still using an older beta version of XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "You are still using an older alpha version of XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "You are still using an older monthly version of XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "You are still using an older non stable version of XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Would you like to remove this reminder?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "You can enable/disable it through addon settings."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Use your package manager(apt) to upgrade."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "A new version is available, do you want to upgrade now?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Upgrade successful"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Do you want to restart Xbmc to finish the upgrade?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Do you want to check the repository for a new version?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "General"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Enable XBMC version check?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Please enter your password"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: Upgrade complete system"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Bosnian (http://www.transifex.com/projects/p/xbmc-addons/language/bs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bs\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Opšte"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Bulgarian (http://www.transifex.com/projects/p/xbmc-addons/language/bg/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bg\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Препоръчваме Ви да актуализирате."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Посетете www.xbmc.info за информация."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Ползвате стара стабилна версия на XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Ползвате стара RC версия на XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Ползвате стара бета версия на XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Ползвате стара алфа версия на XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Ползвате стара версия, от месечно компилираните, на XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Ползвате стара нестабилна версия на XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Желаете ли изключите това напомняне?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Можете да включите/изключите напомнянето от настройките на добавката."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Актуализирайте чрез вашия диспeчер на пакети (apt)."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Налична е нова версия. Желаете ли да актуализирате сега?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Актуализирането е успешно"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Желаете ли да рестартирате XBMC, за да приключи актуализирането?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Желаете ли хранилището да бъде проверено за нова версия?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Основни"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Да бъде ли проверяване версията на XBMC?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Моля, въведете паролата си"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Catalan (http://www.transifex.com/projects/p/xbmc-addons/language/ca/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ca\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "General"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/xbmc-addons/language/zh/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "我们建议你升级。"
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "更多信息访问XBMC.org。"
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "您仍在使用一个旧的稳定版XBMC。"
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "您仍在使用一个旧的RC版XBMC。"
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "您仍在使用一个旧的beta版XBMC。"
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "您仍在使用一个旧的alpha版XBMC。"
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "您仍在使用一个旧的月度版XBMC。"
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "您仍在使用一个旧的非稳定版XBMC。"
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "你想移除此提醒吗?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "你可以通过插件设置来启用/禁用它。"
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "使用你的软件包管理器(apt)升级。"
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "新版可用,你现在要升级吗?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "成功升级"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "你要重启XBMC来完成升级吗?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "你要检查库中的新版本吗?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "常用"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "启用XBMC版本检查?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "请输入你的密码"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux:升级完整的系统"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/xbmc-addons/language/zh_TW/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_TW\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "一般設定"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Croatian (http://www.transifex.com/projects/p/xbmc-addons/language/hr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hr\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Želimo vam preproučiti nadogradnju."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Posjetite XBMC.org za više informacija."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Još uvijek koristite stariju stabilnu inačicu XBMC-a."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Još uvijek koristite stariju pred-stabilnu inačicu XBMC-a."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Još uvijek koristite stariju beta inačicu XBMC-a."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Još uvijek koristite stariju alfa inačicu XBMC-a."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Još uvijek koristite stariju mjesečnu inačicu XBMC-a."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Još uvijek koristite stariju nestabilnu inačicu XBMC-a."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Želite li ukloniti ovog podsjetnika?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Možete ga omogućiti/onemogućiti kroz postavke dodatka."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Koristite svoj upravitelj paketa (apt) za nadogradnju."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Nova inačica je dostupna, želite li ju odmah nadograditi?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Nadogradnja uspješna"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Želite li ponovno pokrenuti XBMC za dovršetak nadogradnje?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Želite li provjeriti repozitorij za novu inačicu?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Općenito"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Omogući XBMC provjeritelja inačice?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Upišite svoju lozinku"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: nadogradi cjelokupan sustav"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Czech (http://www.transifex.com/projects/p/xbmc-addons/language/cs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: cs\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Obecné"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Danish (http://www.transifex.com/projects/p/xbmc-addons/language/da/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: da\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Generelt"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Dutch (http://www.transifex.com/projects/p/xbmc-addons/language/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "We bevelen je aan om te upgraden."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Bezoek XBMC.org voor meer informatie."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Je gebruikt nog steeds een oudere stabiele versie van XBMC"
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Je gebruikt nog steeds een oudere RC versie van XBMC"
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Je gebruikt nog steeds een oudere beta versie van XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Je gebruikt nog steeds een oudere alpha versie van XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Je gebruikt nog steeds een oudere maandelijkse versie van XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Je gebruikt nog steeds een oudere niet stabiele versie van XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Will je deze herinneren verwijderen?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Deze kan je aan/uitzetten in addon settings."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Gebruik pakket manager(apt) voor upgraden."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Er is een nieuwe versie beschikbaar, wil je nu upgraden?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Upgrade succesvol"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Wil je XBMC opnieuw starten om de upgrade te voltooien?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Wil je de repository controleren op een nieuwe versie?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "XBMC versie controle aanzetten?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Vul uw wachtwoord in"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: Upgrade compleet systeem"
msgid "Use your package manager(apt) to upgrade."
msgstr ""
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr ""
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr ""
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr ""
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr ""
+
+#empty strings from id 32016 to 32019
+
msgctxt "#32020"
msgid "General"
msgstr ""
msgctxt "#32021"
msgid "Enable XBMC version check?"
-msgstr ""
\ No newline at end of file
+msgstr ""
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr ""
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr ""
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Esperanto (http://www.transifex.com/projects/p/xbmc-addons/language/eo/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: eo\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Generalo"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Estonian (http://www.transifex.com/projects/p/xbmc-addons/language/et/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: et\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Üldine"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Finnish (http://www.transifex.com/projects/p/xbmc-addons/language/fi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Yleinen"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: French (http://www.transifex.com/projects/p/xbmc-addons/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Nous vous recommandons de mettre à jour XBMC."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Visitez xbmc.org pour plus d'informations."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Vous utilisez toujours une ancienne version stable d'XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Vous utilisez toujours une ancienne version RC d'XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Vous utilisez toujours une ancienne version béta d'XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Vous utilisez toujours une ancienne version alpha d'XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Vous utilisez toujours une ancienne version mensuelle d'XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Vous utilisez toujours une ancienne version non stable d'XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Souhaitez-vous supprimer ce rappel ?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Vous pouvez l'activer/désactiver depuis les paramètres de l'extension."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Utilisez votre gestionnaire de paquets (apt) pour mettre à jour."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Une nouvelle version est disponible, souhaitez vous mettre à niveau maintenant ?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Mise à jour réussie"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Voulez-vous redémarrer Xbmc pour terminer la mise à jour ?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Voulez-vous vérifier sur le dépôt s’il existe une nouvelle version?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Général"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Activer XBMC Version Check ?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "S'il vous plaît entrer votre mot de passe"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: Mise à niveau du système terminée"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Galician (http://www.transifex.com/projects/p/xbmc-addons/language/gl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: gl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Gustaríanos recomendarlle actualizar."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Visitar XBMC.org para máis información."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Aínda está a usar unha versión antiga de XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Aínda está a usar unha versión RC antiga de XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Aínda está a usar unha versión beta antiga de XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Aínda está a usar unha versión alpha antiga de XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Aínda está a usar unha versión mensual antiga de XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Aínda está a usar unha versión antiga non estábel de XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Quere eliminar este aviso?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Pode des/activarlo mediante a configuración do complemento."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Use o xestor de paquetes(apt) para actualizar."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Hai unha nova versión dispoñíbel, ¿quere actualizar agora?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Actualización correcta"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Quere reiniciar agora o XBMC para rematar a actualización?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Quere buscar no repositorio unha nova versión?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Xeral"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Activar a verificación de versión do XBMC?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Por favor introduza o seu contrasinal"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: Actualizar o sistema completo"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: German (http://www.transifex.com/projects/p/xbmc-addons/language/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Wir empfehlen Ihnen ein Upgrade."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Besuchen Sie XBMC.org für mehr Informationen."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Sie verwenden eine ältere, aber stabile Version von XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Sie verwenden noch eine ältere Version von XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Sie verwenden noch eine ältere BETA-Version von XBMC"
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Sie verwenden noch eine ältere ALPHA-Version von XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Du benutzt noch eine ältere Version von XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Sie verwenden eine ältere, aber stabile Version von XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Möchten Sie diese Erinnerung löschen?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Dies kann in den Addoneinstellungen aktiviert/deaktiviert werden."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Bitte verwenden Sie den Packetmanager (apt) für ein Upgrade."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Eine neue Version ist verfügbar, wollen sie jetzt upgraden?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Upgrade erfolgreich"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Wollen sie Neustarten um das Upgrade zu beenden?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Repository auf eine neue Version überprüfen?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "XBMC Versionsprüfung aktivieren?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Geben Sie ihr Passwort ein"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: Komplettes System aktualisieren"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Greek (http://www.transifex.com/projects/p/xbmc-addons/language/el/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: el\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Θα σας προτείναμε να κάνετε αναβάθμιση."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Επισκεφθείτε το XBMC.org για περισσότερες πληροφορίες."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Χρησιμοποιείτε ακόμη μια παλιά σταθερή έκδοση του XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Χρησιμοποιείτε ακόμη μια παλιά RC έκδοση του XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Χρησιμοποιείτε ακόμη μια παλιά beta έκδοση του XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Χρησιμοποιείτε ακόμη μια παλιά alpha έκδοση του XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Χρησιμοποιείτε ακόμη μια παλιά μηνιαία έκδοση του XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Χρησιμοποιείτε ακόμη μια παλιά μη σταθερή έκδοση του XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Να αφαιρεθεί αυτή η υπενθύμιση;"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Μπορείτε να την (απ)ενεργοποιήσετε από τις ρυθμίσεις του πρόσθετου."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Χρησιμοποιήστε τη διαχείριση πακέτων (apt) για αναβάθμιση."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Μια νέα έκδοση είναι διαθέσιμη, να γίνει αναβάθμιση τώρα;"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Επιτυχής Αναβάθμιση"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Να γίνει επανεκκίνηση του XBMC για να ολοκληρωθεί η αναβάθμιση;"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Να γίνει έλεγχος του αποθετηρίου για νέα έκδοση;"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Γενικά"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Ενεργοποίηση ελέγχου έκδοσης XBMC;"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Παρακαλώ εισάγετε τον κωδικό σας"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: Αναβάθμιση όλου του συστήματος"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Hebrew (http://www.transifex.com/projects/p/xbmc-addons/language/he/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: he\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "אנו ממליצים לך לשדרג."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "בקר ב-XBMC.org למידע נוסף."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "הינך משתמש עדיין בגרסה יציבה ישנה של XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "הינך משתמש עדיין בגרסת RC ישנה של XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "הינך משתמש עדיין בגרסת ביטא ישנה של XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "הינך משתמש עדיין בגרסת אלפא ישנה של XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "הינך משתמש עדיין בגרסה חודשית ישנה של XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "הינך משתמש עדיין בגרסה לא יציבה ישנה של XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "התרצה להסיר תזכורת זאת?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "הינך יכול להפעיל/לנטרל זאת בהגדרות התוסף."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "השתמש במנהל החבילות (apt) לשידרוג."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "גרסה חדשה זמינה, התרצה לעדכן כעת?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "שדרוג התבצע בהצלחה"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "התרצה להפעיל מחדש את XBMC כדי לסיים את השדרוג?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "התרצה לבדוק האם זמינה גרסה חדשה במאגר?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "כללי"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "להפעיל את XBMC version check?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "אנא הזן סיסמתך"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "לינוקס: שדרוג מערכת מלא"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Hindi (Devanagiri) (http://www.transifex.com/projects/p/xbmc-addons/language/hi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "सामान्य"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Hungarian (http://www.transifex.com/projects/p/xbmc-addons/language/hu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Azt ajánljuk Önnek, hogy frissítse a rendszerét."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "További információkért keresse fel az xbmc.org oldalt!"
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Ön még az XBMC egy régebbi, stabil változatát használja."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Ön még az XBMC egy régebbi, kiadás előtti (RC) változatát használja."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Ön még az XBMC egy régebbi, béta változatát használja."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Ön még az XBMC egy régebbi, alfa változatát használja."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Ön még az XBMC egy régebbi, havi kiadású változatát használja."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Ön még az XBMC egy régebbi, kísérleti változatát használja."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Szeretné eltávolítani ezt az emlékeztetőt?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Engedélyezheti / letilthatja a kiegészítő beállításaiban."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Használja a csomagkezelőt (apt) a frissítéshez."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Egy új verzió érhető el, szeretne erre frissíteni?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "A frissítés sikerült."
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Kívánja újraindítani az XBMC-t a frissítés befejezéséhez?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Általános"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Engedélyezi az XBMC verzió ellenőrzését?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Kérjük, adja meg jelszavát"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Icelandic (http://www.transifex.com/projects/p/xbmc-addons/language/is/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: is\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Við mælum með að þú uppfærir."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Farðu inn á XBMC.org til að fá fleiri upplýsingar."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Þú ert enn að nota eldri örugga útgáfu af XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Þú ert enn að nota eldri beta útgáfu af XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Þú ert enn að nota eldri mánaðarlega útgáfu af XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Þú ert enn að nota eldri óörugga útgáfu af XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Viltu fjarlægja þessa áminningu ?"
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Notaðu pakkastjórann (apt) til að uppfæra."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Ný útgáfa er fáanleg, viltu uppfæra núna ?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Uppfærsla heppnaðist"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Viltu endurræsa Xbmc til að ljúka uppfærslu ?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Almennt"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Indonesian (http://www.transifex.com/projects/p/xbmc-addons/language/id/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: id\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Kami merekomendasikan Anda untuk upgrade."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Kunjungi XBMC.org untuk informasi lebih lanjut."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Anda masih menggunakan versi stabil XBMC yang lebih lama."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Anda masih menggunakan versi RC XBMC yang lebih lama."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Anda masih menggunakan versi beta XBMC yang lebih lama."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Anda masih menggunakan versi alpha XBMC yang lebih lama."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Anda masih menggunakan versi bulanan XBMC yang lebih lama."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Anda masih menggunakan versi non-stabil XBMC yang lebih lama."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Apakah anda ingin menghapus pengingat ini?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Anda dapat mengaktifkan/menonaktifkannya melalui pengaturan addon."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Gunakan manajer paket (apt) untuk upgrade."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Versi yang baru sudah tersedia, apakah Anda ingin upgrade sekarang?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Upgrade sukses"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Apakah Anda ingin memulai ulang XBMC untuk menuntaskan proses upgrade?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Apakah Anda ingin memeriksa repositori untuk versi yang baru?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Umum"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Aktifkan pengecekan versi XBMC?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Silakan masukkan kata sandi Anda"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: Upgrade sistem seluruhnya"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Italian (http://www.transifex.com/projects/p/xbmc-addons/language/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Ti raccomandiamo di aggiornare."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Visita XBMC.org per più informazioni."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Stai ancora usando una vecchia versione stabile di XBMC"
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Stai ancora usando una vecchia versione RC di XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Stai ancora usando una vecchia versione beta di XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Stai ancora usando una vecchia versione alpha di XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Stai ancora usando una vecchia versione mensile di XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Stai ancora usando una vecchia versione non stabile di XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Vuoi eliminare questo promemoria?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Puoi abilitarlo/disabilitarlo dalle impostazioni dell'addon"
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Usa il tuo gestore pacchetti (apt) per aggiornare."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Una nuova versione è disponibile, vuoi aggiornare ora?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Aggiornamento effettuato con successo"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Vuoi riavviare l'XBMC per finire l'aggiornamento?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Vuoi verificare la presenza di un nuovo aggiornamento?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Generale"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Abilita XBMC version check?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Inserisci la tua Password"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: Aggiornamento completo del sistema"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Japanese (http://www.transifex.com/projects/p/xbmc-addons/language/ja/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ja\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "一般"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Korean (http://www.transifex.com/projects/p/xbmc-addons/language/ko/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ko\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "업그레이드를 권장합니다."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "자세한 정보는 XBMC.org를 방문하세요."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "오래된 XBMC 안정 버전을 사용 중입니다."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "오래된 XBMC RC 버전을 사용중입니다."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "오래된 XBMC 베타 버전을 사용 중입니다."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "오래된 XBMC 알파 버전을 사용 중입니다."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "오래된 XBMC monthly 버전을 사용 중입니다."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "오래된 XBMC 불안정 버전을 사용 중입니다."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "이 미리 알림을 삭제하겠습니까?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "추가기능 설정에서 사용/사용하지 않음을 선택할 수 있습니다."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "패키지 관리자(apt)로 업그레이드 하세요."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "새 버전이 사용 가능합니다. 지금 업그레이드 하겠습니까?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "업그레이드 성공"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "업그레이드를 완료하기 위해 XBMC를 다시 시작 하겠습니까?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "저장소에서 새 버전을 확인하겠습니까?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "일반"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "XBMC 버전을 검사하겠습니까?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "패스워드를 입력하세요"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Latvian (http://www.transifex.com/projects/p/xbmc-addons/language/lv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: lv\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Vispārīgi"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xbmc-addons/language/lt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: lt\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Pagrindinis"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Macedonian (http://www.transifex.com/projects/p/xbmc-addons/language/mk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: mk\n"
+"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Општо"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Malay (http://www.transifex.com/projects/p/xbmc-addons/language/ms/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ms\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Am"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Malayalam (http://www.transifex.com/projects/p/xbmc-addons/language/ml/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ml\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "പോതുവായത്"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Maltese (http://www.transifex.com/projects/p/xbmc-addons/language/mt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: mt\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Ġenerali"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Norwegian (http://www.transifex.com/projects/p/xbmc-addons/language/no/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: no\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Vi ønsker å anbefale at du oppgraderer."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Besøk XBMC.org for mer informasjon"
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Du bruker fortsatt en eldre, stabil versjon av XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Du bruker fortsatt en eldre, RC-versjon av XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Du bruker fortsatt en eldre, betaversjon av XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Du bruker fortsatt en eldre, alphaversjon av XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Du bruker fortsatt en eldre, månedlig versjon av XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Du bruker fortsatt en eldre, ustabil versjon av XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Ønsker du å fjerne denne påminnelsen?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Du kan aktivere/deaktivere den gjennom tilleggsinnstillingene."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Bruk pakkebehandleren (apt) din for å oppgradere."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "En ny versjon er tilgjengelig, ønsker du å oppgradere nå?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Vellykket oppgradering"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Ønsker du å starte XBMC på nytt for å fullføre oppgraderingen?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Ønsker du å sjekke pakkebrønnen etter en ny versjon?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Generelt"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Aktiver XBMC versjonsettersyn"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Vennlingst skriv inn ditt passord"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: Oppgrader hele systemet"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/xbmc-addons/language/fa_IR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fa_IR\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "عمومی"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Persian (http://www.transifex.com/projects/p/xbmc-addons/language/fa/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fa\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "عمومی"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Polish (http://www.transifex.com/projects/p/xbmc-addons/language/pl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pl\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Chcielibyśmy polecić aktualizację."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Odwiedź XBMC.org po więcej informacji."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Nadal używasz starszej stabilnej wersji XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Nadal używasz starszej wersji RC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Nadal używasz starszej wersji beta XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Nadal używasz starszej wersji alpha XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Nadal używasz starszej wersji comiesięcznej XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Nadal używasz starszej niestabilnej wersji XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Usunąć to przypomnienie?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Można to włączyć/wyłączyć przez ustawienia wtyczki."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Użyj swojego menedżera pakietów (apt) do aktualizacji."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Dostępna jest nowa wersja, chcesz teraz aktualizować?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Aktualizacja powiodła się"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Chcesz zrestartować Xbmc by dokończyć aktualizację?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Czy chcesz sprawdzić repozytorium czy jest nowa wersja?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Ogólne"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Włączyć sprawdzanie wersji XBMC?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Proszę podać hasło"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: aktualizacja systemu kompletna"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xbmc-addons/language/pt_BR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Gostaríamos de recomendar-lhe que atualize."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Visite XBMC.org para mais informações."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Você ainda está usando uma versão estável antiga do XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Você ainda está usando uma versão RC antiga do XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Você ainda está usando uma versão beta antiga do XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Você ainda está usando uma versão alpha antiga do XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Você ainda está usando uma versão mensal antiga do XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Você ainda está usando uma versão não estável antiga do XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Gostaria de remover este lembrete?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Você pode ativar/desativá-lo através das configurações do add-on."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Use seu gerenciador de pacotes(apt) para atualizar."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Uma nova versão está disponível, você quer atualizara agora?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Atualização efetuada com sucesso"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Você deseja reiniciar o XBMC após atualização finalizar?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Deseja verificar se há uma nova versão no repositório?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Geral"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Habilitar verificação de versão do XBMC?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Por favor entre sua senha"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: Atualizar o sistema completamente"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Portuguese (http://www.transifex.com/projects/p/xbmc-addons/language/pt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pt\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Gostaríamos de recomendar-lhe que actualizasse o XBMC."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Visite xbmc.org para mais informação."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Ainda está a usar uma versão estável antiga do XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Ainda está a usar uma versão RC antiga do XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Ainda está a usar uma versão beta antiga do XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Ainda está a usar uma versão alpha antiga do XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Ainda está a usar uma versão mensal antiga do XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Ainda está a usar uma versão instável antiga do XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Gostaria de anular este lembrete?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Pode activá-lo/desactivá-lo através das definições de addon."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Use o gestor de pacotes(apt) para actualizar."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Uma nova versão está disponível, quer actualizar agora?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "A actualização foi concluída"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Quer reiniciar o XBMC para concluir a actualização?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Quer procurar por uma nova versão no repositório?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Menus"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Activar verificação de versão do XBMC?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Por favor, introduza a sua palavra-passe"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: Actualização completa do sistema"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Romanian (http://www.transifex.com/projects/p/xbmc-addons/language/ro/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ro\n"
+"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "General"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Russian (http://www.transifex.com/projects/p/xbmc-addons/language/ru/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ru\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Мы рекомендуем Вам обновиться."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Для более полной информации посетите XBMC.org."
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Основные"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/xbmc-addons/language/sr_RS/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sr_RS\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Опште"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Serbian (http://www.transifex.com/projects/p/xbmc-addons/language/sr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sr\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Opšte"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Slovak (http://www.transifex.com/projects/p/xbmc-addons/language/sk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sk\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Všeobecné"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Slovenian (http://www.transifex.com/projects/p/xbmc-addons/language/sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sl\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Splošno"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/xbmc-addons/language/es_AR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_AR\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "General"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xbmc-addons/language/es_MX/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_MX\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Nos gustaria recomendarle actualizar."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Visita XBMC.org para mas informacion."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Usted todavia esta utilizando una version vieja estable de XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Usted todavia esta utilizando una version vieja RC de XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Usted todavia esta utilizando una version vieja beta de XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Usted todavia esta utilizando una version vieja alpha de XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Usted todavia esta utilizando una vieja version mensual de XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Usted todavia esta utilizando una version vieja inestable de XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Usted quiere remover este recordatorio?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "General"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Spanish (http://www.transifex.com/projects/p/xbmc-addons/language/es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Le recomendamos que actualice."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Visite XBMC.org para más información."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Todavía está usando una versión antigua estable de XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Todavía está usando una versión antigua RC de XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Todavía está usando una antigua versión beta de XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Todavía está usando una antigua versión alfa de XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Todavía está usando una antigua versión mensual de XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Todavía está usando una versión antigua no estable de XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "¿Desea eliminar este recordatorio?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Puede activarlo o desactivarlo a través de los ajustes del complemento."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Use su administrador de paquetes (apt) para actualizar."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "Está disponible una nueva versión, ¿deseas actualizar ahora?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Actualización correcta"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "¿Deseas reiniciar XBMC para terminar la actualización?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "¿Quieres comprobar el repositorio para una nueva versión?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "General"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "¿Activar la comprobación de versión de XBMC?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Por favor introduce tu contraseña"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: Actualizar sistema completo"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Swedish (http://www.transifex.com/projects/p/xbmc-addons/language/sv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sv\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32001"
+msgid "We would like to recommend you to upgrade."
+msgstr "Vi rekommenderar dig att uppgradera."
+
+msgctxt "#32002"
+msgid "Visit XBMC.org for more information."
+msgstr "Besök XBMC.org för mer information."
+
+msgctxt "#32003"
+msgid "You are still using an older stable version of XBMC."
+msgstr "Du använder fortfarande en äldre stabil version av XBMC."
+
+msgctxt "#32004"
+msgid "You are still using an older RC version of XBMC."
+msgstr "Du använder fortfarande en äldre RC version av XBMC."
+
+msgctxt "#32005"
+msgid "You are still using an older beta version of XBMC."
+msgstr "Du använder fortfarande en äldre betaversion av XBMC."
+
+msgctxt "#32006"
+msgid "You are still using an older alpha version of XBMC."
+msgstr "Du använder fortfarande en äldre alfaversion av XBMC."
+
+msgctxt "#32007"
+msgid "You are still using an older monthly version of XBMC."
+msgstr "Du använder fortfarande en äldre månatlig version av XBMC."
+
+msgctxt "#32008"
+msgid "You are still using an older non stable version of XBMC."
+msgstr "Du använder fortfarande en äldre ostabil version av XBMC."
+
+msgctxt "#32009"
+msgid "Would you like to remove this reminder?"
+msgstr "Vill du ta bort denna påminnelse?"
+
+msgctxt "#32010"
+msgid "You can enable/disable it through addon settings."
+msgstr "Du kan aktivera/inaktivera detta i tilläggsinställningarna."
+
+msgctxt "#32011"
+msgid "Use your package manager(apt) to upgrade."
+msgstr "Använd din pakethanterare (apt) för att uppgradera."
+
+msgctxt "#32012"
+msgid "A new version is available, do you want to upgrade now?"
+msgstr "En ny version är tillgänglig, vill du uppgradera nu?"
+
+msgctxt "#32013"
+msgid "Upgrade successful"
+msgstr "Uppgradering lyckades"
+
+msgctxt "#32014"
+msgid "Do you want to restart Xbmc to finish the upgrade?"
+msgstr "Vill du starta om XBMC för att slutföra uppgraderingen?"
+
+msgctxt "#32015"
+msgid "Do you want to check the repository for a new version?"
+msgstr "Vill du kontrollera förrådet efter en ny version?"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Allmänna"
+
+msgctxt "#32021"
+msgid "Enable XBMC version check?"
+msgstr "Aktivera XBMC versionskontroll?"
+
+msgctxt "#32022"
+msgid "Please enter your password"
+msgstr "Var god ange ditt lösenord"
+
+msgctxt "#32023"
+msgid "Linux: Upgrade complete system"
+msgstr "Linux: Uppdatera hela systemet"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/xbmc-addons/language/ta_IN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ta_IN\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "பொதுவானது"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Thai (http://www.transifex.com/projects/p/xbmc-addons/language/th/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: th\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "ทั่วไป"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Turkish (http://www.transifex.com/projects/p/xbmc-addons/language/tr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: tr\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Genel"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Ukrainian (http://www.transifex.com/projects/p/xbmc-addons/language/uk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: uk\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Загальні"
--- /dev/null
+# XBMC Media Center language file
+# Addon Name: XBMC Version Check
+# Addon id: service.xbmc.versioncheck
+# Addon Provider: Team XBMC
+msgid ""
+msgstr ""
+"Project-Id-Version: XBMC Addons\n"
+"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
+"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: XBMC Translation Team\n"
+"Language-Team: Vietnamese (http://www.transifex.com/projects/p/xbmc-addons/language/vi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: vi\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "#32020"
+msgid "General"
+msgstr "Chung"
--- /dev/null
+[Untrusted Upgrade]
+Identity=unix-user:xbmc
+Action=org.debian.apt.upgrade-packages;org.debian.apt.update-cache
+ResultAny=no
+ResultInactive=yes
+ResultActive=yes
--- /dev/null
+If you run xbmc standalone and/or do want to have password less upgrades, copy the file 10-allow-update.conf to /etc/polkit-1/localauthority/50-local.d/
+
+Make sure to adjust the username if it is different from "xbmc"
+
+For this to work, you must have python-apt and python-aptdaemon installed:
+sudo apt-get install python-apt python-aptdaemon
+
+
+If those packages are not installed, this script will fallback to calling apt directly and ask you for your password.
+
<settings>
<category label="32020">
<setting label="32021" type="bool" id="versioncheck_enable" default="true"/>
+ <setting label="32023" type="bool" id="upgrade_system" default="false"/>
</category>
</settings>
"stable": [
{
"major": "12",
+ "minor": "2",
+ "tag": "stable",
+ "revision": "20130502-32b1a5e",
+ "extrainfo": "final"
+ },
+ {
+ "major": "12",
"minor": "1",
"tag": "stable",
"revision": "20130317-0d373cc",
"major": "13",
"minor": "0",
"tag": "prealpha",
+ "revision": "20130929-494c67a",
+ "extrainfo": "alpha8"
+ },
+ {
+ "major": "13",
+ "minor": "0",
+ "tag": "prealpha",
+ "revision": "20130831-2da9c97",
+ "extrainfo": "alpha7"
+ },
+ {
+ "major": "13",
+ "minor": "0",
+ "tag": "prealpha",
+ "revision": "20130630-30f4a79",
+ "extrainfo": "alpha6"
+ },
+ {
+ "major": "13",
+ "minor": "0",
+ "tag": "prealpha",
+ "revision": "20130630-9188e6a",
+ "extrainfo": "alpha5"
+ },
+ {
+ "major": "13",
+ "minor": "0",
+ "tag": "prealpha",
+ "revision": "20130531-0ccc594",
+ "extrainfo": "alpha4"
+ },
+ {
+ "major": "13",
+ "minor": "0",
+ "tag": "prealpha",
+ "revision": "20130430-e8fe5cf",
+ "extrainfo": "alpha3"
+ },
+ {
+ "major": "13",
+ "minor": "0",
+ "tag": "prealpha",
+ "revision": "20130331-194c408",
+ "extrainfo": "alpha2"
+ },
+ {
+ "major": "13",
+ "minor": "0",
+ "tag": "prealpha",
"revision": "20130227-8d2e0fe",
"extrainfo": "alpha1"
},
#
-import os
import platform
import xbmc
-import xbmcaddon
-import xbmcgui
-import xbmcvfs
+import lib.common
+from lib.common import log, dialog_yesno
+from lib.common import upgrade_message as _upgrademessage
-if sys.version_info < (2, 7):
- import simplejson
-else:
- import json as simplejson
+__addon__ = lib.common.__addon__
+__addonversion__ = lib.common.__addonversion__
+__addonname__ = lib.common.__addonname__
+__addonpath__ = lib.common.__addonpath__
+__icon__ = lib.common.__icon__
+__localize__ = lib.common.__localize__
-__addon__ = xbmcaddon.Addon()
-__addonversion__ = __addon__.getAddonInfo('version')
-__addonname__ = __addon__.getAddonInfo('name')
-__addonpath__ = __addon__.getAddonInfo('path').decode('utf-8')
-__icon__ = __addon__.getAddonInfo('icon')
-__localize__ = __addon__.getLocalizedString
-
-def log(txt):
- if isinstance (txt,str):
- txt = txt.decode("utf-8")
- message = u'%s: %s' % (__addonname__, txt)
- xbmc.log(msg=message.encode("utf-8"), level=xbmc.LOGDEBUG)
class Main:
def __init__(self):
+ linux = False
+ packages = []
if __addon__.getSetting("versioncheck_enable") == 'true' and not xbmc.getCondVisibility('System.HasAddon(os.openelec.tv)'):
if not sys.argv[0]:
xbmc.executebuiltin('XBMC.AlarmClock(CheckAtBoot,XBMC.RunScript(service.xbmc.versioncheck, started),00:00:30,silent)')
xbmc.executebuiltin('XBMC.AlarmClock(CheckWhileRunning,XBMC.RunScript(service.xbmc.versioncheck, started),24:00:00,silent,loop)')
elif sys.argv[0] and sys.argv[1] == 'started':
if xbmc.getCondVisibility('System.Platform.Linux'):
- oldversion = _versionchecklinux('xbmc')
+ packages = ['xbmc']
+ _versionchecklinux(packages)
else:
- oldversion = _versioncheck()
- if oldversion[0]:
- _upgrademessage(oldversion[1])
+ oldversion, msg = _versioncheck()
+ if oldversion:
+ _upgrademessage(msg, False)
else:
pass
def _versioncheck():
# initial vars
- oldversion = False
- msg = ''
+ from lib.jsoninterface import get_installedversion, get_versionfilelist
+ from lib.versions import compare_version
# retrieve versionlists from supplied version file
- version_file = os.path.join(__addonpath__, 'resources/versions.txt')
- # Eden didn't have xbmcvfs.File()
- if xbmcaddon.Addon('xbmc.addon').getAddonInfo('version') < "11.9.3":
- file = open(version_file, 'r')
- else:
- file = xbmcvfs.File(version_file)
- data = file.read()
- file.close()
- version_query = unicode(data, 'utf-8', errors='ignore')
- version_query = simplejson.loads(version_query)
-
- # Create seperate version lists
- versionlist_stable = version_query['releases']['stable']
- versionlist_rc = version_query['releases']['releasecandidate']
- versionlist_beta = version_query['releases']['beta']
- versionlist_alpha = version_query['releases']['alpha']
- versionlist_prealpha = version_query['releases']['prealpha']
-
- # retrieve current installed version
- json_query = xbmc.executeJSONRPC('{ "jsonrpc": "2.0", "method": "Application.GetProperties", "params": {"properties": ["version", "name"]}, "id": 1 }')
- json_query = unicode(json_query, 'utf-8', errors='ignore')
- json_query = simplejson.loads(json_query)
- version_installed = []
- if json_query.has_key('result') and json_query['result'].has_key('version'):
- version_installed = json_query['result']['version']
- log("Version installed %s" %version_installed)
- # set oldversion flag to false
- oldversion = False
-
- ### Check to upgrade to newest available stable version
- # check on smaller major version. Smaller version than available always notify
- if version_installed['major'] < int(versionlist_stable[0]['major']):
- msg = __localize__(32003)
- oldversion = True
- log("Version available %s" %versionlist_stable[0])
-
- # check on same major version installed and available
- elif version_installed['major'] == int(versionlist_stable[0]['major']):
- # check on smaller minor version
- if version_installed['minor'] < int(versionlist_stable[0]['minor']):
- msg = __localize__(32003)
- oldversion = True
- log("Version available %s" %versionlist_stable[0])
- # check if not installed a stable so always notify
- elif version_installed['tag'] != "stable":
- msg = __localize__(32008)
- oldversion = True
- log("Version available %s" %versionlist_stable[0])
- else:
- log("Last available stable installed")
-
- ### Check to upgrade to newest available RC version if not installed stable
- ## Check also oldversion hasn't been set true by previous check because if so this need to be skipped
- if not oldversion and version_installed['tag'] != "stable":
- # only check on equal or lower major because newer installed beta/alpha/prealpha version will be higher
- if versionlist_rc and version_installed['major'] <= int(versionlist_rc[0]['major']):
- if version_installed['revision'] <= versionlist_rc[0]['revision']:
- msg = __localize__(32004)
- oldversion = True
- log("Version available %s" %versionlist_rc[0])
-
- # exclude if installed RC on checking for newer beta
- if not oldversion and versionlist_beta and version_installed['tag'] not in ["releasecandidate"]:
- if version_installed['major'] <= int(versionlist_beta[0]['major']):
- if version_installed['revision'] < versionlist_beta[0]['revision']:
- msg = __localize__(32005)
- oldversion = True
- log("Version available %s" %versionlist_beta[0])
-
- # exclude if installed RC or beta on checking for newer alpha
- if not oldversion and versionlist_alpha and version_installed['tag'] not in ["releasecandidate", "beta"]:
- if version_installed['major'] <= int(versionlist_alpha[0]['major']):
- if version_installed['revision'] < versionlist_alpha[0]['revision']:
- msg = __localize__(32006)
- oldversion = True
- log("Version available %s" %versionlist_alpha[0])
-
- # exclude if installed RC, beta or alpha on checking for newer prealpha
- if not oldversion and versionlist_prealpha and version_installed['tag'] not in ["releasecandidate", "beta", "alpha"]:
- if version_installed['major'] <= int(versionlist_prealpha[0]['major']):
- if version_installed['revision'] < versionlist_prealpha[0]['revision']:
- msg = __localize__(32007)
- oldversion = True
- log("Version available %s" %versionlist_prealpha[0])
-
- # Nothing to see here, move along
- else:
- # Nothing to see here, move along
- pass
+ versionlist = get_versionfilelist()
+ # retrieve version installed
+ version_installed = get_installedversion()
+ # copmpare installed and available
+ oldversion, msg = compare_version(version_installed, versionlist)
return oldversion, msg
-def _versionchecklinux(package):
- if (platform.dist()[0] == "Ubuntu" or platform.dist()[0] == "Debian"):
- oldversion, msg = _versioncheckapt(package)
+def _versionchecklinux(packages):
+ if platform.dist()[0].lower() in ['ubuntu', 'debian', 'linuxmint']:
+ handler = False
+ result = False
+ try:
+ # try aptdeamon first
+ from lib.aptdeamonhandler import AptdeamonHandler
+ handler = AptdeamonHandler()
+ except:
+ # fallback to shell
+ # since we need the user password, ask to check for new version first
+ from lib.shellhandlerapt import ShellHandlerApt
+ sudo = True
+ handler = ShellHandlerApt(sudo)
+ if dialog_yesno(32015):
+ pass
+ elif dialog_yesno(32009, 32010):
+ log("disabling addon by user request")
+ __addon__.setSetting("versioncheck_enable", 'false')
+ return
+
+ if handler:
+ if handler.check_upgrade_available(packages[0]):
+ if _upgrademessage(32012, True):
+ if __addon__.getSetting("upgrade_system") == "false":
+ result = handler.upgrade_package(packages[0])
+ else:
+ result = handler.upgrade_system()
+ if result:
+ from lib.common import message_upgrade_success, message_restart
+ message_upgrade_success()
+ message_restart()
+ else:
+ log("Error during upgrade")
+ else:
+ log("Error: no handler found")
else:
log("Unsupported platform %s" %platform.dist()[0])
sys.exit(0)
- return oldversion, msg
-
-def _versioncheckapt(package):
- #check for linux using Apt
- # initial vars
- oldversion = False
- msg = ''
- result = ''
-
- # try to import apt
- try:
- import apt
- from aptdaemon import client
- from aptdaemon import errors
- except:
- log('python apt import error')
- sys.exit(0)
- apt_client = client.AptClient()
- try:
- result = apt_client.update_cache(wait=True)
- if (result == "exit-success"):
- log("Finished updating the cache")
- else:
- log("Error updating the cache %s" %result)
- except errors.NotAuthorizedError:
- log("You are not allowed to update the cache")
- sys.exit(0)
-
- trans = apt_client.upgrade_packages([package])
- trans.simulate(reply_handler=_apttransstarted, error_handler=_apterrorhandler)
- pkg = trans.packages[4][0]
- if (pkg == package):
- cache=apt.Cache()
- cache.open(None)
- cache.upgrade()
- if (cache[package].installed and cache[package].installed.version != cache[package].candidate.version):
- log("Version installed %s" %cache[package].installed.version)
- log("Version available %s" %cache[package].candidate.version)
- oldversion = True
- msg = __localize__(32011)
- elif (cache[package].installed):
- log("Already on newest version %s" %cache[package].installed.version)
- else:
- log("No installed package found, probably manual install")
- sys.exit(0)
-
- return oldversion, msg
-def _apttransstarted():
- pass
-def _apterrorhandler(error):
- raise error
-
-def _upgrademessage(msg):
- # Don't show while watching a video
- while(xbmc.Player().isPlayingVideo() and not xbmc.abortRequested):
- xbmc.sleep(1000)
- i = 0
- while(i < 5 and not xbmc.abortRequested):
- xbmc.sleep(1000)
- i += 1
- # Detect if it's first run and only show OK dialog + ask to disable on that
- firstrun = __addon__.getSetting("versioncheck_firstrun") != 'false'
- if firstrun and not xbmc.abortRequested:
- xbmcgui.Dialog().ok(__addonname__,
- msg,
- __localize__(32001),
- __localize__(32002))
- # sets check to false which is checked on startup
- if xbmcgui.Dialog().yesno(__addonname__,
- __localize__(32009),
- __localize__(32010)):
- __addon__.setSetting("versioncheck_enable", 'false')
- # set first run to false to only show a popup next startup / every two days
- __addon__.setSetting("versioncheck_firstrun", 'false')
- # Show notification after firstrun
- elif not xbmc.abortRequested:
- log(__localize__(32001) + '' + __localize__(32002))
- xbmc.executebuiltin("XBMC.Notification(%s, %s, %d, %s)" %(__addonname__,
- __localize__(32001) + '' + __localize__(32002),
- 15000,
- __icon__))
- else:
- pass
if (__name__ == "__main__"):
log('Version %s started' % __addonversion__)
AC_LINK_IFELSE(
[AC_LANG_SOURCE([#include <pthread.h>
-int main(int argc, char *argv[]) {
+int main(int argc, char **argv) {
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);
AC_LINK_IFELSE(
[AC_LANG_SOURCE([#include <windows.h>
-int main(int argc, char *argv[]) {
+int main(int argc, char **argv) {
CreateMutex(NULL, FALSE, NULL);
return 0;
}
<requirement>HAVE_LIBVDPAU</requirement>
<level>2</level>
<default>true</default>
- <control>
- <dependencies>
- <dependency type="enable" setting="videoplayer.usevdpau" operator="is">true</dependency> <!-- USE VDPAU -->
- </dependencies>
- </control>
+ <dependencies>
+ <dependency type="enable" setting="videoplayer.usevdpau" operator="is">true</dependency> <!-- USE VDPAU -->
+ </dependencies>
</setting>
<setting id="videoplayer.usevaapi" type="boolean" label="13426" help="36156">
<requirement>HAVE_LIBVA</requirement>
#include <inttypes.h>
#include "guilib/XBTF.h"
#include "utils/EndianSwap.h"
-#if defined(TARGET_FREEBSD)
+#if defined(TARGET_FREEBSD) || defined(TARGET_DARWIN)
#include <stdlib.h>
#elif !defined(TARGET_DARWIN)
#include <malloc.h>
platform_cc=gcc-4.2
platform_cxx=g++-4.2
;;
- *)
+ 4.*.*)
platform_cc=llvm-gcc-4.2
platform_cxx=llvm-g++-4.2
+ ;;
+ *)
+ platform_cc=clang
+ platform_cxx=clang++
+ platform_cflags="-fheinous-gnu-extensions -no-cpp-precomp -no-integrated-as"
+ platform_ldflags="-Wl,-search_paths_first"
+ platform_cxxflags="-no-cpp-precomp"
;;
esac
case $host in
*86*-apple-darwin)
found_sdk_version=[`$use_xcodebuild -showsdks | grep macosx | sort | tail -n 1 | grep -oE 'macosx[0-9.0-9]+' | cut -c 7-$NF`]
+ case $use_xcode in
+ 5.* | 5.*.* )
+ use_toolchain="${use_xcodepath}/Toolchains/XcodeDefault.xctoolchain"
+ ;;
+ *)
+ use_toolchain="${use_toolchain:-$use_xcodepath}"
+ ;;
+ esac
use_sdk="${use_sdk:-$found_sdk_version}"
- use_toolchain="${use_toolchain:-$use_xcodepath}"
if test "$use_cpu" = "armv7"; then
AC_MSG_ERROR(error in configure of --with-arch=$use_cpu)
fi
10.6);;
10.7);;
10.8);;
+ 10.9);;
*)
AC_MSG_ERROR(error in configure of --with-sdk=$use_sdk)
esac
found_sdk_version=[`$use_xcodebuild -showsdks | grep iphoneos | sort | tail -n 1 | awk '{ print $2}'`]
use_sdk="${use_sdk:-$found_sdk_version}"
sdk_name=iphoneos$use_sdk
- use_toolchain="${use_toolchain:-`$use_xcodebuild -version -sdk $sdk_name PlatformPath`/Developer}"
+ case $use_xcode in
+ 5.* | 5.*.* )
+ use_toolchain="${use_xcodepath}/Toolchains/XcodeDefault.xctoolchain"
+ ;;
+ *)
+ use_toolchain="${use_toolchain:-`$use_xcodebuild -version -sdk $sdk_name PlatformPath`/Developer}"
+ ;;
+ esac
+
case $use_sdk in
4.*);;
5.*);;
6.*);;
+ 7.*);;
*)
AC_MSG_ERROR(error in configure of --with-sdk=$use_sdk)
;;
AC_SUBST(need_libiconv)
AC_SUBST(use_gplv3)
AC_SUBST(has_libcrystax)
+AC_SUBST(use_xcode)
AC_OUTPUT
echo -e "toolchain:\t $use_toolchain"
DEPS= ../../Makefile.include.in Makefile
APPNAME=cmake
-VERSION=2.8.8
+VERSION=2.8.12
SOURCE=$(APPNAME)-$(VERSION)
ARCHIVE=$(SOURCE).tar.gz
# lib name, version
# lib name, version
LIBNAME=pkg-config
-VERSION=0.23
+VERSION=0.28
SOURCE=$(LIBNAME)-$(VERSION)
ARCHIVE=$(SOURCE).tar.gz
endif
# configuration settings
-CONFIGURE=./configure --prefix=$(PREFIX) --enable-indirect-deps --with-pc-path=$(PC_PATH)
+CONFIGURE=./configure --prefix=$(PREFIX) --enable-indirect-deps --with-pc-path=$(PC_PATH) --with-internal-glib
LIBDYLIB=$(PLATFORM)/pkg-config
CLEAN_FILES=$(ARCHIVE) $(PLATFORM)
IF("${OS}" STREQUAL "linux" OR "${OS}" STREQUAL "android")
SET(CMAKE_SYSTEM_NAME Linux)
ENDIF()
+IF("${OS}" STREQUAL "ios" OR "${OS}" STREQUAL "osx")
+SET(CMAKE_OSX_SYSROOT @use_sdk_path@)
+ENDIF()
SET(CMAKE_SYSTEM_VERSION 1)
# specify the cross compiler
+
+struct afp_server * afp_server_full_connect(void * priv, struct afp_connection_request * req);
+
-+void * just_end_it_now(void *other);
++void just_end_it_now(void *other);
+void add_fd_and_signal(int fd);
+void loop_disconnect(struct afp_server *s);
+void afp_wait_for_started_loop(void);
#define SIGNAL_TO_USE SIGUSR2
+@@ -85,7 +85,7 @@ void signal_main_thread(void)
+ }
+
+ static int ending=0;
+-void * just_end_it_now(void * ignore)
++void just_end_it_now(void * ignore)
+ {
+ if (ending) return;
+ ending=1;
+
diff -Naur afpfs-ng-0.8.1/lib/lowlevel.c afpfs-ng-0.8.1.patch/lib/lowlevel.c
--- afpfs-ng-0.8.1/lib/lowlevel.c 2008-02-20 02:33:17.000000000 +0100
+++ afpfs-ng-0.8.1.patch/lib/lowlevel.c 2011-09-10 12:13:50.136124828 +0200
if test "@platform_os@" = "ios"; then
# tweaks for libffi (ios must use llvm-gcc-4.2)
if test "${PACKAGE_NAME}" = "libffi" ; then
- export CC="@use_toolchain@/usr/bin/llvm-gcc-4.2"
- export CPP="@use_toolchain@/usr/bin/llvm-gcc-4.2 -E"
+ case "@use_xcode@" in
+ 5.* | 5.*.* )
+ export CC="@use_toolchain@/usr/bin/clang"
+ export CPP="@use_toolchain@/usr/bin/clang -E"
+ ;;
+ *)
+ export CC="@use_toolchain@/usr/bin/llvm-gcc-4.2"
+ export CPP="@use_toolchain@/usr/bin/llvm-gcc-4.2 -E"
+ ;;
+ esac
unset AS
unset CCAS
fi
# lib name, version
LIBNAME=libgpg-error
-VERSION=1.10
+VERSION=1.12
SOURCE=$(LIBNAME)-$(VERSION)
ARCHIVE=$(SOURCE).tar.bz2
$(LIBDYLIB): $(PLATFORM)
$(MAKE) -C $(PLATFORM)/src/daemon
$(MAKE) -C $(PLATFORM)/src/include install
- #(STRIP_MEMMEM)
+ $(STRIP_MEMMEM)
.installed-$(PLATFORM): $(LIBDYLIB)
rm -f $(PREFIX)/lib/libmicrohttpd.so $(PREFIX)/lib/libmicrohttpd.so.5 $(PREFIX)/lib/libmicrohttpd.so.5.2.1
--- /dev/null
+--- /configure.ac 2013-10-09 22:39:08.000000000 +0400
++++ /configure.ac 2013-06-24 20:34:58.000000000 +0400
+@@ -149,7 +149,6 @@ AC_CHECK_GENERATE_INTTYPES([include])
+
+ dnl Checks for typedefs, structures, and compiler characteristics.
+ AC_C_CONST
+-AC_C_ALWAYS_INLINE
+ AC_C_RESTRICT
+ AC_C_BUILTIN_EXPECT
+ AC_C_BIGENDIAN
\ No newline at end of file
cd $(PLATFORM); patch -p0 < ../02-neon.patch
cd $(PLATFORM); patch -p1 < ../03-config-fix.patch
endif
+ cd $(PLATFORM); patch -p1 < ../04-clang-fix.patch
+ cd $(PLATFORM); $(AUTORECONF) -vif
cd $(PLATFORM); $(CONFIGURE)
$(LIBDYLIB): $(PLATFORM)
--- /dev/null
+--- /libcnary/node.c 2011-06-25 05:00:48.000000000 +0400
++++ /libcnary/node.c 2013-03-19 20:34:11.000000000 +0400
+@@ -95,16 +95,17 @@
+ }
+
+ int node_detach(node_t* parent, node_t* child) {
+- if (!parent || !child) return 0;
+- if (node_list_remove(parent->children, child) == 0) {
++ if (!parent || !child) return -1;
++ int index = node_list_remove(parent->children, child);
++ if (index >= 0) {
+ parent->count--;
+ }
+- return 0;
++ return index;
+ }
+
+ int node_insert(node_t* parent, unsigned int index, node_t* child)
+ {
+- if (!parent || !child) return;
++ if (!parent || !child) return -1;
+ child->isLeaf = TRUE;
+ child->isRoot = FALSE;
+ child->parent = parent;
+@@ -209,7 +210,7 @@
+ node_t* node_copy_deep(node_t* node, copy_func_t copy_func)
+ {
+ if (!node) return NULL;
+- void *data;
++ void *data = NULL;
+ if (copy_func) {
+ data = copy_func(node->data);
+ }
+
+--- /src/base64.c 2013-10-06 23:14:24.000000000 +0400
++++ /src/base64.c 2013-03-19 20:34:11.000000000 +0400
+@@ -104,9 +104,9 @@
+
+ unsigned char *base64decode(const char *buf, size_t *size)
+ {
+- if (!buf) return;
++ if (!buf) return NULL;
+ size_t len = strlen(buf);
+- if (len <= 0) return;
++ if (len <= 0) return NULL;
+ unsigned char *outbuf = (unsigned char*)malloc((len/4)*3+3);
+
+ unsigned char *line;
+@@ -114,7 +114,7 @@
+
+ line = (unsigned char*)strtok((char*)buf, "\r\n\t ");
+ while (line) {
+- p+=base64decode_block(outbuf+p, line, strlen((char*)line));
++ p+=base64decode_block(outbuf+p, (const char*)line, strlen((char*)line));
+
+ // get next line of base64 encoded block
+ line = (unsigned char*)strtok(NULL, "\r\n\t ");
\ No newline at end of file
rm -rf $(PLATFORM); mkdir -p $(PLATFORM)
cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE)
cd $(PLATFORM); patch -p1 < ../0001-dontbuildswig.patch
+ cd $(PLATFORM); patch -p1 < ../0002-fixclang.diff
cd $(PLATFORM); sed -ie 's/TARGET_LINK_LIBRARIES( plist /TARGET_LINK_LIBRARIES( plist m z /' src/CMakeLists.txt
cd $(PLATFORM); rm -rf build; mkdir -p build
cd $(PLATFORM)/build; $(CMAKE) VERBOSE=1 -DCMAKE_C_FLAGS="$(CFLAGS)" -DCMAKE_LD_FLAGS="$(LDFLAGS)" ..
cd $(PLATFORM); CFLAGS="$(CFLAGS)" CC=$(CC) RANLIB=$(RANLIB) $(CONFIGURE)
if test "$(OS)" = "osx"; then \
sed -ie "s|CC= /usr/bin/gcc-4.2|CC= $(CC)|" "$(PLATFORM)/Makefile"; \
+ sed -ie "s|CFLAG= |CFLAG=$(CFLAGS) |" "$(PLATFORM)/Makefile"; \
fi
if test "$(OS)" = "ios"; then \
sed -ie "s|CFLAG= |CFLAG=$(CFLAGS) |" "$(PLATFORM)/Makefile"; \
.installed-$(PLATFORM): $(LIBDYLIB)
mkdir -p $(PREFIX)/lib/python2.6/site-packages/PIL
- unzip $(LIBDYLIB) -d $(PREFIX)/lib/python2.6/site-packages/PIL/
+ unzip -of $(LIBDYLIB) -d $(PREFIX)/lib/python2.6/site-packages/PIL/
echo 'PIL' > $(PREFIX)/lib/python2.6/site-packages/PIL.pth
touch $@
update_emu_environ();//apply the GUI settings
- // initialize our charset converter
- g_charsetConverter.reset();
-
// Load the langinfo to have user charset <-> utf-8 conversion
CStdString strLanguage = CSettings::Get().GetString("locale.language");
strLanguage[0] = toupper(strLanguage[0]);
g_colorManager.Clear();
- g_charsetConverter.reset();
-
g_infoManager.Clear();
// The g_SkinInfo boost shared_ptr ought to be reset here
}
CSettings::Get().SetString("locale.language", strNewLanguage);
- g_charsetConverter.reset();
-
if (!g_localizeStrings.Load("special://xbmc/language/", strNewLanguage))
return false;
locale::global(current_locale);
#endif
+ g_charsetConverter.resetSystemCharset();
CLog::Log(LOGINFO, "global locale set to %s", strLocale.c_str());
}
const CStdString& strName=CSettings::Get().GetString("locale.country");
SetCurrentRegion(strName);
}
+ g_charsetConverter.reinitCharsetsFromSettings();
LoadTokens(pRootElement->FirstChild("sorttokens"),g_advancedSettings.m_vecTokens);
CLog::Log(LOGERROR, "No ttf font found but needed: %s", strFontSet.c_str());
}
- g_charsetConverter.reset();
-
if (!g_localizeStrings.Load("special://xbmc/language/", strLanguage))
return false;
m_clock.Reset();
m_dvd.Clear();
m_errorCount = 0;
- m_iChannelEntryTimeOut = 0;
+ m_ChannelEntryTimeOut.SetInfinite();
return true;
}
{
bool bReturn(false);
- if (m_iChannelEntryTimeOut > 0 && XbmcThreads::SystemClockMillis() >= m_iChannelEntryTimeOut)
+ if (m_ChannelEntryTimeOut.IsTimePast())
{
CFileItem currentFile(g_application.CurrentFileItem());
CPVRChannel *currentChannel = currentFile.GetPVRChannelInfoTag();
SwitchChannel(*currentChannel);
bReturn = true;
- m_iChannelEntryTimeOut = 0;
+ m_ChannelEntryTimeOut.SetInfinite();
}
return bReturn;
if (bShowPreview)
{
UpdateApplication(0);
- m_iChannelEntryTimeOut = XbmcThreads::SystemClockMillis() + CSettings::Get().GetInt("pvrplayback.channelentrytimeout");
+ m_ChannelEntryTimeOut.Set(CSettings::Get().GetInt("pvrplayback.channelentrytimeout"));
}
else
{
- m_iChannelEntryTimeOut = 0;
+ m_ChannelEntryTimeOut.SetInfinite();
SAFE_DELETE(m_pDemuxer);
g_infoManager.SetDisplayAfterSeek();
std::string m_mimetype; // hold a hint to what content file contains (mime type)
ECacheState m_caching;
CFileItem m_item;
- unsigned int m_iChannelEntryTimeOut;
+ XbmcThreads::EndTime m_ChannelEntryTimeOut;
COMXCurrentStream m_CurrentAudio;
bool COMXVideo::SendDecoderConfig()
{
+ CSingleLock lock (m_critSection);
OMX_ERRORTYPE omx_err = OMX_ErrorNone;
/* send decoder config */
bool COMXVideo::PortSettingsChanged()
{
+ CSingleLock lock (m_critSection);
OMX_ERRORTYPE omx_err = OMX_ErrorNone;
if (m_settings_changed)
bool COMXVideo::Open(CDVDStreamInfo &hints, OMXClock *clock, EDEINTERLACEMODE deinterlace, bool hdmi_clock_sync)
{
+ CSingleLock lock (m_critSection);
bool vflip = false;
Close();
OMX_ERRORTYPE omx_err = OMX_ErrorNone;
void COMXVideo::Close()
{
+ CSingleLock lock (m_critSection);
m_omx_tunnel_clock.Deestablish();
m_omx_tunnel_decoder.Deestablish();
if(m_deinterlace)
unsigned int COMXVideo::GetFreeSpace()
{
+ CSingleLock lock (m_critSection);
return m_omx_decoder.GetInputBufferSpace();
}
unsigned int COMXVideo::GetSize()
{
+ CSingleLock lock (m_critSection);
return m_omx_decoder.GetInputBufferSize();
}
int COMXVideo::Decode(uint8_t *pData, int iSize, double pts)
{
+ CSingleLock lock (m_critSection);
OMX_ERRORTYPE omx_err;
- if( m_drop_state )
+ if( m_drop_state || !m_is_open )
return true;
unsigned int demuxer_bytes = (unsigned int)iSize;
void COMXVideo::Reset(void)
{
+ CSingleLock lock (m_critSection);
if(!m_is_open)
return;
m_setStartTime = true;
m_omx_decoder.FlushInput();
+ if(m_deinterlace)
+ m_omx_image_fx.FlushInput();
}
///////////////////////////////////////////////////////////////////////////////////////////
void COMXVideo::SetVideoRect(const CRect& SrcRect, const CRect& DestRect)
{
+ CSingleLock lock (m_critSection);
if(!m_is_open)
return;
int COMXVideo::GetInputBufferSize()
{
+ CSingleLock lock (m_critSection);
return m_omx_decoder.GetInputBufferSize();
}
void COMXVideo::SubmitEOS()
{
+ CSingleLock lock (m_critSection);
if(!m_is_open)
return;
bool COMXVideo::IsEOS()
{
+ CSingleLock lock (m_critSection);
if(!m_is_open)
return true;
if (!m_failed_eos && !m_omx_render.IsEOS())
#include "guilib/Geometry.h"
#include "DVDDemuxers/DVDDemux.h"
#include "xbmc/settings/VideoSettings.h"
+#include "threads/CriticalSection.h"
#include <string>
#define VIDEO_BUFFERS 60
OMX_DISPLAYTRANSFORMTYPE m_transform;
bool m_settings_changed;
static bool NaluFormatStartCodes(enum AVCodecID codec, uint8_t *in_extradata, int in_extrasize);
+ CCriticalSection m_critSection;
};
#endif
#define POPUP_ICON_WARNING 404
#define POPUP_ICON_ERROR 405
+CGUIDialogKaiToast::TOASTQUEUE CGUIDialogKaiToast::m_notifications;
+CCriticalSection CGUIDialogKaiToast::m_critical;
+
CGUIDialogKaiToast::CGUIDialogKaiToast(void)
: CGUIDialog(WINDOW_DIALOG_KAI_TOAST, "DialogKaiToast.xml")
{
- m_defaultIcon = "";
m_loadType = LOAD_ON_GUI_INIT;
m_timer = 0;
m_toastDisplayTime = 0;
void CGUIDialogKaiToast::OnWindowLoaded()
{
CGUIDialog::OnWindowLoaded();
- CGUIImage *image = (CGUIImage *)GetControl(POPUP_ICON);
- if (image)
- m_defaultIcon = image->GetFileName();
}
void CGUIDialogKaiToast::QueueNotification(eMessageType eType, const CStdString& aCaption, const CStdString& aDescription, unsigned int displayTime /*= TOAST_DISPLAY_TIME*/, bool withSound /*= true*/, unsigned int messageTime /*= TOAST_MESSAGE_TIME*/)
{
- CGUIDialogKaiToast *toast = (CGUIDialogKaiToast *)g_windowManager.GetWindow(WINDOW_DIALOG_KAI_TOAST);
- if (toast)
- toast->AddToQueue(eType, aCaption, aDescription, displayTime, withSound, messageTime);
+ AddToQueue("", eType, aCaption, aDescription, displayTime, withSound, messageTime);
}
void CGUIDialogKaiToast::QueueNotification(const CStdString& aCaption, const CStdString& aDescription)
void CGUIDialogKaiToast::QueueNotification(const CStdString& aImageFile, const CStdString& aCaption, const CStdString& aDescription, unsigned int displayTime /*= TOAST_DISPLAY_TIME*/, bool withSound /*= true*/, unsigned int messageTime /*= TOAST_MESSAGE_TIME*/)
{
- CGUIDialogKaiToast *toast = (CGUIDialogKaiToast *)g_windowManager.GetWindow(WINDOW_DIALOG_KAI_TOAST);
- if (toast)
- toast->AddToQueue(aImageFile, aCaption, aDescription, displayTime, withSound, messageTime);
+ AddToQueue(aImageFile, Default, aCaption, aDescription, displayTime, withSound, messageTime);
}
-void CGUIDialogKaiToast::AddToQueue(eMessageType eType, const CStdString& aCaption, const CStdString& aDescription, unsigned int displayTime /*= TOAST_DISPLAY_TIME*/, bool withSound /*= true*/, unsigned int messageTime /*= TOAST_MESSAGE_TIME*/)
-{
- CGUIImage *image = NULL;
-
- if (eType == Info)
- image = (CGUIImage *)GetControl(POPUP_ICON_INFO);
- else if (eType == Warning)
- image = (CGUIImage *)GetControl(POPUP_ICON_WARNING);
- else if (eType == Error)
- image = (CGUIImage *)GetControl(POPUP_ICON_ERROR);
-
- CStdString strImage;
- if (image)
- strImage = image->GetFileName();
-
- AddToQueue(strImage, aCaption, aDescription, displayTime, withSound, messageTime);
-}
-
-void CGUIDialogKaiToast::AddToQueue(const CStdString& aImageFile, const CStdString& aCaption, const CStdString& aDescription, unsigned int displayTime /*= TOAST_DISPLAY_TIME*/, bool withSound /*= true*/, unsigned int messageTime /*= TOAST_MESSAGE_TIME*/)
+void CGUIDialogKaiToast::AddToQueue(const CStdString& aImageFile, const eMessageType eType, const CStdString& aCaption, const CStdString& aDescription, unsigned int displayTime /*= TOAST_DISPLAY_TIME*/, bool withSound /*= true*/, unsigned int messageTime /*= TOAST_MESSAGE_TIME*/)
{
CSingleLock lock(m_critical);
Notification toast;
+ toast.eType = eType;
toast.imagefile = aImageFile;
toast.caption = aCaption;
toast.description = aDescription;
CGUIImage *image = (CGUIImage *)GetControl(POPUP_ICON);
if (image)
{
- if (!toast.imagefile.IsEmpty())
- image->SetFileName(toast.imagefile);
- else
- image->SetFileName(m_defaultIcon);
+ CStdString strTypeImage = toast.imagefile;
+
+ if (strTypeImage.IsEmpty())
+ {
+ CGUIImage *typeImage = NULL;
+
+ if (toast.eType == Info)
+ typeImage = (CGUIImage *)GetControl(POPUP_ICON_INFO);
+ else if (toast.eType == Warning)
+ typeImage = (CGUIImage *)GetControl(POPUP_ICON_WARNING);
+ else if (toast.eType == Error)
+ typeImage = (CGUIImage *)GetControl(POPUP_ICON_ERROR);
+ else
+ typeImage = image;
+
+ strTypeImage = typeImage->GetFileName();
+ }
+
+ image->SetFileName(strTypeImage);
}
// Play the window specific init sound for each notification queued
CGUIDialogKaiToast(void);
virtual ~CGUIDialogKaiToast(void);
+ enum eMessageType { Default = 0, Info, Warning, Error };
+
struct Notification
{
CStdString caption;
CStdString description;
CStdString imagefile;
+ eMessageType eType;
unsigned int displayTime;
unsigned int messageTime;
bool withSound;
};
- enum eMessageType { Info = 0, Warning, Error };
+ typedef std::queue<Notification> TOASTQUEUE;
static void QueueNotification(eMessageType eType, const CStdString& aCaption, const CStdString& aDescription, unsigned int displayTime = TOAST_DISPLAY_TIME, bool withSound = true, unsigned int messageTime = TOAST_MESSAGE_TIME);
static void QueueNotification(const CStdString& aCaption, const CStdString& aDescription);
void ResetTimer();
protected:
- void AddToQueue(eMessageType eType, const CStdString& aCaption, const CStdString& aDescription, unsigned int displayTime, bool withSound, unsigned int messageTime);
- void AddToQueue(const CStdString& aImageFile, const CStdString& aCaption, const CStdString& aDescription, unsigned int displayTime, bool withSound, unsigned int messageTime);
+ static void AddToQueue(const CStdString& aImageFile, const eMessageType eType, const CStdString& aCaption, const CStdString& aDescription, unsigned int displayTime, bool withSound, unsigned int messageTime);
unsigned int m_timer;
unsigned int m_toastDisplayTime;
unsigned int m_toastMessageTime;
- CStdString m_defaultIcon;
-
- typedef std::queue<Notification> TOASTQUEUE;
- TOASTQUEUE m_notifications;
- CCriticalSection m_critical;
+ static TOASTQUEUE m_notifications;
+ static CCriticalSection m_critical;
};
<string>YES</string>
<key>UIStatusBarHidden</key>
<true/>
+ <key>UIViewControllerBasedStatusBarAppearance</key>
+ <false/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
CreateProfileFolders();
- // initialize our charset converter
- g_charsetConverter.reset();
-
// Load the langinfo to have user charset <-> utf-8 conversion
string strLanguage = CSettings::Get().GetString("locale.language");
strLanguage[0] = toupper(strLanguage[0]);
#include "LangInfo.h"
#include "guilib/LocalizeStrings.h"
#include "settings/Setting.h"
+#include "settings/Settings.h"
#include "threads/SingleLock.h"
#include "log.h"
#endif
#endif
+#define NO_ICONV ((iconv_t)-1)
+
+enum SpecialCharset
+{
+ NotSpecialCharset = 0,
+ SystemCharset,
+ UserCharset /* locale.charset */,
+ SubtitleCharset /* subtitles.charset */,
+ KaraokeCharset /* karaoke.charset */
+};
+
+
+class CConverterType : public CCriticalSection
+{
+public:
+ CConverterType(const std::string& sourceCharset, const std::string& targetCharset, unsigned int targetSingleCharMaxLen = 1);
+ CConverterType(enum SpecialCharset sourceSpecialCharset, const std::string& targetCharset, unsigned int targetSingleCharMaxLen = 1);
+ CConverterType(const std::string& sourceCharset, enum SpecialCharset targetSpecialCharset, unsigned int targetSingleCharMaxLen = 1);
+ CConverterType(enum SpecialCharset sourceSpecialCharset, enum SpecialCharset targetSpecialCharset, unsigned int targetSingleCharMaxLen = 1);
+ CConverterType(const CConverterType& other);
+ ~CConverterType();
+
+ iconv_t GetConverter(CSingleLock& converterLock);
+
+ void Reset(void);
+ void ReinitTo(const std::string& sourceCharset, const std::string& targetCharset, unsigned int targetSingleCharMaxLen = 1);
+ std::string GetSourceCharset(void) const { return m_sourceCharset; }
+ std::string GetTargetCharset(void) const { return m_targetCharset; }
+ unsigned int GetTargetSingleCharMaxLen(void) const { return m_targetSingleCharMaxLen; }
+
+private:
+ static std::string ResolveSpecialCharset(enum SpecialCharset charset);
+
+ enum SpecialCharset m_sourceSpecialCharset;
+ std::string m_sourceCharset;
+ enum SpecialCharset m_targetSpecialCharset;
+ std::string m_targetCharset;
+ iconv_t m_iconv;
+ unsigned int m_targetSingleCharMaxLen;
+};
+
+CConverterType::CConverterType(const std::string& sourceCharset, const std::string& targetCharset, unsigned int targetSingleCharMaxLen /*= 1*/) : CCriticalSection(),
+ m_sourceSpecialCharset(NotSpecialCharset),
+ m_sourceCharset(sourceCharset),
+ m_targetSpecialCharset(NotSpecialCharset),
+ m_targetCharset(targetCharset),
+ m_iconv(NO_ICONV),
+ m_targetSingleCharMaxLen(targetSingleCharMaxLen)
+{
+}
+
+CConverterType::CConverterType(enum SpecialCharset sourceSpecialCharset, const std::string& targetCharset, unsigned int targetSingleCharMaxLen /*= 1*/) : CCriticalSection(),
+ m_sourceSpecialCharset(sourceSpecialCharset),
+ m_sourceCharset(),
+ m_targetSpecialCharset(NotSpecialCharset),
+ m_targetCharset(targetCharset),
+ m_iconv(NO_ICONV),
+ m_targetSingleCharMaxLen(targetSingleCharMaxLen)
+{
+}
+
+CConverterType::CConverterType(const std::string& sourceCharset, enum SpecialCharset targetSpecialCharset, unsigned int targetSingleCharMaxLen /*= 1*/) : CCriticalSection(),
+ m_sourceSpecialCharset(NotSpecialCharset),
+ m_sourceCharset(sourceCharset),
+ m_targetSpecialCharset(targetSpecialCharset),
+ m_targetCharset(),
+ m_iconv(NO_ICONV),
+ m_targetSingleCharMaxLen(targetSingleCharMaxLen)
+{
+}
+
+CConverterType::CConverterType(enum SpecialCharset sourceSpecialCharset, enum SpecialCharset targetSpecialCharset, unsigned int targetSingleCharMaxLen /*= 1*/) : CCriticalSection(),
+ m_sourceSpecialCharset(sourceSpecialCharset),
+ m_sourceCharset(),
+ m_targetSpecialCharset(targetSpecialCharset),
+ m_targetCharset(),
+ m_iconv(NO_ICONV),
+ m_targetSingleCharMaxLen(targetSingleCharMaxLen)
+{
+}
+
+CConverterType::CConverterType(const CConverterType& other) : CCriticalSection(),
+ m_sourceSpecialCharset(other.m_sourceSpecialCharset),
+ m_sourceCharset(other.m_sourceCharset),
+ m_targetSpecialCharset(other.m_targetSpecialCharset),
+ m_targetCharset(other.m_targetCharset),
+ m_iconv(NO_ICONV),
+ m_targetSingleCharMaxLen(other.m_targetSingleCharMaxLen)
+{
+}
+
+
+CConverterType::~CConverterType()
+{
+ CSingleLock(*this);
+ if (m_iconv != NO_ICONV)
+ iconv_close(m_iconv);
+}
+
+
+iconv_t CConverterType::GetConverter(CSingleLock& converterLock)
+{
+ // ensure that this unique instance is locked externally
+ if (&converterLock.get_underlying() != this)
+ return NO_ICONV;
+
+ if (m_iconv == NO_ICONV)
+ {
+ if (m_sourceSpecialCharset)
+ m_sourceCharset = ResolveSpecialCharset(m_sourceSpecialCharset);
+ if (m_targetSpecialCharset)
+ m_targetCharset = ResolveSpecialCharset(m_targetSpecialCharset);
+
+ m_iconv = iconv_open(m_targetCharset.c_str(), m_sourceCharset.c_str());
+
+ if (m_iconv == NO_ICONV)
+ CLog::Log(LOGERROR, "%s: iconv_open() for \"%s\" -> \"%s\" failed, errno = %d (%s)",
+ __FUNCTION__, m_sourceCharset.c_str(), m_targetCharset.c_str(), errno, strerror(errno));
+ }
+
+ return m_iconv;
+}
+
+
+void CConverterType::Reset(void)
+{
+ CSingleLock(*this);
+ if (m_iconv != NO_ICONV)
+ {
+ iconv_close(m_iconv);
+ m_iconv = NO_ICONV;
+ }
+
+ if (m_sourceSpecialCharset)
+ m_sourceCharset.clear();
+ if (m_targetSpecialCharset)
+ m_targetCharset.clear();
+
+}
+
+void CConverterType::ReinitTo(const std::string& sourceCharset, const std::string& targetCharset, unsigned int targetSingleCharMaxLen /*= 1*/)
+{
+ CSingleLock(*this);
+ if (sourceCharset != m_sourceCharset || targetCharset != m_targetCharset)
+ {
+ if (m_iconv != NO_ICONV)
+ {
+ iconv_close(m_iconv);
+ m_iconv = NO_ICONV;
+ }
+
+ m_sourceSpecialCharset = NotSpecialCharset;
+ m_sourceCharset = sourceCharset;
+ m_targetSpecialCharset = NotSpecialCharset;
+ m_targetCharset = targetCharset;
+ m_targetSingleCharMaxLen = targetSingleCharMaxLen;
+ }
+}
+
+std::string CConverterType::ResolveSpecialCharset(enum SpecialCharset charset)
+{
+ switch (charset)
+ {
+ case SystemCharset:
+ return "";
+ case UserCharset:
+ return g_langInfo.GetGuiCharSet();
+ case SubtitleCharset:
+ return g_langInfo.GetSubtitleCharSet();
+ case KaraokeCharset:
+ {
+ CSetting* karaokeSetting = CSettings::Get().GetSetting("karaoke.charset");
+ if (karaokeSetting == NULL || ((CSettingString*)karaokeSetting)->GetValue() == "DEFAULT")
+ return g_langInfo.GetGuiCharSet();
+
+ return ((CSettingString*)karaokeSetting)->GetValue();
+ }
+ case NotSpecialCharset:
+ default:
+ return "UTF-8"; /* dummy value */
+ }
+}
+
+
+enum StdConversionType /* Keep it in sync with CCharsetConverter::CInnerConverter::m_stdConversion */
+{
+ NoConversion = -1,
+ Utf8ToUtf32 = 0,
+ Utf32ToUtf8,
+ Utf32ToW,
+ WToUtf32,
+ SubtitleCharsetToW,
+ Utf8ToUserCharset,
+ UserCharsetToUtf8,
+ Utf32ToUserCharset,
+ WtoUtf8,
+ Utf16LEtoW,
+ Utf16BEtoUtf8,
+ Utf16LEtoUtf8,
+ Utf8toW,
+ Utf8ToSystem,
+ Ucs2CharsetToUtf8,
+ NumberOfStdConversionTypes /* Dummy sentinel entry */
+};
+
+
+/* We don't want to pollute header file with many additional includes and definitions, so put
+ here all staff that require usage of types defined in this file or in additional headers */
+class CCharsetConverter::CInnerConverter
+{
+public:
+ static bool logicalToVisualBiDi(const std::string& stringSrc, std::string& stringDst, FriBidiCharSet fribidiCharset, FriBidiCharType base = FRIBIDI_TYPE_LTR, bool* bWasFlipped =NULL);
+
+ template<class INPUT,class OUTPUT>
+ static bool stdConvert(StdConversionType convertType, const INPUT& strSource, OUTPUT& strDest, bool failOnInvalidChar = false);
+ template<class INPUT,class OUTPUT>
+ static bool customConvert(const std::string& sourceCharset, const std::string& targetCharset, const INPUT& strSource, OUTPUT& strDest, bool failOnInvalidChar = false);
+
+ template<class INPUT,class OUTPUT>
+ static bool convert(iconv_t type, int multiplier, const INPUT& strSource, OUTPUT& strDest, bool failOnInvalidChar = false);
+
+ static CConverterType m_stdConversion[NumberOfStdConversionTypes];
+};
+
+/* single symbol sizes in chars */
+const int CCharsetConverter::m_Utf8CharMinSize = 1;
+const int CCharsetConverter::m_Utf8CharMaxSize = 4;
+
+CConverterType CCharsetConverter::CInnerConverter::m_stdConversion[NumberOfStdConversionTypes] = /* keep it in sync with enum StdConversionType */
+{
+ /* Utf8ToUtf32 */ CConverterType(UTF8_SOURCE, UTF32_CHARSET),
+ /* Utf32ToUtf8 */ CConverterType(UTF32_CHARSET, "UTF-8", CCharsetConverter::m_Utf8CharMaxSize),
+ /* Utf32ToW */ CConverterType(UTF32_CHARSET, WCHAR_CHARSET),
+ /* WToUtf32 */ CConverterType(WCHAR_CHARSET, UTF32_CHARSET),
+ /* SubtitleCharsetToW */ CConverterType(SubtitleCharset, WCHAR_CHARSET),
+ /* Utf8ToUserCharset */ CConverterType(UTF8_SOURCE, UserCharset),
+ /* UserCharsetToUtf8 */ CConverterType(UserCharset, "UTF-8", CCharsetConverter::m_Utf8CharMaxSize),
+ /* Utf32ToUserCharset */ CConverterType(UTF32_CHARSET, UserCharset),
+ /* WtoUtf8 */ CConverterType(WCHAR_CHARSET, "UTF-8", CCharsetConverter::m_Utf8CharMaxSize),
+ /* Utf16LEtoW */ CConverterType("UTF-16LE", WCHAR_CHARSET),
+ /* Utf16BEtoUtf8 */ CConverterType("UTF-16BE", "UTF-8", CCharsetConverter::m_Utf8CharMaxSize),
+ /* Utf16LEtoUtf8 */ CConverterType("UTF-16LE", "UTF-8", CCharsetConverter::m_Utf8CharMaxSize),
+ /* Utf8toW */ CConverterType(UTF8_SOURCE, WCHAR_CHARSET),
+ /* Utf8ToSystem */ CConverterType(UTF8_SOURCE, SystemCharset),
+ /* Ucs2CharsetToUtf8 */ CConverterType("UCS-2LE", "UTF-8", CCharsetConverter::m_Utf8CharMaxSize)
+};
+
+
+
+template<class INPUT,class OUTPUT>
+bool CCharsetConverter::CInnerConverter::stdConvert(StdConversionType convertType, const INPUT& strSource, OUTPUT& strDest, bool failOnInvalidChar /*= false*/)
+{
+ strDest.clear();
+ if (strSource.empty())
+ return true;
+
+ if (convertType < 0 || convertType >= NumberOfStdConversionTypes)
+ return false;
+
+ CConverterType& convType = m_stdConversion[convertType];
+ CSingleLock converterLock(convType);
+
+ return convert(convType.GetConverter(converterLock), convType.GetTargetSingleCharMaxLen(), strSource, strDest, failOnInvalidChar);
+}
+
+template<class INPUT,class OUTPUT>
+bool CCharsetConverter::CInnerConverter::customConvert(const std::string& sourceCharset, const std::string& targetCharset, const INPUT& strSource, OUTPUT& strDest, bool failOnInvalidChar /*= false*/)
+{
+ strDest.clear();
+ if (strSource.empty())
+ return true;
+
+ iconv_t conv = iconv_open(targetCharset.c_str(), sourceCharset.c_str());
+ if (conv == NO_ICONV)
+ {
+ CLog::Log(LOGERROR, "%s: iconv_open() for \"%s\" -> \"%s\" failed, errno = %d (%s)",
+ __FUNCTION__, sourceCharset.c_str(), targetCharset.c_str(), errno, strerror(errno));
+ return false;
+ }
+ const int dstMultp = (targetCharset.compare(0, 5, "UTF-8") == 0) ? CCharsetConverter::m_Utf8CharMaxSize : 1;
+ const bool result = convert(conv, dstMultp, strSource, strDest, failOnInvalidChar);
+ iconv_close(conv);
+
+ return result;
+}
-static iconv_t m_iconvUtf8ToUtf32 = (iconv_t)-1;
-static iconv_t m_iconvUtf32ToUtf8 = (iconv_t)-1;
-static iconv_t m_iconvUtf32ToW = (iconv_t)-1;
-static iconv_t m_iconvWToUtf32 = (iconv_t)-1;
-static iconv_t m_iconvSubtitleCharsetToW = (iconv_t)-1;
-static iconv_t m_iconvUtf8ToStringCharset = (iconv_t)-1;
-static iconv_t m_iconvStringCharsetToUtf8 = (iconv_t)-1;
-static iconv_t m_iconvUtf32ToStringCharset = (iconv_t)-1;
-static iconv_t m_iconvWtoUtf8 = (iconv_t)-1;
-static iconv_t m_iconvUtf16LEtoW = (iconv_t)-1;
-static iconv_t m_iconvUtf16BEtoUtf8 = (iconv_t)-1;
-static iconv_t m_iconvUtf16LEtoUtf8 = (iconv_t)-1;
-static iconv_t m_iconvUtf8toW = (iconv_t)-1;
-static iconv_t m_iconvUcs2CharsetToUtf8 = (iconv_t)-1;
#if defined(FRIBIDI_CHAR_SET_NOT_FOUND)
-static FriBidiCharSet m_stringFribidiCharset = FRIBIDI_CHAR_SET_NOT_FOUND;
#define FRIBIDI_UTF8 FRIBIDI_CHAR_SET_UTF8
-#define FRIBIDI_NOTFOUND FRIBIDI_CHAR_SET_NOT_FOUND
#else /* compatibility to older version */
-static FriBidiCharSet m_stringFribidiCharset = FRIBIDI_CHARSET_NOT_FOUND;
#define FRIBIDI_UTF8 FRIBIDI_CHARSET_UTF8
-#define FRIBIDI_NOTFOUND FRIBIDI_CHARSET_NOT_FOUND
#endif
static CCriticalSection m_critSection;
-static struct SFribidMapping
-{
- FriBidiCharSet name;
- const char* charset;
-} g_fribidi[] = {
-#if defined(FRIBIDI_CHAR_SET_NOT_FOUND)
- { FRIBIDI_CHAR_SET_ISO8859_6, "ISO-8859-6" }
-, { FRIBIDI_CHAR_SET_ISO8859_8, "ISO-8859-8" }
-, { FRIBIDI_CHAR_SET_CP1255 , "CP1255" }
-, { FRIBIDI_CHAR_SET_CP1255 , "Windows-1255" }
-, { FRIBIDI_CHAR_SET_CP1256 , "CP1256" }
-, { FRIBIDI_CHAR_SET_CP1256 , "Windows-1256" }
-, { FRIBIDI_CHAR_SET_NOT_FOUND, NULL }
-#else /* compatibility to older version */
- { FRIBIDI_CHARSET_ISO8859_6, "ISO-8859-6" }
-, { FRIBIDI_CHARSET_ISO8859_8, "ISO-8859-8" }
-, { FRIBIDI_CHARSET_CP1255 , "CP1255" }
-, { FRIBIDI_CHARSET_CP1255 , "Windows-1255" }
-, { FRIBIDI_CHARSET_CP1256 , "CP1256" }
-, { FRIBIDI_CHARSET_CP1256 , "Windows-1256" }
-, { FRIBIDI_CHARSET_NOT_FOUND, NULL }
-#endif
-};
-
static struct SCharsetMapping
{
const char* charset;
};
-/* single symbol sizes in chars */
-const int CCharsetConverter::m_Utf8CharMinSize = 1;
-const int CCharsetConverter::m_Utf8CharMaxSize = 6;
-
-#define ICONV_PREPARE(iconv) iconv=(iconv_t)-1
-#define ICONV_SAFE_CLOSE(iconv) if (iconv!=(iconv_t)-1) { iconv_close(iconv); iconv=(iconv_t)-1; }
-
-size_t iconv_const (void* cd, const char** inbuf, size_t* inbytesleft,
- char** outbuf, size_t* outbytesleft)
+/* iconv may declare inbuf to be char** rather than const char** depending on platform and version,
+ so provide a wrapper that handles both */
+struct charPtrPtrAdapter
{
- struct iconv_param_adapter {
- iconv_param_adapter(const char**p) : p(p) {}
- iconv_param_adapter(char**p) : p((const char**)p) {}
- operator char**() const
- {
- return(char**)p;
- }
- operator const char**() const
- {
- return(const char**)p;
- }
- const char** p;
- };
-
- return iconv((iconv_t)cd, iconv_param_adapter(inbuf), inbytesleft, outbuf, outbytesleft);
-}
+ const char** pointer;
+ charPtrPtrAdapter(const char** p) :
+ pointer(p) { }
+ operator char**()
+ { return const_cast<char**>(pointer); }
+ operator const char**()
+ { return pointer; }
+};
template<class INPUT,class OUTPUT>
-static bool convert(iconv_t& type, int multiplier, const std::string& strFromCharset, const std::string& strToCharset, const INPUT& strSource, OUTPUT& strDest, bool failOnInvalidChar = false)
+bool CCharsetConverter::CInnerConverter::convert(iconv_t type, int multiplier, const INPUT& strSource, OUTPUT& strDest, bool failOnInvalidChar /*= false*/)
{
- strDest.clear();
-
- if (type == (iconv_t)-1)
- {
- type = iconv_open(strToCharset.c_str(), strFromCharset.c_str());
- if (type == (iconv_t)-1) //iconv_open failed
- {
- CLog::Log(LOGERROR, "%s iconv_open() failed from %s to %s, errno=%d(%s)",
- __FUNCTION__, strFromCharset.c_str(), strToCharset.c_str(), errno, strerror(errno));
- return false;
- }
- }
-
- if (strSource.empty())
- return true; //empty strings are easy
+ if (type == NO_ICONV)
+ return false;
//input buffer for iconv() is the buffer from strSource
size_t inBufSize = (strSource.length() + 1) * sizeof(typename INPUT::value_type);
while(1)
{
//iconv() will update inBufStart, inBytesAvail, outBufStart and outBytesAvail
- returnV = iconv_const(type, &inBufStart, &inBytesAvail, &outBufStart, &outBytesAvail);
+ returnV = iconv(type, charPtrPtrAdapter(&inBufStart), &inBytesAvail, &outBufStart, &outBytesAvail);
if (returnV == (size_t)-1)
{
}
else //iconv() had some other error
{
- CLog::Log(LOGERROR, "%s iconv() failed from %s to %s, errno=%d(%s)",
- __FUNCTION__, strFromCharset.c_str(), strToCharset.c_str(), errno, strerror(errno));
+ CLog::Log(LOGERROR, "%s: iconv() failed, errno=%d (%s)",
+ __FUNCTION__, errno, strerror(errno));
}
}
break;
}
//complete the conversion (reset buffers), otherwise the current data will prefix the data on the next call
- if (iconv_const(type, NULL, NULL, &outBufStart, &outBytesAvail) == (size_t)-1)
+ if (iconv(type, NULL, NULL, &outBufStart, &outBytesAvail) == (size_t)-1)
CLog::Log(LOGERROR, "%s failed cleanup errno=%d(%s)", __FUNCTION__, errno, strerror(errno));
if (returnV == (size_t)-1)
const typename OUTPUT::size_type sizeInChars = (typename OUTPUT::size_type) (outBufSize - outBytesAvail) / sizeof(typename OUTPUT::value_type);
typename OUTPUT::const_pointer strPtr = (typename OUTPUT::const_pointer) outBuf;
/* Make sure that all buffer is assigned and string is stopped at end of buffer */
- if (strPtr[sizeInChars-1] == 0)
+ if (strPtr[sizeInChars-1] == 0 && strSource[strSource.length()-1] != 0)
strDest.assign(strPtr, sizeInChars-1);
else
strDest.assign(strPtr, sizeInChars);
return true;
}
-using namespace std;
-
-static bool logicalToVisualBiDi(const std::string& stringSrc, std::string& stringDst, FriBidiCharSet fribidiCharset, FriBidiCharType base = FRIBIDI_TYPE_LTR, bool* bWasFlipped =NULL)
+bool CCharsetConverter::CInnerConverter::logicalToVisualBiDi(const std::string& stringSrc, std::string& stringDst, FriBidiCharSet fribidiCharset, FriBidiCharType base /*= FRIBIDI_TYPE_LTR*/, bool* bWasFlipped /*=NULL*/)
{
stringDst.clear();
- vector<std::string> lines = StringUtils::Split(stringSrc, "\n");
+ std::vector<std::string> lines = StringUtils::Split(stringSrc, "\n");
if (bWasFlipped)
*bWasFlipped = false;
return;
const std::string& settingId = setting->GetId();
- // TODO: does this make any sense at all for subtitles and karaoke?
- if (settingId == "subtitles.charset" ||
- settingId == "karaoke.charset" ||
- settingId == "locale.charset")
- reset();
+ if (settingId == "locale.charset")
+ resetUserCharset();
+ else if (settingId == "subtitles.charset")
+ resetSubtitleCharset();
+ else if (settingId == "karaoke.charset")
+ resetKaraokeCharset();
}
void CCharsetConverter::clear()
std::vector<std::string> CCharsetConverter::getCharsetLabels()
{
- vector<std::string> lab;
+ std::vector<std::string> lab;
for(SCharsetMapping* c = g_charsets; c->charset; c++)
lab.push_back(c->caption);
return "";
}
-bool CCharsetConverter::isBidiCharset(const std::string& charset)
+void CCharsetConverter::reset(void)
{
- for(SFribidMapping* c = g_fribidi; c->charset; c++)
- {
- if (StringUtils::EqualsNoCase(charset, c->charset))
- return true;
- }
- return false;
+ for (int i = 0; i < NumberOfStdConversionTypes; i++)
+ CInnerConverter::m_stdConversion[i].Reset();
}
-void CCharsetConverter::reset(void)
+void CCharsetConverter::resetSystemCharset(void)
{
- CSingleLock lock(m_critSection);
+ CInnerConverter::m_stdConversion[Utf8ToSystem].Reset();
+}
- ICONV_SAFE_CLOSE(m_iconvUtf8ToUtf32);
- ICONV_SAFE_CLOSE(m_iconvUtf32ToUtf8);
- ICONV_SAFE_CLOSE(m_iconvUtf32ToW);
- ICONV_SAFE_CLOSE(m_iconvWToUtf32);
- ICONV_SAFE_CLOSE(m_iconvUtf8ToStringCharset);
- ICONV_SAFE_CLOSE(m_iconvStringCharsetToUtf8);
- ICONV_SAFE_CLOSE(m_iconvSubtitleCharsetToW);
- ICONV_SAFE_CLOSE(m_iconvWtoUtf8);
- ICONV_SAFE_CLOSE(m_iconvUtf16BEtoUtf8);
- ICONV_SAFE_CLOSE(m_iconvUtf16LEtoUtf8);
- ICONV_SAFE_CLOSE(m_iconvUtf32ToStringCharset);
- ICONV_SAFE_CLOSE(m_iconvUtf8toW);
- ICONV_SAFE_CLOSE(m_iconvUcs2CharsetToUtf8);
-
-
- m_stringFribidiCharset = FRIBIDI_NOTFOUND;
-
- std::string strCharset=g_langInfo.GetGuiCharSet();
- for(SFribidMapping* c = g_fribidi; c->charset; c++)
- {
- if (StringUtils::EqualsNoCase(strCharset, c->charset))
- {
- m_stringFribidiCharset = c->name;
- break;
- }
- }
+void CCharsetConverter::resetUserCharset(void)
+{
+ CInnerConverter::m_stdConversion[UserCharsetToUtf8].Reset();
+ CInnerConverter::m_stdConversion[UserCharsetToUtf8].Reset();
+ CInnerConverter::m_stdConversion[Utf32ToUserCharset].Reset();
+ resetSubtitleCharset();
+ resetKaraokeCharset();
+}
+
+void CCharsetConverter::resetSubtitleCharset(void)
+{
+ CInnerConverter::m_stdConversion[SubtitleCharsetToW].Reset();
+}
+
+void CCharsetConverter::resetKaraokeCharset(void)
+{
+}
+
+void CCharsetConverter::reinitCharsetsFromSettings(void)
+{
+ resetUserCharset(); // this will also reinit Subtitle and Karaoke charsets
}
bool CCharsetConverter::utf8ToUtf32(const std::string& utf8StringSrc, std::u32string& utf32StringDst, bool failOnBadChar /*= true*/)
{
- CSingleLock lock(m_critSection);
- return convert(m_iconvUtf8ToUtf32, 1, UTF8_SOURCE, UTF32_CHARSET, utf8StringSrc, utf32StringDst, failOnBadChar);
+ return CInnerConverter::stdConvert(Utf8ToUtf32, utf8StringSrc, utf32StringDst, failOnBadChar);
}
std::u32string CCharsetConverter::utf8ToUtf32(const std::string& utf8StringSrc, bool failOnBadChar /*= true*/)
if (bVisualBiDiFlip)
{
std::string strFlipped;
- if (!logicalToVisualBiDi(utf8StringSrc, strFlipped, FRIBIDI_UTF8, forceLTRReadingOrder ? FRIBIDI_TYPE_LTR : FRIBIDI_TYPE_PDF))
+ if (!CInnerConverter::logicalToVisualBiDi(utf8StringSrc, strFlipped, FRIBIDI_UTF8, forceLTRReadingOrder ? FRIBIDI_TYPE_LTR : FRIBIDI_TYPE_PDF))
return false;
- CSingleLock lock(m_critSection);
- return convert(m_iconvUtf8ToUtf32, 1, UTF8_SOURCE, UTF32_CHARSET, strFlipped, utf32StringDst, failOnBadChar);
+ return CInnerConverter::stdConvert(Utf8ToUtf32, strFlipped, utf32StringDst, failOnBadChar);
}
- CSingleLock lock(m_critSection);
- return convert(m_iconvUtf8ToUtf32, 1, UTF8_SOURCE, UTF32_CHARSET, utf8StringSrc, utf32StringDst, failOnBadChar);
+ return CInnerConverter::stdConvert(Utf8ToUtf32, utf8StringSrc, utf32StringDst, failOnBadChar);
}
bool CCharsetConverter::utf32ToUtf8(const std::u32string& utf32StringSrc, std::string& utf8StringDst, bool failOnBadChar /*= true*/)
{
- CSingleLock lock(m_critSection);
- return convert(m_iconvUtf32ToUtf8, m_Utf8CharMaxSize, UTF32_CHARSET, "UTF-8", utf32StringSrc, utf8StringDst, failOnBadChar);
+ return CInnerConverter::stdConvert(Utf32ToUtf8, utf32StringSrc, utf8StringDst, failOnBadChar);
}
std::string CCharsetConverter::utf32ToUtf8(const std::u32string& utf32StringSrc, bool failOnBadChar /*= false*/)
wStringDst.assign((const wchar_t*)utf32StringSrc.c_str(), utf32StringSrc.length());
return true;
#else // !WCHAR_IS_UCS_4
- CSingleLock lock(m_critSection);
- return convert(m_iconvUtf32ToW, 1, UTF32_CHARSET, WCHAR_CHARSET, utf32StringSrc, wStringDst, failOnBadChar);
+ return CInnerConverter::stdConvert(Utf32ToW, utf32StringSrc, wStringDst, failOnBadChar);
#endif // !WCHAR_IS_UCS_4
}
/* UCS-4 is almost equal to UTF-32, but UTF-32 has strict limits on possible values, while UCS-4 is usually unchecked.
* With this "conversion" we ensure that output will be valid UTF-32 string. */
#endif
- CSingleLock lock(m_critSection);
- return convert(m_iconvWToUtf32, 1, WCHAR_CHARSET, UTF32_CHARSET, wStringSrc, utf32StringDst, failOnBadChar);
+ return CInnerConverter::stdConvert(WToUtf32, wStringSrc, utf32StringDst, failOnBadChar);
}
// The bVisualBiDiFlip forces a flip of characters for hebrew/arabic languages, only set to false if the flipping
{
std::string strFlipped;
FriBidiCharType charset = forceLTRReadingOrder ? FRIBIDI_TYPE_LTR : FRIBIDI_TYPE_PDF;
- logicalToVisualBiDi(utf8StringSrc, strFlipped, FRIBIDI_UTF8, charset, bWasFlipped);
- CSingleLock lock(m_critSection);
- return convert(m_iconvUtf8toW,1,UTF8_SOURCE,WCHAR_CHARSET,strFlipped,wStringDst, failOnBadChar);
+ CInnerConverter::logicalToVisualBiDi(utf8StringSrc, strFlipped, FRIBIDI_UTF8, charset, bWasFlipped);
+ return CInnerConverter::stdConvert(Utf8toW, strFlipped, wStringDst, failOnBadChar);
}
else
{
- CSingleLock lock(m_critSection);
- return convert(m_iconvUtf8toW,1,UTF8_SOURCE,WCHAR_CHARSET,utf8StringSrc,wStringDst, failOnBadChar);
+ return CInnerConverter::stdConvert(Utf8toW, utf8StringSrc, wStringDst, failOnBadChar);
}
}
bool CCharsetConverter::subtitleCharsetToW(const std::string& stringSrc, std::wstring& wStringDst)
{
- // No need to flip hebrew/arabic as mplayer does the flipping
- CSingleLock lock(m_critSection);
- return convert(m_iconvSubtitleCharsetToW,1,g_langInfo.GetSubtitleCharSet(),WCHAR_CHARSET,stringSrc,wStringDst);
+ return CInnerConverter::stdConvert(SubtitleCharsetToW, stringSrc, wStringDst, false);
}
bool CCharsetConverter::fromW(const std::wstring& wStringSrc,
std::string& stringDst, const std::string& enc)
{
- iconv_t iconvString;
- ICONV_PREPARE(iconvString);
- const bool result = convert(iconvString,m_Utf8CharMaxSize,WCHAR_CHARSET,enc,wStringSrc,stringDst);
- iconv_close(iconvString);
- return result;
+ return CInnerConverter::customConvert(WCHAR_CHARSET, enc, wStringSrc, stringDst);
}
bool CCharsetConverter::toW(const std::string& stringSrc,
std::wstring& wStringDst, const std::string& enc)
{
- iconv_t iconvString;
- ICONV_PREPARE(iconvString);
- const bool result = convert(iconvString,1,enc,WCHAR_CHARSET,stringSrc,wStringDst);
- iconv_close(iconvString);
- return result;
+ return CInnerConverter::customConvert(enc, WCHAR_CHARSET, stringSrc, wStringDst);
}
bool CCharsetConverter::utf8ToStringCharset(const std::string& utf8StringSrc, std::string& stringDst)
{
- CSingleLock lock(m_critSection);
- return convert(m_iconvUtf8ToStringCharset,1,UTF8_SOURCE,g_langInfo.GetGuiCharSet(),utf8StringSrc,stringDst);
+ return CInnerConverter::stdConvert(Utf8ToUserCharset, utf8StringSrc, stringDst);
}
bool CCharsetConverter::utf8ToStringCharset(std::string& stringSrcDst)
utf8StringDst = stringSrc;
return true;
}
- iconv_t iconvString;
- ICONV_PREPARE(iconvString);
- const bool result = convert(iconvString,m_Utf8CharMaxSize,strSourceCharset,"UTF-8",stringSrc,utf8StringDst);
- iconv_close(iconvString);
- return result;
+
+ return CInnerConverter::customConvert(strSourceCharset, "UTF-8", stringSrc, utf8StringDst);
}
bool CCharsetConverter::utf8To(const std::string& strDestCharset, const std::string& utf8StringSrc, std::string& stringDst)
stringDst = utf8StringSrc;
return true;
}
- iconv_t iconvString;
- ICONV_PREPARE(iconvString);
- const bool result = convert(iconvString,1,UTF8_SOURCE,strDestCharset,utf8StringSrc,stringDst);
- iconv_close(iconvString);
- return result;
+
+ return CInnerConverter::customConvert(UTF8_SOURCE, strDestCharset, utf8StringSrc, stringDst);
}
bool CCharsetConverter::utf8To(const std::string& strDestCharset, const std::string& utf8StringSrc, std::u16string& utf16StringDst)
{
- iconv_t iconvString;
- ICONV_PREPARE(iconvString);
- const bool result = convert(iconvString,1,UTF8_SOURCE,strDestCharset,utf8StringSrc,utf16StringDst);
- iconv_close(iconvString);
- return result;
+ return CInnerConverter::customConvert(UTF8_SOURCE, strDestCharset, utf8StringSrc, utf16StringDst);
}
bool CCharsetConverter::utf8To(const std::string& strDestCharset, const std::string& utf8StringSrc, std::u32string& utf32StringDst)
{
- iconv_t iconvString;
- ICONV_PREPARE(iconvString);
- const bool result = convert(iconvString,1,UTF8_SOURCE,strDestCharset,utf8StringSrc,utf32StringDst);
- iconv_close(iconvString);
- return result;
+ return CInnerConverter::customConvert(UTF8_SOURCE, strDestCharset, utf8StringSrc, utf32StringDst);
}
bool CCharsetConverter::unknownToUTF8(std::string& stringSrcDst)
utf8StringDst = stringSrc;
return true;
}
- CSingleLock lock(m_critSection);
- return convert(m_iconvStringCharsetToUtf8, m_Utf8CharMaxSize, g_langInfo.GetGuiCharSet(), "UTF-8", stringSrc, utf8StringDst, failOnBadChar);
+ return CInnerConverter::stdConvert(UserCharsetToUtf8, stringSrc, utf8StringDst, failOnBadChar);
}
bool CCharsetConverter::wToUTF8(const std::wstring& wStringSrc, std::string& utf8StringDst, bool failOnBadChar /*= false*/)
{
- CSingleLock lock(m_critSection);
- return convert(m_iconvWtoUtf8,m_Utf8CharMaxSize,WCHAR_CHARSET,"UTF-8",wStringSrc,utf8StringDst, failOnBadChar);
+ return CInnerConverter::stdConvert(WtoUtf8, wStringSrc, utf8StringDst, failOnBadChar);
}
bool CCharsetConverter::utf16BEtoUTF8(const std::u16string& utf16StringSrc, std::string& utf8StringDst)
{
- CSingleLock lock(m_critSection);
- return convert(m_iconvUtf16BEtoUtf8,m_Utf8CharMaxSize,"UTF-16BE","UTF-8",utf16StringSrc,utf8StringDst);
+ return CInnerConverter::stdConvert(Utf16BEtoUtf8, utf16StringSrc, utf8StringDst);
}
bool CCharsetConverter::utf16LEtoUTF8(const std::u16string& utf16StringSrc,
std::string& utf8StringDst)
{
- CSingleLock lock(m_critSection);
- return convert(m_iconvUtf16LEtoUtf8,m_Utf8CharMaxSize,"UTF-16LE","UTF-8",utf16StringSrc,utf8StringDst);
+ return CInnerConverter::stdConvert(Utf16LEtoUtf8, utf16StringSrc, utf8StringDst);
}
bool CCharsetConverter::ucs2ToUTF8(const std::u16string& ucs2StringSrc, std::string& utf8StringDst)
{
- CSingleLock lock(m_critSection);
- return convert(m_iconvUcs2CharsetToUtf8,m_Utf8CharMaxSize,"UCS-2LE","UTF-8",ucs2StringSrc,utf8StringDst);
+ return CInnerConverter::stdConvert(Ucs2CharsetToUtf8, ucs2StringSrc,utf8StringDst);
}
bool CCharsetConverter::utf16LEtoW(const std::u16string& utf16String, std::wstring& wString)
{
- CSingleLock lock(m_critSection);
- return convert(m_iconvUtf16LEtoW,1,"UTF-16LE",WCHAR_CHARSET,utf16String,wString);
+ return CInnerConverter::stdConvert(Utf16LEtoW, utf16String, wString);
}
bool CCharsetConverter::utf32ToStringCharset(const std::u32string& utf32StringSrc, std::string& stringDst)
{
- CSingleLock lock(m_critSection);
- return convert(m_iconvUtf32ToStringCharset, 1, g_langInfo.GetGuiCharSet().c_str(), UTF32_CHARSET, utf32StringSrc, stringDst);
+ return CInnerConverter::stdConvert(Utf32ToUserCharset, utf32StringSrc, stringDst);
}
bool CCharsetConverter::utf8ToSystem(std::string& stringSrcDst, bool failOnBadChar /*= false*/)
{
std::string strSrc(stringSrcDst);
- return utf8To("", strSrc, stringSrcDst);
+ return CInnerConverter::stdConvert(Utf8ToSystem, strSrc, stringSrcDst, failOnBadChar);
}
// Taken from RFC2640
bool CCharsetConverter::utf8logicalToVisualBiDi(const std::string& utf8StringSrc, std::string& utf8StringDst)
{
- return logicalToVisualBiDi(utf8StringSrc, utf8StringDst, FRIBIDI_UTF8, FRIBIDI_TYPE_RTL);
+ return CInnerConverter::logicalToVisualBiDi(utf8StringSrc, utf8StringDst, FRIBIDI_UTF8, FRIBIDI_TYPE_RTL);
}
void CCharsetConverter::SettingOptionsCharsetsFiller(const CSetting* setting, std::vector< std::pair<std::string, std::string> >& list, std::string& current)
{
- vector<std::string> vecCharsets = g_charsetConverter.getCharsetLabels();
+ std::vector<std::string> vecCharsets = g_charsetConverter.getCharsetLabels();
sort(vecCharsets.begin(), vecCharsets.end(), sortstringbyname());
list.push_back(make_pair(g_localizeStrings.Get(13278), "DEFAULT")); // "Default"
virtual void OnSettingChanged(const CSetting* setting);
- void reset();
+ static void reset();
+ static void resetSystemCharset();
+ static void reinitCharsetsFromSettings(void);
- void clear();
+ static void clear();
/**
* Convert UTF-8 string to UTF-32 string.
* otherwise invalid character will be skipped
* @return true on successful conversion, false on any error
*/
- bool utf8ToUtf32(const std::string& utf8StringSrc, std::u32string& utf32StringDst, bool failOnBadChar = true);
+ static bool utf8ToUtf32(const std::string& utf8StringSrc, std::u32string& utf32StringDst, bool failOnBadChar = true);
/**
* Convert UTF-8 string to UTF-32 string.
* No RTL logical-visual transformation is performed.
* otherwise invalid character will be skipped
* @return converted string on successful conversion, empty string on any error
*/
- std::u32string utf8ToUtf32(const std::string& utf8StringSrc, bool failOnBadChar = true);
+ static std::u32string utf8ToUtf32(const std::string& utf8StringSrc, bool failOnBadChar = true);
/**
* Convert UTF-8 string to UTF-32 string.
* RTL logical-visual transformation is optionally performed.
* otherwise invalid character will be skipped
* @return true on successful conversion, false on any error
*/
- bool utf8ToUtf32Visual(const std::string& utf8StringSrc, std::u32string& utf32StringDst, bool bVisualBiDiFlip = false, bool forceLTRReadingOrder = false, bool failOnBadChar = false);
+ static bool utf8ToUtf32Visual(const std::string& utf8StringSrc, std::u32string& utf32StringDst, bool bVisualBiDiFlip = false, bool forceLTRReadingOrder = false, bool failOnBadChar = false);
/**
* Convert UTF-32 string to UTF-8 string.
* No RTL visual-logical transformation is performed.
* otherwise invalid character will be skipped
* @return true on successful conversion, false on any error
*/
- bool utf32ToUtf8(const std::u32string& utf32StringSrc, std::string& utf8StringDst, bool failOnBadChar = false);
+ static bool utf32ToUtf8(const std::u32string& utf32StringSrc, std::string& utf8StringDst, bool failOnBadChar = false);
/**
* Convert UTF-32 string to UTF-8 string.
* No RTL visual-logical transformation is performed.
* otherwise invalid character will be skipped
* @return converted string on successful conversion, empty string on any error
*/
- std::string utf32ToUtf8(const std::u32string& utf32StringSrc, bool failOnBadChar = false);
+ static std::string utf32ToUtf8(const std::u32string& utf32StringSrc, bool failOnBadChar = false);
/**
* Convert UTF-32 string to wchar_t string (wstring).
* No RTL visual-logical transformation is performed.
* otherwise invalid character will be skipped
* @return true on successful conversion, false on any error
*/
- bool utf32ToW(const std::u32string& utf32StringSrc, std::wstring& wStringDst, bool failOnBadChar = false);
+ static bool utf32ToW(const std::u32string& utf32StringSrc, std::wstring& wStringDst, bool failOnBadChar = false);
/**
* Perform logical to visual flip.
* @param logicalStringSrc is source string with logical characters order
* @param forceLTRReadingOrder force LTR reading order
* @return true on success, false otherwise
*/
- bool utf32logicalToVisualBiDi(const std::u32string& logicalStringSrc, std::u32string& visualStringDst, bool forceLTRReadingOrder = false);
+ static bool utf32logicalToVisualBiDi(const std::u32string& logicalStringSrc, std::u32string& visualStringDst, bool forceLTRReadingOrder = false);
/**
* Strictly convert wchar_t string (wstring) to UTF-32 string.
* No RTL visual-logical transformation is performed.
* otherwise invalid character will be skipped
* @return true on successful conversion, false on any error
*/
- bool wToUtf32(const std::wstring& wStringSrc, std::u32string& utf32StringDst, bool failOnBadChar = false);
+ static bool wToUtf32(const std::wstring& wStringSrc, std::u32string& utf32StringDst, bool failOnBadChar = false);
- bool utf8ToW(const std::string& utf8StringSrc, std::wstring& wStringDst,
+ static bool utf8ToW(const std::string& utf8StringSrc, std::wstring& wStringDst,
bool bVisualBiDiFlip = true, bool forceLTRReadingOrder = false,
bool failOnBadChar = false, bool* bWasFlipped = NULL);
- bool utf16LEtoW(const std::u16string& utf16String, std::wstring& wString);
+ static bool utf16LEtoW(const std::u16string& utf16String, std::wstring& wString);
- bool subtitleCharsetToW(const std::string& stringSrc, std::wstring& wStringDst);
+ static bool subtitleCharsetToW(const std::string& stringSrc, std::wstring& wStringDst);
- bool utf8ToStringCharset(const std::string& utf8StringSrc, std::string& stringDst);
+ static bool utf8ToStringCharset(const std::string& utf8StringSrc, std::string& stringDst);
- bool utf8ToStringCharset(std::string& stringSrcDst);
- bool utf8ToSystem(std::string& stringSrcDst, bool failOnBadChar = false);
+ static bool utf8ToStringCharset(std::string& stringSrcDst);
+ static bool utf8ToSystem(std::string& stringSrcDst, bool failOnBadChar = false);
- bool utf8To(const std::string& strDestCharset, const std::string& utf8StringSrc, std::string& stringDst);
- bool utf8To(const std::string& strDestCharset, const std::string& utf8StringSrc, std::u16string& utf16StringDst);
- bool utf8To(const std::string& strDestCharset, const std::string& utf8StringSrc, std::u32string& utf32StringDst);
+ static bool utf8To(const std::string& strDestCharset, const std::string& utf8StringSrc, std::string& stringDst);
+ static bool utf8To(const std::string& strDestCharset, const std::string& utf8StringSrc, std::u16string& utf16StringDst);
+ static bool utf8To(const std::string& strDestCharset, const std::string& utf8StringSrc, std::u32string& utf32StringDst);
- bool ToUtf8(const std::string& strSourceCharset, const std::string& stringSrc, std::string& utf8StringDst);
+ static bool ToUtf8(const std::string& strSourceCharset, const std::string& stringSrc, std::string& utf8StringDst);
- bool isValidUtf8(const std::string& str);
+ static bool isValidUtf8(const std::string& str);
- bool isValidUtf8(const char* buf, unsigned int len);
+ static bool isValidUtf8(const char* buf, unsigned int len);
- bool wToUTF8(const std::wstring& wStringSrc, std::string& utf8StringDst, bool failOnBadChar = false);
- bool utf16BEtoUTF8(const std::u16string& utf16StringSrc, std::string& utf8StringDst);
- bool utf16LEtoUTF8(const std::u16string& utf16StringSrc, std::string& utf8StringDst);
- bool ucs2ToUTF8(const std::u16string& ucs2StringSrc, std::string& utf8StringDst);
+ static bool wToUTF8(const std::wstring& wStringSrc, std::string& utf8StringDst, bool failOnBadChar = false);
+ static bool utf16BEtoUTF8(const std::u16string& utf16StringSrc, std::string& utf8StringDst);
+ static bool utf16LEtoUTF8(const std::u16string& utf16StringSrc, std::string& utf8StringDst);
+ static bool ucs2ToUTF8(const std::u16string& ucs2StringSrc, std::string& utf8StringDst);
- bool utf8logicalToVisualBiDi(const std::string& utf8StringSrc, std::string& utf8StringDst);
+ static bool utf8logicalToVisualBiDi(const std::string& utf8StringSrc, std::string& utf8StringDst);
- bool utf32ToStringCharset(const std::u32string& utf32StringSrc, std::string& stringDst);
+ static bool utf32ToStringCharset(const std::u32string& utf32StringSrc, std::string& stringDst);
- std::vector<std::string> getCharsetLabels();
- std::string getCharsetLabelByName(const std::string& charsetName);
- std::string getCharsetNameByLabel(const std::string& charsetLabel);
- bool isBidiCharset(const std::string& charset);
+ static std::vector<std::string> getCharsetLabels();
+ static std::string getCharsetLabelByName(const std::string& charsetName);
+ static std::string getCharsetNameByLabel(const std::string& charsetLabel);
- bool unknownToUTF8(std::string& stringSrcDst);
- bool unknownToUTF8(const std::string& stringSrc, std::string& utf8StringDst, bool failOnBadChar = false);
+ static bool unknownToUTF8(std::string& stringSrcDst);
+ static bool unknownToUTF8(const std::string& stringSrc, std::string& utf8StringDst, bool failOnBadChar = false);
- bool toW(const std::string& stringSrc, std::wstring& wStringDst, const std::string& enc);
- bool fromW(const std::wstring& wStringSrc, std::string& stringDst, const std::string& enc);
+ static bool toW(const std::string& stringSrc, std::wstring& wStringDst, const std::string& enc);
+ static bool fromW(const std::wstring& wStringSrc, std::string& stringDst, const std::string& enc);
static void SettingOptionsCharsetsFiller(const CSetting* setting, std::vector< std::pair<std::string, std::string> >& list, std::string& current);
private:
+ static void resetUserCharset(void);
+ static void resetSubtitleCharset(void);
+ static void resetKaraokeCharset(void);
+
static const int m_Utf8CharMinSize, m_Utf8CharMaxSize;
+ class CInnerConverter;
};
XBMC_GLOBAL(CCharsetConverter,g_charsetConverter);
-size_t iconv_const (void* cd, const char** inbuf, size_t* inbytesleft, char** outbuf, size_t* outbytesleft);
-
#endif