Files
addon/channels/porntrex.py
mac12m99 a3c90d90d7 KoD 0.5
KoD 0.5
-riscritti molti canali per cambiamenti nella struttura stessa di kod
-altre robe carine
2019-08-30 20:47:43 +02:00

328 lines
14 KiB
Python

# -*- coding: utf-8 -*-
import re
import urllib
import urlparse
from core import httptools
from core import scrapertools
from core.item import Item
from platformcode import config, logger
host = "https://www.porntrex.com"
perpage = 20
def mainlist(item):
logger.info()
itemlist = []
config.set_setting("url_error", False, "porntrex")
itemlist.append(item.clone(action="lista", title="Nuevos Vídeos", url=host + "/latest-updates/"))
itemlist.append(item.clone(action="lista", title="Mejor Valorados", url=host + "/top-rated/"))
itemlist.append(item.clone(action="lista", title="Más Vistos", url=host + "/most-popular/"))
itemlist.append(item.clone(action="categorias", title="Categorías", url=host + "/categories/"))
itemlist.append(item.clone(action="categorias", title="Modelos",
url=host + "/models/?mode=async&function=get_block&block_id=list_models_models" \
"_list&sort_by=total_videos"))
itemlist.append(item.clone(action="categorias", title="Canal", url=host + "/channels/"))
itemlist.append(item.clone(action="playlists", title="Listas", url=host + "/playlists/"))
itemlist.append(item.clone(action="tags", title="Tags", url=host + "/tags/"))
itemlist.append(item.clone(title="Buscar...", action="search"))
itemlist.append(item.clone(action="configuracion", title="Configurar canal...", text_color="gold", folder=False))
return itemlist
def configuracion(item):
from platformcode import platformtools
ret = platformtools.show_channel_settings()
platformtools.itemlist_refresh()
return ret
def search(item, texto):
logger.info()
item.url = "%s/search/%s/" % (host, texto.replace("+", "-"))
item.extra = texto
try:
return lista(item)
# Se captura la excepción, para no interrumpir al buscador global si un canal falla
except:
import sys
for line in sys.exc_info():
logger.error("%s" % line)
return []
def lista(item):
logger.info()
itemlist = []
# Descarga la pagina
data = get_data(item.url)
action = "play"
if config.get_setting("menu_info", "porntrex"):
action = "menu_info"
# Quita las entradas, que no son private <div class="video-preview-screen video-item thumb-item private "
patron = '<div class="video-preview-screen video-item thumb-item ".*?'
patron += '<a href="([^"]+)".*?'
patron += 'data-src="([^"]+)".*?'
patron += 'alt="([^"]+)".*?'
patron += '<span class="quality">(.*?)<.*?'
patron += '</i>([^<]+)<'
matches = scrapertools.find_multiple_matches(data, patron)
for scrapedurl, scrapedthumbnail, scrapedtitle, quality, duration in matches:
if "go.php?" in scrapedurl:
scrapedurl = urllib.unquote(scrapedurl.split("/go.php?u=")[1].split("&")[0])
if not scrapedthumbnail.startswith("https"):
scrapedthumbnail = "https:%s" % scrapedthumbnail
else:
scrapedurl = urlparse.urljoin(host, scrapedurl)
if not scrapedthumbnail.startswith("https"):
scrapedthumbnail = "https:%s" % scrapedthumbnail
scrapedtitle = "%s - [COLOR red]%s[/COLOR] %s" % (duration, quality, scrapedtitle)
scrapedthumbnail += "|Referer=https://www.porntrex.com/"
itemlist.append(item.clone(action=action, title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail,
contentThumbnail=scrapedthumbnail, fanart=scrapedthumbnail))
# Extrae la marca de siguiente página
if item.extra:
next_page = scrapertools.find_single_match(data, '<li class="next">.*?from_videos\+from_albums:(\d+)')
if next_page:
if "from_videos=" in item.url:
next_page = re.sub(r'&from_videos=(\d+)', '&from_videos=%s' % next_page, item.url)
else:
next_page = "%s?mode=async&function=get_block&block_id=list_videos_videos" \
"&q=%s&category_ids=&sort_by=post_date&from_videos=%s" % (item.url, item.extra, next_page)
itemlist.append(item.clone(action="lista", title=">> Página Siguiente", url=next_page))
else:
next_page = scrapertools.find_single_match(data, '<li class="next">.*?href="([^"]*)"')
if next_page and not next_page.startswith("#"):
if "go.php?" in next_page:
next_page = urllib.unquote(next_page.split("/go.php?u=")[1].split("&")[0])
else:
next_page = urlparse.urljoin(host, next_page)
itemlist.append(item.clone(action="lista", title=">> Página Siguiente", url=next_page))
else:
next_page = scrapertools.find_single_match(data, '<li class="next">.*?from4:(\d+)')
if next_page:
if "from4" in item.url:
next_page = re.sub(r'&from4=(\d+)', '&from4=%s' % next_page, item.url)
else:
next_page = "%s?mode=async&function=get_block&block_id=list_videos_common_videos_list_norm" \
"&sort_by=post_date&from4=%s" % (
item.url, next_page)
itemlist.append(item.clone(action="lista", title=">> Página Siguiente", url=next_page))
return itemlist
def categorias(item):
logger.info()
itemlist = []
data = get_data(item.url)
# Extrae las entradas
if "/channels/" in item.url:
patron = '<div class="video-item ">.*?<a href="([^"]+)" title="([^"]+)".*?src="([^"]+)".*?<li>([^<]+)<'
else:
patron = '<a class="item" href="([^"]+)" title="([^"]+)".*?src="([^"]+)".*?<div class="videos">([^<]+)<'
matches = scrapertools.find_multiple_matches(data, patron)
for scrapedurl, scrapedtitle, scrapedthumbnail, videos in matches:
if "go.php?" in scrapedurl:
scrapedurl = urllib.unquote(scrapedurl.split("/go.php?u=")[1].split("&")[0])
scrapedthumbnail = urllib.unquote(scrapedthumbnail.split("/go.php?u=")[1].split("&")[0])
scrapedthumbnail += "|Referer=https://www.porntrex.com/"
else:
scrapedurl = urlparse.urljoin(host, scrapedurl)
if not scrapedthumbnail.startswith("https"):
scrapedthumbnail = "https:%s" % scrapedthumbnail
scrapedthumbnail += "|Referer=https://www.porntrex.com/"
scrapedthumbnail = scrapedthumbnail.replace(" " , "%20")
if videos:
scrapedtitle = "%s (%s)" % (scrapedtitle, videos)
itemlist.append(item.clone(action="lista", title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail,
fanart=scrapedthumbnail))
# Extrae la marca de siguiente página
next_page = scrapertools.find_single_match(data, '<li class="next">.*?from:(\d+)')
if next_page:
if "from=" in item.url:
next_page = re.sub(r'&from=(\d+)', '&from=%s' % next_page, item.url)
else:
next_page = "%s&from=%s" % (item.url, next_page)
itemlist.append(item.clone(action="categorias", title=">> Página Siguiente", url=next_page))
return itemlist
def playlists(item):
logger.info()
itemlist = []
# Descarga la pagina
data = get_data(item.url)
# Extrae las entradas
patron = '<div class="item.*?'
patron += 'href="([^"]+)" title="([^"]+)".*?'
patron += 'data-original="([^"]+)".*?'
patron += '<div class="totalplaylist">([^<]+)<'
matches = scrapertools.find_multiple_matches(data, patron)
for scrapedurl, scrapedtitle, scrapedthumbnail, videos in matches:
if "go.php?" in scrapedurl:
scrapedurl = urllib.unquote(scrapedurl.split("/go.php?u=")[1].split("&")[0])
scrapedthumbnail = urlparse.urljoin(host, scrapedthumbnail)
else:
scrapedurl = urlparse.urljoin(host, scrapedurl)
if not scrapedthumbnail.startswith("https"):
scrapedthumbnail = "https:%s" % scrapedthumbnail
scrapedthumbnail += "|Referer=https://www.porntrex.com/"
scrapedthumbnail = scrapedthumbnail.replace(" " , "%20")
if videos:
scrapedtitle = "%s [COLOR red](%s)[/COLOR]" % (scrapedtitle, videos)
itemlist.append(item.clone(action="videos", title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail,
fanart=scrapedthumbnail))
#Extrae la marca de siguiente página
next_page = scrapertools.find_single_match(data, '<li class="next">.*?href="([^"]+)"')
if next_page:
if "go.php?" in next_page:
next_page = urllib.unquote(next_page.split("/go.php?u=")[1].split("&")[0])
else:
next_page = urlparse.urljoin(host, next_page)
itemlist.append(item.clone(action="playlists", title=">> Página Siguiente", url=next_page))
return itemlist
def videos(item):
logger.info()
if not item.indexp:
item.indexp = 1
itemlist = []
# Descarga la pagina
data = get_data(item.url)
action = "play"
if config.get_setting("menu_info", "porntrex"):
action = "menu_info"
# Extrae las entradas
# Quita las entradas, que no son private <div class="video-item private ">
patron = '<div class="video-item ".*?'
patron += 'href="([^"]+)".*?'
patron += 'title="([^"]+)".*?'
patron += 'src="([^"]+)"(.*?)<div class="durations">.*?'
patron += '</i>([^<]+)</div>'
matches = scrapertools.find_multiple_matches(data, patron)
count = 0
for scrapedurl, scrapedtitle, scrapedthumbnail, quality, duration in matches:
count += 1
if count < item.indexp:
continue
if "go.php?" in scrapedurl:
scrapedurl = urllib.unquote(scrapedurl.split("/go.php?u=")[1].split("&")[0])
scrapedthumbnail = urlparse.urljoin(host, scrapedthumbnail)
else:
scrapedurl = urlparse.urljoin(host, scrapedurl)
if not scrapedthumbnail.startswith("https"):
scrapedthumbnail = "https:%s" % scrapedthumbnail
scrapedthumbnail += "|Referer=https://www.porntrex.com/"
scrapedthumbnail = scrapedthumbnail.replace(" " , "%20")
if 'k4"' in quality:
quality = "4K"
scrapedtitle = "%s - [COLOR yellow]%s[/COLOR] %s" % (duration, quality, scrapedtitle)
else:
quality = scrapertools.find_single_match(quality, '<span class="quality">(.*?)<.*?')
scrapedtitle = "%s - [COLOR red]%s[/COLOR] %s" % (duration, quality, scrapedtitle)
if len(itemlist) >= perpage:
break;
itemlist.append(item.clone(action=action, title=scrapedtitle, url=scrapedurl, contentThumbnail=scrapedthumbnail,
fanart=scrapedthumbnail, thumbnail=scrapedthumbnail))
#Extrae la marca de siguiente página
if item.channel and len(itemlist) >= perpage:
itemlist.append( item.clone(title = "Página siguiente >>>", indexp = count + 1) )
return itemlist
def play(item):
logger.info()
itemlist = []
data = get_data(item.url)
patron = '(?:video_url|video_alt_url[0-9]*):\s*\'([^\']+)\'.*?'
patron += '(?:video_url_text|video_alt_url[0-9]*_text):\s*\'([^\']+)\''
matches = scrapertools.find_multiple_matches(data, patron)
scrapertools.printMatches(matches)
for url, quality in matches:
quality = quality.replace(" HD" , "").replace(" 4k", "")
itemlist.append(['.mp4 %s [directo]' % quality, url])
if item.extra == "play_menu":
return itemlist, data
return itemlist
def menu_info(item):
logger.info()
itemlist = []
video_urls, data = play(item.clone(extra="play_menu"))
itemlist.append(item.clone(action="play", title="Ver -- %s" % item.title, video_urls=video_urls))
matches = scrapertools.find_multiple_matches(data, '<img class="thumb lazy-load" src="([^"]+)"')
for i, img in enumerate(matches):
if i == 0:
continue
img = "https:" + img + "|Referer=https://www.porntrex.com/"
title = "Imagen %s" % (str(i))
itemlist.append(item.clone(action="", title=title, thumbnail=img, fanart=img))
return itemlist
def tags(item):
logger.info()
itemlist = []
data = get_data(item.url)
if item.title == "Tags":
letras = []
matches = scrapertools.find_multiple_matches(data, '<strong class="title".*?>\s*(.*?)</strong>')
for title in matches:
title = title.strip()
if title not in letras:
letras.append(title)
itemlist.append(Item(channel=item.channel, action="tags", url=item.url, title=title, extra=title))
else:
if not item.length:
item.length = 0
bloque = scrapertools.find_single_match(data,
'>%s</strong>(.*?)(?:(?!%s)(?!#)[A-Z#]{1}</strong>|<div class="footer-margin">)' % (
item.extra, item.extra))
matches = scrapertools.find_multiple_matches(bloque, '<a href="([^"]+)">\s*(.*?)</a>')
for url, title in matches[item.length:item.length + 100]:
if "go.php?" in url:
url = urllib.unquote(url.split("/go.php?u=")[1].split("&")[0])
itemlist.append(Item(channel=item.channel, action="lista", url=url, title=title))
if len(itemlist) >= 100:
itemlist.append(Item(channel=item.channel, action="tags", url=item.url, title=">> Página siguiente",
length=item.length + 100, extra=item.extra))
return itemlist
def get_data(url_orig):
try:
if config.get_setting("url_error", "porntrex"):
raise Exception
response = httptools.downloadpage(url_orig)
if not response.data or "urlopen error [Errno 1]" in str(response.code):
raise Exception
except:
config.set_setting("url_error", True, "porntrex")
import random
server_random = ['nl', 'de', 'us']
server = server_random[random.randint(0, 2)]
url = "https://%s.hideproxy.me/includes/process.php?action=update" % server
post = "u=%s&proxy_formdata_server=%s&allowCookies=1&encodeURL=0&encodePage=0&stripObjects=0&stripJS=0&go=" \
% (urllib.quote(url_orig), server)
while True:
response = httptools.downloadpage(url, post, follow_redirects=False)
if response.headers.get("location"):
url = response.headers["location"]
post = ""
else:
break
return response.data