diff --git a/addon.xml b/addon.xml index 3542d0df..ece09699 100644 --- a/addon.xml +++ b/addon.xml @@ -5,7 +5,6 @@ - video diff --git a/channels/altadefinizione01_club.py b/channels/altadefinizione01_club.py index 2895bb93..d75f8edb 100644 --- a/channels/altadefinizione01_club.py +++ b/channels/altadefinizione01_club.py @@ -3,131 +3,98 @@ # -*- Riscritto per KOD -*- # -*- By Greko -*- # -*- last change: 04/05/2019 +# -*- doppione di altadefinizione01 - -from core import channeltools, servertools, support +from specials import autoplay +from core import servertools, support from core.item import Item from platformcode import config, logger -from specials import autoplay __channel__ = "altadefinizione01_club" host = config.get_channel_url(__channel__) -# ======== Funzionalità ============================= - -checklinks = config.get_setting('checklinks', __channel__) -checklinks_number = config.get_setting('checklinks_number', __channel__) - headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'], ['Referer', host]] -parameters = channeltools.get_channel_parameters(__channel__) -fanart_host = parameters['fanart'] -thumbnail_host = parameters['thumbnail'] -IDIOMAS = {'Italiano': 'IT'} -list_language = IDIOMAS.values() -list_servers = ['verystream','openload','supervideo','rapidvideo','streamango'] # per l'autoplay +list_servers = ['verystream','openload','rapidvideo','streamango'] list_quality = ['default'] -# =========== home menu =================== - +@support.menu def mainlist(item): - """ - Creo il menu principale del canale - :param item: - :return: itemlist [] - """ - logger.info("%s mainlist log: %s" % (__channel__, item)) - itemlist = [] + film = '' - # Menu Principale - support.menu(itemlist, 'Film Ultimi Arrivi bold', 'peliculas', host, args='pellicola') - support.menu(itemlist, 'Genere', 'categorie', host, args='genres') - support.menu(itemlist, 'Per anno submenu', 'categorie', host, args=['Film per Anno','years']) - support.menu(itemlist, 'Per lettera', 'categorie', host + '/catalog/a/', args=['Film per Lettera','orderalf']) - support.menu(itemlist, 'Al Cinema bold', 'peliculas', host + '/cinema/', args='pellicola') - support.menu(itemlist, 'Sub-ITA bold', 'peliculas', host + '/sub-ita/', args='pellicola') - support.menu(itemlist, 'Cerca film submenu', 'search', host, args = 'search') + filmSub = [ + ('Al Cinema', ['/cinema/', 'peliculas', 'pellicola']), + ('Generi', ['', 'categorie', 'genres']), + ('Lettera', ['/catalog/a/', 'categorie', 'orderalf']), + ('Anni', ['', 'categorie', 'years']), + ('Sub-ITA', ['/sub-ita/', 'peliculas', 'pellicola']) + ] - autoplay.init(item.channel, list_servers, list_quality) - autoplay.show_option(item.channel, itemlist) - - support.channel_config(item, itemlist) - - return itemlist + return locals() # ======== def in ordine di menu =========================== # =========== def per vedere la lista dei film ============= - +@support.scrape def peliculas(item): - logger.info("%s mainlist peliculas log: %s" % (__channel__, item)) - itemlist = [] +## import web_pdb; web_pdb.set_trace() + support.log('peliculas',item) - patron_block = r'(.*?)' + action="findvideos" if item.args == "search": - patron_block = r' (.*?)' - patron = r'.(.*?))[ ].*?(.*?)' + patronBlock = r' (.*?)' + else: + patronBlock = r'(.*?)' + patron = r' ..*?<.*?src="(?P[^"]+)"'\ + '.+?[^>]+>[^>]+ (?P[A-Z]+)<[^>]+>(?:.[^>]+>(?P.*?)<[^>]+>).*?'\ + '(?P.*?)[^>]+> [^>]+> [^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+> [^>]+> '\ + '[^>]+>[^>]+>(?P\d{4})[^>]+>[^>]+> [^>]+>[^>]+>(?P\d+).+?>' - listGroups = ['url', 'thumb', 'lang', 'title', 'year'] + patronNext = '\d ' - patronNext = '[^<]+[^<]+' - - itemlist = support.scrape(item, patron=patron, listGroups=listGroups, - headers= headers, patronNext=patronNext,patron_block=patron_block, - action='findvideos') - - return itemlist + return locals() # =========== def pagina categorie ====================================== +@support.scrape def categorie(item): - logger.info("%s mainlist categorie log: %s" % (__channel__, item)) - itemlist = [] + support.log('categorie',item) +## import web_pdb; web_pdb.set_trace() + + if item.args != 'orderalf': action = "peliculas" + else: action = 'orderalf' + blacklist = 'Altadefinizione01' - # da qui fare le opportuni modifiche - patron = r'(.*?)' - action = 'peliculas' if item.args == 'genres': - bloque = r'(.*?)' - elif item.args[1] == 'years': - bloque = r'(.*?)' - elif item.args[1] == 'orderalf': - bloque = r'(.*)' - patron = r'(.*?)' - action = 'orderalf' - - listGroups = ['url', 'title'] - patronNext = '' - - itemlist = support.scrape(item, patron=patron, listGroups=listGroups, - headers= headers, patronNext=patronNext, patron_block = bloque, - action=action) - - return itemlist + patronBlock = r'(.*?)' + patron = '(?P.*?)' + elif item.args == 'years': + patronBlock = r'(.*?)' + patron = '(?P.*?)' + elif item.args == 'orderalf': + patronBlock = r'(.*)' + patron = '[^"]+)">(?P.*?)' + return locals() # =========== def pagina lista alfabetica =============================== - +@support.scrape def orderalf(item): - logger.info("%s mainlist orderalf log: %s" % (__channel__, item)) - itemlist = [] - listGroups = ['url', 'title', 'thumb', 'year', 'lang'] - patron = r'(.*?)<.*?"mlnh-5">.<(.*?)(.*?)<.*?"mlnh-5">.<(.*?)[^<]+[^<]+' - - itemlist = support.scrape(item, patron=patron, listGroups=listGroups, - headers= headers, patronNext=patronNext, - action='findvideos') + support.log('orderalf',item) - return itemlist + action= 'findvideos' + patron = r'[^"]+)"'\ + '.+?[^>]+>[^>]+ [^>]+[^>]+ [^>]+>(?P[^<]+).*?[^>]+>(?P\d{4})<'\ + '[^>]+>[^>]+>(?P[A-Z]+)[^>]+> (?P.*?)' + patronNext = r'[^<]+[^<]+' + return locals() # =========== def pagina del film con i server per verderlo ============= def findvideos(item): - logger.info("%s mainlist findvideos_film log: %s" % (__channel__, item)) - itemlist = [] + support.log('findvideos', item) return support.server(item, headers=headers) # =========== def per cercare film/serietv ============= @@ -137,7 +104,7 @@ def search(item, text): itemlist = [] text = text.replace(" ", "+") item.url = host + "/index.php?do=search&story=%s&subaction=search" % (text) - #item.extra = "search" + item.args = "search" try: return peliculas(item) # Cattura la eccezione così non interrompe la ricerca globle se il canale si rompe! @@ -150,16 +117,18 @@ def search(item, text): # =========== def per le novità nel menu principale ============= def newest(categoria): - logger.info("%s mainlist newest log: %s" % (__channel__, categoria)) + + support.log(categoria) itemlist = [] item = Item() try: - item.url = host - item.action = "peliculas" - itemlist = peliculas(item) - if itemlist[-1].action == "peliculas": - itemlist.pop() + if categoria == "peliculas": + item.url = host + item.action = "peliculas" + itemlist = peliculas(item) + if itemlist[-1].action == "peliculas": + itemlist.pop() # Continua la ricerca in caso di errore except: import sys @@ -167,4 +136,4 @@ def newest(categoria): logger.error("{0}".format(line)) return [] - return itemlist + return itemlist \ No newline at end of file diff --git a/channels/altadefinizione01_link.json b/channels/altadefinizione01_link.json index 579853b4..610822e4 100644 --- a/channels/altadefinizione01_link.json +++ b/channels/altadefinizione01_link.json @@ -4,9 +4,9 @@ "active": true, "adult": false, "language": ["ita"], - "fanart": "https://altadefinizione01.estate/templates/Dark/img/nlogo.png", - "thumbnail": "https://altadefinizione01.estate/templates/Dark/img/nlogo.png", - "banner": "https://altadefinizione01.estate/templates/Dark/img/nlogo.png", + "fanart": "https://altadefinizione01.tools/templates/Dark/img/nlogo.png", + "thumbnail": "https://altadefinizione01.tools/templates/Dark/img/nlogo.png", + "banner": "https://altadefinizione01.tools/templates/Dark/img/nlogo.png", "fix" : "reimpostato url e modificato file per KOD", "change_date": "2019-30-04", "categories": [ @@ -18,7 +18,7 @@ "id": "channel_host", "type": "text", "label": "Host del canale", - "default": "https://altadefinizione01.estate/", + "default": "https://www.altadefinizione01.tools/", "enabled": true, "visible": true }, diff --git a/channels/altadefinizione01_link.py b/channels/altadefinizione01_link.py index 584e175b..d45e843f 100644 --- a/channels/altadefinizione01_link.py +++ b/channels/altadefinizione01_link.py @@ -2,7 +2,7 @@ # -*- Channel Altadefinizione01L Film - Serie -*- # -*- By Greko -*- -import channelselector +##import channelselector from specials import autoplay from core import servertools, support, jsontools from core.item import Item @@ -11,88 +11,66 @@ from platformcode import config, logger __channel__ = "altadefinizione01_link" # ======== def per utility INIZIO ============================ +host = config.get_setting("channel_host", __channel__) list_servers = ['supervideo', 'streamcherry','rapidvideo', 'streamango', 'openload'] list_quality = ['default'] -host = config.get_setting("channel_host", __channel__) - headers = [['Referer', host]] # =========== home menu =================== - +@support.menu def mainlist(item): - """ - Creo il menu principale del canale - :param item: - :return: itemlist [] - """ - support.log() - itemlist = [] - # Menu Principale - support.menu(itemlist, 'Novità bold', 'peliculas', host) - support.menu(itemlist, 'Film per Genere', 'genres', host, args='genres') - support.menu(itemlist, 'Film per Anno submenu', 'genres', host, args='years') - support.menu(itemlist, 'Film per Qualità submenu', 'genres', host, args='quality') - support.menu(itemlist, 'Al Cinema bold', 'peliculas', host + '/film-del-cinema') - support.menu(itemlist, 'Popolari bold', 'peliculas', host + '/piu-visti.html') - support.menu(itemlist, 'Mi sento fortunato bold', 'genres', host, args='lucky') - support.menu(itemlist, 'Sub-ITA bold', 'peliculas', host + '/film-sub-ita/') - support.menu(itemlist, 'Cerca film submenu', 'search', host) + film = '' + filmSub = [ + ('Al Cinema', ['/film-del-cinema', 'peliculas']), + ('Generi', ['', 'genres', 'genres']), + ('Anni', ['', 'genres', 'years']), + ('Mi sento fortunato', ['/piu-visti.html', 'genres', 'lucky']), + ('Popolari', ['/piu-visti.html', 'peliculas', '']), + ('Qualità', ['/piu-visti.html', 'genres', 'quality']), + ('Sub-ITA', ['/sub-ita/', 'peliculas']) + ] - # per autoplay - autoplay.init(item.channel, list_servers, list_quality) - autoplay.show_option(item.channel, itemlist) - - support.channel_config(item, itemlist) - - return itemlist + return locals() # ======== def in ordine di action dal menu =========================== +@support.scrape def peliculas(item): - support.log + #import web_pdb; web_pdb.set_trace() + support.log('peliculas',item) itemlist = [] - patron = r'class="innerImage">.*?href="([^"]+)".*?src="([^"]+)"'\ - '.*?class="ml-item-title">([^<]+) (\d{4}) <'\ - '.*?class="ml-item-label">.*?class="ml-item-label ml-item-label-.+?"> '\ - '(.+?) .*?class="ml-item-label"> (.+?) ' - listGroups = ['url', 'thumb', 'title', 'year', 'quality', 'lang'] + patron = r'class="innerImage">.*?href="(?P[^"]+)".*?src="(?P[^"]+)"'\ + '.*?class="ml-item-title">(?P[^<]+) '\ + '(?P\d{4}) <.*?class="ml-item-label"> (?P\d+) .*?'\ + 'class="ml-item-label ml-item-label-.+?"> (?P.+?) <.*?'\ + 'class="ml-item-label"> (?P.+?) ' patronNext = '\d ' - - itemlist = support.scrape(item, patron=patron, listGroups=listGroups, - headers= headers, patronNext=patronNext, - action='findvideos') - - return itemlist + + return locals() # =========== def pagina categorie ====================================== - +@support.scrape def genres(item): support.log - itemlist = [] - #data = httptools.downloadpage(item.url, headers=headers).data + action = 'peliculas' if item.args == 'genres': - bloque = r'(.*?)' + patronBlock = r'(.*?)' elif item.args == 'years': - bloque = r'(.*?)' + patronBlock = r'(.*?)' elif item.args == 'quality': - bloque = r'(.*?)' + patronBlock = r'(.*?)' elif item.args == 'lucky': # sono i titoli random nella pagina, cambiano 1 volta al dì - bloque = r'FILM RANDOM.*?class="listSubCat">(.*?)' + patronBlock = r'FILM RANDOM.*?class="listSubCat">(.*?)' action = 'findvideos' - - patron = r'(.*?)<' - listGroups = ['url','title'] - itemlist = support.scrape(item, patron=patron, listGroups=listGroups, - headers= headers, patron_block = bloque, - action=action) + patron = r'(?P[^<]+)<' - return itemlist + return locals() # =========== def per cercare film/serietv ============= #host+/index.php?do=search&story=avatar&subaction=search @@ -133,15 +111,6 @@ def newest(categoria): return itemlist + def findvideos(item): - support.log() - - itemlist = support.server(item, headers=headers) - - # Requerido para FilterTools - # itemlist = filtertools.get_links(itemlist, item, list_language) - - # Requerido para AutoPlay - autoplay.start(itemlist, item) - - return itemlist + return support.server(item, headers=headers) diff --git a/channels/altadefinizioneclick.py b/channels/altadefinizioneclick.py index e4db4965..b1fd9aca 100644 --- a/channels/altadefinizioneclick.py +++ b/channels/altadefinizioneclick.py @@ -3,41 +3,60 @@ # Canale per altadefinizioneclick # ---------------------------------------------------------- -import re - +from specials import autoplay from core import servertools, support from core.item import Item -from platformcode import logger, config -from specials import autoplay +from platformcode import config, logger -#host = config.get_setting("channel_host", 'altadefinizioneclick') __channel__ = 'altadefinizioneclick' -host = config.get_channel_url(__channel__) -IDIOMAS = {'Italiano': 'IT'} -list_language = IDIOMAS.values() +host = config.get_channel_url(__channel__) +headers = [['Referer', host]] list_servers = ['verystream', 'openload', 'streamango', "vidoza", "thevideo", "okru", 'youtube'] list_quality = ['1080p'] -checklinks = config.get_setting('checklinks', 'altadefinizioneclick') -checklinks_number = config.get_setting('checklinks_number', 'altadefinizioneclick') - -headers = [['Referer', host]] - +@support.menu def mainlist(item): - support.log() - itemlist = [] + support.log() - support.menu(itemlist, 'Film', 'peliculas', host + "/nuove-uscite/") - support.menu(itemlist, 'Per Genere submenu', 'menu', host, args='Film') - support.menu(itemlist, 'Per Anno submenu', 'menu', host, args='Anno') - support.menu(itemlist, 'Sub-ITA', 'peliculas', host + "/sub-ita/") - support.menu(itemlist, 'Cerca...', 'search', host, 'movie') - support.aplay(item, itemlist,list_servers, list_quality) - support.channel_config(item, itemlist) + film = '' #'/nuove-uscite/' + filmSub = [ + ('Novità', ['/nuove-uscite/', 'peliculas']), + ('Al Cinema', ['/film-del-cinema', 'peliculas']), + ('Generi', ['', 'menu', 'Film']), + ('Anni', ['', 'menu', 'Anno']), + ('Qualità', ['', 'menu', 'Qualita']), + ('Sub-ITA', ['/sub-ita/', 'peliculas']) + ] - return itemlist + return locals() +@support.scrape +def menu(item): + support.log() + + action='peliculas' + patron = r'(?P[^<]+)' + patronBlock= r'(.*?)' + + return locals() + +@support.scrape +def peliculas(item): + support.log() + if item.extra == 'search': + patron = r'\s*(?:(?P[^<]+)'\ + '<\/span>)?[^"]+)"[^>]+>[^>]+>[^>]+>(?P[^<]+)<[^<]+>'\ + '(?:.*?IMDB:\s(\2[^<]+)<\/div>)?' + else: + patron = r'[^"]+)[^>]+><\/a>.*?(?P[^(?:\]|<)]+)'\ + '(?:\[(?P[^\]]+)\])?<\/a>[^>]+>[^>]+>[^>]+>(?:\sIMDB\:\s(?P[^<]+)<)?'\ + '(?:.*?(?P[^<]+)<\/span>)?\s*' + + return locals() def search(item, texto): support.log("search ", texto) @@ -77,36 +96,6 @@ def newest(categoria): return itemlist - -def menu(item): - support.log() - itemlist = support.scrape(item, '([^<]+)', ['url', 'title'], headers, patron_block='(.*?)', action='peliculas') - return support.thumb(itemlist) - -def peliculas(item): - support.log() - if item.extra == 'search': - patron = r'\s*(?:([^<]+)<\/span>)?]+>[^>]+>[^>]+>([^<]+)<[^<]+>(?:.*?IMDB:\s([^<]+)<\/div>)?' - elements = ['url', 'quality', 'thumb', 'title', 'rating'] - - else: - patron = r']+><\/a>.*?([^(?:\]|<)]+)(?:\[([^\]]+)\])?<\/a>[^>]+>[^>]+>[^>]+>(?:\sIMDB\:\s([^<]+)<)?(?:.*?([^<]+)<\/span>)?\s*([^<]+)<', ['url','title'],patron_block='(.*?)<\/ul>', action='findvideos') + return support.scrape(item, '([^<]+)<', ['url','title'],patronBlock='(.*?)<\/ul>', action='findvideos') def newest(categoria): log('ANIME PER TUTTI') @@ -83,7 +83,7 @@ def newest(categoria): return itemlist def genres(item): - itemlist = support.scrape(item, '([^<]+)<', ['url', 'title'], action='peliculas', patron_block=r'Generi.*?(.*?)<\/ul>', blacklist=['Contattaci','Privacy Policy', 'DMCA']) + itemlist = support.scrape(item, '([^<]+)<', ['url', 'title'], action='peliculas', patronBlock=r'Generi.*?(.*?)<\/ul>', blacklist=['Contattaci','Privacy Policy', 'DMCA']) return support.thumb(itemlist) def peliculas(item): diff --git a/channels/animeworld.py b/channels/animeworld.py index 5b0ac071..faeba1e7 100644 --- a/channels/animeworld.py +++ b/channels/animeworld.py @@ -45,10 +45,10 @@ def mainlist(item): def generi(item): log() - patron_block = r'\sGeneri\s*(.*?)' + patronBlock = r'\sGeneri\s*(.*?)' patron = r'' - return support.scrape(item, patron, ['url','title'], patron_block=patron_block, action='video') + return support.scrape(item, patron, ['url','title'], patronBlock=patronBlock, action='video') # Crea Menu Filtro ====================================================== @@ -118,7 +118,7 @@ def search(item, texto): # Lista A-Z ==================================================== def alfabetico(item): - return support.scrape(item, '', ['url', 'title'], patron_block=r'.*?A alla Z.<\/span>.*?(.*?)<\/ul>', action='lista_anime') + return support.scrape(item, '', ['url', 'title'], patronBlock=r'.*?A alla Z.<\/span>.*?(.*?)<\/ul>', action='lista_anime') def lista_anime(item): @@ -259,9 +259,10 @@ def video(item): def episodios(item): log() itemlist = [] + patron_block = r'server active(.*?)server hidden ' patron = r']+>([^<]+)<' - matches = support.match(item, patron, patron_block)[0] + matches = support.match(item, patron, patronBlock)[0] for scrapedurl, scrapedtitle in matches: itemlist.append( diff --git a/channels/cineblog01.py b/channels/cineblog01.py index 0881884a..ea56d0e9 100644 --- a/channels/cineblog01.py +++ b/channels/cineblog01.py @@ -36,31 +36,24 @@ blacklist = ['BENVENUTI', 'Richieste Serie TV', 'CB01.UNO ▶ TROVA L’ 'Openload: la situazione. Benvenuto Verystream', 'Openload: lo volete ancora?'] +@support.menu def mainlist(item): findhost() + film = '' + filmSub = [ + ('HD', ['', 'menu', 'Film HD Streaming']), + ('Generi', ['', 'menu', 'Film per Genere']), + ('Anni', ['', 'menu', 'Film per Anno']) + ] + tvshow = '/serietv/' + tvshowSub = [ + ('Aggiornamenti serie tv', ['/serietv/aggiornamento-quotidiano-serie-tv/', 'last']), + ('Per Lettera', ['/serietv/', 'menu', 'Serie-Tv per Lettera']), + ('Per Genere', ['/serietv/aggiornamento-quotidiano-serie-tv/', 'menu', 'Serie-Tv per Genere']), + ('Per anno', ['/serietv/aggiornamento-quotidiano-serie-tv/', 'menu', 'Serie-Tv per Anno']) + ] - autoplay.init(item.channel, list_servers, list_quality) - - # Main options - itemlist = [] - support.menu(itemlist, 'Ultimi 100 Film Aggiornati bold', 'last', host + '/lista-film-ultimi-100-film-aggiornati/') - - support.menu(itemlist, 'Film bold', 'peliculas', host) - support.menu(itemlist, 'HD submenu', 'menu', host, args="Film HD Streaming") - support.menu(itemlist, 'Per genere submenu', 'menu', host, args="Film per Genere") - support.menu(itemlist, 'Per anno submenu', 'menu', host, args="Film per Anno") - support.menu(itemlist, 'Cerca film... submenu', 'search', host, args='film') - - support.menu(itemlist, 'Serie TV bold', 'peliculas', host + '/serietv/', contentType='tvshow') - support.menu(itemlist, 'Aggiornamenti serie tv', 'last', host + '/serietv/aggiornamento-quotidiano-serie-tv/', contentType='tvshow') - support.menu(itemlist, 'Per Lettera submenu', 'menu', host + '/serietv/', contentType='tvshow', args="Serie-Tv per Lettera") - support.menu(itemlist, 'Per Genere submenu', 'menu', host + '/serietv/', contentType='tvshow', args="Serie-Tv per Genere") - support.menu(itemlist, 'Per anno submenu', 'menu', host + '/serietv/', contentType='tvshow', args="Serie-Tv per Anno") - support.menu(itemlist, 'Cerca serie... submenu', 'search', host + '/serietv/', contentType='tvshow', args='serie') - - autoplay.show_option(item.channel, itemlist) - - return itemlist + return locals() def menu(item): @@ -110,7 +103,7 @@ def newest(categoria): item.url = host + '/lista-film-ultimi-100-film-aggiunti/' return support.scrape(item, r']+)>([^<([]+)(?:\[([A-Z]+)\])?\s\(([0-9]{4})\)<\/a>', ['url', 'title', 'quality', 'year'], - patron_block=r'Ultimi 100 film aggiunti:.*?<\/td>') + patronBlock=r'Ultimi 100 film aggiunti:.*?<\/td>') def last(item): @@ -170,21 +163,22 @@ def last(item): return itemlist +@support.scrape def peliculas(item): support.log() if item.contentType == 'movie' or '/serietv/' not in item.url: - patron = r'.*?]+)(?:\/|")>([^<[(]+)(?:\[([A-Za-z0-9/-]+)])? (?:\(([0-9]{4})\))?.*?([^<>&]+).*?DURATA ([0-9]+).*?([^<>]+)' - listGroups = ['thumb', 'url', 'title', 'quality', 'year', 'genre', 'duration', 'plot'] + patron = r'.*?]+)(?:\/|")>(?P[^<[(]+)(?:\[(?P[A-Za-z0-9/-]+)])? (?:\((?P[0-9]{4})\))?.*?(?P[^<>&]+).*?DURATA (?P[0-9]+).*?(?P[^<>]+)' action = 'findvideos' else: - patron = r'div class="card-image">.*?([^<[(]+)<\/a>.*?([^<>0-9(]+)\(([0-9]{4}).*?(?:p|div)>(.*?).*?(?P[^<[(]+)<\/a>.*?(?P[^<>0-9(]+)\((?P[0-9]{4}).*?(?:p|div)>(?P.*?)(.*?)
(.*?)
(?P