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
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
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')
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()
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)
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()