astrXbian/.install/.kodi/addons/plugin.video.vstream/resources/sites/radio.py

268 lines
8.9 KiB
Python

# -*- coding: utf-8 -*-
# vStream https://github.com/Kodi-vStream/venom-xbmc-addons
# Venom
import re
import string
import xbmc
import xbmcvfs
from resources.lib.comaddon import addon
from resources.lib.gui.gui import cGui
from resources.lib.gui.guiElement import cGuiElement
from resources.lib.handler.inputParameterHandler import cInputParameterHandler
from resources.lib.handler.outputParameterHandler import cOutputParameterHandler
from resources.lib.handler.requestHandler import cRequestHandler
from resources.lib.parser import cParser
from resources.lib.player import cPlayer
SITE_IDENTIFIER = 'radio'
SITE_NAME = '[COLOR orange]Radio[/COLOR]'
SITE_DESC = 'Radio'
UA = 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/48.0.2564.116 Chrome/48.0.2564.116 Safari/537.36'
USER_AGENT = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'
headers = {'User-Agent': USER_AGENT, 'Accept': '*/*', 'Connection': 'keep-alive'}
icon = 'tv.png'
# /home/lordvenom/.kodi/
# sRootArt = cConfig().getRootArt()
sRootArt = 'special://home/addons/plugin.video.vstream/resources/art/tv'
class track:
def __init__(self, location, title, image, ident):
self.location = location
self.title = title
self.image = image
self.ident = ident
def load():
oGui = cGui()
addons = addon()
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', 'http://')
oGui.addDir(SITE_IDENTIFIER, 'showGenres', addons.VSlang(30203) + ' (Genres)', 'music.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', 'http://')
oGui.addDir(SITE_IDENTIFIER, 'showAZ', addons.VSlang(30203) + ' (A-Z)', 'music.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', 'http://')
oGui.addDir(SITE_IDENTIFIER, 'showWeb', addons.VSlang(30203), 'music.png', oOutputParameterHandler)
oGui.setEndOfDirectory()
def showGenres():
oGui = cGui()
liste = []
liste.append(['70', '70'])
liste.append(['80', '80'])
liste.append(['90', '90'])
liste.append(['Classic', 'Classic'])
liste.append(['Clubbing', 'Clubbing'])
liste.append(['Dance', 'Dance'])
liste.append(['Electronic', 'Electronic'])
liste.append(['Funk', 'Funk'])
liste.append(['Hip-Hop', 'Hip-Hop'])
liste.append(['Hits', 'Hits'])
liste.append(['Jazz', 'Jazz'])
liste.append(['Lounge', 'Lounge'])
liste.append(['Love', 'Love'])
liste.append(['Metal', 'Metal'])
liste.append(['News', 'News'])
liste.append(['Pop', 'Pop'])
liste.append(['Rock', 'Rock'])
liste.append(['Slow', 'Slow'])
liste.append(['Trance', 'Trance'])
for sTitle, sIdent in liste:
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', '')
oOutputParameterHandler.addParameter('ident', sIdent)
oGui.addDir(SITE_IDENTIFIER, 'showWeb', sTitle, 'genres.png', oOutputParameterHandler)
oGui.setEndOfDirectory()
def parseWebM3U(): # Traite les m3u
playlist = []
song = track(None, None, None, None)
sFile = 'special://home/addons/plugin.video.vstream/resources/extra/radio.xspf'
if not xbmcvfs.exists(sFile):
return
f = xbmcvfs.File(sFile, 'rb')
sHtmlContent = f.read()
f.close()
line = re.compile('<location>(.+?)<.+?<title>(.+?)<.+?<image>(.+?)<.+?<identifier>(.+?)<', re.MULTILINE | re.IGNORECASE | re.DOTALL).findall(sHtmlContent)
if line:
total = len(line)
for result in line:
# sUrl2 = result[0].replace('\r', '')
song = track(result[0], result[1], result[2], result[3])
playlist.append(song)
return playlist
def showWeb(): # Code qui s'occupe de liens TV du Web
oGui = cGui()
oInputParameterHandler = cInputParameterHandler()
playlist = parseWebM3U()
if (oInputParameterHandler.exist('AZ')):
sAZ = oInputParameterHandler.getValue('AZ')
string = filter(lambda t: t.title.strip().capitalize().startswith(sAZ), playlist)
playlist = sorted(string, key=lambda t: t.title.strip().capitalize())
elif (oInputParameterHandler.exist('ident')):
sIdent = oInputParameterHandler.getValue('ident')
string = filter(lambda t: t.ident.strip().capitalize().startswith(sIdent), playlist)
playlist = sorted(string, key=lambda t: t.ident.strip().capitalize())
else:
playlist = sorted(playlist, key=lambda t: t.title.strip().capitalize())
if not playlist:
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', 'http://')
oGui.addText(SITE_IDENTIFIER, '[COLOR red]Aucun résultat[/COLOR] ')
else:
for track in playlist:
sThumb = track.image
if not sThumb:
sThumb = 'tv.png'
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', track.location)
oOutputParameterHandler.addParameter('sMovieTitle', track.title)
oOutputParameterHandler.addParameter('sThumbnail', sThumb)
# oGui.addDirectTV(SITE_IDENTIFIER, 'play__', track.title, 'tv.png' , sRootArt + '/tv/' + sThumb, oOutputParameterHandler)
oGuiElement = cGuiElement()
oGuiElement.setSiteName(SITE_IDENTIFIER)
oGuiElement.setFunction('play__')
oGuiElement.setTitle(track.title)
oGuiElement.setFileName(track.title)
oGuiElement.setIcon('tv.png')
oGuiElement.setMeta(0)
oGuiElement.setThumbnail(sThumb)
oGuiElement.setDirectTvFanart()
oGuiElement.setCat(6)
oGui.createContexMenuBookmark(oGuiElement, oOutputParameterHandler)
oGui.addFolder(oGuiElement, oOutputParameterHandler)
oGui.setEndOfDirectory()
def showAZ():
oGui = cGui()
oInputParameterHandler = cInputParameterHandler()
sUrl = oInputParameterHandler.getValue('siteUrl')
for i in string.digits:
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl)
oOutputParameterHandler.addParameter('AZ', i)
oGui.addDir(SITE_IDENTIFIER, 'showWeb', i, 'az.png', oOutputParameterHandler)
for i in string.ascii_uppercase:
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl)
oOutputParameterHandler.addParameter('AZ', i)
oGui.addDir(SITE_IDENTIFIER, 'showWeb', i, 'az.png', oOutputParameterHandler)
oGui.setEndOfDirectory()
def play__(): # Lancer les liens
oInputParameterHandler = cInputParameterHandler()
sUrl = oInputParameterHandler.getValue('siteUrl').replace('P_L_U_S', '+')
sTitle = oInputParameterHandler.getValue('sMovieTitle')
sThumbnail = oInputParameterHandler.getValue('sThumbnail')
# Special url with tag
if '[' in sUrl and ']' in sUrl:
sUrl = GetRealUrl(sUrl)
if 'f4mTester' in sUrl:
xbmc.executebuiltin('XBMC.RunPlugin(' + sUrl + ')')
return
else:
oGuiElement = cGuiElement()
oGuiElement.setSiteName(SITE_IDENTIFIER)
oGuiElement.setTitle(sTitle)
sUrl = sUrl.replace(' ', '%20')
oGuiElement.setMediaUrl(sUrl)
oGuiElement.setThumbnail(sThumbnail)
oPlayer = cPlayer()
oPlayer.clearPlayList()
oPlayer.addItemToPlaylist(oGuiElement)
# tout repeter
xbmc.executebuiltin('xbmc.playercontrol(RepeatAll)')
oPlayer.startPlayer()
return
def GetRealUrl(chain): # Recupere les liens des regex
UA2 = UA
url = chain
regex = ''
sHtmlContent = ''
r = re.search('\[[REGEX]+\](.+?)(?:(?:\[[A-Z]+\])|$)', chain)
if (r):
regex = r.group(1)
r = re.search('\[[UA]+\](.+?)(?:(?:\[[A-Z]+\])|$)', chain)
if (r):
UA2 = r.group(1)
r = re.search('\[[URL]+\](.+?)(?:(?:\[[A-Z]+\])|$)', chain)
if (r):
url = r.group(1)
# post methode ?
r = re.search('\[[POSTFORM]+\](.+?)(?:(?:\[[A-Z]+\])|$)', chain)
if (r):
param = r.group(1)
oRequestHandler = cRequestHandler(url)
oRequestHandler.setRequestType(1)
oRequestHandler.addHeaderEntry('Accept-Encoding', 'identity')
oRequestHandler.addParametersLine(param)
sHtmlContent = oRequestHandler.request()
else:
if (url):
oRequestHandler = cRequestHandler(url)
sHtmlContent = oRequestHandler.request()
# xbmc.log(sHtmlContent)
if regex:
oParser = cParser()
aResult2 = oParser.parse(sHtmlContent, regex)
if (aResult2):
url = aResult2[1][0]
# xbmc.log('Url recuperee : ' + url)
url = url + '|User-Agent=' + UA2
return url