Esempio n. 1
0
    def listSubtitlesProviders(self):
        printDBG("IPTVSubDownloaderWidget.listSubtitlesProviders")
        subProvidersList = []
        napisy24pl = {'title': _("Napisy24.pl"), 'sub_provider': 'napisy24pl'}
        openSubtitles = {
            'title': _("OpenSubtitles.org"),
            'sub_provider': 'opensubtitlesorg'
        }
        napiprojektpl = {
            'title': _("Napiprojekt.pl"),
            'sub_provider': 'napiprojektpl'
        }
        titlovi = {'title': _("Titlovi.com"), 'sub_provider': 'titlovicom'}
        subscene = {'title': _("Subscene.com"), 'sub_provider': 'subscenecom'}
        youtube = {'title': _("Youtube.com"), 'sub_provider': 'youtubecom'}

        if 'youtube_id' in self.params['url_params'] and '' != self.params[
                'url_params']['youtube_id']:
            subProvidersList.append(youtube)
        if 'pl' == GetDefaultLang():
            subProvidersList.append(napisy24pl)
            if IsSubtitlesParserExtensionCanBeUsed():
                subProvidersList.append(napiprojektpl)
        subProvidersList.append(openSubtitles)
        subProvidersList.append(titlovi)
        subProvidersList.append(subscene)
        if 'pl' != GetDefaultLang():
            subProvidersList.append(napisy24pl)
            if IsSubtitlesParserExtensionCanBeUsed():
                subProvidersList.append(napiprojektpl)

        self.currList = []
        for item in subProvidersList:
            params = CDisplayListItem(item['title'], item.get('desc', ''),
                                      CDisplayListItem.TYPE_SUB_PROVIDER)
            params.privateData = {'sub_provider': item['sub_provider']}
            self.currList.append(params)

        idx = 0
        selIndex = 0
        for idx in range(len(self.currList)):
            if self.hostName == self.currList[idx].privateData['sub_provider']:
                selIndex = idx
                break

        self["list"].setList([(x, ) for x in self.currList])
        #restor previus selection
        if len(self.currList) > selIndex:
            self["list"].moveToIndex(selIndex)
        self.changeBottomPanel()
        self["headertext"].setText(self.getCategoryPath())
        self["statustext"].setText("")
        self["list"].show()
Esempio n. 2
0
 def listMainMenu(self, cItem, nextCategory):
     printDBG("ArteTV.listMainMenu")
     
     lang = GetDefaultLang()
     url = self.getMainUrl()
     if lang in ['en','fr','de','es','pl']:
         url += lang
     
     sts, data = self.getPage(url)
     if not sts: return
     
     data = self.cm.ph.getAllItemsBeetwenNodes(data, ('<a', '>', 'next-language'), ('</a', '>'))
     for item in data:
         url = self.getFullUrl(self.cm.ph.getSearchGroups(item, '''\shref=['"]([^'^"]+?)['"]''')[0])
         title = self.cleanHtmlStr(item)
         lang = url.split('/')[3]
         printDBG("+++> lang[%s] title[%s]" % (lang, title))
         params = dict(cItem)
         params.update({'good_for_fav':False, 'category':nextCategory, 'title':title, 'url':url, 'f_lang':lang})
         self.addDir(params)
         
     MAIN_CAT_TAB = [{'category':'search',         'title': _('Search'),          'search_item':True}, 
                     {'category':'search_history', 'title': _('Search history')},]
     
     self.listsTab(MAIN_CAT_TAB, cItem)
Esempio n. 3
0
    def _get_subtitles(self, video_id):
        sub_tracks = []
        try:
            url = 'https://www.youtube.com/api/timedtext?hl=%s&type=list&v=%s' % (GetDefaultLang(), video_id)
            sts, data = self.cm.getPage(url)
            if not sts: return sub_tracks
            
            encoding = self.cm.ph.getDataBeetwenMarkers(data, 'encoding="', '"', False)[1]
            
            def getArg(item, name):
                val = self.cm.ph.getDataBeetwenMarkers(item, '%s="' % name, '"', False)[1]
                return val.decode(encoding).encode(encoding)
            
            data = data.split('/>')
            for item in data:
                if 'lang_code' not in item: continue
                id = getArg(item, 'id')
                name = getArg(item, 'name')
                lang_code = getArg(item, 'lang_code')
                lang_original = getArg(item, 'lang_original')
                lang_translated = getArg(item, 'lang_translated')

                title = (name + ' ' + lang_translated).strip()
                params = {'lang':lang_code, 'v':video_id, 'fmt':'vtt', 'name':name}
                url = 'https://www.youtube.com/api/timedtext?' + urllib.urlencode(params)
                sub_tracks.append({'title':title, 'url':url, 'lang':lang_code, 'ytid':id, 'format':'vtt'})
        except Exception:
            printExc()
        printDBG(sub_tracks)
        return sub_tracks
Esempio n. 4
0
 def getMainUrl(self):
     lang = GetDefaultLang()
     if lang not in self.LANGUAGE_CACHE:
         lang = 'en'
     if lang == 'rs':
         return 'http://titlovi.com/'
     return 'http://%s.titlovi.com/' % lang
Esempio n. 5
0
 def getLocale(self):
     locale = config.plugins.iptvplayer.dailymotion_localization.value
     if 'auto' != locale:
         return locale
     all = [('ar_AA', 'العربية'), ('es_AR', 'Argentina'),
            ('en_AU', 'Australia'), ('de_AT', 'Österreich'),
            ('nl_BE', 'België'), ('fr_BE', 'Belgique'), ('pt_BR', 'Brasil'),
            ('en_CA', 'Canada'), ('fr_CA', 'Canada'), ('zh_CN', '中国'),
            ('fr_FR', 'France'), ('de_DE', 'Deutschland'),
            ('el_GR', 'Ελλάδα'), ('en_IN', 'India'), ('id_ID', 'Indonesia'),
            ('en_EN', 'International'), ('en_IE', 'Ireland'),
            ('it_IT', 'Italia'), ('ja_JP', '日本'), ('ms_MY', 'Malaysia'),
            ('es_MX', 'México'), ('fr_MA', 'Maroc'), ('nl_NL', 'Nederland'),
            ('en_PK', 'Pakistan'), ('en_PH', 'Pilipinas'),
            ('pl_PL', 'Polska'), ('pt_PT', 'Portugal'), ('ro_RO',
                                                         'România'),
            ('ru_RU', 'Россия'), ('en_SG', 'Singapore'), ('ko_KR', '대한민국'),
            ('es_ES', 'España'), ('fr_CH', 'Suisse'), ('it_CH', 'Svizzera'),
            ('de_CH', 'Schweiz'), ('fr_TN', 'Tunisie'),
            ('tr_TR', 'Türkiye'), ('en_GB', 'United Kingdom'),
            ('en_US', 'United States'), ('vi_VN', 'Việt Nam')]
     tmp = GetDefaultLang(True)
     printDBG('GetDefaultLang [%s]' % tmp)
     for item in all:
         if item[0] == tmp:
             locale = tmp
             break
     if 'auto' == locale:
         locale = 'en_EN'
     return locale
Esempio n. 6
0
    def _getLanguages(self):
        defLang = GetDefaultLang()

        def _isDefaultLanguage(langName):
            tab = GetLanguageTab()
            for item in tab:
                if item[1] != defLang:
                    continue
                if item[0] in langName:
                    return True

        url = self.getFullUrl('/filter/edit')
        sts, data = self.cm.getPage(url, self.defaultParams)
        if not sts: return []

        list = []
        defaultLanguages = []
        data = self.cm.ph.getDataBeetwenMarkers(data, '<label class="h5">',
                                                '<button type="submit">',
                                                False)[1]
        data = self.cm.ph.getAllItemsBeetwenMarkers(data, '<label>',
                                                    '</label>')
        for item in data:
            langId = self.cm.ph.getSearchGroups(item, 'value="([0-9]+?)"')[0]
            if '' == langId: continue
            title = self.cleanHtmlStr(item)
            params = {'title': title, 'lang_id': langId}
            if _isDefaultLanguage(title):
                defaultLanguages.append(params)
            else:
                list.append(params)
        defaultLanguages.extend(list)
        return defaultLanguages
Esempio n. 7
0
    def listTalksLanguages(self, cItem, nextCategory):
        printDBG("TED.listTalksLanguages")
        if 0 == len(self.cacheTalksLanguages):
            httpParams = dict(self.defaultAjaxParams)
            httpParams['header']['Referer'] = cItem['url']

            sts, data = self.getPage(cItem['f_url'], httpParams)
            if not sts:
                return
            try:
                userLang = GetDefaultLang()
                promotItem = None
                data = json_loads(data)
                for item in data:
                    params = {
                        'title': item['label'],
                        'f_language': item['value']
                    }
                    if item['value'] == userLang:
                        promotItem = params
                    else:
                        self.cacheTalksLanguages.append(params)
                if promotItem != None:
                    self.cacheTalksLanguages.insert(0, promotItem)
            except Exception:
                printExc()

        params = dict(cItem)
        params.update({
            'category': nextCategory,
            'f_idx': cItem.get('f_idx', 0) + 1
        })
        self.listsTab(self.cacheTalksLanguages, params)
 def getLanguages(self, cItem, nextCategory):
     printDBG("OpenSubOrgProvider.getEpisodes")
     lang = GetDefaultLang()
     tmpList = []
     
     defaultLanguageItem = None
     engLanguageItem = None
     for item in self.languages:
         params = {'title':'{0} [{1}]'.format(_(item['name']), item['id']), 'search_lang':item['id']}
         if lang ==  item['iso']:
             defaultLanguageItem = params
         elif 'en' ==  item['iso']:
             engLanguageItem = params
         else:
             tmpList.append(params)
     
     if None != engLanguageItem:
         tmpList.insert(0, engLanguageItem)
     
     if None != defaultLanguageItem:
         tmpList.insert(0, defaultLanguageItem)
         
     #tmpList.insert(0, {'title':_('All'), 'search_lang':''})
     
     for item in tmpList:
         params = dict(cItem)
         params.update(item)
         params.update({'category':nextCategory})
         self.addDir(params)
Esempio n. 9
0
    def _getLanguages(self):
        lang = GetDefaultLang()
        subParams = [{'name': 'sublanguageid', 'value': lang}]
        params = [self.loginToken, self._getArraryParam(subParams)]

        sts, data = self._rpcMethodCall("GetSubLanguages", params)
        printDBG(">>>>>>>>>>>>>>>>>>>>>>>>>>>>> data[%s]" % data)
        if sts:
            try:
                list = []
                defaultLanguageItem = None
                for item in data:
                    if 'LanguageName' in item and 'SubLanguageID' in item and 'ISO639' in item:
                        params = {
                            'title':
                            '{0} [{1}]'.format(item['LanguageName'],
                                               item['SubLanguageID']),
                            'lang':
                            item['SubLanguageID']
                        }
                        if lang != item['ISO639']:
                            list.append(params)
                        else:
                            defaultLanguageItem = params
                if None != defaultLanguageItem:
                    list.insert(0, defaultLanguageItem)
                return list
            except Exception:
                printExc()
        SetIPTVPlayerLastHostError(_('Get languages failed!'))
        return []
Esempio n. 10
0
 def getMainUrl(self):
     lang = GetDefaultLang()
     if lang in self.LANGUAGE_CACHE:
         self.pageLang = lang
     if self.pageLang == 'hr':
         return 'https://titlovi.com/'
     return 'https://%s.titlovi.com/' % self.pageLang
Esempio n. 11
0
 def getMainUrl(self):
     lang = config.plugins.iptvplayer.ddlme_lang.value
     if lang == '':
         lang = GetDefaultLang()
     if lang not in ['en', 'de']:
         lang = 'en'
     return 'http://%s.ddl.me/' % lang
Esempio n. 12
0
 def converFileToUtf8(self, inFile, outFile, lang=''):
     printDBG('CBaseSubProviderClass.converFileToUtf8 inFile[%s] outFile[%s]' % (inFile, outFile))
     # detect encoding
     encoding = ''
     cmd = '%s "%s"' % (GetUchardetPath(), inFile)
     ret = self.iptv_execute(cmd)
     if ret['sts'] and 0 == ret['code']:
         encoding = MapUcharEncoding(ret['data'])
         if 0 != ret['code'] or 'unknown' in encoding:
             encoding = ''
         else: encoding = encoding.strip()
     
     if lang == '':
         lang = GetDefaultLang() 
     
     if lang == 'pl' and encoding == 'iso-8859-2':
         encoding = GetPolishSubEncoding(tmpFile)
     elif '' == encoding:
         encoding = 'utf-8'
         
     # convert file to UTF-8
     try:
         with open(inFile) as f:
             data = f.read()
         try:
             data = data.decode(encoding).encode('UTF-8')
             if self.writeFile(outFile, data):
                 return True
         except Exception:
             printExc()
             SetIPTVPlayerLastHostError(_('Failed to convert the file "%s" to UTF-8.') % inFile)
     except Exception:
         printExc()
         SetIPTVPlayerLastHostError(_('Failed to open the file "%s".') % inFile)
     return False
Esempio n. 13
0
 def doSearchMovie(self, callback, title):
     self.outerCallback = callback
     self.tmpData = {'title':title, 'list':[]}
     if GetDefaultLang() == 'pl':
         self._doSearchMovieNapisy24()
     else:
         self._RealDoSearchMovie()
Esempio n. 14
0
    def __init__(self):
        CBaseHostClass.__init__(self, {'history':'Twitch', 'cookie':'Twitch.cookie'})

        self.HTTP_HEADER = self.cm.getDefaultHeader(browser='chrome')
        self.defaultParams = {'header':self.HTTP_HEADER}#, 'use_cookie': True, 'load_cookie': True, 'save_cookie': True, 'cookiefile': self.COOKIE_FILE}

        self.DEFAULT_ICON_URL = 'http://s.jtvnw.net/jtv_user_pictures/hosted_images/GlitchIcon_WhiteonPurple.png'
        self.MAIN_URL = 'https://www.twitch.tv/'
        self.API1_URL = 'https://api.twitch.tv/'
        self.API2_URL = 'https://gql.twitch.tv/'
        
        self.CHANNEL_TOKEN_URL = self.getFullUrl('/api/channels/%s/access_token')
        self.LIVE_URL = 'http://usher.justin.tv/api/channel/hls/%s.m3u8?token=%s&sig=%s&allow_source=true'
        self.CHANNEL_TOKEN_URL = self.API1_URL + 'api/channels/%s/access_token?need_https=false&oauth_token&platform=web&player_backend=mediaplayer&player_type=site'
        
        self.VOD_TOKEN_URL = self.API1_URL + 'api/vods/%s/access_token?need_https=true&oauth_token&platform=web&player_backend=mediaplayer&player_type=site'
        self.VOD_URL = 'https://usher.ttvnw.net/vod/%s.m3u8?token=%s&sig=%s&allow_source=true'

        self.platformFilters = [{'title':_('All Platforms'), 'platform_type':'all'}, {'title':_('Xbox One'), 'platform_type':'xbox'}, {'title':_('PlayStation 4'), 'platform_type':'ps4'}]
        self.languagesFilters = [{'lang':"ar",'title':"العربية"},{'lang':"bg",'title':"Български"},{'lang':"cs",'title':"Čeština"},{'lang':"da",'title':"Dansk"},{'lang':"de",'title':"Deutsch"},{'lang':"el",'title':"Ελληνικά"},{'lang':"en",'title':"English"},{'lang':"es",'title':"Español"},{'lang':"fi",'title':"Suomi"},{'lang':"fr",'title':"Français"},{'lang':"hu",'title':"Magyar"},{'lang':"it",'title':"Italiano"},{'lang':"ja",'title':"日本語"},{'lang':"ko",'title':"한국어"},{'lang':"nl",'title':"Nederlands"},{'lang':"no",'title':"Norsk"},{'lang':"pl",'title':"Polski"},{'lang':"pt",'title':"Português"},{'lang':"ro",'title':"Română"},{'lang':"ru",'title':"Русский"},{'lang':"sk",'title':"Slovenčina"},{'lang':"sv",'title':"Svenska"},{'lang':"th",'title':"ภาษาไทย"},{'lang':"tr",'title':"Türkçe"},{'lang':"vi",'title':"TiếngViệt"},{'lang':"zh-hk",'title':"中文(粵語)"},{'lang':"zh",'title':"中文"},{'lang':'asl', 'title':'American Sign Language'},{'lang':'other', 'title':'Other'}]

        lang = GetDefaultLang()
        default = None
        defaultEn = None
        self.langItems = []
        for item in self.languagesFilters:
            if lang == item['lang']:
                default = item
                continue
            if 'en' == item['lang']:
                defaultEn = item
                continue
            self.langItems.append(item)
        if defaultEn: self.langItems.insert(0, defaultEn)
        if default: self.langItems.insert(0, default)
        self.langItems.insert(0, {'title':_('All')})
        
        
        self.VIDEOS_TYPES_TAB = [{'title':_('All')}, 
                                 {'title':_('Past premieres'), 'videos_type':'PAST_PREMIERE'},
                                 {'title':_('Archive'),        'videos_type':'ARCHIVE'      },
                                 {'title':_('Highlights'),     'videos_type':'HIGHLIGHT'    },
                                 {'title':_('Uploads'),        'videos_type':'UPLOAD'       },]
 
        self.VIDEOS_SORT_TAB = [{'title':_('Popular'), 'sort':'VIEWS' },
                                {'title':_('Recent'),  'sort':'TIME'  },]

        self.CLIPS_FILTERS_TAB = [{'title':_('Trending'),         'clips_filter':'TRENDING'   },
                                  {'title':_('Last day'),         'clips_filter':'LAST_DAY'   },
                                  {'title':_('Last week'),        'clips_filter':'LAST_WEEK'  },
                                  {'title':_('Last month'),       'clips_filter':'LAST_MONTH' },
                                  {'title':_('All time'),         'clips_filter':'ALL_TIME'   },]
                                  
        self.GAME_CAT_TAB = [{'category':'game_lang', 'next_category':'game_channels',      'title': _('Channels')},
                             {'category':'game_lang', 'next_category':'game_videos_types',  'title': _('Videos') },
                             {'category':'game_lang', 'next_category':'game_clips_filters', 'title': _('Clips') },
                            ]
Esempio n. 15
0
 def getArticleContent(self, cItem):
     printDBG("CineTO.getArticleContent [%s]" % cItem)
     retTab = []
     
     otherInfo = {}
     
     url = self.getFullUrl('/request/entry')
     post_data = 'ID=%s' % cItem['imdb']
     
     sts, data = self.getPage(url, post_data=post_data)
     if not sts: return []
     
     title = ''
     desc = ''
     icon = ''
     
     try:
         data = json_loads(data, noneReplacement='', baseTypesAsString=True)['entry']
         icon = self.getFullIconUrl(data.get('cover', cItem.get('icon', '')))
         title = self.cleanHtmlStr(data['title'])
         
         lang = cItem.get('f_lang', '')
         if lang == '': 
             # move better language at top
             langKeys = list(data['lang'].keys())
             defLang = GetDefaultLang()
             if defLang not in langKeys: defLang = 'en'
             if defLang in langKeys: lang = defLang
             else: lang = langKeys[0]
         
         desc = self.cleanHtmlStr(data.get('plot_'+lang, ''))
         
         tmp = data.get('year', '')
         if tmp != '': otherInfo['year'] = tmp
         
         tmp = data.get('date', '')
         if tmp != '': otherInfo['released'] = tmp
         
         tmp = data.get('duration', '')
         if tmp != '': otherInfo['duration'] = tmp + ' min.'
         
         for item in [('genres', 'genres'), ('producer', 'producers'), ('director', 'directors'), ('actor', 'actors')]:
             tmp = ', '.join(data.get(item[0], []))
             if tmp != '': otherInfo[item[1]] = tmp
         
         tmp = data['rating']
         if tmp != '': otherInfo['imdb_rating'] = '%s/10' % (data['rating'])
         
     except Exception:
         printExc()
         
     if title == '': title = cItem['title']
     if desc == '':  desc = cItem.get('desc', '')
     if icon == '':  icon = cItem.get('icon', self.DEFAULT_ICON_URL)
     
     return [{'title':self.cleanHtmlStr( title ), 'text': self.cleanHtmlStr( desc ), 'images':[{'title':'', 'url':self.getFullUrl(icon)}], 'other_info':otherInfo}]
Esempio n. 16
0
 def getSearchTypes(self):
     searchTypesOptions = []
     searchTypesOptions.append(('English  ( EN )', "en"))
     searchTypesOptions.append(('Français ( FR )', "fr"))
     searchTypesOptions.append(('Deutsch  ( DE )', "de"))
     searchTypesOptions.append(('Español  ( ES )', "es"))
     searchTypesOptions.append(('Polski   ( PL )', "pl"))
     lang = GetDefaultLang()
     searchTypesOptions.sort(key=lambda x: -2 if x[1] == lang else 0)
     return searchTypesOptions
Esempio n. 17
0
    def onWindowShow(self):
        self.onShown.remove(self.onWindowShow)
        self.setTitle(_('Virtual Keyboard'))
        self["header"].setText(self.header)

        # Left list
        self['left_list'].setSelectionState(False)
        self['left_header'].hide()
        self['left_list'].hide()
        self.showSearchHistory()

        # Right list
        if self.autocomplete:
            self['right_header'].setText(self.autocomplete.getProviderName())
            self['right_list'].setSelectionState(False)
            self['right_header'].hide()
            self['right_list'].hide()

        vkLayoutId = self.vkRequestedId if self.vkRequestedId else self.selectedVKLayoutId
        if vkLayoutId == '':
            e2Locale = GetDefaultLang(True)
            langMap = {'pl_PL': '00000415', 'en_EN': '00020409'}
            vkLayoutId = langMap.get(e2Locale, '')

            if vkLayoutId == '':
                for item in self.ALL_VK_LAYOUTS:
                    if e2Locale == item[1]:
                        vkLayoutId = item[2]
                        break

            if vkLayoutId == '':
                e2lang = GetDefaultLang() + '_'
                for item in self.ALL_VK_LAYOUTS:
                    if item[1].startswith(e2lang):
                        vkLayoutId = item[2]
                        break

        if not self.getKeyboardLayoutItem(vkLayoutId):
            vkLayoutId = self.DEFAULT_VK_LAYOUT['id']

        self.loadKeyboardLayout(vkLayoutId)
        self.isAutocompleteEnabled = self.autocomplete != None
        self.setText(self.startText)
Esempio n. 18
0
    def tryTologin(self):
        printDBG('tryTologin start')
        connFailed = _('Connection to server failed!')

        sts, data = self.getPage(self.getMainUrl())
        if not sts:
            return False, connFailed

        if 'logout.php' in data:
            return True, 'OK'

        login = config.plugins.iptvplayer.mrpiracy_login.value
        passwd = config.plugins.iptvplayer.mrpiracy_password.value

        post_data = {
            'email': login,
            'password': passwd,
            'lembrar_senha': 'lembrar'
        }

        sitekey = self.cm.ph.getSearchGroups(data, 'fallback\?k=([^"]+?)"')[0]
        if sitekey != '':
            recaptcha = UnCaptchaReCaptcha_fallback(lang=GetDefaultLang())
            recaptcha.HTTP_HEADER['Referer'] = self.getMainUrl()
            recaptcha.HTTP_HEADER['User-Agent'] = self.USER_AGENT
            token = recaptcha.processCaptcha(sitekey)
            if token == '':
                return False, 'NOT OK'
            post_data.update({
                'g-recaptcha-response': token,
                'g-recaptcha-response2': token,
                'url': '/'
            })

        data = self.cm.ph.getDataBeetwenMarkers(data, '<form', '</form>',
                                                False)[1]
        url = self.getFullUrl(
            self.cm.ph.getSearchGroups(data,
                                       '''action=['"]([^'^"]+?)['"]''')[0])

        params = dict(self.defaultParams)
        params['header'] = dict(self.HEADER)
        params['header']['Referer'] = self.getMainUrl()

        # login
        sts, data = self.cm.getPage(url, params, post_data)
        if not sts:
            return False, connFailed

        if 'logout.php' in data:
            return True, 'OK'
        else:
            return False, 'NOT OK'
Esempio n. 19
0
    def listChannelCategories(self, cItem, category):
        printDBG("Twitch.listChannelCategories")

        params = dict(cItem)
        params.update({
            'category':
            category,
            'title':
            _('Random'),
            'url':
            self.MAIN_URL +
            'kraken/beta/streams/random?offset=0&on_site=1&limit=' +
            self.NUM_OF_ITEMS
        })
        self.addDir(params)

        baseChannelUrl = self.MAIN_URL + 'kraken/streams?offset=0&broadcaster_language=%s&sce_platform=%s&on_site=1&limit=' + self.NUM_OF_ITEMS
        tmpTab = [(_('Top'), '', '')]

        userLang = GetDefaultLang()
        promoteItem = None
        # list language
        sts, data = self.cm.getPage('https://www.twitch.tv/directory/all')
        if sts:
            data = self.cm.ph.getDataBeetwenMarkers(
                data, 'header_language_dropmenu', '</div>', False)[1]
            data = self.cm.ph.getAllItemsBeetwenMarkers(data,
                                                        '<li',
                                                        '</li>',
                                                        withMarkers=True,
                                                        caseSensitive=False)
            for item in data:
                title = self.cleanHtmlStr(item)
                lang = self.cm.ph.getDataBeetwenMarkers(
                    item, 'setByAsyncPut(', ')',
                    False)[1].replace('"', '').replace("'", '')
                if lang != '':
                    if lang != userLang:
                        tmpTab.append((title, lang, ''))
                    else:
                        promoteItem = (title, lang, '')

        if promoteItem != None:
            tmpTab.insert(1, promoteItem)

        for item in tmpTab:
            params = dict(cItem)
            params.update({
                'category': category,
                'title': item[0],
                'url': baseChannelUrl % (item[1], item[2])
            })
            self.addDir(params)
Esempio n. 20
0
 def getLocale(self):
     locale = config.plugins.iptvplayer.dailymotion_localization.value
     if 'auto' != locale:
         return locale
     all = [('ar_AA','العربية'), ('es_AR', 'Argentina'), ('en_AU', 'Australia'), ('de_AT', 'Österreich'), ('nl_BE', 'België'), ('fr_BE', 'Belgique'), ('pt_BR', 'Brasil'), ('en_CA', 'Canada'), ('fr_CA', 'Canada'), ('zh_CN', '中国'), ('fr_FR', 'France'), ('de_DE', 'Deutschland'), ('el_GR', 'Ελλάδα'), ('en_IN', 'India'), ('id_ID', 'Indonesia'), ('en_EN', 'International'), ('en_IE', 'Ireland'), ('it_IT', 'Italia'), ('ja_JP', '日本'), ('ms_MY', 'Malaysia'), ('es_MX', 'México'), ('fr_MA', 'Maroc'), ('nl_NL', 'Nederland'), ('en_PK', 'Pakistan'), ('en_PH', 'Pilipinas'), ('pl_PL', 'Polska'), ('pt_PT', 'Portugal'), ('ro_RO', 'România'), ('ru_RU', 'Россия'), ('en_SG', 'Singapore'), ('ko_KR', '대한민국'), ('es_ES', 'España'), ('fr_CH', 'Suisse'), ('it_CH', 'Svizzera'), ('de_CH', 'Schweiz'), ('fr_TN', 'Tunisie'), ('tr_TR', 'Türkiye'), ('en_GB', 'United Kingdom'), ('en_US', 'United States'), ('vi_VN', 'Việt Nam')]
     tmp = GetDefaultLang(True)
     printDBG('GetDefaultLang [%s]' % tmp)
     for item in all:
         if item[0] == tmp:
             locale = tmp
             break
     if 'auto' == locale:
         locale = 'en_EN'
     return locale
Esempio n. 21
0
 def getLocale(self):
     locale = config.plugins.iptvplayer.dailymotion_localization.value
     if 'auto' != locale:
         return locale
     all = [("ar_AA", "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9"), ("es_AR", "Argentina"), ("en_AU", "Australia"), ("de_AT", "\xc3\x96sterreich"), ("nl_BE", "Belgi\xc3\xab"), ("fr_BE", "Belgique"), ("pt_BR", "Brasil"), ("en_CA", "Canada"), ("fr_CA", "Canada"), ("zh_CN", "\xe4\xb8\xad\xe5\x9b\xbd"), ("fr_FR", "France"), ("de_DE", "Deutschland"), ("el_GR", "\xce\x95\xce\xbb\xce\xbb\xce\xac\xce\xb4\xce\xb1"), ("en_IN", "India"), ("id_ID", "Indonesia"), ("en_EN", "International"), ("en_IE", "Ireland"), ("it_IT", "Italia"), ("ja_JP", "\xe6\x97\xa5\xe6\x9c\xac"), ("ms_MY", "Malaysia"), ("es_MX", "M\xc3\xa9xico"), ("fr_MA", "Maroc"), ("nl_NL", "Nederland"), ("en_PK", "Pakistan"), ("en_PH", "Pilipinas"), ("pl_PL", "Polska"), ("pt_PT", "Portugal"), ("ro_RO", "Rom\xc3\xa2nia"), ("ru_RU", "\xd0\xa0\xd0\xbe\xd1\x81\xd1\x81\xd0\xb8\xd1\x8f"), ("en_SG", "Singapore"), ("ko_KR", "\xeb\x8c\x80\xed\x95\x9c\xeb\xaf\xbc\xea\xb5\xad"), ("es_ES", "Espa\xc3\xb1a"), ("fr_CH", "Suisse"), ("it_CH", "Svizzera"), ("de_CH", "Schweiz"), ("fr_TN", "Tunisie"), ("tr_TR", "T\xc3\xbcrkiye"), ("en_GB", "United Kingdom"), ("en_US", "United States"), ("vi_VN", "Vi\xe1\xbb\x87t Nam")]
     tmp = GetDefaultLang(True)
     printDBG("GetDefaultLang [%s]" % tmp)
     for item in all:
         if item[0] == tmp:
             locale = tmp
             break
     if 'auto' == locale:
         locale = 'en_EN'
     return locale
    def __init__(self, session, params={}):
        # params: movie_title, sub_list: [{'title':'', 'lang':'', 'url':''}]
        self.session = session
        Screen.__init__(self, session)

        self.params = params

        self.onShown.append(self.onStart)
        self.onClose.append(self.__onClose)

        self["title"] = Label(" ")
        self["console"] = Label(" ")

        self["label_red"] = Label(_("Cancel"))
        self["label_yellow"] = Label(_("Move group"))
        self["label_green"] = Label(_("Apply"))

        self["icon_red"] = Cover3()
        self["icon_green"] = Cover3()

        self["list"] = IPTVMainNavigatorList()
        self["list"].connectSelChanged(self.onSelectionChanged)

        self["actions"] = ActionMap(
            [
                "ColorActions", "SetupActions", "WizardActions",
                "ListboxActions"
            ], {
                "cancel": self.keyExit,
                "ok": self.keyOK,
                "red": self.keyRed,
                "green": self.keyGreen,
            }, -2)

        self.iconPixmap = {}
        for icon in ['red', 'green']:
            self.iconPixmap[icon] = LoadPixmap(GetIconDir(icon + '.png'))

        self.movieTitle = ''
        self.stackList = []
        self.stackItems = []

        self.defaultLanguage = GetDefaultLang()

        self.listMode = False
        self.downloadedSubFilePath = ""
        self.currItem = {}
        self.downloader = None
        self.cleanDownloader()
        self.workconsole = None
Esempio n. 23
0
    def __init__(self):
        CBaseHostClass.__init__(self, {
            'history': 'cine.to',
            'cookie': 'cine.to.cookie'
        })
        self.DEFAULT_ICON_URL = 'https://cine.to/opengraph.jpg'
        self.USER_AGENT = 'Mozilla / 5.0 (SMART-TV; Linux; Tizen 2.4.0) AppleWebkit / 538.1 (KHTML, podobnie jak Gecko) SamsungBrowser / 1.1 TV Safari / 538.1'
        self.MAIN_URL = 'https://cine.to/'
        self.HEADER = {
            'User-Agent': self.USER_AGENT,
            'DNT': '1',
            'Accept':
            'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate',
            'Referer': self.getMainUrl(),
            'Accept-Language': GetDefaultLang()
        }
        self.AJAX_HEADER = dict(self.HEADER)
        self.AJAX_HEADER.update({
            'X-Requested-With':
            'XMLHttpRequest',
            'Accept-Encoding':
            'gzip, deflate',
            'Content-Type':
            'application/x-www-form-urlencoded; charset=UTF-8',
            'Accept':
            'application/json, text/javascript, */*; q=0.01'
        })

        self.cacheFilters = {}
        self.cacheLinks = {}
        self.defaultParams = {
            'with_metadata': True,
            'header': self.HEADER,
            'raw_post_data': True,
            'use_cookie': True,
            'load_cookie': True,
            'save_cookie': True,
            'cookiefile': self.COOKIE_FILE
        }

        self.MAIN_CAT_TAB = [{
            'category': 'search',
            'title': _('Search'),
            'search_item': True,
        }, {
            'category': 'search_history',
            'title': _('Search history'),
        }]
Esempio n. 24
0
 def _doLogin(self, login, password):
     lang = GetDefaultLang()
     params = [login, hex_md5(password), lang, self.USER_AGENT]
     sts, data = self._rpcMethodCall("LogIn", params)
     if sts and (None == data or 0 == len(data)): sts = False 
     printDBG(">>>>>>>>>>>>>>>>>>>>>>>>>>>>> data[%s]" % data)
     if not sts:
         SetIPTVPlayerLastHostError(_('Login failed!'))
     elif ('' != login and self._checkStatus(data, 0)) or '' == login: 
         if 'token' in data[0]:
             self.loginToken = data[0]['token']
         else:
             SetIPTVPlayerLastHostError(_('Get token failed!') + '\n' + _('Error message: \"%s\".\nError code: \"%s\".') % (self.lastApiError['code'], self.lastApiError['message']) )
     else:
         SetIPTVPlayerLastHostError(_('Login failed!') + '\n' + _('Error message: \"%s\".\nError code: \"%s\".') % (self.lastApiError['code'], self.lastApiError['message']) )
Esempio n. 25
0
 def fillCacheFilters(self):
     printDBG("PodnapisiNetProvider.fillFiltersCache")
     self.cacheFilters = {}
     
     baseUrl = '/subtitles/search/advanced'
    
     sts, data = self.getPage(self.getFullUrl(baseUrl))
     if not sts: return
     
     data = self.cm.ph.getDataBeetwenNodes(data, ('<div', '>', 'advanced_search_panel'), ('</form', '>'))[1]
     for filter in [{'key':'movie_type',   'marker':'movie_type'},
                    {'key':'episode_type', 'marker':'episode_type'  },
                    {'key':'flags',        'marker':'flags'},
                    {'key':'fps',          'marker':'fps'},
                    {'key':'language',     'marker':'language'}]:
         self.cacheFilters[filter['key']] = []
         tmp = self.cm.ph.getDataBeetwenMarkers(data, filter['marker'], '</select>', False)[1]
         tmp = self.cm.ph.getAllItemsBeetwenMarkers(tmp, '<option', '</option>', withMarkers=True, caseSensitive=False)
         allItemAdded = False
         for item in tmp:
             value = self.cm.ph.getSearchGroups(item, '''value=["']?([^"^'^\s^>]+?)[\s"'>]''')[0].strip()
             self.cacheFilters[filter['key']].append({filter['key']:value, 'title':self.cleanHtmlStr(item)})
             if value == '': allItemAdded = True
         if not allItemAdded:
             self.cacheFilters[filter['key']].insert(0, {filter['key']:'', 'title':_('Any')})
             
     # prepare default values for filters
     season  = self.dInfo.get('season', None)
     episode = self.dInfo.get('episode', None)
     if season != None and episode != None: defaultType = 'tv-series'
     elif episode != None: defaultType = 'mini-series'
     else: defaultType = ''
     printDBG("season [%s] episode[%s]" % (episode, season))
     defaultLanguage = GetDefaultLang()
     
     # move default values to the begining of the list
     for defItem in [{'key':'language', 'val':defaultLanguage}, {'key':'movie_type', 'val':defaultType}]:
         newList = []
         promotedItem = None
         for item in self.cacheFilters[defItem['key']]:
             if None == promotedItem and defItem['val'] == item[defItem['key']]:
                 promotedItem = item
             else:
                 newList.append(item)
         if None != promotedItem:
             newList.insert(0, promotedItem)
             self.cacheFilters[defItem['key']] = newList
Esempio n. 26
0
 def processCaptcha(self, sitekey, refUrl, bypassCaptchaService=None, userAgent=None, baseErrMsgTab=None, beQuaiet=False):
     if isinstance(baseErrMsgTab, list):
         errorMsgTab = list(baseErrMsgTab)
     else:
         errorMsgTab = [_('Link protected with Google ReCaptcha v2')]
     
     if userAgent == None:
         try:
             userAgent = self.USER_AGENT
         except Exception:
             pass
     
     if userAgent == None:
         try:
             userAgent = self.defaultParams['header']['User-Agent']
         except Exception:
             pass
     
     recaptcha = UnCaptchaReCaptcha_fallback(lang=GetDefaultLang())
     recaptcha.HTTP_HEADER['Referer'] = refUrl
     if userAgent != None:
         recaptcha.HTTP_HEADER['User-Agent'] = userAgent
     token = recaptcha.processCaptcha(sitekey)
     
     if token == '':
         recaptcha = None
         if config.plugins.iptvplayer.captcha_bypass.value != '' and bypassCaptchaService == None:
             bypassCaptchaService = config.plugins.iptvplayer.captcha_bypass.value
         if bypassCaptchaService == '9kw.eu':
             recaptcha = UnCaptchaReCaptcha_9kw()
         elif bypassCaptchaService == '2captcha.com':
             recaptcha = UnCaptchaReCaptcha_2captcha()
         elif config.plugins.iptvplayer.myjd_login.value != '' and config.plugins.iptvplayer.myjd_password.value != '':
             recaptcha = UnCaptchaReCaptcha_myjd()
         
         if recaptcha != None:
             token = recaptcha.processCaptcha(sitekey, refUrl)
         else:
             errorMsgTab.append(_('Please visit %s to learn how to redirect this task to the external device.') % 'http://zadmario.gitlab.io/captcha.html')
             if not beQuaiet:
                 self.sessionEx.waitForFinishOpen(MessageBox, '\n'.join(errorMsgTab), type=MessageBox.TYPE_ERROR, timeout=20)
             if bypassCaptchaService != None:
                 errorMsgTab.append(_(' or '))
                 errorMsgTab.append(_('You can use \"%s\" or \"%s\" services for automatic solution.') % ("http://2captcha.com/", "https://9kw.eu/", ) + ' ' + _('Go to the host configuration available under blue button.'))
     return token, errorMsgTab
Esempio n. 27
0
 def _getLangCode(self):
     langCode = 'E'
     if config.plugins.iptvplayer.tvjworg_language.value == 'default':
         if self.defaultLangCode != '':
             return self.defaultLangCode
         else:
             sts, data = self.cm.getPage(self._getFullUrl('languages/E/web'))
             if sts:
                 try:
                     lang = GetDefaultLang()
                     data = byteify(json.loads(data))
                     for item in data['languages']:
                         if item['locale'] == lang:
                             self.defaultLangCode = str(item['code'])
                             langCode = self.defaultLangCode
                             break
                 except Exception:
                     printExc()
     else:
         langCode = config.plugins.iptvplayer.tvjworg_language.value
     return langCode
Esempio n. 28
0
    def _doGetEncodingSubtitle24Callback(self, code, data):
        encoding = data
        if 0 != code or 'unknown' in encoding:
            encoding = ''
        else:
            encoding = encoding.strip()
        
        if GetDefaultLang() == 'pl' and encoding == 'iso-8859-2':
            encoding = GetPolishSubEncoding(self.tmpData['tmpFile'])
        elif '' == encoding:
            encoding = 'utf-8'
        fileName = ''
        sts = False
        try:
            f = open(self.tmpData['tmpFile'])
            data = f.read()
            f.close()
            subItem = self.tmpData['subItem']
            try:
                data = data.decode(encoding).encode('UTF-8')
                title = self._getSubtitleNapisy24Title(subItem).replace('_', '.').replace('.srt', '').replace(' ', '.')
                match = re.search(r'[^.]', title)
                if match: title = title[match.start():]

                fileName = "{0}_{1}_0_{2}_{3}".format(title, 'pl', subItem['id'][2:], subItem['imdb'])
                fileName = self.tmpData['subDir'] + fileName + '.srt'
                try:
                    with open(fileName, 'w') as f:
                        f.write(data)
                    sts = True
                except: 
                    self.lastApiError = {'code':-999, 'message':_('write error')}
                    printExc()
            except:
                self.lastApiError = {'code':-999, 'message':_('decode error')}
                printExc()  
        except:
            self.lastApiError = {'code':-999, 'message':_('read error')}
            printExc()
        self.outerCallback(sts, fileName)
    def getSubtitles(self, cItem):
        printDBG("YoutubeComProvider.getSubtitles")
        if '' == self.youtubeId:
            SetIPTVPlayerLastHostError(_('The YouTube video ID is invalid.'))
            return
        from Plugins.Extensions.IPTVPlayer.libs.youtube_dl.extractor.youtube import YoutubeIE

        ytExtractor = YoutubeIE()
        # get normal langs
        tab = ytExtractor._get_subtitles(self.youtubeId)
        tab2 = ytExtractor._get_automatic_captions(self.youtubeId)
        for item in tab2:
            item['title'] = '[%s] %s' % (_('Auto-translate'), item['title'])
            tab.append(item)
        defaultLang = GetDefaultLang()
        promotedItem = None
        for item in tab:
            params = dict(item)
            if None == promotedItem and defaultLang == params['lang']:
                promotedItem = params
            else:
                self.addSubtitle(params)
        if None != promotedItem:
            self.addSubtitle(promotedItem, False)
Esempio n. 30
0
    def __init__(self):
        CBaseHostClass.__init__(self, {
            'history': 'Twitch',
            'cookie': 'Twitch.cookie'
        })

        self.HTTP_HEADER = self.cm.getDefaultHeader(browser='chrome')
        self.defaultParams = {
            'header': self.HTTP_HEADER
        }  #, 'use_cookie': True, 'load_cookie': True, 'save_cookie': True, 'cookiefile': self.COOKIE_FILE}

        self.DEFAULT_ICON_URL = 'http://s.jtvnw.net/jtv_user_pictures/hosted_images/GlitchIcon_WhiteonPurple.png'
        self.MAIN_URL = 'https://www.twitch.tv/'
        self.API1_URL = 'https://api.twitch.tv/'
        self.API2_URL = 'https://gql.twitch.tv/'

        self.CHANNEL_TOKEN_URL = self.getFullUrl(
            '/api/channels/%s/access_token')
        self.LIVE_URL = 'http://usher.justin.tv/api/channel/hls/%s.m3u8?token=%s&sig=%s&allow_source=true'
        self.CHANNEL_TOKEN_URL = self.API1_URL + 'api/channels/%s/access_token?need_https=false&oauth_token&platform=web&player_backend=mediaplayer&player_type=site'

        self.VOD_TOKEN_URL = self.API1_URL + 'api/vods/%s/access_token?need_https=true&oauth_token&platform=web&player_backend=mediaplayer&player_type=site'
        self.VOD_URL = 'https://usher.ttvnw.net/vod/%s.m3u8?token=%s&sig=%s&allow_source=true'

        self.platformFilters = [{
            'title': _('All Platforms'),
            'platform_type': 'all'
        }, {
            'title': _('Xbox One'),
            'platform_type': 'xbox'
        }, {
            'title': _('PlayStation 4'),
            'platform_type': 'ps4'
        }]
        self.languagesFilters = [
            # nice of them to change from meaningful identifers to guid
            # screwing things up with the language filtering.  CM
            {
                'lang': "73cc486a-e56b-41ed-a1df-7afedbc84f6f",
                'title': "العربية"
            },
            {
                'lang': "21d85c73-701f-4259-8c4e-4321265847b5",
                'title': "български"
            },
            {
                'lang': "a6cddaba-f0ce-4526-9087-6de2f603a24d",
                'title': "Čeština"
            },
            {
                'lang': "43e598cc-918b-4247-b02c-b13543a1eac9",
                'title': "Dansk"
            },
            {
                'lang': "9166ad14-41f1-4b04-a3b8-c8eb838c6be6",
                'title': "Deutsch"
            },
            {
                'lang': "902f6815-a655-4918-99e7-48c74a71feac",
                'title': "Ελληνικά"
            },
            {
                'lang': "6ea6bca4-4712-4ab9-a906-e3336a9d8039",
                'title': "English"
            },
            {
                'lang': "d4bb9c58-2141-4881-bcdc-3fe0505457d1",
                'title': "Español"
            },
            {
                'lang': "220eb274-ab25-425b-8a9b-826103404997",
                'title': "Suomi"
            },
            {
                'lang': "6f655045-9989-4ef7-8f85-1edcec42d648",
                'title': "Français"
            },
            {
                'lang': "a298cca5-d408-47c7-a1e7-0c76ca878bc6",
                'title': "Magyar"
            },
            {
                'lang': "5b9935eb-1e9a-4217-98ad-62bda5cff0d1",
                'title': "Italiano"
            },
            {
                'lang': "6ba1d230-e52f-4d81-b1e0-41f25a8a9f5d",
                'title': "日本語"
            },
            {
                'lang': "ab2975e3-b9ca-4b1a-a93e-fb61a5d5c3a4",
                'title': "한국어"
            },
            {
                'lang': "e13e6734-37ae-4d85-897b-3015f0168355",
                'title': "Nederlands"
            },
            {
                'lang': "5647bf35-f99e-49aa-8578-0e07d936188c",
                'title': "Norsk"
            },
            {
                'lang': "f9d04efa-6e25-49bf-bf0a-da3e2addaf1b",
                'title': "Polski"
            },
            {
                'lang': "39ee8140-901a-4762-bfca-8260dea1310f",
                'title': "Português"
            },
            {
                'lang': "75a99c80-0f15-4159-b1fd-3812c25b4aca",
                'title': "Română"
            },
            {
                'lang': "0569b171-2a2b-476e-a596-5bdfb45a1327",
                'title': "Русский"
            },
            {
                'lang': "9b773670-05f8-4c06-ac99-e6649f906171",
                'title': "Slovenčina"
            },
            {
                'lang': "145b073b-cb70-4e91-b170-f5fab2ebba05",
                'title': "Svenska"
            },
            {
                'lang': "f19c7524-c18d-41af-9f39-034c8d0b0fee",
                'title': "ภาษาไทย"
            },
            {
                'lang': "f08d5873-f0c7-4912-94ba-a41933b4c141",
                'title': "Türkçe"
            },
            {
                'lang': "ba3b69fe-899c-4518-ac46-707275e3eba1",
                'title': "TiếngViệt"
            },
            {
                'lang': "0c8c6543-4019-47d0-9b8a-57a81ee6ace5",
                'title': "中文(粵語)"
            },
            {
                'lang': "74c92063-a389-4fd2-8460-b1bb82b04ec7",
                'title': "中文"
            },
            {
                'lang': '5ad4b978-495f-4093-9461-c194f58201ab',
                'title': 'American Sign Language'
            },
            {
                'lang': 'fd76c790-0505-4c4c-865a-d6bd139c0901',
                'title': 'Other'
            }
        ]

        lang = GetDefaultLang()
        default = None
        defaultEn = None
        self.langItems = []
        for item in self.languagesFilters:
            if lang == item['lang']:
                default = item
                continue
            if 'en' == item['lang']:
                defaultEn = item
                continue
            self.langItems.append(item)
        if defaultEn: self.langItems.insert(0, defaultEn)
        if default: self.langItems.insert(0, default)
        self.langItems.insert(0, {'title': _('All')})

        self.VIDEOS_TYPES_TAB = [
            {
                'title': _('All')
            },
            {
                'title': _('Past premieres'),
                'videos_type': 'PAST_PREMIERE'
            },
            {
                'title': _('Archive'),
                'videos_type': 'ARCHIVE'
            },
            {
                'title': _('Highlights'),
                'videos_type': 'HIGHLIGHT'
            },
            {
                'title': _('Uploads'),
                'videos_type': 'UPLOAD'
            },
        ]

        self.VIDEOS_SORT_TAB = [
            {
                'title': _('Popular'),
                'sort': 'VIEWS'
            },
            {
                'title': _('Recent'),
                'sort': 'TIME'
            },
        ]

        self.CLIPS_FILTERS_TAB = [
            {
                'title': _('Trending'),
                'clips_filter': 'TRENDING'
            },
            {
                'title': _('Last day'),
                'clips_filter': 'LAST_DAY'
            },
            {
                'title': _('Last week'),
                'clips_filter': 'LAST_WEEK'
            },
            {
                'title': _('Last month'),
                'clips_filter': 'LAST_MONTH'
            },
            {
                'title': _('All time'),
                'clips_filter': 'ALL_TIME'
            },
        ]

        self.GAME_CAT_TAB = [
            {
                'category': 'game_lang',
                'next_category': 'game_channels',
                'title': _('Channels')
            },
            {
                'category': 'game_lang',
                'next_category': 'game_videos_types',
                'title': _('Videos')
            },
            {
                'category': 'game_lang',
                'next_category': 'game_clips_filters',
                'title': _('Clips')
            },
        ]