def login(**kwargs):
    username = gui.input(_.ASK_USERNAME, default=userdata.get('username', '')).strip()
    if not username:
        return

    userdata.set('username', username)

    password = gui.input(_.ASK_PASSWORD, hide_input=True).strip()
    if not password:
        return

    api.login(username=username, password=password)
    gui.refresh()
def search(query=None, page=1, **kwargs):
    page = int(page)

    if not query:
        query = gui.input(_.SEARCH, default=userdata.get('search', '')).strip()
        if not query:
            return
        userdata.set('search', query)

    data = api.filter_media('keyword', query, page=page)
    total_pages = int(data['paginator']['total_pages'])

    folder = plugin.Folder(title=_(_.SEARCH_FOR, query=query, page=page, total_pages=total_pages))

    for row in data['data']:
        item = _process_media(row)
        folder.add_items([item])

    if total_pages > page:
        folder.add_item(
            label = _(_.NEXT_PAGE, next_page=page+1),
            path  = plugin.url_for(search, query=query, page=page+1),
        )

    return folder
def get_tvg_id(channel):
    epg_channels = load_epg_channels()

    channel_epgs = []
    for row in Channels().channel_list():
        tvg_id = row.get('tvg-id')
        if tvg_id:
            channel_epgs.append(tvg_id)

    tvg_id = channel.get('tvg-id', '')
    name = channel.get('_name').lower().strip()
    best_match = None
    values = []
    labels = []

    for key in sorted(epg_channels.keys()):
        values.append(key)
        names = ' / '.join(epg_channels[key]).strip()
        label = _(_.EPG_ID_LABEL, epg_id=key, names=names)

        if key == tvg_id:
            label = _(_.CURRENT_EPG, label=label)
        elif key in channel_epgs:
            label = _(_.ASSIGNED_EPG, label=label)

        labels.append(label)

        for value in epg_channels[key]:
            ratio = SequenceMatcher(None, name,
                                    value.lower().strip()).quick_ratio()
            if not best_match or ratio > best_match[0]:
                best_match = [ratio, key]

    labels.append(_.CUSTOM_EPG)
    values.append(None)

    if best_match and best_match[1] != tvg_id:
        index = values.index(best_match[1])
        labels[index] = _(_.BEST_MATCH_EPG, label=labels[index])

    if tvg_id:
        try:
            default = values.index(tvg_id)
        except:
            default = len(values) - 1
    else:
        if best_match:
            default = values.index(best_match[1])
        else:
            default = 0

    index = gui.select(_.SET_CHANNEL_ID, labels, preselect=default)
    if index < 0:
        return None

    value = values[index]
    if value == None:
        value = gui.input(_.CUSTOM_EPG, default=tvg_id)

    return value
Пример #4
0
def login():
    username = gui.input(_.ASK_USERNAME, default=userdata.get('username',
                                                              '')).strip()
    if not username:
        return

    userdata.set('username', username)

    password = gui.input(_.ASK_PASSWORD).strip()
    if not password:
        return

    api.login(username=username, password=password)

    _select_profile()

    gui.refresh()
    def wizard(self):
        types = [self.TYPE_REMOTE, self.TYPE_LOCAL, self.TYPE_ADDON]
        options = [_.REMOTE_PATH, _.LOCAL_PATH, _.ADDON_SOURCE]
        default = self.path_type or self.TYPE_REMOTE

        index = gui.select(_.CHOOSE, options, preselect=types.index(default))
        if index < 0:
            return False

        self.path_type = types[index]

        if self.path_type == self.TYPE_ADDON:
            addons = self._get_merge_addons()
            if not addons:
                raise Error(_.NO_ADDONS)

            ids = [x['id'] for x in addons]
            options = [x['name'] for x in addons]

            try:
                default = ids.index(self.path)
            except ValueError:
                default = 0

            index = gui.select(_.CHOOSE, options, preselect=default)
            if index < 0:
                return False

            self.path = ids[index]
            self.file_type = self.FILE_STANDARD

            return True

        elif self.path_type == self.TYPE_REMOTE:
            self.path = gui.input(_.URL, default=self.path)
        elif self.path_type == self.TYPE_LOCAL:
            self.path = xbmcgui.Dialog().browseSingle(1, _.BROWSE_FILE,
                                                      self.path or '', '')

        if not self.path:
            return False

        types = [self.FILE_STANDARD, self.FILE_GZIP]
        options = [_.STANDARD_FILE, _.GZIPPED_FILE]
        default = self.file_type or (self.FILE_GZIP if self.path.endswith(
            '.gz') else self.FILE_STANDARD)

        index = gui.select(_.CHOOSE, options, preselect=types.index(default))
        if index < 0:
            return False

        self.file_type = types[index]

        return True
Пример #6
0
def login():
    while not api.logged_in:
        username = gui.input(_(L_ASK_USERNAME), default=userdata.get('username', '')).strip()
        if not username:
            break

        userdata.set('username', username)

        password = gui.input(_(L_ASK_PASSWORD), default=cache.get('password', '')).strip()
        if not password:
            break

        cache.set('password', password, expires=60)

        if api.login(username=username, password=password):
            gui.refresh()
        else:
            gui.ok(_(L_LOGIN_ERROR))

    cache.delete('password')
Пример #7
0
def dns4me_login(**kwargs):
    username = gui.input('dns4me Username').strip()
    if not username:
        return

    password = gui.input('dns4me Password', hide_input=True).strip()
    if not password:
        return

    data = Session().post('https://dns4me.net/api/v2/get_apikey',
                          data={
                              'username': username,
                              'password': password
                          }).json()
    if 'apikey' in data:
        userdata.set('dns4me_key', data['apikey'])
    else:
        plugin.exception('Failed to login')

    gui.refresh()
def edit_channel(id, key, **kwargs):
    channels = Channels()
    channel = channels.get(id)

    if key == '_hidden':
        value = not channel['_hidden']
    elif key == '_name':
        default = channel['_name']
        value = gui.input(_.RENAME_CHANNEL, default=default)
        if not value or value == default:
            return
    elif key == 'tvg-chno':
        default = channel.get('tvg-chno', '')
        value = gui.numeric(_.SET_CHANNEL_NUMBER, default=default)
        if not value or value == default:
            return
        value = int(value)
    elif key == 'tvg-logo':
        default = channel.get('tvg-logo', '')
        value = gui.input(_.SET_CHANNEL_LOGO, default=default)
        if not value or value == default:
            return
    elif key == 'group-title':
        default = channel.get('group-title', '')
        value = gui.input(_.SET_CHANNEL_GROUP, default=default)
        if not value or value == default:
            return
    elif key == 'tvg-id':
        value = get_tvg_id(channel)
        if not value:
            return
    else:
        return

    channels.set_override(id, key, value)
    gui.refresh()
Пример #9
0
def search():
    query = gui.input(_(L_SEARCH), default=userdata.get('search', '')).strip()
    if not query:
        return

    userdata.set('search', query)

    @cache.cached(LIST_EXPIRY)
    def get_results(query):
        folder = plugin.Folder(title=_(L_SEARCH_FOR, query=query))
        rows = api.search(query)
        folder.add_items(_parse_rows(rows))

        if not folder.items:
            folder.add_item(
                label     = _(L_NO_RESULTS, label=True),
                is_folder = False,
            )

        return folder

    return get_results(query)
Пример #10
0
def search(query=None, start=0, **kwargs):
    start = int(start)

    if not query:
        query = gui.input(_.SEARCH, default=userdata.get('search', '')).strip()
        if not query:
            return

        userdata.set('search', query)

    folder = plugin.Folder(title=_(_.SEARCH_FOR, query=query))

    data = api.content(text=query, start=start)
    items = _process_content(data['data'])
    folder.add_items(items)

    if items and data['index'] < data['available']:
        folder.add_item(
            label = _(_.NEXT_PAGE, _bold=True),
            path  = plugin.url_for(search, query=query, start=data['index']),
        )

    return folder
def add_channel(sort=None, **kwargs):
    url = gui.input(_.CHANNEL_PATH)
    if url:
        channels = Channels()
        channels.add(url, is_radio=sort == 'radio')
        gui.refresh()