#!/usr/bin/env python3 from http.server import BaseHTTPRequestHandler, HTTPServer import datetime from time import perf_counter import os import json import urllib.parse import configuration import socket import requests import re from userio import * # Random Example URL: https://manganelo.tv/chapter/dy925032/chapter_21 # Random Example URL: https://manganelo.tv/chapter/read_rurouni_kenshin/chapter_257 server = None csvFilename = None connectionResults = None def completedManganeloTV(genre): if genre is None: genre="" url = "https://manganelo.tv/genre/"+genre+"?state=completed" say("display by genre: ["+genre+"]") say(url) pageContent = "" pageContent += "
\n" pageContent += "
\n" pageContent += "
\n" pageContent += "
\n" if configuration.get_debug() != 0: pageContent += "

Request: "+url+"

\n" r = requests.get(url, allow_redirects=True) content = r.text #pageContent += content articleCstBegin="
" articleCstEnd="
" indexBegin = content.index(articleCstBegin) indexEnd = content.index(articleCstEnd) dataContent = content[indexBegin+len(articleCstBegin):indexEnd] dataContent = re.sub(r"(.*?)", '', dataContent) dataContent = re.sub(r"(.*?)", '', dataContent) dataContent = re.sub(r"onerror=\"javascript:this.src='/res/img/404_not_found.webp';\" ", '', dataContent) dataContent = re.sub(r"href=\"\/", 'href=\"//manganelo.tv/', dataContent) dataContent = re.sub(r"src=\"\/", 'src=\"//manganelo.tv/', dataContent) dataContent = re.sub(r"Read more", '', dataContent) dataContent = re.sub(r"", '', dataContent) dataContent = re.sub(r"(.*)", '', dataContent) dataContent = re.sub(r"(.*?)", '

\g<1>

', dataContent) dataContent = re.sub(r"
", '
', dataContent) dataContent = re.sub(r"
", '

', dataContent) dataContent = re.sub(r"(.*),(.*)", '', dataContent) pageContent += "
\n" pageContent += dataContent return pageContent def getManganeloTV(url): debug("Downloading: "+url) #if "manganelo.com" in url: # url=url.replace("manganelo.com","manganelo.tv") # say("Replace URL:"+url) r = requests.get(url, allow_redirects=True) content = r.text isMangakakalot = 0 if "mangakakalot.com" in url: isMangakakalot = 1 #print(r.text) lineNextChapter = None linePreviousChapter = None lineTitle = None linkNext = None linkPrev = None listImages = [] for line in content.split("\n"): if "navi-change-chapter-btn-prev a-h" in line and linePreviousChapter is None: linePreviousChapter = line elif "navi-change-chapter-btn-next a-h" in line and lineNextChapter is None: print("Found at"+str(line)) lineNextChapter = line elif "" in line and lineNextChapter is None and linkNext is None: for subLine in line.split("><"): if "NEXT CHAPTER" in subLine: linkNext=subLine.split("'")[1] elif isMangakakalot == 1 and "
" in line and linePreviousChapter is None and linkPrev is None: for subLine in line.split("><"): if "PREV CHAPTER" in subLine: linkPrev=subLine.split("'")[1] elif "<"): if "https://" in subLine: if ".jpg" in subLine.split("\"")[1]: listImages.append(subLine.split("\"")[1]) if None is not linePreviousChapter: say("Prev :"+str(len(linePreviousChapter))) #i.e First chapter is opened if 200 < len(linePreviousChapter): tempLine = linePreviousChapter linePreviousChapter = None for line in tempLine.split("><"): if "navi-change-chapter-btn-prev a-h" in line and linePreviousChapter is None: linePreviousChapter = line linkPrev=linePreviousChapter.split("\"")[5] else: linkPrev="https://manganelo.tv"+linePreviousChapter.split("\"")[5] if None is not lineNextChapter: #i.e Last chapter is opened say("Next :"+str(len(lineNextChapter))) if 200 < len(lineNextChapter): tempLine = lineNextChapter lineNextChapter = None for line in tempLine.split("><"): if "navi-change-chapter-btn-next a-h" in line and lineNextChapter is None: lineNextChapter = line linkNext=lineNextChapter.split("\"")[5] else: linkNext="https://manganelo.tv"+lineNextChapter.split("\"")[5] mangaImagesNum = len(listImages) if not isMangakakalot: mangaTitle=lineTitle.split("\"")[3].split(" - Manganelo")[0] else: mangaTitle=lineTitle.split("\"")[3].split(" - Mangakakalot.com")[0] say("Manga :"+mangaTitle) pageContent = "" pageContent += "
\n" pageContent += "
"+mangaTitle+"
\n" if linkPrev is not None: pageContent += "
\n" if linkNext is not None: pageContent += "
\n" pageContent += "
\n" pageContent += " / "+str(mangaImagesNum)+"\n" pageContent += " 0\n" pageContent += "
\n" opacityValue=2; if 7 <= datetime.datetime.now().hour and 20 >= datetime.datetime.now().hour: opacityValue=10; pageContent += " " pageContent += " "+str(opacityValue)+"" pageContent += " \n" pageContent += "
\n" pageContent += "
\n" pageContent += "
\n" pageContent += "
\n\n" cpt = 0 for pageImage in listImages: #debug(pageImage) pageContent += "\n" pageContent += "\n" cpt += 1 pageContent += "
\n" return pageContent class MyServer(BaseHTTPRequestHandler): def log_message(self, format, *args): # To silence the default output of server (too verbose) return def do_GET(self): global csvFilename global csvFilenameTemp global connectionResults rootdir = 'pages/static/' csvFilename = rootdir + server['csv'] csvFilenameTemp = rootdir + server['csvTemp'] if '/list.html' in self.path: page=[] data_begin = "" with open(configuration.get_pageBegin(),'r') as fStart: data_begin += fStart.read().replace( 'CSTAPPNAME', server['name'] ) data_end = "" with open(configuration.get_pageEnd(),'r') as fEnd: data_end += fEnd.read().replace( 'CSTAPPNAME', server['name'] ).replace( 'CSTAPPVERSION', server['version'] ) data_page = "" with open("list.html", "rt") as f: lines=f.readlines() for line in lines: data_page += "
  • "+line.split("@")[1]+"
  • " f.close() page.append(data_begin) page.append(data_page) page.append(data_end) content = ''.join(page) self.send_response(200) self.send_header("Content-type", "text/html") self.send_header('Server',server['name']+" v"+server['version']) self.end_headers() self.wfile.write(content.encode('utf-8')) elif not os.path.exists(rootdir + self.path) or self.path == '/index.html' or self.path == '/': if self.headers['X-Real-IP'] is None: say("From: "+self.client_address[0]+" GET Received : "+self.path) else: say("From: "+self.headers['X-Real-IP']+" GET Received : "+self.path) page=[] data_begin = "" with open(configuration.get_pageBegin(),'r') as fStart: data_begin += fStart.read().replace( 'CSTAPPNAME', server['name'] ) data_end = "" with open(configuration.get_pageEnd(),'r') as fEnd: data_end += fEnd.read().replace( 'CSTAPPNAME', server['name'] ).replace( 'CSTAPPVERSION', server['version'] ) s = self.path urlArgs = urllib.parse.parse_qs(s[2:]) url = None if "url" in urlArgs: url = urlArgs['url'][0] data_page = "" #Forging response if configuration.get_debug() != 0: data_page += "

    Request: "+self.path+"

    \n" data_page += ""+json.dumps(urlArgs)+"\n" if not url is None: if "manganelo" in url: data_page += getManganeloTV(url) elif "readmanganato.com" in url: data_page += getManganeloTV(url) elif "mangakakalot.com" in url: data_page += getManganeloTV(url) else: warn("Unsupported Hoster at "+url) data_page += "Unsupported hoster at "+url+"" data_page += "
    " else: try: with open(server['favorite'], "rt") as f: lines=f.readlines() for line in lines: data_page += "
  • "+line+"
  • " f.close() except: pass data_form = "
    \n\ Url:\n\ \n\ \n\
    \n" data_page += data_form page.append(data_begin) page.append(data_page) page.append(data_end) content = ''.join(page) self.send_response(200) self.send_header("Content-type", "text/html") self.send_header('Server',server['name']+" v"+server['version']) self.end_headers() self.wfile.write(content.encode('utf-8')) elif not os.path.exists(rootdir + self.path): self.send_header('Server',server['name']+" v"+server['version']) self.send_error(404, 'file not found') else: try: #say(self.path) f = open(rootdir + self.path,'rb') #open requested file self.send_response(200) if self.path.endswith('.css'): self.send_header('Content-type','text/css') elif self.path.endswith('.bmp'): self.send_header('Content-type','image/x-ms-bmp') elif self.path.endswith('.png'): self.send_header('Content-type','image/png') elif self.path.endswith('.jpg'): self.send_header('Content-type','image/jpeg') else: self.send_header('Content-type','text/html') self.send_header('Server',server['name']+" v"+server['version']) self.end_headers() self.wfile.write(f.read()) f.close() return except IOError: self.send_header('Server',server['name']+" v"+server['version']) self.send_error(404, 'file not found') if __name__ == "__main__": #global server server = configuration.get_server() say(server['name']+" v"+server['version']) webServer = HTTPServer((server['address'], server['port']), MyServer) say("Server started http://%s:%s" % (server['address'], server['port'])) try: webServer.serve_forever() except KeyboardInterrupt: pass webServer.server_close() print("Server stopped.")