summaryrefslogtreecommitdiff
path: root/plugin.video.plutotv
diff options
context:
space:
mode:
authorLunatixz <pseudotvlive@gmail.com>2017-06-21 10:49:16 -0400
committerLunatixz <pseudotvlive@gmail.com>2017-06-21 10:49:16 -0400
commita68bd84de8246a826edbaeb26fca1d40057ac609 (patch)
tree5c893ccdfbed8aed1b10907edc5dc2fd83c8a6db /plugin.video.plutotv
parent5f55ca760019d7f296c60e8035fe58d553d24423 (diff)
[plugin.video.plutotv] 1.0.6
Diffstat (limited to 'plugin.video.plutotv')
-rw-r--r--plugin.video.plutotv/addon.xml9
-rw-r--r--plugin.video.plutotv/country.py60
-rw-r--r--plugin.video.plutotv/default.py166
-rw-r--r--plugin.video.plutotv/resources/images/fanart.jpg (renamed from plugin.video.plutotv/fanart.jpg)bin160810 -> 160810 bytes
-rw-r--r--plugin.video.plutotv/resources/images/icon.png (renamed from plugin.video.plutotv/icon.png)bin141202 -> 141202 bytes
-rw-r--r--plugin.video.plutotv/resources/iso3166-1.json1677
-rw-r--r--plugin.video.plutotv/resources/language/resource.language.en_gb/strings.po27
-rw-r--r--plugin.video.plutotv/resources/settings.xml9
8 files changed, 1870 insertions, 78 deletions
diff --git a/plugin.video.plutotv/addon.xml b/plugin.video.plutotv/addon.xml
index 776c79f..fbdd490 100644
--- a/plugin.video.plutotv/addon.xml
+++ b/plugin.video.plutotv/addon.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
-<addon id="plugin.video.plutotv" version="1.0.3" name="Pluto.TV" provider-name="Lunatixz">
+<addon id="plugin.video.plutotv" version="1.0.6" name="Pluto.TV" provider-name="Lunatixz">
<requires>
<import addon="xbmc.python" version="2.25.0"/>
- <import addon="script.module.requests" version="2.7.0"/>
<import addon="script.module.simplecache" version="1.0.0"/>
<import addon="script.module.urlresolver" version="0.0.1"/>
<import addon="plugin.video.youtube" version="5.1.8" optional="true"/>
@@ -19,10 +18,10 @@
<source>https://github.com/Lunatixz/XBMC_Addons/tree/master/plugin.video.plutotv</source>
<website>http://pluto.tv/</website>
<forum>http://forum.kodi.tv/showthread.php?tid=315513</forum>
- <news>v1.0.1[CR]- Fixed login cache issue.[CR]v1.0.2[CR]- Fixed cookie issue on android/rpi devices.[CR]- Updated cache timings (8Hrs).[CR]v1.0.3[CR]- Fixed Menu and Tweaked cache</news>
+ <news>v1.0.1[CR]- Fixed login cache issue.[CR]v1.0.2[CR]- Fixed cookie issue on android devices.[CR]- Updated cache life.[CR]v1.0.3[CR]- Fixed Menu and Tweaked cache.[CR]v1.0.4[CR]- Added Region Selection and Improved Region Filter[CR]- Added Startup Wizard and Improved Login Verification.[CR]v1.0.5[CR]- Fixed Android Login[CR]v1.0.6[CR]- Added Guest Login.[CR]- Added Geoblock warning.</news>
<assets>
- <icon>icon.png</icon>
- <fanart>fanart.jpg</fanart>
+ <icon>resources/images/icon.png</icon>
+ <fanart>resources/images/fanart.jpg</fanart>
<screenshot>resources/images/screenshot01.png</screenshot>
<screenshot>resources/images/screenshot02.png</screenshot>
<screenshot>resources/images/screenshot03.png</screenshot>
diff --git a/plugin.video.plutotv/country.py b/plugin.video.plutotv/country.py
new file mode 100644
index 0000000..fd21e87
--- /dev/null
+++ b/plugin.video.plutotv/country.py
@@ -0,0 +1,60 @@
+# Copyright (C) 2017 Lunatixz
+#
+#
+# This file is part of PlutoTV.
+#
+# PlutoTV 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.
+#
+# PlutoTV 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 PlutoTV. If not, see <http://www.gnu.org/licenses/>.
+
+# -*- coding: utf-8 -*-
+import os, json
+import xbmcgui, xbmcaddon, xbmcvfs
+
+# Plugin Info
+ADDON_ID = 'plugin.video.plutotv'
+REAL_SETTINGS = xbmcaddon.Addon(id=ADDON_ID)
+ADDON_NAME = REAL_SETTINGS.getAddonInfo('name')
+SETTINGS_LOC = REAL_SETTINGS.getAddonInfo('profile')
+ADDON_PATH = REAL_SETTINGS.getAddonInfo('path').decode('utf-8')
+ADDON_VERSION = REAL_SETTINGS.getAddonInfo('version')
+ICON = REAL_SETTINGS.getAddonInfo('icon')
+FANART = REAL_SETTINGS.getAddonInfo('fanart')
+LANGUAGE = REAL_SETTINGS.getLocalizedString
+
+## GLOBALS ##
+USER_REGION = REAL_SETTINGS.getSetting("Select_Country")
+ISO3166 = os.path.join(ADDON_PATH,'resources','iso3166-1.json')
+COUNTRY_LIST = sorted((json.load(xbmcvfs.File(ISO3166)))['3166-1'], key=lambda x: x['name'])
+
+def getCurrentRegion():
+ for idx, country in enumerate(COUNTRY_LIST):
+ if country['alpha_2'] == USER_REGION:
+ return idx
+ return 0
+
+def getCountryList():
+ for country in COUNTRY_LIST:
+ yield (country['name'])
+
+def getAlpha2(idx):
+ if idx is None or idx < 0:
+ return 'US'
+ return str((COUNTRY_LIST[idx])['alpha_2'])
+
+def selectDialog(list, header=ADDON_NAME):
+ select = xbmcgui.Dialog().select(LANGUAGE(30005), list, preselect=getCurrentRegion())
+ if select > -1:
+ return select
+
+if __name__ == '__main__':
+ REAL_SETTINGS.setSetting("Select_Country",getAlpha2(selectDialog(list(getCountryList()),LANGUAGE(30005)))) \ No newline at end of file
diff --git a/plugin.video.plutotv/default.py b/plugin.video.plutotv/default.py
index 045c36c..515dcde 100644
--- a/plugin.video.plutotv/default.py
+++ b/plugin.video.plutotv/default.py
@@ -17,11 +17,12 @@
# along with PlutoTV. If not, see <http://www.gnu.org/licenses/>.
# -*- coding: utf-8 -*-
-import os, sys, time, datetime, net, requests, re, traceback
+import os, sys, time, datetime, net, re, traceback
import urllib, socket, json, urlresolver, collections
import xbmc, xbmcgui, xbmcplugin, xbmcvfs, xbmcaddon
from simplecache import SimpleCache
+
# Plugin Info
ADDON_ID = 'plugin.video.plutotv'
REAL_SETTINGS = xbmcaddon.Addon(id=ADDON_ID)
@@ -31,17 +32,18 @@ ADDON_PATH = REAL_SETTINGS.getAddonInfo('path').decode('utf-8')
ADDON_VERSION = REAL_SETTINGS.getAddonInfo('version')
ICON = REAL_SETTINGS.getAddonInfo('icon')
FANART = REAL_SETTINGS.getAddonInfo('fanart')
-
+LANGUAGE = REAL_SETTINGS.getLocalizedString
## GLOBALS ##
TIMEOUT = 15
USER_EMAIL = REAL_SETTINGS.getSetting('User_Email')
PASSWORD = REAL_SETTINGS.getSetting('User_Password')
-FIT_REGION = REAL_SETTINGS.getSetting('Filter_Region') == 'true'
+USER_REGION = REAL_SETTINGS.getSetting("Select_Country")
+FIT_REGION = False if USER_REGION == 'US' else True
DEBUG = REAL_SETTINGS.getSetting('Enable_Debugging') == 'true'
-HIDE_PLUTO = REAL_SETTINGS.getSetting("Hide_Ads") == "true"
COOKIE_JAR = xbmc.translatePath(os.path.join(SETTINGS_LOC, "cookiejar.lwp"))
PTVL_RUN = xbmcgui.Window(10000).getProperty('PseudoTVRunning') == 'True'
+HIDE_PLUTO = PTVL_RUN
IGNORE_KEYS = ['pluto.tv','plutotv','pluto tv','promo']
YTURL = 'plugin://plugin.video.youtube/play/?video_id='
VMURL = 'plugin://plugin.video.vimeo/play/?video_id='
@@ -50,7 +52,6 @@ BASE_API = 'https://api.pluto.tv/v1'
BASE_LINEUP = 'https://api.pluto.tv/v1/channels.json'
BASE_GUIDE = 'https://api.pluto.tv/v1/timelines/%s.000Z/%s.000Z/matrix.json'
BASE_CLIPS = 'https://api.pluto.tv/v2/episodes/%s/clips.json'
-USER_REGION = 'US'
PLUTO_MENU = [("Channel Guide" , BASE_LINEUP, 0),
("Browse Channels", BASE_LINEUP, 1)]
@@ -74,6 +75,14 @@ def stringify(string):
string = string.encode('utf-8', 'ignore')
return string
+def inputDialog(heading=ADDON_NAME, default='', key=xbmcgui.INPUT_ALPHANUM, opt=0, close=0):
+ retval = xbmcgui.Dialog().input(heading, default, key, opt, close)
+ if len(retval) > 0:
+ return retval
+
+def yesnoDialog(str1, str2='', str3='', header=ADDON_NAME, yes='', no='', autoclose=0):
+ return xbmcgui.Dialog().yesno(header, str1, str2, str3, no, yes, autoclose)
+
def getParams():
param=[]
if len(sys.argv[2])>=2:
@@ -91,26 +100,30 @@ def getParams():
return param
socket.setdefaulttimeout(TIMEOUT)
-
class PlutoTV():
def __init__(self):
log('__init__')
self.net = net.Net()
self.cache = SimpleCache()
self.categoryMenu = self.getCategories()
-
+ self.mediaType = self.getMediaTypes()
+
def login(self):
log('login')
- header_dict = {}
- header_dict['Accept'] = 'application/json, text/javascript, */*; q=0.01'
- header_dict['Host'] = 'api.pluto.tv'
- header_dict['Connection'] = 'keep-alive'
- header_dict['Referer'] = 'http://pluto.tv/'
- header_dict['Origin'] = 'http://pluto.tv'
- header_dict['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.2; rv:24.0) Gecko/20100101 Firefox/24.0'
-
+ #ignore guest login
+ if USER_EMAIL == LANGUAGE(30009):
+ return
+
if len(USER_EMAIL) > 0:
+ header_dict = {}
+ header_dict['Accept'] = 'application/json, text/javascript, */*; q=0.01'
+ header_dict['Host'] = 'api.pluto.tv'
+ header_dict['Connection'] = 'keep-alive'
+ header_dict['Referer'] = 'http://pluto.tv/'
+ header_dict['Origin'] = 'http://pluto.tv'
+ header_dict['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.2; rv:24.0) Gecko/20100101 Firefox/24.0'
+
try:
#remove COOKIE_JAR Folder
xbmcvfs.rmdir(COOKIE_JAR)
@@ -128,17 +141,25 @@ class PlutoTV():
form_data = ({'optIn': 'true', 'password': PASSWORD,'synced': 'false', 'userIdentity': USER_EMAIL})
self.net.set_cookies(COOKIE_JAR)
try:
- loginlink = self.loadJson(self.net.http_POST(BASE_API + '/auth/local', form_data=form_data, headers=header_dict).content.encode("utf-8").rstrip())
+ loginlink = json.loads(self.net.http_POST(BASE_API + '/auth/local', form_data=form_data, headers=header_dict).content.encode("utf-8").rstrip())
if loginlink and loginlink['email'].lower() == USER_EMAIL.lower():
- xbmcgui.Dialog().notification(ADDON_NAME, 'Welcome Back %s' % loginlink['displayName'], ICON, 4000)
+ xbmcgui.Dialog().notification(ADDON_NAME, LANGUAGE(30006) + loginlink['displayName'], ICON, 4000)
self.net.save_cookies(COOKIE_JAR)
- return True
else:
- xbmcgui.Dialog().notification(ADDON_NAME, 'Invalid User Credentials', ICON, 4000)
+ xbmcgui.Dialog().notification(ADDON_NAME, LANGUAGE(30007), ICON, 4000)
except Exception,e:
log('login, Unable to create the storage directory ' + str(e), xbmc.LOGERROR)
-
-
+
+ else:
+ #firstrun wizard
+ if yesnoDialog(LANGUAGE(30008),no=LANGUAGE(30009), yes=LANGUAGE(30010)):
+ REAL_SETTINGS.setSetting('User_Email',inputDialog(LANGUAGE(30001)))
+ REAL_SETTINGS.setSetting('User_Password',inputDialog(LANGUAGE(30002)))
+ else:
+ REAL_SETTINGS.setSetting('User_Email',LANGUAGE(30009))
+ xbmc.executebuiltin('RunScript("' + ADDON_PATH + '/country.py' + '")')
+
+
def openURL(self, url):
log('openURL, url = ' + url)
try:
@@ -151,21 +172,20 @@ class PlutoTV():
header_dict['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.2; rv:24.0) Gecko/20100101 Firefox/24.0'
self.net.set_cookies(COOKIE_JAR)
trans_table = ''.join( [chr(i) for i in range(128)] + [' '] * 128 )
- cacheResponce = self.cache.get(ADDON_NAME + 'openURL, url = %s'%url)
- if not cacheResponce:
+ cacheResponse = self.cache.get(ADDON_NAME + '.openURL, url = %s'%url)
+ if not cacheResponse:
try:
req = self.net.http_GET(url, headers=header_dict).content.encode("utf-8", 'ignore')
except:
req = self.net.http_GET(url, headers=header_dict).content.translate(trans_table)
self.net.save_cookies(COOKIE_JAR)
- self.cache.set(ADDON_NAME + 'openURL, url = %s'%url, json.loads(stringify(req)), expiration=datetime.timedelta(hours=8))
- responce = self.cache.get(ADDON_NAME + 'openURL, url = %s'%url)
- if len(responce) > 0:
- return responce
+ self.cache.set(ADDON_NAME + '.openURL, url = %s'%url, json.loads(stringify(req)), expiration=datetime.timedelta(hours=1))
+ return self.cache.get(ADDON_NAME + '.openURL, url = %s'%url)
except Exception,e:
log('openURL, Unable to open url ' + str(e), xbmc.LOGERROR)
xbmcgui.Dialog().notification(ADDON_NAME, 'Unable to Connect, Check User Credentials', ICON, 4000)
-
+ return []
+
def mainMenu(self):
log('mainMenu')
@@ -178,8 +198,8 @@ class PlutoTV():
log('browseMenu')
for item in self.categoryMenu:
self.addDir(*item)
-
+
def getCategories(self):
log('getCategories')
collect= []
@@ -192,24 +212,42 @@ class PlutoTV():
lineup.append(("%s"%(key), BASE_LINEUP, 2))
lineup.insert(0,("Featured" , BASE_LINEUP, 2))
lineup.insert(2,("All Channels", BASE_LINEUP, 2))
- del collect[:]
- if len(lineup) > 0:
- return lineup
+ return lineup
+
+ def getMediaTypes(self):
+ mediaType = {}
+ for type in self.categoryMenu:
+ type = type[0]
+ if type == 'Movies':
+ mediaType[type] = 'movie'
+ elif type == 'TV':
+ mediaType[type] = 'episodes'
+ elif type == 'Music + Radio':
+ mediaType[type] = 'musicvideo'
+ else:
+ mediaType[type] = 'video'
+ return mediaType
+
def browse(self, chname, url):
log('browse, chname = ' + chname)
- data = (self.openURL(url))
+ geowarn = False
+ data = (self.openURL(url))
for channel in data:
- id = channel['_id']
- cat = channel['category']
- number = channel['number']
- region = channel['regionFilter']['exclude']
- name = channel['name']
- plot = channel['description']
- feat = (channel.get('featured','') or 0) == -1
-
- if FIT_REGION == True and USER_REGION in region:
+ id = channel['_id']
+ cat = channel['category']
+ number = channel['number']
+ region = channel['regionFilter']['include']
+ exclude = channel['regionFilter']['exclude']
+ name = channel['name']
+ plot = channel['description']
+ feat = (channel.get('featured','') or 0) == -1
+
+ if FIT_REGION == True and (USER_REGION in exclude or USER_REGION not in region):
+ if geowarn == False:
+ geowarn = True
+ xbmcgui.Dialog().notification(ADDON_NAME, LANGUAGE(30004), ICON, 4000)
continue
thumb = ICON
@@ -221,21 +259,21 @@ class PlutoTV():
logo = ICON
if 'logo' in channel:
logo = (channel['logo']['path'] or ICON)
-
+
if chname == "All Channels":
title = "%s - %s: %s" % (cat, number, name)
- infoLabels ={"label":title ,"title":title ,"plot":plot, "code":number, "genre":cat, "imdbnumber":id}
+ infoLabels ={"mediatype":self.mediaType[cat],"label":title ,"title":title ,"plot":plot, "code":number, "genre":cat, "imdbnumber":id}
infoArt ={"thumb":thumb,"poster":thumb,"fanart":land,"icon":logo,"logo":logo}
self.addDir(title, id, 8, infoLabels, infoArt)
elif chname == "Featured" and feat == True:
title = "%s - %s: %s" % (cat, number, name)
- infoLabels ={"label":title ,"title":title ,"plot":plot, "code":number, "genre":cat, "imdbnumber":id}
+ infoLabels ={"mediatype":self.mediaType[cat],"label":title ,"title":title ,"plot":plot, "code":number, "genre":cat, "imdbnumber":id}
infoArt ={"thumb":thumb,"poster":thumb,"fanart":land,"icon":logo,"logo":logo}
self.addDir(title, id, 8, infoLabels, infoArt)
elif chname.lower() == cat.lower():
title = "%s: %s" % (number, name)
- infoLabels ={"label":title ,"title":title ,"plot":plot, "code":number, "genre":cat, "imdbnumber":id}
+ infoLabels ={"mediatype":self.mediaType[cat],"label":title ,"title":title ,"plot":plot, "code":number, "genre":cat, "imdbnumber":id}
infoArt ={"thumb":thumb,"poster":thumb,"fanart":land,"icon":logo,"logo":logo}
self.addDir(title, id, 8, infoLabels, infoArt)
@@ -247,21 +285,26 @@ class PlutoTV():
def browseGuide(self, start=0, end=24):
log('browseGuide')
- start = 0 if start == BASE_LINEUP else int(start)
- data = (self.openURL(BASE_LINEUP))
- data = list(self.pagination(data, end))
- start = 0 if start >= len(data) else start
+ geowarn = False
+ start = 0 if start == BASE_LINEUP else int(start)
+ data = (self.openURL(BASE_LINEUP))
+ data = list(self.pagination(data, end))
+ start = 0 if start >= len(data) else start
for channel in data[start]:
chid = channel['_id']
chcat = channel['category']
chnum = channel['number']
- region = channel['regionFilter']['exclude']
+ region = channel['regionFilter']['include']
+ exclude = channel['regionFilter']['exclude']
chname = channel['name']
chplot = channel['description']
chthumb = (channel['thumbnail']['path'] or ICON)
feat = (channel.get('featured','') or 0) == -1
- if FIT_REGION == True and USER_REGION in region:
+ if FIT_REGION == True and (USER_REGION in exclude or USER_REGION not in region):
+ if geowarn == False:
+ geowarn = True
+ xbmcgui.Dialog().notification(ADDON_NAME, LANGUAGE(30004), ICON, 4000)
continue
t1 = datetime.datetime.now().strftime('%Y-%m-%dT%H:00:00')
@@ -275,9 +318,9 @@ class PlutoTV():
epdur = int(item['episode']['duration'] or '0') // 1000
live = item['episode']['liveBroadcast']
thumb = chthumb #(item['episode']['thumbnail']['path'] or chthumb) #site doesn't update missing episode thumbs
-
+
title = "%s: %s - %s" % (chnum, chname, epname)
- infoLabels ={"label":title ,"title":title ,"plot":epplot, "code":epid, "genre":epgenre, "imdbnumber":chid, "duration":epdur}
+ infoLabels ={"mediatype":self.mediaType[chcat],"label":title ,"title":title ,"plot":epplot, "code":epid, "genre":epgenre, "imdbnumber":chid, "duration":epdur}
infoArt ={"thumb":thumb,"poster":thumb,"fanart":FANART,"icon":ICON,"logo":ICON}
self.addLink(title, chid, 9, infoLabels, infoArt, end)
start += 1
@@ -286,7 +329,6 @@ class PlutoTV():
def resolveURL(self, provider, url):
log('resolveURL, provider = ' + provider)
- print url
if provider == 'jwplatform' or url[-4:] == 'm3u8':
return url
elif provider == 'youtube':
@@ -299,7 +341,7 @@ class PlutoTV():
return VMURL + url.split('/vimeo.com/')[1]
return urlresolver.resolve(url)
-
+
def playChannel(self, name, url):
log('playChannel')
if PTVL_RUN == True:
@@ -333,7 +375,7 @@ class PlutoTV():
continue
liz=xbmcgui.ListItem(name, path=url)
- infoList = {"label":name,"title":name,"duration":dur}
+ infoList = {"mediatype":"video","label":name,"title":name,"duration":dur}
infoArt = {"thumb":thumb,"poster":thumb,"icon":ICON,"fanart":FANART}
liz.setInfo(type="Video", infoLabels=infoList)
liz.setArt(infoArt)
@@ -346,7 +388,7 @@ class PlutoTV():
playlist.add(url, liz, idx)
xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, liz)
-
+
def playContent(self, name, url):
log('playContent')
origurl = url
@@ -374,7 +416,7 @@ class PlutoTV():
continue
liz=xbmcgui.ListItem(name, path=url)
- infoList = {"label":name,"title":name,"duration":dur}
+ infoList = {"mediatype":"video","label":name,"title":name,"duration":dur}
infoArt = {"thumb":thumb,"poster":thumb,"icon":ICON,"fanart":FANART}
liz.setInfo(type="Video", infoLabels=infoList)
liz.setArt(infoArt)
@@ -386,7 +428,7 @@ class PlutoTV():
liz.setProperty('ResumeTime', str(vid_offset) )
self.addLink(name, url, 7, infoList, infoArt, len(data))
-
+
def playVideo(self, name, url, list=None):
log('playVideo')
if not list:
@@ -400,7 +442,7 @@ class PlutoTV():
liz=xbmcgui.ListItem(name)
liz.setProperty('IsPlayable', 'true')
if infoList == False:
- liz.setInfo( type="Video", infoLabels={"label":name,"title":name} )
+ liz.setInfo(type="Video", infoLabels={"mediatype":"video","label":name,"title":name})
else:
liz.setInfo(type="Video", infoLabels=infoList)
@@ -418,7 +460,7 @@ class PlutoTV():
liz=xbmcgui.ListItem(name)
liz.setProperty('IsPlayable', 'false')
if infoList == False:
- liz.setInfo(type="Video", infoLabels={"label":name,"title":name} )
+ liz.setInfo(type="Video", infoLabels={"mediatype":"video","label":name,"title":name} )
else:
liz.setInfo(type="Video", infoLabels=infoList)
if infoArt == False:
diff --git a/plugin.video.plutotv/fanart.jpg b/plugin.video.plutotv/resources/images/fanart.jpg
index d9cb05b..d9cb05b 100644
--- a/plugin.video.plutotv/fanart.jpg
+++ b/plugin.video.plutotv/resources/images/fanart.jpg
Binary files differ
diff --git a/plugin.video.plutotv/icon.png b/plugin.video.plutotv/resources/images/icon.png
index 3198f41..3198f41 100644
--- a/plugin.video.plutotv/icon.png
+++ b/plugin.video.plutotv/resources/images/icon.png
Binary files differ
diff --git a/plugin.video.plutotv/resources/iso3166-1.json b/plugin.video.plutotv/resources/iso3166-1.json
new file mode 100644
index 0000000..2834482
--- /dev/null
+++ b/plugin.video.plutotv/resources/iso3166-1.json
@@ -0,0 +1,1677 @@
+{
+ "3166-1": [
+ {
+ "alpha_2": "AW",
+ "alpha_3": "ABW",
+ "name": "Aruba",
+ "numeric": "533"
+ },
+ {
+ "alpha_2": "AF",
+ "alpha_3": "AFG",
+ "name": "Afghanistan",
+ "numeric": "004",
+ "official_name": "Islamic Republic of Afghanistan"
+ },
+ {
+ "alpha_2": "AO",
+ "alpha_3": "AGO",
+ "name": "Angola",
+ "numeric": "024",
+ "official_name": "Republic of Angola"
+ },
+ {
+ "alpha_2": "AI",
+ "alpha_3": "AIA",
+ "name": "Anguilla",
+ "numeric": "660"
+ },
+ {
+ "alpha_2": "AX",
+ "alpha_3": "ALA",
+ "name": "Åland Islands",
+ "numeric": "248"
+ },
+ {
+ "alpha_2": "AL",
+ "alpha_3": "ALB",
+ "name": "Albania",
+ "numeric": "008",
+ "official_name": "Republic of Albania"
+ },
+ {
+ "alpha_2": "AD",
+ "alpha_3": "AND",
+ "name": "Andorra",
+ "numeric": "020",
+ "official_name": "Principality of Andorra"
+ },
+ {
+ "alpha_2": "AE",
+ "alpha_3": "ARE",
+ "name": "United Arab Emirates",
+ "numeric": "784"
+ },
+ {
+ "alpha_2": "AR",
+ "alpha_3": "ARG",
+ "name": "Argentina",
+ "numeric": "032",
+ "official_name": "Argentine Republic"
+ },
+ {
+ "alpha_2": "AM",
+ "alpha_3": "ARM",
+ "name": "Armenia",
+ "numeric": "051",
+ "official_name": "Republic of Armenia"
+ },
+ {
+ "alpha_2": "AS",
+ "alpha_3": "ASM",
+ "name": "American Samoa",
+ "numeric": "016"
+ },
+ {
+ "alpha_2": "AQ",
+ "alpha_3": "ATA",
+ "name": "Antarctica",
+ "numeric": "010"
+ },
+ {
+ "alpha_2": "TF",
+ "alpha_3": "ATF",
+ "name": "French Southern Territories",
+ "numeric": "260"
+ },
+ {
+ "alpha_2": "AG",
+ "alpha_3": "ATG",
+ "name": "Antigua and Barbuda",
+ "numeric": "028"
+ },
+ {
+ "alpha_2": "AU",
+ "alpha_3": "AUS",
+ "name": "Australia",
+ "numeric": "036"
+ },
+ {
+ "alpha_2": "AT",
+ "alpha_3": "AUT",
+ "name": "Austria",
+ "numeric": "040",
+ "official_name": "Republic of Austria"
+ },
+ {
+ "alpha_2": "AZ",
+ "alpha_3": "AZE",
+ "name": "Azerbaijan",
+ "numeric": "031",
+ "official_name": "Republic of Azerbaijan"
+ },
+ {
+ "alpha_2": "BI",
+ "alpha_3": "BDI",
+ "name": "Burundi",
+ "numeric": "108",
+ "official_name": "Republic of Burundi"
+ },
+ {
+ "alpha_2": "BE",
+ "alpha_3": "BEL",
+ "name": "Belgium",
+ "numeric": "056",
+ "official_name": "Kingdom of Belgium"
+ },
+ {
+ "alpha_2": "BJ",
+ "alpha_3": "BEN",
+ "name": "Benin",
+ "numeric": "204",
+ "official_name": "Republic of Benin"
+ },
+ {
+ "alpha_2": "BQ",
+ "alpha_3": "BES",
+ "name": "Bonaire, Sint Eustatius and Saba",
+ "numeric": "535",
+ "official_name": "Bonaire, Sint Eustatius and Saba"
+ },
+ {
+ "alpha_2": "BF",
+ "alpha_3": "BFA",
+ "name": "Burkina Faso",
+ "numeric": "854"
+ },
+ {
+ "alpha_2": "BD",
+ "alpha_3": "BGD",
+ "name": "Bangladesh",
+ "numeric": "050",
+ "official_name": "People's Republic of Bangladesh"
+ },
+ {
+ "alpha_2": "BG",
+ "alpha_3": "BGR",
+ "name": "Bulgaria",
+ "numeric": "100",
+ "official_name": "Republic of Bulgaria"
+ },
+ {
+ "alpha_2": "BH",
+ "alpha_3": "BHR",
+ "name": "Bahrain",
+ "numeric": "048",
+ "official_name": "Kingdom of Bahrain"
+ },
+ {
+ "alpha_2": "BS",
+ "alpha_3": "BHS",
+ "name": "Bahamas",
+ "numeric": "044",
+ "official_name": "Commonwealth of the Bahamas"
+ },
+ {
+ "alpha_2": "BA",
+ "alpha_3": "BIH",
+ "name": "Bosnia and Herzegovina",
+ "numeric": "070",
+ "official_name": "Republic of Bosnia and Herzegovina"
+ },
+ {
+ "alpha_2": "BL",
+ "alpha_3": "BLM",
+ "name": "Saint Barthélemy",
+ "numeric": "652"
+ },
+ {
+ "alpha_2": "BY",
+ "alpha_3": "BLR",
+ "name": "Belarus",
+ "numeric": "112",
+ "official_name": "Republic of Belarus"
+ },
+ {
+ "alpha_2": "BZ",
+ "alpha_3": "BLZ",
+ "name": "Belize",
+ "numeric": "084"
+ },
+ {
+ "alpha_2": "BM",
+ "alpha_3": "BMU",
+ "name": "Bermuda",
+ "numeric": "060"
+ },
+ {
+ "alpha_2": "BO",
+ "alpha_3": "BOL",
+ "common_name": "Bolivia",
+ "name": "Bolivia, Plurinational State of",
+ "numeric": "068",
+ "official_name": "Plurinational State of Bolivia"
+ },
+ {
+ "alpha_2": "BR",
+ "alpha_3": "BRA",
+ "name": "Brazil",
+ "numeric": "076",
+ "official_name": "Federative Republic of Brazil"
+ },
+ {
+ "alpha_2": "BB",
+ "alpha_3": "BRB",
+ "name": "Barbados",
+ "numeric": "052"
+ },
+ {
+ "alpha_2": "BN",
+ "alpha_3": "BRN",
+ "name": "Brunei Darussalam",
+ "numeric": "096"
+ },
+ {
+ "alpha_2": "BT",
+ "alpha_3": "BTN",
+ "name": "Bhutan",
+ "numeric": "064",
+ "official_name": "Kingdom of Bhutan"
+ },
+ {
+ "alpha_2": "BV",
+ "alpha_3": "BVT",
+ "name": "Bouvet Island",
+ "numeric": "074"
+ },
+ {
+ "alpha_2": "BW",
+ "alpha_3": "BWA",
+ "name": "Botswana",
+ "numeric": "072",
+ "official_name": "Republic of Botswana"
+ },
+ {
+ "alpha_2": "CF",
+ "alpha_3": "CAF",
+ "name": "Central African Republic",
+ "numeric": "140"
+ },
+ {
+ "alpha_2": "CA",
+ "alpha_3": "CAN",
+ "name": "Canada",
+ "numeric": "124"
+ },
+ {
+ "alpha_2": "CC",
+ "alpha_3": "CCK",
+ "name": "Cocos (Keeling) Islands",
+ "numeric": "166"
+ },
+ {
+ "alpha_2": "CH",
+ "alpha_3": "CHE",
+ "name": "Switzerland",
+ "numeric": "756",
+ "official_name": "Swiss Confederation"
+ },
+ {
+ "alpha_2": "CL",
+ "alpha_3": "CHL",
+ "name": "Chile",
+ "numeric": "152",
+ "official_name": "Republic of Chile"
+ },
+ {
+ "alpha_2": "CN",
+ "alpha_3": "CHN",
+ "name": "China",
+ "numeric": "156",
+ "official_name": "People's Republic of China"
+ },
+ {
+ "alpha_2": "CI",
+ "alpha_3": "CIV",
+ "name": "Côte d'Ivoire",
+ "numeric": "384",
+ "official_name": "Republic of Côte d'Ivoire"
+ },
+ {
+ "alpha_2": "CM",
+ "alpha_3": "CMR",
+ "name": "Cameroon",
+ "numeric": "120",
+ "official_name": "Republic of Cameroon"
+ },
+ {
+ "alpha_2": "CD",
+ "alpha_3": "COD",
+ "name": "Congo, The Democratic Republic of the",
+ "numeric": "180"
+ },
+ {
+ "alpha_2": "CG",
+ "alpha_3": "COG",
+ "name": "Congo",
+ "numeric": "178",
+ "official_name": "Republic of the Congo"
+ },
+ {
+ "alpha_2": "CK",
+ "alpha_3": "COK",
+ "name": "Cook Islands",
+ "numeric": "184"
+ },
+ {
+ "alpha_2": "CO",
+ "alpha_3": "COL",
+ "name": "Colombia",
+ "numeric": "170",
+ "official_name": "Republic of Colombia"
+ },
+ {
+ "alpha_2": "KM",
+ "alpha_3": "COM",
+ "name": "Comoros",
+ "numeric": "174",
+ "official_name": "Union of the Comoros"
+ },
+ {
+ "alpha_2": "CV",
+ "alpha_3": "CPV",
+ "name": "Cabo Verde",
+ "numeric": "132",
+ "official_name": "Republic of Cabo Verde"
+ },
+ {
+ "alpha_2": "CR",
+ "alpha_3": "CRI",
+ "name": "Costa Rica",
+ "numeric": "188",
+ "official_name": "Republic of Costa Rica"
+ },
+ {
+ "alpha_2": "CU",
+ "alpha_3": "CUB",
+ "name": "Cuba",
+ "numeric": "192",
+ "official_name": "Republic of Cuba"
+ },
+ {
+ "alpha_2": "CW",
+ "alpha_3": "CUW",
+ "name": "Curaçao",
+ "numeric": "531",
+ "official_name": "Curaçao"
+ },
+ {
+ "alpha_2": "CX",
+ "alpha_3": "CXR",
+ "name": "Christmas Island",
+ "numeric": "162"
+ },
+ {
+ "alpha_2": "KY",
+ "alpha_3": "CYM",
+ "name": "Cayman Islands",
+ "numeric": "136"
+ },
+ {
+ "alpha_2": "CY",
+ "alpha_3": "CYP",
+ "name": "Cyprus",
+ "numeric": "196",
+ "official_name": "Republic of Cyprus"
+ },
+ {
+ "alpha_2": "CZ",
+ "alpha_3": "CZE",
+ "name": "Czechia",
+ "numeric": "203",
+ "official_name": "Czech Republic"
+ },
+ {
+ "alpha_2": "DE",
+ "alpha_3": "DEU",
+ "name": "Germany",
+ "numeric": "276",
+ "official_name": "Federal Republic of Germany"
+ },
+ {
+ "alpha_2": "DJ",
+ "alpha_3": "DJI",
+ "name": "Djibouti",
+ "numeric": "262",
+ "official_name": "Republic of Djibouti"
+ },
+ {
+ "alpha_2": "DM",
+ "alpha_3": "DMA",
+ "name": "Dominica",
+ "numeric": "212",
+ "official_name": "Commonwealth of Dominica"
+ },
+ {
+ "alpha_2": "DK",
+ "alpha_3": "DNK",
+ "name": "Denmark",
+ "numeric": "208",
+ "official_name": "Kingdom of Denmark"
+ },
+ {
+ "alpha_2": "DO",
+ "alpha_3": "DOM",
+ "name": "Dominican Republic",
+ "numeric": "214"
+ },
+ {
+ "alpha_2": "DZ",
+ "alpha_3": "DZA",
+ "name": "Algeria",
+ "numeric": "012",
+ "official_name": "People's Democratic Republic of Algeria"
+ },
+ {
+ "alpha_2": "EC",
+ "alpha_3": "ECU",
+ "name": "Ecuador",
+ "numeric": "218",
+ "official_name": "Republic of Ecuador"
+ },
+ {
+ "alpha_2": "EG",
+ "alpha_3": "EGY",
+ "name": "Egypt",
+ "numeric": "818",
+ "official_name": "Arab Republic of Egypt"
+ },
+ {
+ "alpha_2": "ER",
+ "alpha_3": "ERI",
+ "name": "Eritrea",
+ "numeric": "232",
+ "official_name": "the State of Eritrea"
+ },
+ {
+ "alpha_2": "EH",
+ "alpha_3": "ESH",
+ "name": "Western Sahara",
+ "numeric": "732"
+ },
+ {
+ "alpha_2": "ES",
+ "alpha_3": "ESP",
+ "name": "Spain",
+ "numeric": "724",
+ "official_name": "Kingdom of Spain"
+ },
+ {
+ "alpha_2": "EE",
+ "alpha_3": "EST",
+ "name": "Estonia",
+ "numeric": "233",
+ "official_name": "Republic of Estonia"
+ },
+ {
+ "alpha_2": "ET",
+ "alpha_3": "ETH",
+ "name": "Ethiopia",
+ "numeric": "231",
+ "official_name": "Federal Democratic Republic of Ethiopia"
+ },
+ {
+ "alpha_2": "FI",
+ "alpha_3": "FIN",
+ "name": "Finland",
+ "numeric": "246",
+ "official_name": "Republic of Finland"
+ },
+ {
+ "alpha_2": "FJ",
+ "alpha_3": "FJI",
+ "name": "Fiji",
+ "numeric": "242",
+ "official_name": "Republic of Fiji"
+ },
+ {
+ "alpha_2": "FK",
+ "alpha_3": "FLK",
+ "name": "Falkland Islands (Malvinas)",
+ "numeric": "238"
+ },
+ {
+ "alpha_2": "FR",
+ "alpha_3": "FRA",
+ "name": "France",
+ "numeric": "250",
+ "official_name": "French Republic"
+ },
+ {
+ "alpha_2": "FO",
+ "alpha_3": "FRO",
+ "name": "Faroe Islands",
+ "numeric": "234"
+ },
+ {
+ "alpha_2": "FM",
+ "alpha_3": "FSM",
+ "name": "Micronesia, Federated States of",
+ "numeric": "583",
+ "official_name": "Federated States of Micronesia"
+ },
+ {
+ "alpha_2": "GA",
+ "alpha_3": "GAB",
+ "name": "Gabon",
+ "numeric": "266",
+ "official_name": "Gabonese Republic"
+ },
+ {
+ "alpha_2": "GB",
+ "alpha_3": "GBR",
+ "name": "United Kingdom",
+ "numeric": "826",
+ "official_name": "United Kingdom of Great Britain and Northern Ireland"
+ },
+ {
+ "alpha_2": "GE",
+ "alpha_3": "GEO",
+ "name": "Georgia",
+ "numeric": "268"
+ },
+ {
+ "alpha_2": "GG",
+ "alpha_3": "GGY",
+ "name": "Guernsey",
+ "numeric": "831"
+ },
+ {
+ "alpha_2": "GH",
+ "alpha_3": "GHA",
+ "name": "Ghana",
+ "numeric": "288",
+ "official_name": "Republic of Ghana"
+ },
+ {
+ "alpha_2": "GI",
+ "alpha_3": "GIB",
+ "name": "Gibraltar",
+ "numeric": "292"
+ },
+ {
+ "alpha_2": "GN",
+ "alpha_3": "GIN",
+ "name": "Guinea",
+ "numeric": "324",
+ "official_name": "Republic of Guinea"
+ },
+ {
+ "alpha_2": "GP",
+ "alpha_3": "GLP",
+ "name": "Guadeloupe",
+ "numeric": "312"
+ },
+ {
+ "alpha_2": "GM",
+ "alpha_3": "GMB",
+ "name": "Gambia",
+ "numeric": "270",
+ "official_name": "Islamic Republic of the Gambia"
+ },
+ {
+ "alpha_2": "GW",
+ "alpha_3": "GNB",
+ "name": "Guinea-Bissau",
+ "numeric": "624",
+ "official_name": "Republic of Guinea-Bissau"
+ },
+ {
+ "alpha_2": "GQ",
+ "alpha_3": "GNQ",
+ "name": "Equatorial Guinea",
+ "numeric": "226",
+ "official_name": "Republic of Equatorial Guinea"
+ },
+ {
+ "alpha_2": "GR",
+ "alpha_3": "GRC",
+ "name": "Greece",
+ "numeric": "300",
+ "official_name": "Hellenic Republic"
+ },
+ {
+ "alpha_2": "GD",
+ "alpha_3": "GRD",
+ "name": "Grenada",
+ "numeric": "308"
+ },
+ {
+ "alpha_2": "GL",
+ "alpha_3": "GRL",
+ "name": "Greenland",
+ "numeric": "304"
+ },
+ {
+ "alpha_2": "GT",
+ "alpha_3": "GTM",
+ "name": "Guatemala",
+ "numeric": "320",
+ "official_name": "Republic of Guatemala"
+ },
+ {
+ "alpha_2": "GF",
+ "alpha_3": "GUF",
+ "name": "French Guiana",
+ "numeric": "254"
+ },
+ {
+ "alpha_2": "GU",
+ "alpha_3": "GUM",
+ "name": "Guam",
+ "numeric": "316"
+ },
+ {
+ "alpha_2": "GY",
+ "alpha_3": "GUY",
+ "name": "Guyana",
+ "numeric": "328",
+ "official_name": "Republic of Guyana"
+ },
+ {
+ "alpha_2": "HK",
+ "alpha_3": "HKG",
+ "name": "Hong Kong",
+ "numeric": "344",
+ "official_name": "Hong Kong Special Administrative Region of China"
+ },
+ {
+ "alpha_2": "HM",
+ "alpha_3": "HMD",
+ "name": "Heard Island and McDonald Islands",
+ "numeric": "334"
+ },
+ {
+ "alpha_2": "HN",
+ "alpha_3": "HND",
+ "name": "Honduras",
+ "numeric": "340",
+ "official_name": "Republic of Honduras"
+ },
+ {
+ "alpha_2": "HR",
+ "alpha_3": "HRV",
+ "name": "Croatia",
+ "numeric": "191",
+ "official_name": "Republic of Croatia"
+ },
+ {
+ "alpha_2": "HT",
+ "alpha_3": "HTI",
+ "name": "Haiti",
+ "numeric": "332",
+ "official_name": "Republic of Haiti"
+ },
+ {
+ "alpha_2": "HU",
+ "alpha_3": "HUN",
+ "name": "Hungary",
+ "numeric": "348",
+ "official_name": "Hungary"
+ },
+ {
+ "alpha_2": "ID",
+ "alpha_3": "IDN",
+ "name": "Indonesia",
+ "numeric": "360",
+ "official_name": "Republic of Indonesia"
+ },
+ {
+ "alpha_2": "IM",
+ "alpha_3": "IMN",
+ "name": "Isle of Man",
+ "numeric": "833"
+ },
+ {
+ "alpha_2": "IN",
+ "alpha_3": "IND",
+ "name": "India",
+ "numeric": "356",
+ "official_name": "Republic of India"
+ },
+ {
+ "alpha_2": "IO",
+ "alpha_3": "IOT",
+ "name": "British Indian Ocean Territory",
+ "numeric": "086"
+ },
+ {
+ "alpha_2": "IE",
+ "alpha_3": "IRL",
+ "name": "Ireland",
+ "numeric": "372"
+ },
+ {
+ "alpha_2": "IR",
+ "alpha_3": "IRN",
+ "name": "Iran, Islamic Republic of",
+ "numeric": "364",
+ "official_name": "Islamic Republic of Iran"
+ },
+ {
+ "alpha_2": "IQ",
+ "alpha_3": "IRQ",
+ "name": "Iraq",
+ "numeric": "368",
+ "official_name": "Republic of Iraq"
+ },
+ {
+ "alpha_2": "IS",
+ "alpha_3": "ISL",
+ "name": "Iceland",
+ "numeric": "352",
+ "official_name": "Republic of Iceland"
+ },
+ {
+ "alpha_2": "IL",
+ "alpha_3": "ISR",
+ "name": "Israel",
+ "numeric": "376",
+ "official_name": "State of Israel"
+ },
+ {
+ "alpha_2": "IT",
+ "alpha_3": "ITA",
+ "name": "Italy",
+ "numeric": "380",
+ "official_name": "Italian Republic"
+ },
+ {
+ "alpha_2": "JM",
+ "alpha_3": "JAM",
+ "name": "Jamaica",
+ "numeric": "388"
+ },
+ {
+ "alpha_2": "JE",
+ "alpha_3": "JEY",
+ "name": "Jersey",
+ "numeric": "832"
+ },
+ {
+ "alpha_2": "JO",
+ "alpha_3": "JOR",
+ "name": "Jordan",
+ "numeric": "400",
+ "official_name": "Hashemite Kingdom of Jordan"
+ },
+ {
+ "alpha_2": "JP",
+ "alpha_3": "JPN",
+ "name": "Japan",
+ "numeric": "392"
+ },
+ {
+ "alpha_2": "KZ",
+ "alpha_3": "KAZ",
+ "name": "Kazakhstan",
+ "numeric": "398",
+ "official_name": "Republic of Kazakhstan"
+ },
+ {
+ "alpha_2": "KE",
+ "alpha_3": "KEN",
+ "name": "Kenya",
+ "numeric": "404",
+ "official_name": "Republic of Kenya"
+ },
+ {
+ "alpha_2": "KG",
+ "alpha_3": "KGZ",
+ "name": "Kyrgyzstan",
+ "numeric": "417",
+ "official_name": "Kyrgyz Republic"
+ },
+ {
+ "alpha_2": "KH",
+ "alpha_3": "KHM",
+ "name": "Cambodia",
+ "numeric": "116",
+ "official_name": "Kingdom of Cambodia"
+ },
+ {
+ "alpha_2": "KI",
+ "alpha_3": "KIR",
+ "name": "Kiribati",
+ "numeric": "296",
+ "official_name": "Republic of Kiribati"
+ },
+ {
+ "alpha_2": "KN",
+ "alpha_3": "KNA",
+ "name": "Saint Kitts and Nevis",
+ "numeric": "659"
+ },
+ {
+ "alpha_2": "KR",
+ "alpha_3": "KOR",
+ "name": "Korea, Republic of",
+ "numeric": "410"
+ },
+ {
+ "alpha_2": "KW",
+ "alpha_3": "KWT",
+ "name": "Kuwait",
+ "numeric": "414",
+ "official_name": "State of Kuwait"
+ },
+ {
+ "alpha_2": "LA",
+ "alpha_3": "LAO",
+ "name": "Lao People's Democratic Republic",
+ "numeric": "418"
+ },
+ {
+ "alpha_2": "LB",
+ "alpha_3": "LBN",
+ "name": "Lebanon",
+ "numeric": "422",
+ "official_name": "Lebanese Republic"
+ },
+ {
+ "alpha_2": "LR",
+ "alpha_3": "LBR",
+ "name": "Liberia",
+ "numeric": "430",
+ "official_name": "Republic of Liberia"
+ },
+ {
+ "alpha_2": "LY",
+ "alpha_3": "LBY",
+ "name": "Libya",
+ "numeric": "434",
+ "official_name": "Libya"
+ },
+ {
+ "alpha_2": "LC",
+ "alpha_3": "LCA",
+ "name": "Saint Lucia",
+ "numeric": "662"
+ },
+ {
+ "alpha_2": "LI",
+ "alpha_3": "LIE",
+ "name": "Liechtenstein",
+ "numeric": "438",
+ "official_name": "Principality of Liechtenstein"
+ },
+ {
+ "alpha_2": "LK",
+ "alpha_3": "LKA",
+ "name": "Sri Lanka",
+ "numeric": "144",
+ "official_name": "Democratic Socialist Republic of Sri Lanka"
+ },
+ {
+ "alpha_2": "LS",
+ "alpha_3": "LSO",
+ "name": "Lesotho",
+ "numeric": "426",
+ "official_name": "Kingdom of Lesotho"
+ },
+ {
+ "alpha_2": "LT",
+ "alpha_3": "LTU",
+ "name": "Lithuania",
+ "numeric": "440",
+ "official_name": "Republic of Lithuania"
+ },
+ {
+ "alpha_2": "LU",
+ "alpha_3": "LUX",
+ "name": "Luxembourg",
+ "numeric": "442",
+ "official_name": "Grand Duchy of Luxembourg"
+ },
+ {
+ "alpha_2": "LV",
+ "alpha_3": "LVA",
+ "name": "Latvia",
+ "numeric": "428",
+ "official_name": "Republic of Latvia"
+ },
+ {
+ "alpha_2": "MO",
+ "alpha_3": "MAC",
+ "name": "Macao",
+ "numeric": "446",
+ "official_name": "Macao Special Administrative Region of China"
+ },
+ {
+ "alpha_2": "MF",
+ "alpha_3": "MAF",
+ "name": "Saint Martin (French part)",
+ "numeric": "663"
+ },
+ {
+ "alpha_2": "MA",
+ "alpha_3": "MAR",
+ "name": "Morocco",
+ "numeric": "504",
+ "official_name": "Kingdom of Morocco"
+ },
+ {
+ "alpha_2": "MC",
+ "alpha_3": "MCO",
+ "name": "Monaco",
+ "numeric": "492",
+ "official_name": "Principality of Monaco"
+ },
+ {
+ "alpha_2": "MD",
+ "alpha_3": "MDA",
+ "common_name": "Moldova",
+ "name": "Moldova, Republic of",
+ "numeric": "498",
+ "official_name": "Republic of Moldova"
+ },
+ {
+ "alpha_2": "MG",
+ "alpha_3": "MDG",
+ "name": "Madagascar",
+ "numeric": "450",
+ "official_name": "Republic of Madagascar"
+ },
+ {
+ "alpha_2": "MV",
+ "alpha_3": "MDV",
+ "name": "Maldives",
+ "numeric": "462",
+ "official_name": "Republic of Maldives"
+ },
+ {
+ "alpha_2": "MX",
+ "alpha_3": "MEX",
+ "name": "Mexico",
+ "numeric": "484",
+ "official_name": "United Mexican States"
+ },
+ {
+ "alpha_2": "MH",
+ "alpha_3": "MHL",
+ "name": "Marshall Islands",
+ "numeric": "584",
+ "official_name": "Republic of the Marshall Islands"
+ },
+ {
+ "alpha_2": "MK",
+ "alpha_3": "MKD",
+ "name": "Macedonia, Republic of",
+ "numeric": "807",
+ "official_name": "The Former Yugoslav Republic of Macedonia"
+ },
+ {
+ "alpha_2": "ML",
+ "alpha_3": "MLI",
+ "name": "Mali",
+ "numeric": "466",
+ "official_name": "Republic of Mali"
+ },
+ {
+ "alpha_2": "MT",
+ "alpha_3": "MLT",
+ "name": "Malta",
+ "numeric": "470",
+ "official_name": "Republic of Malta"
+ },
+ {
+ "alpha_2": "MM",
+ "alpha_3": "MMR",
+ "name": "Myanmar",
+ "numeric": "104",
+ "official_name": "Republic of Myanmar"
+ },
+ {
+ "alpha_2": "ME",
+ "alpha_3": "MNE",
+ "name": "Montenegro",
+ "numeric": "499",
+ "official_name": "Montenegro"
+ },
+ {
+ "alpha_2": "MN",
+ "alpha_3": "MNG",
+ "name": "Mongolia",
+ "numeric": "496"
+ },
+ {
+ "alpha_2": "MP",
+ "alpha_3": "MNP",
+ "name": "Northern Mariana Islands",
+ "numeric": "580",
+ "official_name": "Commonwealth of the Northern Mariana Islands"
+ },
+ {
+ "alpha_2": "MZ",
+ "alpha_3": "MOZ",
+ "name": "Mozambique",
+ "numeric": "508",
+ "official_name": "Republic of Mozambique"
+ },
+ {
+ "alpha_2": "MR",
+ "alpha_3": "MRT",
+ "name": "Mauritania",
+ "numeric": "478",
+ "official_name": "Islamic Republic of Mauritania"
+ },
+ {
+ "alpha_2": "MS",
+ "alpha_3": "MSR",
+ "name": "Montserrat",
+ "numeric": "500"
+ },
+ {
+ "alpha_2": "MQ",
+ "alpha_3": "MTQ",
+ "name": "Martinique",
+ "numeric": "474"
+ },
+ {
+ "alpha_2": "MU",
+ "alpha_3": "MUS",
+ "name": "Mauritius",
+ "numeric": "480",
+ "official_name": "Republic of Mauritius"
+ },
+ {
+ "alpha_2": "MW",
+ "alpha_3": "MWI",
+ "name": "Malawi",
+ "numeric": "454",
+ "official_name": "Republic of Malawi"
+ },
+ {
+ "alpha_2": "MY",
+ "alpha_3": "MYS",
+ "name": "Malaysia",
+ "numeric": "458"
+ },
+ {
+ "alpha_2": "YT",
+ "alpha_3": "MYT",
+ "name": "Mayotte",
+ "numeric": "175"
+ },
+ {
+ "alpha_2": "NA",
+ "alpha_3": "NAM",
+ "name": "Namibia",
+ "numeric": "516",
+ "official_name": "Republic of Namibia"
+ },
+ {
+ "alpha_2": "NC",
+ "alpha_3": "NCL",
+ "name": "New Caledonia",
+ "numeric": "540"
+ },
+ {
+ "alpha_2": "NE",
+ "alpha_3": "NER",
+ "name": "Niger",
+ "numeric": "562",
+ "official_name": "Republic of the Niger"
+ },
+ {
+ "alpha_2": "NF",
+ "alpha_3": "NFK",
+ "name": "Norfolk Island",
+ "numeric": "574"
+ },
+ {
+ "alpha_2": "NG",
+ "alpha_3": "NGA",
+ "name": "Nigeria",
+ "numeric": "566",
+ "official_name": "Federal Republic of Nigeria"
+ },
+ {
+ "alpha_2": "NI",
+ "alpha_3": "NIC",
+ "name": "Nicaragua",
+ "numeric": "558",
+ "official_name": "Republic of Nicaragua"
+ },
+ {
+ "alpha_2": "NU",
+ "alpha_3": "NIU",
+ "name": "Niue",
+ "numeric": "570",
+ "official_name": "Niue"
+ },
+ {
+ "alpha_2": "NL",
+ "alpha_3": "NLD",
+ "name": "Netherlands",
+ "numeric": "528",
+ "official_name": "Kingdom of the Netherlands"
+ },
+ {
+ "alpha_2": "NO",
+ "alpha_3": "NOR",
+ "name": "Norway",
+ "numeric": "578",
+ "official_name": "Kingdom of Norway"
+ },
+ {
+ "alpha_2": "NP",
+ "alpha_3": "NPL",
+ "name": "Nepal",
+ "numeric": "524",
+ "official_name": "Federal Democratic Republic of Nepal"
+ },
+ {
+ "alpha_2": "NR",
+ "alpha_3": "NRU",
+ "name": "Nauru",
+ "numeric": "520",
+ "official_name": "Republic of Nauru"
+ },
+ {
+ "alpha_2": "NZ",
+ "alpha_3": "NZL",
+ "name": "New Zealand",
+ "numeric": "554"
+ },
+ {
+ "alpha_2": "OM",
+ "alpha_3": "OMN",
+ "name": "Oman",
+ "numeric": "512",
+ "official_name": "Sultanate of Oman"
+ },
+ {
+ "alpha_2": "PK",
+ "alpha_3": "PAK",
+ "name": "Pakistan",
+ "numeric": "586",
+ "official_name": "Islamic Republic of Pakistan"
+ },
+ {
+ "alpha_2": "PA",
+ "alpha_3": "PAN",
+ "name": "Panama",
+ "numeric": "591",
+ "official_name": "Republic of Panama"
+ },
+ {
+ "alpha_2": "PN",
+ "alpha_3": "PCN",
+ "name": "Pitcairn",
+ "numeric": "612"
+ },
+ {
+ "alpha_2": "PE",
+ "alpha_3": "PER",
+ "name": "Peru",
+ "numeric": "604",
+ "official_name": "Republic of Peru"
+ },
+ {
+ "alpha_2": "PH",
+ "alpha_3": "PHL",
+ "name": "Philippines",
+ "numeric": "608",
+ "official_name": "Republic of the Philippines"
+ },
+ {
+ "alpha_2": "PW",
+ "alpha_3": "PLW",
+ "name": "Palau",
+ "numeric": "585",
+ "official_name": "Republic of Palau"
+ },
+ {
+ "alpha_2": "PG",
+ "alpha_3": "PNG",
+ "name": "Papua New Guinea",
+ "numeric": "598",
+ "official_name": "Independent State of Papua New Guinea"
+ },
+ {
+ "alpha_2": "PL",
+ "alpha_3": "POL",
+ "name": "Poland",
+ "numeric": "616",
+ "official_name": "Republic of Poland"
+ },
+ {
+ "alpha_2": "PR",
+ "alpha_3": "PRI",
+ "name": "Puerto Rico",
+ "numeric": "630"
+ },
+ {
+ "alpha_2": "KP",
+ "alpha_3": "PRK",
+ "name": "Korea, Democratic People's Republic of",
+ "numeric": "408",
+ "official_name": "Democratic People's Republic of Korea"
+ },
+ {
+ "alpha_2": "PT",
+ "alpha_3": "PRT",
+ "name": "Portugal",
+ "numeric": "620",
+ "official_name": "Portuguese Republic"
+ },
+ {
+ "alpha_2": "PY",
+ "alpha_3": "PRY",
+ "name": "Paraguay",
+ "numeric": "600",
+ "official_name": "Republic of Paraguay"
+ },
+ {
+ "alpha_2": "PS",
+ "alpha_3": "PSE",
+ "name": "Palestine, State of",
+ "numeric": "275",
+ "official_name": "the State of Palestine"
+ },
+ {
+ "alpha_2": "PF",
+ "alpha_3": "PYF",
+ "name": "French Polynesia",
+ "numeric": "258"
+ },
+ {
+ "alpha_2": "QA",
+ "alpha_3": "QAT",
+ "name": "Qatar",
+ "numeric": "634",
+ "official_name": "State of Qatar"
+ },
+ {
+ "alpha_2": "RE",
+ "alpha_3": "REU",
+ "name": "Réunion",
+ "numeric": "638"
+ },
+ {
+ "alpha_2": "RO",
+ "alpha_3": "ROU",
+ "name": "Romania",
+ "numeric": "642"
+ },
+ {
+ "alpha_2": "RU",
+ "alpha_3": "RUS",
+ "name": "Russian Federation",
+ "numeric": "643"
+ },
+ {
+ "alpha_2": "RW",
+ "alpha_3": "RWA",
+ "name": "Rwanda",
+ "numeric": "646",
+ "official_name": "Rwandese Republic"
+ },
+ {
+ "alpha_2": "SA",
+ "alpha_3": "SAU",
+ "name": "Saudi Arabia",
+ "numeric": "682",
+ "official_name": "Kingdom of Saudi Arabia"
+ },
+ {
+ "alpha_2": "SD",
+ "alpha_3": "SDN",
+ "name": "Sudan",
+ "numeric": "729",
+ "official_name": "Republic of the Sudan"
+ },
+ {
+ "alpha_2": "SN",
+ "alpha_3": "SEN",
+ "name": "Senegal",
+ "numeric": "686",
+ "official_name": "Republic of Senegal"
+ },
+ {
+ "alpha_2": "SG",
+ "alpha_3": "SGP",
+ "name": "Singapore",
+ "numeric": "702",
+ "official_name": "Republic of Singapore"
+ },
+ {
+ "alpha_2": "GS",
+ "alpha_3": "SGS",
+ "name": "South Georgia and the South Sandwich Islands",
+ "numeric": "239"
+ },
+ {
+ "alpha_2": "SH",
+ "alpha_3": "SHN",
+ "name": "Saint Helena, Ascension and Tristan da Cunha",
+ "numeric": "654"
+ },
+ {
+ "alpha_2": "SJ",
+ "alpha_3": "SJM",
+ "name": "Svalbard and Jan Mayen",
+ "numeric": "744"
+ },
+ {
+ "alpha_2": "SB",
+ "alpha_3": "SLB",
+ "name": "Solomon Islands",
+ "numeric": "090"
+ },
+ {
+ "alpha_2": "SL",
+ "alpha_3": "SLE",
+ "name": "Sierra Leone",
+ "numeric": "694",
+ "official_name": "Republic of Sierra Leone"
+ },
+ {
+ "alpha_2": "SV",
+ "alpha_3": "SLV",
+ "name": "El Salvador",
+ "numeric": "222",
+ "official_name": "Republic of El Salvador"
+ },
+ {
+ "alpha_2": "SM",
+ "alpha_3": "SMR",
+ "name": "San Marino",
+ "numeric": "674",
+ "official_name": "Republic of San Marino"
+ },
+ {
+ "alpha_2": "SO",
+ "alpha_3": "SOM",
+ "name": "Somalia",
+ "numeric": "706",
+ "official_name": "Federal Republic of Somalia"
+ },
+ {
+ "alpha_2": "PM",
+ "alpha_3": "SPM",
+ "name": "Saint Pierre and Miquelon",
+ "numeric": "666"
+ },
+ {
+ "alpha_2": "RS",
+ "alpha_3": "SRB",
+ "name": "Serbia",
+ "numeric": "688",
+ "official_name": "Republic of Serbia"
+ },
+ {
+ "alpha_2": "SS",
+ "alpha_3": "SSD",
+ "name": "South Sudan",
+ "numeric": "728",
+ "official_name": "Republic of South Sudan"
+ },
+ {
+ "alpha_2": "ST",
+ "alpha_3": "STP",
+ "name": "Sao Tome and Principe",
+ "numeric": "678",
+ "official_name": "Democratic Republic of Sao Tome and Principe"
+ },
+ {
+ "alpha_2": "SR",
+ "alpha_3": "SUR",
+ "name": "Suriname",
+ "numeric": "740",
+ "official_name": "Republic of Suriname"
+ },
+ {
+ "alpha_2": "SK",
+ "alpha_3": "SVK",
+ "name": "Slovakia",
+ "numeric": "703",
+ "official_name": "Slovak Republic"
+ },
+ {
+ "alpha_2": "SI",
+ "alpha_3": "SVN",
+ "name": "Slovenia",
+ "numeric": "705",
+ "official_name": "Republic of Slovenia"
+ },
+ {
+ "alpha_2": "SE",
+ "alpha_3": "SWE",
+ "name": "Sweden",
+ "numeric": "752",
+ "official_name": "Kingdom of Sweden"
+ },
+ {
+ "alpha_2": "SZ",
+ "alpha_3": "SWZ",
+ "name": "Swaziland",
+ "numeric": "748",
+ "official_name": "Kingdom of Swaziland"
+ },
+ {
+ "alpha_2": "SX",
+ "alpha_3": "SXM",
+ "name": "Sint Maarten (Dutch part)",
+ "numeric": "534",
+ "official_name": "Sint Maarten (Dutch part)"
+ },
+ {
+ "alpha_2": "SC",
+ "alpha_3": "SYC",
+ "name": "Seychelles",
+ "numeric": "690",
+ "official_name": "Republic of Seychelles"
+ },
+ {
+ "alpha_2": "SY",
+ "alpha_3": "SYR",
+ "name": "Syrian Arab Republic",
+ "numeric": "760"
+ },
+ {
+ "alpha_2": "TC",
+ "alpha_3": "TCA",
+ "name": "Turks and Caicos Islands",
+ "numeric": "796"
+ },
+ {
+ "alpha_2": "TD",
+ "alpha_3": "TCD",
+ "name": "Chad",
+ "numeric": "148",
+ "official_name": "Republic of Chad"
+ },
+ {
+ "alpha_2": "TG",
+ "alpha_3": "TGO",
+ "name": "Togo",
+ "numeric": "768",
+ "official_name": "Togolese Republic"
+ },
+ {
+ "alpha_2": "TH",
+ "alpha_3": "THA",
+ "name": "Thailand",
+ "numeric": "764",
+ "official_name": "Kingdom of Thailand"
+ },
+ {
+ "alpha_2": "TJ",
+ "alpha_3": "TJK",
+ "name": "Tajikistan",
+ "numeric": "762",
+ "official_name": "Republic of Tajikistan"
+ },
+ {
+ "alpha_2": "TK",
+ "alpha_3": "TKL",
+ "name": "Tokelau",
+ "numeric": "772"
+ },
+ {
+ "alpha_2": "TM",
+ "alpha_3": "TKM",
+ "name": "Turkmenistan",
+ "numeric": "795"
+ },
+ {
+ "alpha_2": "TL",
+ "alpha_3": "TLS",
+ "name": "Timor-Leste",
+ "numeric": "626",
+ "official_name": "Democratic Republic of Timor-Leste"
+ },
+ {
+ "alpha_2": "TO",
+ "alpha_3": "TON",
+ "name": "Tonga",
+ "numeric": "776",
+ "official_name": "Kingdom of Tonga"
+ },
+ {
+ "alpha_2": "TT",
+ "alpha_3": "TTO",
+ "name": "Trinidad and Tobago",
+ "numeric": "780",
+ "official_name": "Republic of Trinidad and Tobago"
+ },
+ {
+ "alpha_2": "TN",
+ "alpha_3": "TUN",
+ "name": "Tunisia",
+ "numeric": "788",
+ "official_name": "Republic of Tunisia"
+ },
+ {
+ "alpha_2": "TR",
+ "alpha_3": "TUR",
+ "name": "Turkey",
+ "numeric": "792",
+ "official_name": "Republic of Turkey"
+ },
+ {
+ "alpha_2": "TV",
+ "alpha_3": "TUV",
+ "name": "Tuvalu",
+ "numeric": "798"
+ },
+ {
+ "alpha_2": "TW",
+ "alpha_3": "TWN",
+ "common_name": "Taiwan",
+ "name": "Taiwan, Province of China",
+ "numeric": "158",
+ "official_name": "Taiwan, Province of China"
+ },
+ {
+ "alpha_2": "TZ",
+ "alpha_3": "TZA",
+ "common_name": "Tanzania",
+ "name": "Tanzania, United Republic of",
+ "numeric": "834",
+ "official_name": "United Republic of Tanzania"
+ },
+ {
+ "alpha_2": "UG",
+ "alpha_3": "UGA",
+ "name": "Uganda",
+ "numeric": "800",
+ "official_name": "Republic of Uganda"
+ },
+ {
+ "alpha_2": "UA",
+ "alpha_3": "UKR",
+ "name": "Ukraine",
+ "numeric": "804"
+ },
+ {
+ "alpha_2": "UM",
+ "alpha_3": "UMI",
+ "name": "United States Minor Outlying Islands",
+ "numeric": "581"
+ },
+ {
+ "alpha_2": "UY",
+ "alpha_3": "URY",
+ "name": "Uruguay",
+ "numeric": "858",
+ "official_name": "Eastern Republic of Uruguay"
+ },
+ {
+ "alpha_2": "US",
+ "alpha_3": "USA",
+ "name": "United States",
+ "numeric": "840",
+ "official_name": "United States of America"
+ },
+ {
+ "alpha_2": "UZ",
+ "alpha_3": "UZB",
+ "name": "Uzbekistan",
+ "numeric": "860",
+ "official_name": "Republic of Uzbekistan"
+ },
+ {
+ "alpha_2": "VA",
+ "alpha_3": "VAT",
+ "name": "Holy See (Vatican City State)",
+ "numeric": "336"
+ },
+ {
+ "alpha_2": "VC",
+ "alpha_3": "VCT",
+ "name": "Saint Vincent and the Grenadines",
+ "numeric": "670"
+ },
+ {
+ "alpha_2": "VE",
+ "alpha_3": "VEN",
+ "common_name": "Venezuela",
+ "name": "Venezuela, Bolivarian Republic of",
+ "numeric": "862",
+ "official_name": "Bolivarian Republic of Venezuela"
+ },
+ {
+ "alpha_2": "VG",
+ "alpha_3": "VGB",
+ "name": "Virgin Islands, British",
+ "numeric": "092",
+ "official_name": "British Virgin Islands"
+ },
+ {
+ "alpha_2": "VI",
+ "alpha_3": "VIR",
+ "name": "Virgin Islands, U.S.",
+ "numeric": "850",
+ "official_name": "Virgin Islands of the United States"
+ },
+ {
+ "alpha_2": "VN",
+ "alpha_3": "VNM",
+ "common_name": "Vietnam",
+ "name": "Viet Nam",
+ "numeric": "704",
+ "official_name": "Socialist Republic of Viet Nam"
+ },
+ {
+ "alpha_2": "VU",
+ "alpha_3": "VUT",
+ "name": "Vanuatu",
+ "numeric": "548",
+ "official_name": "Republic of Vanuatu"
+ },
+ {
+ "alpha_2": "WF",
+ "alpha_3": "WLF",
+ "name": "Wallis and Futuna",
+ "numeric": "876"
+ },
+ {
+ "alpha_2": "WS",
+ "alpha_3": "WSM",
+ "name": "Samoa",
+ "numeric": "882",
+ "official_name": "Independent State of Samoa"
+ },
+ {
+ "alpha_2": "YE",
+ "alpha_3": "YEM",
+ "name": "Yemen",
+ "numeric": "887",
+ "official_name": "Republic of Yemen"
+ },
+ {
+ "alpha_2": "ZA",
+ "alpha_3": "ZAF",
+ "name": "South Africa",
+ "numeric": "710",
+ "official_name": "Republic of South Africa"
+ },
+ {
+ "alpha_2": "ZM",
+ "alpha_3": "ZMB",
+ "name": "Zambia",
+ "numeric": "894",
+ "official_name": "Republic of Zambia"
+ },
+ {
+ "alpha_2": "ZW",
+ "alpha_3": "ZWE",
+ "name": "Zimbabwe",
+ "numeric": "716",
+ "official_name": "Republic of Zimbabwe"
+ }
+ ]
+}
diff --git a/plugin.video.plutotv/resources/language/resource.language.en_gb/strings.po b/plugin.video.plutotv/resources/language/resource.language.en_gb/strings.po
index 4143841..c521fe1 100644
--- a/plugin.video.plutotv/resources/language/resource.language.en_gb/strings.po
+++ b/plugin.video.plutotv/resources/language/resource.language.en_gb/strings.po
@@ -28,15 +28,30 @@ msgctxt "#30002"
msgid "Enter User Password"
msgstr ""
-msgctxt "#30003"
-msgid "Hide Pluto.TV Ads/Promos"
-msgstr ""
-
msgctxt "#30004"
-msgid "Filter by Region"
+msgid "Some channels not available in your region"
msgstr ""
msgctxt "#30005"
-msgid "Disable Channel Autoplay, Enable OnDemand Content"
+msgid "Select User Region"
+msgstr ""
+
+msgctxt "#30006"
+msgid "Welcome Back "
+msgstr ""
+
+msgctxt "#30007"
+msgid "Invalid User Credentials"
+msgstr ""
+
+msgctxt "#30008"
+msgid "Already have a Pluto.TV account?"
+msgstr ""
+
+msgctxt "#30009"
+msgid "Guest"
msgstr ""
+msgctxt "#30010"
+msgid "Sign-In"
+msgstr "" \ No newline at end of file
diff --git a/plugin.video.plutotv/resources/settings.xml b/plugin.video.plutotv/resources/settings.xml
index a900543..84201d8 100644
--- a/plugin.video.plutotv/resources/settings.xml
+++ b/plugin.video.plutotv/resources/settings.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<settings>
- <setting id="User_Email" type="text" label="30001" default="" />
- <setting id="User_Password" type="text" label="30002" default="" />
- <setting id="Hide_Ads" type="bool" label="30003" default="false" />
- <setting id="Filter_Region" type="bool" label="30004" default="false" />
- <setting id="Enable_Debugging" type="bool" label="30000" default="false" />
+ <setting id="User_Email" type="text" label="30001" default="" />
+ <setting id="User_Password" type="text" label="30002" default="" />
+ <setting id="Select_Country" type="action" label="30005" default="US" action="RunScript($CWD/country.py)"/>
+ <setting id="Enable_Debugging" type="bool" label="30000" default="false" />
</settings>