Ejemplo n.º 1
0
    def auth(self):
        resp = self.get_json('pin/get')
        expiry = pin_ttl = int(resp['expires_in'])
        auth_complete = False
        control.copy2clip(resp['pin'])
        control.progressDialog.create(control.ADDON_NAME + ': AllDebrid Auth',
                                    line1=control.lang(30100).format(control.colorString(resp['base_url'])),
                                    line2=control.lang(30101).format(control.colorString(resp['pin'])),
                                    line3=control.lang(30102))

        # Seems the All Debrid servers need some time do something with the pin before polling
        # Polling to early will cause an invalid pin error
        control.kodi.sleep(5 * 1000)
        control.progressDialog.update(100)
        while not auth_complete and not expiry <= 0 and not control.progressDialog.iscanceled():
            auth_complete, expiry = self.poll_auth(check=resp['check'], pin=resp['pin'])
            progress_percent = 100 - int((float(pin_ttl - expiry) / pin_ttl) * 100)
            control.progressDialog.update(progress_percent)
            control.kodi.sleep(1 * 1000)
        try:
            control.progressDialog.close()
        except:
            pass

        self.store_user_info()

        if auth_complete:
            control.ok_dialog(control.ADDON_NAME, 'AllDebrid {}'.format(control.lang(30103)))
        else:
            return
Ejemplo n.º 2
0
def PLAY(payload, params):
    anime_url, episode = payload.rsplit("/", 1)
    sources = _BROWSER.get_episode_sources(anime_url, episode)

    serverChoice = filter(lambda x: control.getSetting(x[0]) == 'true',
                          SERVER_CHOICES.iteritems())
    serverChoice = map(lambda x: x[1], serverChoice)
    sources = filter(lambda x: x[0] in serverChoice, sources)

    autoplay = True if 'true' in control.getSetting('autoplay') else False

    s = SourcesList(
        sources, autoplay, sortResultsByRes, {
            'title': control.lang(30100),
            'processing': control.lang(30101),
            'choose': control.lang(30102),
            'notfound': control.lang(30103),
        })

    if isDirectoryStyle():
        if s._read_sources():
            items = sorted(s._sources.iteritems(), key=lambda x: x[0])
            items = [(title[5:], url) for title, url in items]
            items = map(
                lambda x: utils.allocate_item(x[0], 'playlink&url=/' + x[1],
                                              '', False, ''), items)
            return control.draw_items(items)
    else:
        res = control.play_source(s.get_video_link())
        bookmark_episode_playing(sources[0])
        return res
Ejemplo n.º 3
0
def PLAY(payload, params):
    anime_url, episode = payload.rsplit("/", 1)
    sources = _BROWSER.get_episode_sources(anime_url, episode)

    serverChoice = filter(lambda x:
        control.getSetting(x[0]) == 'true', SERVER_CHOICES.iteritems())
    serverChoice = map(lambda x: x[1], serverChoice)
    sources = filter(lambda x: x[0] in serverChoice, sources)

    autoplay = True if 'true' in control.getSetting('autoplay') else False

    s = SourcesList(sources, autoplay, sortResultsByRes, {
        'title': control.lang(30100),
        'processing': control.lang(30101),
        'choose': control.lang(30102),
        'notfound': control.lang(30103),
    })

    if isDirectoryStyle():
        if s._read_sources():
            items = sorted(s._sources.iteritems(), key=lambda x: x[0])
            items = [(title[5:], url) for title, url in items]
            items = map(lambda x: utils.allocate_item(x[0], 'playlink&url=/'+x[1],'', False, ''), items)
            return control.draw_items(items)
    else:
        res = control.play_source(s.get_video_link())
        bookmark_episode_playing(sources[0])
        return res
Ejemplo n.º 4
0
    def auth(self):
        data = {'client_id': self.client_id, 'response_type': 'device_code'}
        token = requests.post('https://www.premiumize.me/token',
                              data=data).json()
        expiry = token['expires_in']
        token_ttl = token['expires_in']
        poll_again = True
        success = False
        control.copy2clip(token['user_code'])
        control.progressDialog.create(
            control.ADDON_NAME,
            line1=control.lang(30100).format(
                control.colorString(token['verification_uri'])),
            line2=control.lang(30101).format(
                control.colorString(token['user_code'])),
            line3=control.lang(30102))
        control.progressDialog.update(0)

        while poll_again and not token_ttl <= 0 and not control.progressDialog.iscanceled(
        ):
            poll_again, success = self.poll_token(token['device_code'])
            progress_percent = 100 - int((float(
                (expiry - token_ttl) / expiry) * 100))
            control.progressDialog.update(progress_percent)
            time.sleep(token['interval'])
            token_ttl -= int(token['interval'])

        control.progressDialog.close()

        if success:
            control.ok_dialog(control.ADDON_NAME,
                              'Premiumize ' + control.lang(30103))
Ejemplo n.º 5
0
def PLAY(payload):
    anime_url, episode = payload.rsplit("/", 1)
    s = SourcesList(
        NineAnimeBrowser().get_episode_sources(anime_url, int(episode)), {
            'title': control.lang(30100),
            'processing': control.lang(30101),
            'choose': control.lang(30102),
            'notfound': control.lang(30103),
        })
    return control.play_source(s.get_video_link())
Ejemplo n.º 6
0
def GOGO_PLAY(payload, params):
    sources = GogoAnimeBrowser().get_episode_sources(payload)
    autoplay = True if 'true' in control.getSetting('autoplay') else False

    s = SourcesList(
        sorted(sources.items()), autoplay, sortResultsByRes, {
            'title': control.lang(30100),
            'processing': control.lang(30101),
            'choose': control.lang(30102),
            'notfound': control.lang(30103),
        })

    control.play_source(s.get_video_link())
Ejemplo n.º 7
0
def PLAY(payload, params):
    ep_id = payload
    sources = _BROWSER.get_episode_sources(ep_id, params['session'])
    autoplay = True if 'true' in control.getSetting('autoplay') else False

    s = SourcesList(
        sorted(sources.items()), autoplay, sortResultsByRes, {
            'title': control.lang(30100),
            'processing': control.lang(30101),
            'choose': control.lang(30102),
            'notfound': control.lang(30103),
        })

    control.play_source(s.get_video_link())
Ejemplo n.º 8
0
def TOOLS_MENU(payload, params):
    TOOLS_ITEMS = [
        (control.lang(30020), "settings", ''),
        (control.lang(30021), "clear_cache", ''),
        (control.lang(30022), "clear_torrent_cache", ''),
        (control.lang(30023), "clear_history", ''),
        (control.lang(30024), "wipe_addon_data", ''),
    ]

    return control.draw_items(
        [
            utils.allocate_item(name, url, True, image)
            for name, url, image in TOOLS_ITEMS
        ],
        contentType=control.getSetting("contenttype.menu"),
    )
Ejemplo n.º 9
0
def update_bookmark_cm(u):
    if not _BROWSER.is_logged_in():
        return []

    sysaddon = sys.argv[0]

    move_to = control.lang(40001)
    return [
        (move_to + control.lang(30301),
         'RunPlugin(%s?action=update_bookmark&anime_id=%s&folder=watching)' %
         (sysaddon, u)),
        (move_to + control.lang(30302),
         'RunPlugin(%s?action=update_bookmark&anime_id=%s&folder=watched)' %
         (sysaddon, u)),
        (move_to + control.lang(30303),
         'RunPlugin(%s?action=update_bookmark&anime_id=%s&folder=onhold)' %
         (sysaddon, u)),
        (move_to + control.lang(30304),
         'RunPlugin(%s?action=update_bookmark&anime_id=%s&folder=dropped)' %
         (sysaddon, u)),
        (move_to + control.lang(30305),
         'RunPlugin(%s?action=update_bookmark&anime_id=%s&folder=planned)' %
         (sysaddon, u)),
        (control.lang(40002),
         'RunPlugin(%s?action=update_bookmark&anime_id=%s&folder=remove)' %
         (sysaddon,u)),
    ]
Ejemplo n.º 10
0
def update_bookmark_cm(u):
    if not _BROWSER.is_logged_in():
        return []

    sysaddon = sys.argv[0]

    move_to = control.lang(40001)
    return [
        (move_to + control.lang(30301),
         'RunPlugin(%s?action=update_bookmark&anime_id=%s&folder=watching)' %
         (sysaddon, u)),
        (move_to + control.lang(30302),
         'RunPlugin(%s?action=update_bookmark&anime_id=%s&folder=watched)' %
         (sysaddon, u)),
        (move_to + control.lang(30303),
         'RunPlugin(%s?action=update_bookmark&anime_id=%s&folder=onhold)' %
         (sysaddon, u)),
        (move_to + control.lang(30304),
         'RunPlugin(%s?action=update_bookmark&anime_id=%s&folder=dropped)' %
         (sysaddon, u)),
        (move_to + control.lang(30305),
         'RunPlugin(%s?action=update_bookmark&anime_id=%s&folder=planned)' %
         (sysaddon, u)),
        (control.lang(40002),
         'RunPlugin(%s?action=update_bookmark&anime_id=%s&folder=remove)' %
         (sysaddon, u)),
    ]
Ejemplo n.º 11
0
def _add_last_watched():
    if not control.getSetting(LASTWATCHED_URL_KEY):
        return

    MENU_ITEMS.insert(
        0, ("%s[I]%s[/I]" %
            (control.lang(30000), control.getSetting(LASTWATCHED_NAME_KEY)),
            control.getSetting(LASTWATCHED_URL_KEY),
            control.getSetting(LASTWATCHED_IMAGE_KEY)))
Ejemplo n.º 12
0
def unbookmark_cm(u):
    if not _BROWSER.is_logged_in():
        return []

    sysaddon = sys.argv[0]
    return [
        (control.lang(40001),
         'RunPlugin(%s?action=bookmark&anime_id=%s&folder=remove)' %
         (sysaddon, u)),
    ]
Ejemplo n.º 13
0
def SEARCH(payload, params):
    query = control.keyboard(control.lang(30009))
    if not query:
        return False

    # TODO: Better logic here, maybe move functionatly into router?
    if "Yes" in control.getSetting('searchhistory'):
        database.addSearchHistory(query, 'show')
        history = database.getSearchHistory('show')

    return control.draw_items(_ANILIST_BROWSER.get_search(query))
Ejemplo n.º 14
0
def SEARCH(payload, params):
    query = control.keyboard(control.lang(30007))
    if query:
        if "Yes" in control.getSetting('searchhistory') :
            history = control.getSetting("9anime.history")
            if history != "" :
                query = query+HISTORY_DELIM
            history=query+history
            while history.count(HISTORY_DELIM) > 6 :
                history=history.rsplit(HISTORY_DELIM, 1)[0]
            control.setSetting("9anime.history",history)
        return control.draw_items(_BROWSER.search_site(query))
    return False
Ejemplo n.º 15
0
def PLAY(payload, params):
    anime_url, kitsu_id = payload.rsplit("/", 1)
    anime_url, episode = anime_url.rsplit("/", 1)
    anime_url, season = anime_url.rsplit("/", 1)
    anime_url, flavor = anime_url.rsplit("/", 1)
    is_dubbed = True if "dub" == flavor else False
    name, image = _BROWSER.get_anime_metadata(anime_url, is_dubbed)
    sources = _BROWSER.get_episode_sources(anime_url, is_dubbed, season,
                                           episode)
    autoplay = True if 'true' in control.getSetting('autoplay') else False

    s = SourcesList(
        sorted(sources.items()), autoplay, sortResultsByRes, {
            'title': control.lang(30100),
            'processing': control.lang(30101),
            'choose': control.lang(30102),
            'notfound': control.lang(30103),
        })

    __set_last_watched(anime_url, is_dubbed, name, image)
    control.play_source(s.get_video_link(),
                        watchlist_update(episode, kitsu_id), on_stopped)
Ejemplo n.º 16
0
def SEARCH(payload, params):
    query = control.keyboard(control.lang(30007))
    if query:
        if "Yes" in control.getSetting('searchhistory'):
            history = control.getSetting("9anime.history")
            if history != "":
                query = query + HISTORY_DELIM
            history = query + history
            while history.count(HISTORY_DELIM) > 6:
                history = history.rsplit(HISTORY_DELIM, 1)[0]
            control.setSetting("9anime.history", history)
        return control.draw_items(_BROWSER.search_site(query))
    return False
Ejemplo n.º 17
0
def _add_last_watched():
    anilist_id = control.getSetting("addon.last_watched")
    if not anilist_id:
        return

    try:
        last_watched = ast.literal_eval(
            database.get_show(anilist_id)['kodi_meta'])
    except:
        return

    MENU_ITEMS.insert(
        0, ("%s[I]%s[/I]" % (control.lang(30000), last_watched['name']),
            "animes/%s/" % anilist_id, last_watched['poster']))
Ejemplo n.º 18
0
    def auth(self):
        self.ClientSecret = ''
        self.ClientID = 'X245A4XAIBGVM'
        url = ("client_id=%s&new_credentials=yes" % self.ClientID)
        url = self.OauthUrl + self.DeviceCodeUrl % url
        response = json.loads(requests.get(url).text)
        control.copy2clip(response['user_code'])
        control.progressDialog.create('Real-Debrid Auth')
        control.progressDialog.update(-1,
                                      control.lang(30100).format(control.colorString('https://real-debrid.com/device')),
                                      control.lang(30101).format(control.colorString(response['user_code'])),
                                      control.lang(30102))
        self.OauthTimeout = int(response['expires_in'])
        self.OauthTimeStep = int(response['interval'])
        self.DeviceCode = response['device_code']

        while self.ClientSecret == '':
            self.auth_loop()

        self.token_request()

        user_information = self.get_url('https://api.real-debrid.com/rest/1.0/user')
        if user_information['type'] != 'premium':
            control.ok_dialog(control.ADDON_NAME, control.lang(30104))
Ejemplo n.º 19
0
def SEARCH(payload, params):
    query = control.keyboard(control.lang(30008))
    if not query:
        return False

    # TODO: Better logic here, maybe move functionatly into router?
    if "Yes" in control.getSetting('searchhistory'):
        history = control.getSetting(HISTORY_KEY)
        if history != "":
            query = query + HISTORY_DELIM
        history = query + history
        while history.count(HISTORY_DELIM) > 6:
            history = history.rsplit(HISTORY_DELIM, 1)[0]
        control.setSetting(HISTORY_KEY, history)

    return control.draw_items(_BROWSER.search_site(query))
Ejemplo n.º 20
0
    def token_request(self):
        if self.ClientSecret is '':
            return

        postData = {'client_id': self.ClientID,
                    'client_secret': self.ClientSecret,
                    'code': self.DeviceCode,
                    'grant_type': 'http://oauth.net/grant_type/device/1.0'}

        url = self.OauthUrl + self.TokenUrl
        response = requests.post(url, data=postData).text
        response = json.loads(response)
        control.setSetting('rd.auth', response['access_token'])
        control.setSetting('rd.refresh', response['refresh_token'])
        self.token = response['access_token']
        self.refresh = response['refresh_token']
        control.setSetting('rd.expiry', str(time.time() + int(response['expires_in'])))
        username = self.get_url('https://api.real-debrid.com/rest/1.0/user')['username']
        control.setSetting('rd.username', username)
        control.ok_dialog(control.ADDON_NAME, 'Real Debrid ' + control.lang(30103))
Ejemplo n.º 21
0
 def auth_loop(self):
     if control.progressDialog.iscanceled():
         control.progressDialog.close()
         return
     time.sleep(self.OauthTimeStep)
     url = "client_id=%s&code=%s" % (self.ClientID, self.DeviceCode)
     url = self.OauthUrl + self.DeviceCredUrl % url
     response = json.loads(requests.get(url).text)
     if 'error' in response:
         return
     else:
         try:
             control.progressDialog.close()
             control.setSetting('rd.client_id', response['client_id'])
             control.setSetting('rd.secret', response['client_secret'])
             self.ClientSecret = response['client_secret']
             self.ClientID = response['client_id']
         except:
             control.ok_dialog(control.ADDON_NAME, control.lang(30105))
         return
Ejemplo n.º 22
0
def SEARCH(payload):
    query = control.keyboard(control.lang(30002))
    if query:
        return control.draw_items(NineAnimeBrowser().search_site(query))
    return False
Ejemplo n.º 23
0
def on_stopped():
    return control.yesno_dialog(control.lang(30200), control.lang(30201),
                                control.lang(30202))
Ejemplo n.º 24
0
def SEARCH(payload):
    query = control.keyboard(control.lang(30002))
    if query:
        return control.draw_items(_BROWSER.search_site(query))
    return False
Ejemplo n.º 25
0
from resources.lib.ui import control
from resources.lib.ui import utils
from resources.lib.ui.SourcesList import SourcesList
from resources.lib.ui.router import route, router_process
from resources.lib.NineAnimeBrowser import NineAnimeBrowser

AB_LIST = [".", "0"] + [chr(i) for i in range(ord("A"), ord("Z") + 1)]
MENU_ITEMS = [(control.lang(30000), "latest"), (control.lang(30001), "newest"),
              (control.lang(30002), "genres"), (control.lang(30003), "search")]


@route('animes/*')
def ANIMES_PAGE(animeurl):
    return control.draw_items(NineAnimeBrowser().get_anime_episodes(animeurl))


@route('newest')
def NEWEST(payload):
    return control.draw_items(NineAnimeBrowser().get_newest())


@route('newest/*')
def NEWEST_PAGES(payload):
    return control.draw_items(NineAnimeBrowser().get_newest(int(payload)))


@route('latest')
def LATEST(payload):
    return control.draw_items(NineAnimeBrowser().get_latest())

Ejemplo n.º 26
0
def CLEAR_SETTINGS(payload, params):
    dialog = control.yesno_dialog(control.lang(30300), control.lang(30301))
    return control.clear_settings(dialog)
Ejemplo n.º 27
0
import urlparse

AB_LIST = ["none"] + [chr(i) for i in range(ord("a"), ord("z") + 1)]
AB_LIST_NAMING = ["No Letter"
                  ] + [chr(i) for i in range(ord("A"),
                                             ord("Z") + 1)]

HISTORY_KEY = "addon.history"
LASTWATCHED_KEY = "addon.last_watched"
LASTWATCHED_NAME_KEY = "%s.name" % LASTWATCHED_KEY
LASTWATCHED_URL_KEY = "%s.url" % LASTWATCHED_KEY
LASTWATCHED_IMAGE_KEY = "%s.image" % LASTWATCHED_KEY
HISTORY_DELIM = ";"

MENU_ITEMS = [
    (control.lang(30005), "latest", ''),
    (control.lang(30006), "anichart_popular", ''),
    (control.lang(30004), "anilist_genres", ''),
    (control.lang(30008), "search_history", ''),
    (control.lang(30009), "settings", ''),
]

_BROWSER = AnimepaheBrowser()


def _add_last_watched():
    if not control.getSetting(LASTWATCHED_URL_KEY):
        return

    MENU_ITEMS.insert(
        0, ("%s[I]%s[/I]" %
Ejemplo n.º 28
0
from resources.lib.ui import control
from resources.lib.ui import utils
from resources.lib.ui.SourcesList import SourcesList
from resources.lib.ui.router import on_param, route, router_process
from resources.lib.NineAnimeBrowser import NineAnimeBrowser
import urlparse

AB_LIST = [".", "0"] + [chr(i) for i in range(ord("A"), ord("Z") + 1)]
MENU_ITEMS = [
    (control.lang(30009), "watchlist", True),
    (control.lang(30000), "latest", False),
    (control.lang(30001), "newest", False),
    (control.lang(30002), "recent_subbed", False),
    (control.lang(30003), "popular_subbed", False),
    (control.lang(30004), "recent_dubbed", False),
    (control.lang(30005), "popular_dubbed", False),
    (control.lang(30006), "genres", False),
    (control.lang(30007), "search_history", False),
    (control.lang(30008), "settings", False),
    (control.lang(30010), "logout", True),
]
SERVER_CHOICES = {
    "serverstreamango": "Streamango",
    "serverrapid": "RapidVideo",
    "servermycloud": "MyCloud",
    "serveropenload": "OpenLoad",
}

WATCHLIST_ITEMS = [(control.lang(30300), "watchlist_all"),
                   (control.lang(30301), "watchlist_watching"),
                   (control.lang(30302), "watchlist_completed"),
Ejemplo n.º 29
0
import urlparse

AB_LIST = ["none"] + [chr(i) for i in range(ord("a"), ord("z") + 1)]
AB_LIST_NAMING = ["No Letter"
                  ] + [chr(i) for i in range(ord("A"),
                                             ord("Z") + 1)]

HISTORY_KEY = "addon.history"
LASTWATCHED_KEY = "addon.last_watched"
LASTWATCHED_NAME_KEY = "%s.name" % LASTWATCHED_KEY
LASTWATCHED_URL_KEY = "%s.url" % LASTWATCHED_KEY
LASTWATCHED_IMAGE_KEY = "%s.image" % LASTWATCHED_KEY
HISTORY_DELIM = ";"

MENU_ITEMS = [
    (control.lang(30001), "anichart_airing", ''),
    (control.lang(30002), "all", ''),
    (control.lang(30003), "letter", ''),
    (control.lang(30004), "anilist_genres", ''),
    (control.lang(30005), "latest", ''),
    (control.lang(30006), "popular", ''),
    (control.lang(30007), "random", ''),
    (control.lang(30008), "search_history", ''),
    (control.lang(30009), "settings", ''),
]

_FLAVOR = control.getSetting('baseflavor')
_BROWSER = WonderfulSubsBrowser(_FLAVOR)


def _add_last_watched():
Ejemplo n.º 30
0
from resources.lib.ui import control
from resources.lib.ui import utils
from resources.lib.ui.SourcesList import SourcesList
from resources.lib.ui.router import route, router_process
from resources.lib.NineAnimeBrowser import NineAnimeBrowser
import urlparse

AB_LIST = [".", "0"] + [chr(i) for i in range(ord("A"), ord("Z") + 1)]
MENU_ITEMS = [(control.lang(30000), "latest"), (control.lang(30001), "newest"),
              (control.lang(30002), "recent_subbed"),
              (control.lang(30003), "popular_subbed"),
              (control.lang(30004), "recent_dubbed"),
              (control.lang(30005), "popular_dubbed"),
              (control.lang(30006), "genres"), (control.lang(30007), "search"),
              (control.lang(30008), "settings")]
SERVER_CHOICES = {
    "serverg4": "Server G4",
    "serverrapid": "RapidVideo",
    "servermycloud": "MyCloud",
    "serveropenload": "OpenLoad",
}

_BROWSER = NineAnimeBrowser()
control.setContent('tvshows')


def isDirectoryStyle():
    style = control.getSetting('displaystyle')
    return "Directory" == style

Ejemplo n.º 31
0
from resources.lib.ui import control
from resources.lib.ui import player
from resources.lib.ui import utils
from resources.lib.ui import database
from resources.lib.ui.router import on_param, route, router_process
from resources.lib.KaitoBrowser import KaitoBrowser
from resources.lib.AniListBrowser import AniListBrowser
from resources.lib.WatchlistIntegration import set_browser, add_watchlist, watchlist_update
import ast

MENU_ITEMS = [
    (control.lang(30001), "anilist_airing", ''),
    (control.lang(30002), "airing_dub", ''),
    (control.lang(30003), "latest", ''),
    (control.lang(30004), "latest_dub", ''),
    (control.lang(30005), "anilist_trending", ''),
    (control.lang(30006), "anilist_popular", ''),
    (control.lang(30007), "anilist_upcoming", ''),
    (control.lang(30008), 'anilist_all_time_popular', ''),
    (control.lang(30009), "anilist_genres", ''),
    (control.lang(30010), "search_history", ''),
    (control.lang(30011), "tools", ''),
]

_TITLE_LANG = control.getSetting("titlelanguage")

_BROWSER = KaitoBrowser()

_ANILIST_BROWSER = AniListBrowser(_TITLE_LANG)

Ejemplo n.º 32
0
def WIPE_ADDON_DATA(payload, params):
    dialog = control.yesno_dialog(control.lang(30010), control.lang(30025))
    return control.clear_settings(dialog)
Ejemplo n.º 33
0
def genre_dialog(genre_display_list):
    return control.multiselect_dialog(control.lang(30004), genre_display_list)
Ejemplo n.º 34
0
from resources.lib.ui import control
from resources.lib.ui import utils
from resources.lib.ui.SourcesList import SourcesList
from resources.lib.ui.router import on_param, route, router_process
from resources.lib.NineAnimeBrowser import NineAnimeBrowser
import urlparse

AB_LIST = [".", "0"] + [chr(i) for i in range(ord("A"), ord("Z")+1)]
MENU_ITEMS = [
    (control.lang(30009), "watchlist", True),
    (control.lang(30000), "latest", False),
    (control.lang(30001), "newest", False),
    (control.lang(30002), "recent_subbed", False),
    (control.lang(30003), "popular_subbed", False),
    (control.lang(30004), "recent_dubbed", False),
    (control.lang(30005), "popular_dubbed", False),
    (control.lang(30006), "genres", False),
    (control.lang(30007), "search_history", False),
    (control.lang(30008), "settings", False),
    (control.lang(30010), "logout", True),
]
SERVER_CHOICES = {
    "serverstreamango": "Streamango",
    "serverrapid": "RapidVideo",
    "servermycloud": "MyCloud",
    "serveropenload": "OpenLoad",
}

WATCHLIST_ITEMS = [
    (control.lang(30300), "watchlist_all"),
    (control.lang(30301), "watchlist_watching"),