def get_servertv24(url): user = ADDON.getSetting('sctv_user') password = ADDON.getSetting('sctv_pass') channelid = re.search(re.compile(r"\/(\d+)\/"), url).group(1) response = urlfetch.get(url) if not response: notify('Kiểm tra nguồn phát tại [COLOR red]tv24h.vn[/COLOR] và báo cho người phát triển.') return cookie=response.cookiestring; matches = re.search(r'\"channel_token\" value=\"(.+?)\"', response.body) channeltoken = matches.group(1) signin_url = 'http://tv24.vn/client/login/process' headers = {'Host': 'tv24.vn', 'Accept-Encoding': 'gzip, deflate, compress, identity, *', 'Accept': '*/*', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0', 'Cookie': cookie, 'Referer': 'http://web.tv24.vn/dang-nhap'} data = {'mobile': user, 'password': password} urlfetch.post(signin_url, headers=headers, data=data) data = {'channel_id': channelid, 'channel_token': channeltoken} response = urlfetch.post('http://tv24.vn/client/channel/link', headers=headers, data=data) if 'null' in response.body: if len(user) == 0 or len(password) == 0: sleep(1) alert(u'Bạn hãy đăng ký tài khoản trên web [COLOR red]http://tv24.vn[/COLOR] và nhập trong Setting của Addon VMF'.encode("utf-8")) else: notify('Link bị lỗi') else: json_data = json.loads(response.body) video_url = json_data['data']['PLAY_URL'] notify("Đang getlink") video_url = vmf.sctv(channeltoken, video_url) sleep(5) if len(video_url) == 0: alert(u'Lỗi không lấy được link. Xin vui lòng thử lại.'.encode("utf-8")) return (video_url)
def go(): url = sys.argv[0].replace("plugin://%s" % ADDON_ID, VIETMEDIA_HOST ) + sys.argv[2] if url == VIETMEDIA_HOST + '/': url += '?action=menu' #Settings if '__settings__' in url: ADDON.openSettings() return #Search if '__search__' in url: keyboardHandle = xbmc.Keyboard('','Enter search text') keyboardHandle.doModal() if (keyboardHandle.isConfirmed()): queryText = keyboardHandle.getText() if len(queryText) == 0: return queryText = urllib.quote_plus(queryText) url = url.replace('__search__', queryText) else: return data = fetch_data(url) if not data: return if data.get('error'): alert(data['error']) return if data.get("url"): play(data) return if data.get("content_type") and len(data["content_type"]) > 0: xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_UNSORTED) xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE) xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_DATE) xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_GENRE) xbmcplugin.setContent(HANDLE, data["content_type"]) listitems = range(len(data["items"])) for i, item in enumerate(data["items"]): listItem = xbmcgui.ListItem(label=item["label"], label2=item["label2"], iconImage=item["icon"], thumbnailImage=item["thumbnail"]) if item.get("info"): listItem.setInfo("video", item["info"]) if item.get("stream_info"): for type_, values in item["stream_info"].items(): listItem.addStreamInfo(type_, values) if item.get("art"): listItem.setArt(item["art"]) if item.get("context_menu"): listItem.addContextMenuItems(item["context_menu"]) listItem.setProperty("isPlayable", item["is_playable"] and "true" or "false") if item.get("properties"): for k, v in item["properties"].items(): listItem.setProperty(k, v) listitems[i] = (item["path"], listItem, not item["is_playable"]) xbmcplugin.addDirectoryItems(HANDLE, listitems, totalItems=len(listitems)) xbmcplugin.endOfDirectory(HANDLE, succeeded=True, updateListing=False, cacheToDisc=True)
def listen_now(): ifl = xbmcgui.ListItem(utils.translate(30045)) ifl.setArt({'thumb': thumbs.IMG_IFL, 'poster': thumbs.IMG_IFL}) albums = xbmcgui.ListItem(utils.translate(30023)) albums.setArt({'thumb': thumbs.IMG_ALBUM, 'poster': thumbs.IMG_ALBUM}) stations = xbmcgui.ListItem(utils.translate(30021)) stations.setArt({ 'thumb': thumbs.IMG_STATION, 'poster': thumbs.IMG_STATION }) playlists = xbmcgui.ListItem(utils.translate(30020)) playlists.setArt({ 'thumb': thumbs.IMG_PLAYLIST, 'poster': thumbs.IMG_PLAYLIST }) items = [ (utils.build_url(url=URL, paths=['play', 'station'], queries={'station_id': 'IFL'}, r_path=True, r_query=True), ifl, False), (utils.build_url(URL, ['albums']), albums, True), (utils.build_url(URL, ['stations']), stations, True), (utils.build_url(URL, ['playlists']), playlists, True), ] # Only fetch new information if one full hour has passed # to keep things speedy on slow devices try: last_check = ADDON.getSetting('listen_now_last_update') except: last_check = -1 from_cache = True if last_check != time.strftime('%Y%m%d%H'): from_cache = False ADDON.setSetting('listen_now_last_update', time.strftime('%Y%m%d%H')) primary_header, situations = gmusic.get_listen_now_situations(from_cache) if primary_header and situations: situations = xbmcgui.ListItem(primary_header) situations.setArt({ 'thumb': thumbs.IMG_ALBUM, 'poster': thumbs.IMG_ALBUM }) # Add Situations after IFL items.insert(1, (utils.build_url(URL, ['situations']), situations, True)) listing.list_items(items)
def login(self): # Set Kodis locale to super class locale_code = xbmc.getLanguage(xbmc.ISO_639_1) locale_code = locale.normalize(locale_code).split('.')[0] if not locale_code: locale_code = 'en_US' self.locale = locale_code if self._is_logged_in and not self._should_test_login(): return True username = ADDON.getSetting('username') password = ADDON.getSetting('password') device_id = ADDON.getSetting('device_id') authtoken = ADDON.getSetting('authtoken') if authtoken: self.android_id = device_id self.session._authtoken = authtoken self.session.is_authenticated = True ADDON.setSetting('last_login_check', str(int(time.time()))) try: # Send a test request to ensure our authtoken # is still valide and working self.get_registered_devices() self._is_logged_in = True return True except: # Faild with the test-request so we set # "is_authenticated=False" and go through the login-process # again to get a new "authtoken" self.session.is_authenticated = False if device_id: success = super(GMusic, self).login(username, password, device_id, self.locale) if success: ADDON.setSetting('authtoken', self.session._authtoken) self._is_logged_in = True return True utils.notify(utils.translate(30048), '') ADDON.setSetting('is_setup', 'false') # Prevent further addon execution in case we failed with the login-process raise SystemExit
def play_track(track_id, store_id=None, track_title='', station_id=None): track = _get_track_details(track_id, store_id) item = None if track: item = listing.build_song_listitems([track])[0][1] else: item = xbmcgui.ListItem(track_title) item.setArt({'thumb': thumbs.IMG_ALBUM, 'poster': thumbs.IMG_ALBUM}) item.setPath( GMUSIC.get_stream_url(song_id=track_id, quality=ADDON.getSetting('stream_quality'))) xbmcplugin.setResolvedUrl(ADDON_HANDLE, True, item) GMUSIC.increment_song_playcount(track_id) # If the current track is from a station and within the last five (5) # playlist tracks, we get a new set of tracks for this station and # add it to the playlist. if station_id: playlist = xbmc.PlayList(xbmc.PLAYLIST_MUSIC) if playlist.getposition() >= (len(playlist) - 5): queue_station(station_id)
def _get_library_last_updated(): try: library_last_updated = int(ADDON.getSetting('library_last_updated')) except Exception: library_last_updated = 0 return library_last_updated
def setup_addons(root): addon_obj = sendJSONRPC('Addons.GetAddons',["unknown","unknown","all",["name","enabled"]]) enabled_addons = [] for addon in addon_obj['result']['addons']: enabled_addons.append(addon['addonid']) for category in root: for addon in category: if addon.attrib['type'] == 'plugin': addon_id = addon.attrib['type']+'.' +addon.attrib['prefix']+'.'+addon.attrib['name'] elif addon.attrib['type'] == 'website': addon_id = 'plugin.program.chrome.launcher' else: continue enabled_string = category.attrib['type'] + '_' + addon.attrib['name'] enabled = ADDON.getSetting(enabled_string) if addon_id in enabled_addons and enabled == 'true': if category.attrib['type'] == 'series': cfg.series_addons.append({'name':addon.attrib['name'], 'id':addon_id,'function_type':addon.attrib['function_type'],'function_vars':addon.attrib['function_vars']}) if category.attrib['type'] == 'movies': cfg.movie_addons.append({'name':addon.attrib['name'], 'id':addon_id,'function_type':addon.attrib['function_type'],'function_vars':addon.attrib['function_vars']}) if category.attrib['type'] == 'music': cfg.music_addons.append({'name':addon.attrib['name'], 'id':addon_id,'function_type':addon.attrib['function_type'],'function_vars':addon.attrib['function_vars']}) if category.attrib['type'] == 'live': cfg.live_addons.append({'name':addon.attrib['name'], 'id':addon_id,'function_type':addon.attrib['function_type'],'function_vars':addon.attrib['function_vars']}) if category.attrib['type'] == 'sports': cfg.sports_addons.append({'name':addon.attrib['name'], 'id':addon_id,'function_type':addon.attrib['function_type'],'function_vars':addon.attrib['function_vars']})
def _get_update_interval(): try: update_interval = int(ADDON.getSetting('update_interval')) except Exception: update_interval = 0 return update_interval * 60 * 60 # We need seconds
def check_fshare(): username = ADDON.getSetting('fshare_username') password = ADDON.getSetting('fshare_password') login_url = 'https://www.fshare.vn/login' response = urlfetch.fetch(login_url) #alert(username) #alert(password) csrf_pattern = '\svalue="(.+?)".*name="fs_csrf"' csrf=re.search(csrf_pattern, response.body) fs_csrf = csrf.group(1) #alert(fs_csrf) headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 VietMedia/1.0', 'Cookie': response.cookiestring} data = { "LoginForm[email]" : username, "LoginForm[password]" : password, "fs_csrf" : fs_csrf } response = urlfetch.post(login_url, headers=headers, data=data) if 'Sai tên đăng nhập hoặc mật khẩu.' in response.body: alert('Sai tên đăng nhập hoặc mật khẩu. Xin vui lòng kiểm tra lại user và password', '[COLOR yellow]Fshare thông báo[/COLOR]') sys.exit("Error message") headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 VietMedia/1.0', 'Cookie': response.cookiestring} check_acc = urlfetch.get('https://www.fshare.vn/account/infoaccount', headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 VietMedia/1.0', 'Cookie': response.cookiestring}) regex = r"data-target=\"#member\">(.+?)</a>" ma_tk=re.search(regex, check_acc.body) ma_tk=ma_tk.group(1) ma_tk='Loại tài khoản: [COLOR red]'+ma_tk+'[/COLOR]' date_create=re.search(r"<dt>Ngày tham gia</dt>.*\n.+?<dd>(.+?)</dd>", check_acc.body) date_create=date_create.group(1) date_create=date_create.rstrip() date_create='Ngày tham gia: [COLOR red]'+date_create+'[/COLOR]' acc_id=re.search(r"<dt>Mã Tài Khoản</dt>.*\n.+?<dd>(.+?)</dd>",check_acc.body) acc_id=acc_id.group(1) acc_id='Mã tài khoản: [COLOR red]'+acc_id+'[/COLOR]' expire_date=re.search(r"<dt>Hạn dùng</dt>.*\n.+?<dd>(.+?)</dd>",check_acc.body) expire_date=expire_date.group(1) #expire='Hạn dùng: [COLOR red]'+expire+'[/COLOR]' bonus=re.search(r"<dt>Điểm thưởng</dt>.*\n.+?<dd>(.+?)</dd>",check_acc.body) bonus=bonus.group(1) bonus='Điểm thưởng: [COLOR red]'+bonus+'[/COLOR]' check_acc = urlfetch.get('https://www.fshare.vn/account/profile', headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 VietMedia/1.0', 'Cookie': response.cookiestring}) regex = r'Địa chỉ email</label>.+<div class=\"col-sm-8.+text-primary\">(.+?)<\/div>' email = re.search(regex, check_acc.body) email = email.group(1) email = 'Địa chỉ e-mail: [COLOR red]'+email+'[/COLOR]' info=acc_id+'\n'+ma_tk+'\n'+date_create+'\n'+'Hạn dùng: [COLOR red]'+expire_date+'[/COLOR]\n'+bonus+'\n'+email TextBoxes('Trạng thái tài khoản fshare', info)
def getAcestream(url): if 'plugin:' in url: ace_link = url else: ace_option = ADDON.getSetting('ace') if ace_option == 'true': ace_link = 'plugin://program.plexus/?mode=1&url='+url+'&name=Video' else: response = fetch_data('http://127.0.0.1:6878/webui/api/service?method=get_version&format=jsonp&callback=mycallback') if not response: alert('Vui lòng khởi động ứng dụng Acestream. Cài đặt tại [COLOR yellow]acestream.org[/COLOR]') return else: ace_link = url.replace("acestream://", "http://localhost:6878/ace/getstream?id=") return ace_link
def _should_test_login(self): try: last_login_check = int(ADDON.getSetting('last_login_check')) except: last_login_check = 0 if last_login_check == 0: return True # We check every 1 hours elif (last_login_check + 3600) < time.time(): return True else: return False
def get_notif(): NOTIF = ADDON.getSetting("notif") try: response = urlfetch.get('http://repo.kodi.vn/Phude/notif.txt') matches = re.search(r"(\d+)-", response.body) check = matches.group(1) matches = re.search(r"-(.+)", response.body) notif1 = matches.group(1) if NOTIF == check: #TextBoxes('VietmediaF thông báo', notif1) xbmc.log('No notif') else: TextBoxes('VietmediaF thông báo', notif1) addon = xbmcaddon.Addon() addon.setSetting(id='notif', value=check) pass except: pass
def _play(path): utils.execute_jsonrpc(method='Playlist.Clear', params={'playlistid': xbmc.PLAYLIST_MUSIC}) utils.execute_jsonrpc(method='Playlist.Add', params={ 'playlistid': xbmc.PLAYLIST_MUSIC, 'item': { 'directory': utils.build_url(url=URL, paths=path, r_path=True) } }) utils.execute_jsonrpc( method='Player.Open', params={'item': { 'playlistid': xbmc.PLAYLIST_MUSIC, 'position': 0 }}) if ADDON.getSetting('auto_fullscreen') == 'true': utils.execute_jsonrpc('GUI.SetFullscreen', {'fullscreen': True})
def get_fshare(url): response = urlfetch.get(url) if 'Tập tin quý khách yêu cầu không tồn tại' in response.body: notify('Tập tin quý khách yêu cầu không tồn tại') sys.exit("Error message") def checkpass(url): response = urlfetch.get(url) if 'Tập tin có mật khẩu bảo vệ' in response.body: keyboardHandle = xbmc.Keyboard('','Nhập mật khẩu bảo vệ của tập tin') keyboardHandle.doModal() if (keyboardHandle.isConfirmed()): queryText = keyboardHandle.getText() if len(queryText) == 0: return queryText = urllib.quote_plus(queryText) password1 = queryText return password1 else: return url = url.replace('http://', 'https://') if '-' in url: matches = re.search(r"(http.*)-(.*)", url) password1 = matches.group(2) url = matches.group(1) else: password1 = checkpass(url) #notify(password1) match = re.search(r"(https://)", url) if not match: url = 'https://'+url else: url = url username = ADDON.getSetting('fshare_username') password = ADDON.getSetting('fshare_password') fshare_option = ADDON.getSetting('fshare_option') F = 'U2FsdGVkX1+oRjEcO06h18WuKSLFnniVhsVxR1l2aUWLmQAC3v4KfeXi5Xx5I11I' def check_user(session_id): f = 'U2FsdGVkX1+fntz3Jv92YvlUvQk6pEhgPiGKJcEBVtVH9lpd8YS6idK8G9Lr7etACq/sLnO12tI2klwOz9QQWQ' headers = {'cookie': "session_id="+session_id} response = urlfetch.get(vmf.gibberishAES(f, 'Faidemteiv'), headers=headers) jStr = json.loads(response.body) c = jStr['account_type'] return(c) def fshare_download(url, username, password): payload = '{"app_key":"L2S7R6ZMagggC5wWkQhX2+aDi467PPuftWUMRFSn","user_email":"'+username+'","password":"******"}' headers = {'cache-control': "no-cache"} f = 'U2FsdGVkX1+DNcAz9bYFd5cYzmMSxkO6cjEESsnvnFDRwI/cJ7q9e3PMqRvzhaQG/3AKt6uXJwS1dzBpPGlotw' response = urlfetch.post(vmf.gibberishAES(f, 'Faidemteiv'), data=payload, headers=headers) if '405' in response.body: alert('Không đăng nhập được. Kiểm tra lại username và mật khẩu.\nUser: [COLOR yellow]' + username+'[/COLOR]\nPassword: [COLOR yellow]'+password+'[/COLOR]','Fshare thông báo') sys.exit jStr = json.loads(response.body) code = jStr['code'] msg = jStr['msg'] token = jStr['token'] session_id = jStr['session_id'] t = check_user(session_id) t = str(t) if code == 200: notify ('Đăng nhập thành công') notify ('Tài khoản là: [COLOR red]'+t+'[/COLOR]') f = 'U2FsdGVkX1/vJ77W7WEfjOu+hZeMdqup95C+GE85n+a+y7jPpVuWQ/84LkPrQvpvA0xuchHX/FwK++XMK+EnVg' data = '{"token" : "%s", "url" : "%s", "password" : "%s"}' header = {'Cookie' : 'session_id=' + session_id} data = data % (token, url, password1) t = urlfetch.post(vmf.gibberishAES(f, 'Faidemteiv'), headers=header, data=data) jStr = json.loads(t.body) video_url = jStr['location'] if not video_url: notify('Link hỏng') return video_url def getlink(url, username, password): login_url = 'https://www.fshare.vn/login' logout_url = 'https://www.fshare.vn/logout' download_url = 'https://www.fshare.vn/download/get' notify (u'VMF Getlink system'.encode("utf-8")) response = fetch_data(login_url) if not response: return csrf_pattern = '\svalue="(.+?)".*name="fs_csrf"' csrf=re.search(csrf_pattern, response.body) fs_csrf = csrf.group(1) headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 VietMedia/1.0', 'Cookie': response.cookiestring} data = { "LoginForm[email]" : username, "LoginForm[password]" : password, "fs_csrf" : fs_csrf } response = fetch_data(login_url, headers, data) if 'Sai tên đăng nhập hoặc mật khẩu.' in response.body: alert('Sai tên đăng nhập hoặc mật khẩu. Xin vui lòng kiểm tra lại user và password', '[COLOR yellow]Fshare thông báo[/COLOR]') sys.exit check_acc = fetch_data('https://www.fshare.vn/account/infoaccount', headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 VietMedia/1.0', 'Cookie': response.cookiestring}) regex = r"data-target=\"#member\">(.+?)</a>" ma_tk=re.search(regex, check_acc.body) ma_tk=ma_tk.group(1) notify1('Tài khoản Fshare của bạn là: [COLOR red]'+ma_tk+'[/COLOR]') headers['Cookie'] = response.cookiestring headers['Referer'] = url direct_url = '' attempt = 1 MAX_ATTEMPTS = 3 file_id = os.path.basename(url) if response and response.status == 302: notify (u'Đang xử lý lấy link'.encode("utf-8")) while attempt < MAX_ATTEMPTS: if attempt > 1: sleep(2) notify (u'Lấy link lần thứ #%s'.encode("utf-8") % attempt) attempt += 1 response = fetch_data(url, headers, data) if response.status == 200: csrf=re.search(csrf_pattern, response.body) fs_csrf = csrf.group(1) data = { 'fs_csrf' : fs_csrf, 'ajax' : 'download-form', 'DownloadForm[pwd]' : password1, 'DownloadForm[linkcode]' : file_id } response=fetch_data(download_url, headers, data); json_data = json.loads(response.body) if json_data.get('url'): direct_url = json_data['url'] elif json_data.get('msg'): notify(json_data['msg'].encode("utf-8")) else: notify('Kiểm tra lại user, mật khẩu, mã password') elif response.status == 302: direct_url = response.headers['location'] else: notify (u'Lỗi khi lấy link, mã lỗi #%s. Đang thử lại...'.encode("utf-8") % response.status) response = fetch_data(logout_url, headers) if response.status == 302: notify (u'Done'.encode("utf-8")) else: notify (u'Lấy link không thành công.'.encode("utf-8")) if len(direct_url) > 0: notify (u'Đã lấy được link'.encode("utf-8")) else: notify (u'Có sự cố khi lấy link. Xin vui lòng thử lại'.encode("utf-8")) return direct_url #+++++++++++++++++ if fshare_option == "true": if len(username) == 0 or len(password) == 0: alert(u'Bạn chưa nhập [COLOR red]VMF[/COLOR] code hoặc tài khoản cá nhân Fshare'.encode("utf-8"), 'Soạn tin: [COLOR red]VMF[/COLOR] gửi [COLOR red]8798[/COLOR] để lấy VMF Code') return else: try: notify('Đang lấy link') #return fshare_download(url, username, password) return getlink(url, username, password) except: notify('Không đăng nhập được tài khoản') if fshare_option == "false": if len(USER_VIP_CODE) == 0: alert(u'Bạn chưa có tài khoản cá nhân Fshare'.encode("utf-8")) return if len(USER_VIP_CODE) > 0: download_url = 'https://www.fshare.vn/download/get' try: response = fetch_data(VIETMEDIA_HOST + vmf.gibberishAES(F1, 'idok')) json_data = json.loads(response.body) a =json_data['ttt'] c = a.split('|') for x in c: file_id = re.search(r"file\/(.+)", url).group(1) headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36', 'Cookie':'session_id='+x } response = urlfetch.get(url, headers=headers) if 'Tài khoản VIP là tài khoản trả tiền của Fshare' in response.body or 'Tài khoản BUNDLE là tài khoản KM theo gói Internet FPT' in response.body and 'getlink' not in response.body: fs_csrf = re.search(r"fs_csrf:'(.+?)'", response.body).group(1) headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36', 'Cookie':'session_id='+x } data = { 'fs_csrf' : fs_csrf, 'ajax' : 'download-form', 'DownloadForm[pwd]' : '', 'DownloadForm[linkcode]' : file_id, 'underfined' : 'underfined' } response=urlfetch.post(download_url, headers=headers, data=data); json_data = json.loads(response.body) if json_data.get('url'): if len(json_data['url']) > 0: video_url = json_data['url'] return (video_url) break except Exception as e: alert('Sử dụng tài khoản Fshare VIP cá nhân để play. Liên hệ [COLOR yellow][email protected][/COLOR] để mua Fshare VIP', 'VMF code lỗi') pass
from time import sleep from addon import alert, notify,notify1, TextBoxes, ADDON, ADDON_ID, ADDON_PROFILE, LOG, PROFILE import json import random import xbmc,xbmcgui import pyxbmct from config import VIETMEDIA_HOST import urllib import os, sys #import requests import time import vmfdecode as vmf #import urlresolver USER_VIP_CODE = ADDON.getSetting('user_vip_code') ADDON_NAME = ADDON.getAddonInfo("name") PROFILE_PATH = xbmc.translatePath(ADDON_PROFILE).decode("utf-8") T='aHR0cDovL3BsYXllci50cnVuZ3VpdC5uZXQvZ2V0P3VybD0=' F1 = 'U2FsdGVkX18tMUoo3k2cYautKONoQ5xHCpLDHBz/RNhTLRbBvHKgrtMKiRks5tw4' HOME = xbmc.translatePath('special://home/') USERDATA = os.path.join(xbmc.translatePath('special://home/'), 'userdata') ADDONDATA = os.path.join(USERDATA, 'addon_data', ADDON_ID) DIALOG = xbmcgui.Dialog() vDialog = xbmcgui.DialogProgress() def fetch_data(url, headers=None, data=None): if headers is None: headers = { 'User-agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 VietMedia/1.0',
import urllib,urllib2 import os import xbmc,xbmcplugin,xbmcgui,xbmcaddon import getlink import simplejson as json from config import VIETMEDIA_HOST from addon import alert, notify, ADDON, ADDON_ID, ADDON_PROFILE from platform import PLATFORM import uuid reload(sys); sys.setdefaultencoding("utf8") HANDLE = int(sys.argv[1]) CURRENT_PATH = ADDON.getAddonInfo("path") PROFILE_PATH = xbmc.translatePath(ADDON_PROFILE).decode("utf-8") VERSION = ADDON.getAddonInfo("version") USER = ADDON.getSetting('user_id') USER_PIN_CODE = ADDON.getSetting('user_pin_code') def fetch_data(url, headers=None): visitor = get_visitor() if headers is None: headers = { 'User-agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 VietMedia/1.0', 'Referers' : 'http://www..google.com', 'X-Visitor' : visitor, 'X-Version' : VERSION, 'X-User' : USER,
def go(): url = sys.argv[0].replace("plugin://%s" % ADDON_ID, VIETMEDIA_HOST ) + sys.argv[2] if url == VIETMEDIA_HOST + '/': url += '?action=menu' #Settings if 'textbox' in url or 'Textbox' in url: url = url.replace(VIETMEDIA_HOST+'/?action=textbox&', '') url = urllib.unquote_plus(url) content = openURL(url) TextBoxes(ADDON_NAME, content) return if 'checkupdate' in url: forceUpdate() if 'check_fshare' in url: #notify('đang check') check_fshare() return if 'addon' in url: url = url.replace(VIETMEDIA_HOST+'/?action=addon&', '') url=urllib.unquote(url) install_repo(url) return if 'clearCache' in url: clearCache() return if 'viewlog' in url: viewLogFile() return if '__settings__' in url: ADDON.openSettings() return if 'addon' in url: install_repo(url) return #Search if '__search__' in url: keyboardHandle = xbmc.Keyboard('','VietmediaF') keyboardHandle.doModal() if (keyboardHandle.isConfirmed()): queryText = keyboardHandle.getText() if len(queryText) == 0: return queryText = urllib.quote_plus(queryText) url = url.replace('__search__', queryText) else: return if '__download__' in url: download(url) return if '__lock__' in url: add_lock_dir(url) return if '__unlock__' in url: remove_lock_dir(url) return if check_lock(url): dialog = xbmcgui.Dialog() result = dialog.input('Nhập mã khoá', type=xbmcgui.INPUT_ALPHANUM, option=xbmcgui.ALPHANUM_HIDE_INPUT) if len(result) == 0 or result != LOCK_PIN: notify('Sai mật mã, vui lòng nhập lại') return data = fetch_data(url) if not data: return if data.get('error'): alert(data['error']) return if data.get("url"): play(data) return if not data.get("items"): return if data.get("content_type") and len(data["content_type"]) > 0: xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_UNSORTED) xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE) xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_DATE) xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_GENRE) xbmcplugin.setContent(HANDLE, data["content_type"]) listitems = range(len(data["items"])) for i, item in enumerate(data["items"]): lock_url = item["path"].replace("plugin://%s" % ADDON_ID, VIETMEDIA_HOST ) lock_url = re.sub('\?','/?',lock_url) label = item["label"] if check_lock(lock_url): label = "*" + label listItem = xbmcgui.ListItem(label=label, label2=item["label2"], iconImage=item["icon"], thumbnailImage=item["thumbnail"]) if item.get("info"): listItem.setInfo("video", item["info"]) if item.get("stream_info"): for type_, values in item["stream_info"].items(): listItem.addStreamInfo(type_, values) if item.get("art"): listItem.setArt(item["art"]) menu_context = [] if item.get("context_menu"): listItem.addContextMenuItems(item["context_menu"]) elif item["is_playable"] == True: title = item["label"] title = re.sub('\[.*?]','',title) title = re.sub('\s','-',title) title = re.sub('--','-',title) title = re.sub('--','-',title) title = re.sub('[\\\\/*?:"<>|#]',"",title) title = remove_accents.remove_accents(title) command = 'XBMC.RunPlugin(%s&d=__download__&file_name=%s)' % (item["path"], title) menu_context.append(( 'Download...', command, )) command = 'XBMC.RunPlugin(%s&d=__lock__)' % item["path"] menu_context.append(( 'Khoá mục này', command, )) command = 'XBMC.RunPlugin(%s&d=__unlock__)' % item["path"] menu_context.append(( 'Mở khoá mục này', command, )) listItem.addContextMenuItems( menu_context ) listItem.setProperty("isPlayable", item["is_playable"] and "true" or "false") if item.get("properties"): for k, v in item["properties"].items(): listItem.setProperty(k, v) listitems[i] = (item["path"], listItem, not item["is_playable"]) xbmcplugin.addDirectoryItems(HANDLE, listitems, totalItems=len(listitems)) if VIEWMODE == 'true': if '?action=menu' in url or 'node_id=77' in url or 'node_id=86' in url or 'node_id=79' in url or 'thread_id=18666' in url or 'thread_id=15858' in url or 'thread_id=21762' in url or 'thread_id=21802' in url or 'thread_id=15492' in url or 'thread_id=104' in url or 'node_id=13' in url or 'node_id=19' in url: xbmc.executebuiltin('Container.SetViewMode(%d)' % 500) hello() xbmcplugin.endOfDirectory(HANDLE, succeeded=True, updateListing=False, cacheToDisc=True)
def get_fptplay(url): #fptplay_option = ADDON.getSetting('fptplay_option') user = ADDON.getSetting('fptplay_user') password = ADDON.getSetting('fptplay_pass') country_code = ADDON.getSetting('country_code') exec( f**k( 'cj11cmxmZXRjaC5nZXQoJ2h0dHBzOi8vdGV4dHVwbG9hZGVyLmNvbS9kejdweS9yYXcnKQ==' )) headers = { 'cookie': f**k(r.body), 'origin': 'https://fptplay.vn', 'accept-encoding': 'gzip, deflate, br', 'x-requested-with': 'XMLHttpRequest', 'accept-language': 'en,vi;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6', 'x-key': '123456', 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', 'accept': 'application/json, text/javascript, */*; q=0.01', 'referer': url, 'authority': 'fptplay.vn', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36', } if 'livetv' in url: match = re.search(r"livetv\/(.+)", url) tv_id = match.group(1) data = { "id": tv_id, "type": "newchannel", "quality": "3", "mobile": "web" } exec( f**k( 'cmVzcG9uc2UgPSB1cmxmZXRjaC5wb3N0KCdodHRwczovL2ZwdHBsYXkudm4vc2hvdy9nZXRsaW5rbGl2ZXR2JywgaGVhZGVycz1oZWFkZXJzLCBkYXRhPWRhdGEp' )) video_url = json.loads(response.body)['stream'] else: match = re.search(r"(.{24})\.html", url) movie_id = match.group(1) if 'tap' in url: match = re.search(r"tap-(\d+)", url) episode = match.group(1) else: episode = '1' data = { "id": movie_id, "type": "newchannel", "quality": "3", "episode": episode, "mobile": "web" } exec( f**k( 'cmVzcG9uc2UgPSB1cmxmZXRjaC5wb3N0KCdodHRwczovL2ZwdHBsYXkudm4vc2hvdy9nZXRsaW5rJywgaGVhZGVycz1oZWFkZXJzLCBkYXRhPWRhdGEp' )) video_url = json.loads(response.body)['stream'] return video_url + "|User-Agent=vietmediaf&Origin=https%3A%2F%2Ffptplay.vn"
except Exception: library_last_updated = 0 return library_last_updated if __name__ == '__main__': monitor = xbmc.Monitor() while not monitor.abortRequested(): if monitor.waitForAbort(30): # Abort was requested while waiting. We should exit break update_interval = _get_update_interval() library_last_updated = _get_library_last_updated() if update_interval == 0: continue if time.time() >= library_last_updated + update_interval: ADDON.setSetting('library_last_updated', str(int(time.time()))) try: if GMUSIC.login(): GMUSIC.get_my_library_songs(from_cache=False) GMUSIC.get_my_library_artists(from_cache=False) GMUSIC.get_my_library_albums(from_cache=False) except Exception: continue
cfg.movie_addons.append({'name':addon.attrib['name'], 'id':addon_id,'function_type':addon.attrib['function_type'],'function_vars':addon.attrib['function_vars']}) if category.attrib['type'] == 'music': cfg.music_addons.append({'name':addon.attrib['name'], 'id':addon_id,'function_type':addon.attrib['function_type'],'function_vars':addon.attrib['function_vars']}) if category.attrib['type'] == 'live': cfg.live_addons.append({'name':addon.attrib['name'], 'id':addon_id,'function_type':addon.attrib['function_type'],'function_vars':addon.attrib['function_vars']}) if category.attrib['type'] == 'sports': cfg.sports_addons.append({'name':addon.attrib['name'], 'id':addon_id,'function_type':addon.attrib['function_type'],'function_vars':addon.attrib['function_vars']}) # check installed vs. supported to understand which addons the script can access #setup_addons(supported_movie_addons, supported_series_addons, supported_sports_addons, supported_live_addons, supported_music_addons) setup_addons(tree_root) # save to config object cfg.socket_url = ADDON.getSetting('socket_url') #'http://ec2-54-191-98-39.us-west-2.compute.amazonaws.com' cfg.socket_port = int(ADDON.getSetting('socket_port')) #3000 cfg.user_id = ADDON.getSetting('authcode') # save to log log.info('remote: \t%s:%s' % (cfg.socket_url, cfg.socket_port)) log.info('authcode:\t%s' % cfg.user_id) log.info('Enabled Addons..') temp = '\tmovies: ' for name in cfg.movie_addons: temp = temp + '[' + name['name'] + ']' log.info(temp) temp = '\tseries: ' for name in cfg.series_addons: temp = temp + '[' + name['name']+ ']' log.info(temp)
def get_fptplay(url): fptplay_option = ADDON.getSetting('fptplay_option') #Xem tv có thể không cần account hoặc có account hoặc có code VMF if 'livetv' in url: if fptplay_option == 'true': user = ADDON.getSetting('fptplay_user') password = ADDON.getSetting('fptplay_pass') country_code = ADDON.getSetting('country_code') matches = re.search(r"(.+)\s", country_code) country_code = matches.group(1) params = {'country_code': country_code, 'phone': user, 'password': password, 'submit': ''} headers = {'User_Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0','Referer':'https://fptplay.net/'} url_login = '******' url_logout = 'https://fptplay.net/user/logout' if len(user) == 0 or len(password) == 0: sleep(2) notify(u'Bạn nên nhập user và pasword của FPTplay.net. Đăng ký trên trang web http://fptplay.net'.encode("utf-8")) #ADDON.openSettings() s = requests.Session() r = s.get('https://fptplay.net') r = s.post(url_login, headers=headers, data=params) headers = { 'Referer' : url, 'X-KEY' : '123456', 'X-Requested-With' : 'XMLHttpRequest' } #Kiểm tra live tivi match = re.search(r'\/livetv\/(.*)$', url) if match: channel_id = match.group(1) data = { 'id' : channel_id, 'type' : 'newchannel', 'quality' : 3, 'mobile' : 'web' } r = s.post('https://fptplay.net/show/getlinklivetv', headers=headers, data=data) response = fetch_data(url_logout, headers) if response.status == 302: notify (u'Done'.encode("utf-8")) video_url=json.loads(r.content)['stream']+'User-Agent=Mozilla/5.0 (compatible; MSIE 10.0; Trident/6.0; IEMobile/10.0; ARM; Touch; WINDOWS;MSI;MSI MSI-MS-7996;)' return video_url #match = re.search(r'\-([\w]+)\.html', url) #if not match: # return if fptplay_option == 'false': if len(USER_VIP_CODE) == 0: alert(u'Bạn chưa nhập [COLOR red]VMF[/COLOR] code hoặc tài khoản cá nhân FPTPLAY'.encode("utf-8"), 'Soạn tin: [COLOR red]VMF[/COLOR] gửi [COLOR red]8798[/COLOR] để lấy VMF Code') return if len(USER_VIP_CODE) > 0: try: url_account = VIETMEDIA_HOST + '?action=fptplay_account' response = fetch_data(url_account) json_data = json.loads(response.body) user = json_data['username'] xbmc.log(user) password = json_data['password'] xbmc.log(password) country_code = 'VN' #Code getlink params = {'country_code': country_code, 'phone': user, 'password': password, 'submit': ''} headers = {'User_Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0','Referer':'https://fptplay.net/'} url_login = '******' url_logout = 'https://fptplay.net/user/logout' s = requests.Session() r = s.get('https://fptplay.net') r = s.post(url_login, headers=headers, data=params) headers = { 'Referer' : url, 'X-KEY' : '123456', 'X-Requested-With' : 'XMLHttpRequest' } #Kiểm tra live tivi match = re.search(r'\/livetv\/(.*)$', url) if match: channel_id = match.group(1) data = { 'id' : channel_id, 'type' : 'newchannel', 'quality' : 3, 'mobile' : 'web' } r = s.post('https://fptplay.net/show/getlinklivetv', headers=headers, data=data) video_url=json.loads(r.content)['stream']+'User-Agent=Mozilla/5.0 (compatible; MSIE 10.0; Trident/6.0; IEMobile/10.0; ARM; Touch; WINDOWS;MSI;MSI MSI-MS-7996;)' return video_url except Exception as e: pass #Xem phim k cần account vip else: user = ADDON.getSetting('fptplay_user') password = ADDON.getSetting('fptplay_pass') country_code = ADDON.getSetting('country_code') matches = re.search(r"(.+)\s", country_code) country_code = matches.group(1) url_login = '******' params = {'country_code': country_code, 'phone': user, 'password': password, 'submit': ''} headers = {'User_Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0','Referer':'https://fptplay.net/'} s = requests.Session() r = s.get('https://fptplay.net') r = s.post(url_login, headers=headers, data=params) headers = { 'Referer' : 'https://fptplay.net', 'X-Requested-With' : 'XMLHttpRequest' } match = re.search(r'\-([\w]+)\.html', url) if not match: return movie_id = match.group(1) match = re.search(r'#tap-([\d]+)$', url) if match: episode_id = match.group(1) else: episode_id = 1 data = { 'id' : movie_id, 'type' : 'newchannel', 'quality' : 3, 'episode' : episode_id, 'mobile' : 'web', } r = s.post('https://fptplay.net/show/getlink', headers=headers, data=data) json_data = json.loads(r.content) video_url=json.loads(r.content)['stream']+'User-Agent=Mozilla/5.0 (compatible; MSIE 10.0; Trident/6.0; IEMobile/10.0; ARM; Touch; WINDOWS;MSI;MSI MSI-MS-7996;)' return video_url
import traceback import urllib from addon import ADDON, ADDON_NAME, ADDON_VER from logger import log from config import cfg sys.path.append(os.path.join(os.path.dirname(__file__), 'lib')) from socketIO_client import SocketIO,LoggingNamespace socketIO = None while len(cfg.user_id) < 15: xbmc.executebuiltin('Notification(Alexa Service,Please enter a valid key into the alexa service)') for i in range(60): time.sleep(1) cfg.user_id = ADDON.getSetting('authcode') def sendJSONRPC(method,params=None): out = {"id":1,"jsonrpc":"2.0","method":method} if params: out["params"] = params sendstring = json.dumps(out) log.info(sendstring) return json.loads(xbmc.executeJSONRPC(sendstring)) def play_generic_addon(message_attributes): addons = sendJSONRPC('Addons.GetAddons',{"enabled":true,"properties":["path","name"]}) for video in cfg.video_addons: if message_attributes['addon'] in video.name:
from addon import ADDON, ADDON_NAME, ADDON_VER from logger import log from config import cfg sys.path.append(os.path.join(os.path.dirname(__file__), 'lib')) from socketIO_client import SocketIO, LoggingNamespace socketIO = None while len(cfg.user_id) < 15: xbmc.executebuiltin( 'Notification(Alexa Service,Please enter a valid key into the alexa service)' ) for i in range(60): time.sleep(1) cfg.user_id = ADDON.getSetting('authcode') def sendJSONRPC(method, params=None): out = {"id": 1, "jsonrpc": "2.0", "method": method} if params: out["params"] = params sendstring = json.dumps(out) log.info(sendstring) return json.loads(xbmc.executeJSONRPC(sendstring)) def play_generic_addon(message_attributes): addons = sendJSONRPC('Addons.GetAddons', { "enabled": true, "properties": ["path", "name"]
def setup(force=False): is_setup = True if ADDON.getSetting('is_setup') == 'true' else False if is_setup and not force: return True dialog = xbmcgui.Dialog() username = dialog.input(utils.translate(30075), type=xbmcgui.INPUT_ALPHANUM) if not username: return False # If 2-Factor Authentication is used is_two_factor = dialog.yesno(utils.translate(30071), utils.translate(30072)) if is_two_factor: if not dialog.ok(utils.translate(30071), utils.translate(30073), utils.translate(30074)): return False password = dialog.input(utils.translate(30076), type=xbmcgui.INPUT_ALPHANUM, option=xbmcgui.ALPHANUM_HIDE_INPUT) if not password: return False device_id = None if is_two_factor: # If Android Device available if dialog.yesno(utils.translate(30077), utils.translate(30078)): if not dialog.ok(utils.translate(30079), utils.translate(30081)): return False device_id = dialog.input(utils.translate(30084), type=xbmcgui.INPUT_ALPHANUM) if not device_id: return False else: # If using MAC-Address if dialog.yesno(utils.translate(30082), utils.translate(30083)): device_id = gmusicapi.Mobileclient.FROM_MAC_ADDRESS else: return False else: web = gmusicapi.Webclient() if not web.login(username, password): # If re-run setup due to login failed if dialog.yesno(utils.translate(30048), utils.translate(30085)): return setup(force=True) else: return False try: devices = web.get_registered_devices() if not devices: raise dev_list = [] for dev in devices: # Not an Android Device so we skip as streaming would not work if dev['deviceType'] != 2: continue if 'id' in dev and dev['id']: dev_list.append('%s - %s' % ( dev.get('carrier', '').strip(' '), dev.get('model', '').strip(' '), )) dev_list = sorted(dev_list) if len(dev_list) <= 0: raise elif len(dev_list) == 1: device_id = devices[0]['id'].lstrip('0x') else: selection = dialog.select(utils.translate(30042), dev_list, 0) if selection >= 0: device_id = devices[selection]['id'].lstrip('0x') else: return False except Exception: # If use MAC-Address instead due to no devices found if not dialog.yesno(utils.translate(30079), utils.translate(30097)): return False device_id = gmusicapi.Mobileclient.FROM_MAC_ADDRESS # Test login mobile = gmusicapi.Mobileclient() if mobile.login(username, password, device_id): # Test if this is an all-access account if not mobile.get_all_stations(): dialog.ok(utils.translate(30091), utils.translate(30092)) return False ADDON.setSetting('username', username) ADDON.setSetting('password', password) ADDON.setSetting('authtoken', mobile.session._authtoken) if device_id == gmusicapi.Mobileclient.FROM_MAC_ADDRESS: mac_address = ''.join(re.findall('..', '%012x' % uuid.getnode())) ADDON.setSetting('device_id', mac_address) else: ADDON.setSetting('device_id', device_id) ADDON.setSetting('is_setup', 'true') utils.notify(utils.translate(30086), utils.translate(30087)) return True else: # If re-run setup if dialog.yesno(utils.translate(30048), utils.translate(30085)): return setup(force=True) return False
import uuid import SimpleDownloader as downloader import remove_accents import autorun import datetime as dt, time import xbmcvfs, shutil, zipfile downloader = downloader.SimpleDownloader() reload(sys); sys.setdefaultencoding("utf8") HANDLE = int(sys.argv[1]) CURRENT_PATH = ADDON.getAddonInfo("path") PROFILE_PATH = xbmc.translatePath(ADDON_PROFILE).decode("utf-8") VERSION = ADDON.getAddonInfo("version") USER = ADDON.getSetting('user_id') ADDON_NAME = ADDON.getAddonInfo("name") USER_PIN_CODE = ADDON.getSetting('user_pin_code') USER_VIP_CODE = ADDON.getSetting('user_vip_code') LOCK_PIN = ADDON.getSetting('lock_pin') VIEWMODE = ADDON.getSetting('view_mode') DOWNLOAD_PATH = ADDON.getSetting("download_path") CHECK = ADDON.getSetting("check") DIALOG = xbmcgui.Dialog() vDialog = xbmcgui.DialogProgress() HOME = xbmc.translatePath('special://home/') USERDATA = os.path.join(xbmc.translatePath('special://home/'), 'userdata') ADDONDATA = os.path.join(USERDATA, 'addon_data', ADDON_ID)
import mapper # Get all routes added to the mappers data store from addon import routes # noqa from addon.gmusic_wrapper import GMusic from addon import ADDON from addon import URL from addon.routes import actions MPR = mapper.Mapper.get() GMUSIC = GMusic.get(debug_logging=False) if __name__ == '__main__': if ADDON.getSetting('is_setup') != 'true': actions.setup() GMUSIC.login() MPR.call(URL)
def get_fshare(url): login_url = 'https://www.fshare.vn/login' logout_url = 'https://www.fshare.vn/logout' download_url = 'https://www.fshare.vn/download/get' username = ADDON.getSetting('fshare_username') password = ADDON.getSetting('fshare_password') try: url_account = 'http://aku.vn/linksvip' headers = { 'Referer' : 'http://aku.vn/linksvip', 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36' } response = fetch_data(url_account,headers=headers,data={ 'url_download' : url }) link_match=re.search("<a href=http://download(.*?)\starget=_blank", response.body) if link_match: return 'http://download' + link_match.group(1) except Exception as e: pass if len(username) == 0 or len(password) == 0: try: url_account = VIETMEDIA_HOST + '?action=fshare_account' response = fetch_data(url_account) json_data = json.loads(response.body) username = json_data['username'] password = json_data['password'] except Exception as e: pass if len(username) == 0 or len(password) == 0: alert(u'Bạn chưa nhập tài khoản fshare'.encode("utf-8")) return response = fetch_data(login_url) if not response: return csrf_pattern = '\svalue="(.+?)".*name="fs_csrf"' csrf=re.search(csrf_pattern, response.body) fs_csrf = csrf.group(1) headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 VietMedia/1.0', 'Cookie' : response.cookiestring } data = { "LoginForm[email]" : username, "LoginForm[password]" : password, "fs_csrf" : fs_csrf } response = fetch_data(login_url, headers, data) headers['Cookie'] = response.cookiestring headers['Referer'] = url direct_url = '' attempt = 1 MAX_ATTEMPTS = 8 file_id = os.path.basename(url) if response and response.status == 302: notify (u'Đăng nhập fshare thành công'.encode("utf-8")) while attempt < MAX_ATTEMPTS: if attempt > 1: sleep(2) notify (u'Lấy link lần thứ #%s'.encode("utf-8") % attempt) attempt += 1 response = fetch_data(url, headers, data) if response.status == 200: csrf=re.search(csrf_pattern, response.body) fs_csrf = csrf.group(1) data = { 'fs_csrf' : fs_csrf, 'ajax' : 'download-form', 'DownloadForm[linkcode]' : file_id } response=fetch_data(download_url, headers, data); json_data = json.loads(response.body) if json_data.get('url'): direct_url = json_data['url'] break elif json_data.get('msg'): notify(json_data['msg'].encode("utf-8")) elif response.status == 302: direct_url = response.headers['location'] break else: notify (u'Lỗi khi lấy link, mã lỗi #%s. Đang thử lại...'.encode("utf-8") % response.status) response = fetch_data(logout_url, headers) if response.status == 302: notify (u'Đăng xuất fshare thành công'.encode("utf-8")) else: notify (u'Đăng nhập không thành công, kiểm tra lại tài khoản'.encode("utf-8")) if len(direct_url) > 0: notify (u'Đã lấy được link'.encode("utf-8")) else: notify (u'Không được link, bạn vui lòng kiểm tra lại tài khoản'.encode("utf-8")) return direct_url