add logging

This commit is contained in:
odysseusmax 2020-08-11 06:29:09 +00:00
parent 4d0a757c94
commit 0ae39532c3
6 changed files with 82 additions and 59 deletions

View File

@ -1,3 +1,51 @@
from .main import main import asyncio
import pathlib
import logging
import aiohttp_jinja2
import jinja2
from aiohttp import web
from .telegram import Client
from .routes import setup_routes
from .views import Views
from .config import host, port, session_string, api_id, api_hash, debug
TEMPLATES_ROOT = pathlib.Path(__file__).parent / 'templates'
client = Client(session_string, api_id, api_hash)
logging.basicConfig(level=logging.DEBUG if debug else logging.INFO)
logging.getLogger("telethon").setLevel(logging.INFO if debug else logging.ERROR)
log = logging.getLogger("tg-index")
def setup_jinja(app):
loader = jinja2.FileSystemLoader(str(TEMPLATES_ROOT))
aiohttp_jinja2.setup(app, loader=loader)
async def start():
await client.start()
log.debug("telegram client started!")
async def stop(app):
await client.disconnect()
log.debug("telegram client disconnected!")
async def init():
server = web.Application()
await start()
setup_routes(server, Views(client))
setup_jinja(server)
server.on_cleanup.append(stop)
return server
def main():
loop = asyncio.get_event_loop()
app = loop.run_until_complete(init())
web.run_app(app, host=host, port=port)
main() main()

View File

@ -31,3 +31,4 @@ except (KeyError, ValueError):
sys.exit(1) sys.exit(1)
host = os.environ.get("HOST", "0.0.0.0") host = os.environ.get("HOST", "0.0.0.0")
debug = bool(os.environ.get("DEBUG"))

View File

@ -1,42 +0,0 @@
import asyncio
import pathlib
import aiohttp_jinja2
import jinja2
from aiohttp import web
from .telegram import Client
from .routes import setup_routes
from .views import Views
from .config import host, port, session_string, api_id, api_hash
TEMPLATES_ROOT = pathlib.Path(__file__).parent / 'templates'
client = Client(session_string, api_id, api_hash)
def setup_jinja(app):
loader = jinja2.FileSystemLoader(str(TEMPLATES_ROOT))
aiohttp_jinja2.setup(app, loader=loader)
async def start():
await client.start()
async def stop(app):
await client.disconnect()
async def init():
server = web.Application()
await start()
setup_routes(server, Views(client))
setup_jinja(server)
server.on_cleanup.append(stop)
return server
def main():
loop = asyncio.get_event_loop()
app = loop.run_until_complete(init())
web.run_app(app, host=host, port=port)

View File

@ -11,6 +11,7 @@ class Client(TelegramClient):
super().__init__(StringSession(session_string), *args, **kwargs) super().__init__(StringSession(session_string), *args, **kwargs)
self.log = logging.getLogger(__name__) self.log = logging.getLogger(__name__)
async def download(self, file, file_size, offset, limit): async def download(self, file, file_size, offset, limit):
part_size = 1024 * 1024 part_size = 1024 * 1024
first_part_cut = offset % part_size first_part_cut = offset % part_size
@ -27,11 +28,11 @@ class Client(TelegramClient):
yield chunk[:last_part_cut] yield chunk[:last_part_cut]
else: else:
yield chunk yield chunk
self.log.debug(f"Part {part}/{last_part} (total {part_count}) downloaded") self.log.debug(f"Part {part}/{last_part} (total {part_count}) served!")
part += 1 part += 1
self.log.debug("download finished") self.log.debug("serving finished")
except (GeneratorExit, StopAsyncIteration, asyncio.CancelledError): except (GeneratorExit, StopAsyncIteration, asyncio.CancelledError):
self.log.debug("download interrupted") self.log.debug("file serve interrupted")
raise raise
except Exception: except Exception:
self.log.debug("download errored", exc_info=True) self.log.debug("file serve errored", exc_info=True)

View File

@ -7,7 +7,7 @@
<script src="https://cdn.fluidplayer.com/v3/current/fluidplayer.min.js"></script> <script src="https://cdn.fluidplayer.com/v3/current/fluidplayer.min.js"></script>
<title> <title>
{{title}} {% if title %} {{title}} {% else %} Telegram Index {% endif %}
</title> </title>
</head> </head>

View File

@ -1,11 +1,16 @@
import logging
from aiohttp import web from aiohttp import web
import aiohttp_jinja2 import aiohttp_jinja2
from jinja2 import Markup from jinja2 import Markup
from telethon.tl import types from telethon.tl import types
from telethon.tl.custom import Message from telethon.tl.custom import Message
from .util import get_file_name, get_human_size from util import get_file_name, get_human_size
from .config import chat_id from config import chat_id
log = logging.getLogger(__name__)
class Views: class Views:
@ -16,14 +21,17 @@ class Views:
@aiohttp_jinja2.template('index.html') @aiohttp_jinja2.template('index.html')
async def index(self, req): async def index(self, req):
log_msg = ''
try: try:
offset_val = int(req.query.get('page', '1')) offset_val = int(req.query.get('page', '1'))
except: except:
offset_val = 1 offset_val = 1
log_msg += f"page: {offset_val} | "
try: try:
search_query = req.query.get('search', '') search_query = req.query.get('search', '')
except: except:
search_query = '' search_query = ''
log_msg += f"search query: {search_query} | "
offset_val = 0 if offset_val <=1 else offset_val-1 offset_val = 0 if offset_val <=1 else offset_val-1
try: try:
if search_query: if search_query:
@ -31,7 +39,10 @@ class Views:
else: else:
messages = (await self.client.get_messages(chat_id, limit=20, add_offset=20*offset_val)) or [] messages = (await self.client.get_messages(chat_id, limit=20, add_offset=20*offset_val)) or []
except: except:
log.debug("failed to get messages", exc_info=True)
messages = [] messages = []
log_msg += f"found {len(messages)} results"
log.debug(log_msg)
results = [] results = []
for m in messages: for m in messages:
if m.file and not isinstance(m.media, types.MessageMediaWebPage): if m.file and not isinstance(m.media, types.MessageMediaWebPage):
@ -79,7 +90,6 @@ class Views:
'cur_page' : offset_val+1, 'cur_page' : offset_val+1,
'next_page': next_page, 'next_page': next_page,
'search': search_query, 'search': search_query,
'title': "Telegram Index"
} }
@ -88,12 +98,12 @@ class Views:
file_id = int(req.match_info["id"]) file_id = int(req.match_info["id"])
message = await self.client.get_messages(entity=chat_id, ids=file_id) message = await self.client.get_messages(entity=chat_id, ids=file_id)
if not message or not isinstance(message, Message): if not message or not isinstance(message, Message):
print(type(message)) log.debug(f"no valid entry for {file_id} in {chat_id}")
return { return {
'found':False, 'found':False,
'reason' : "Entry you are looking for cannot be retrived!", 'reason' : "Entry you are looking for cannot be retrived!",
'title': "Telegram Index"
} }
return_val = {}
if message.file and not isinstance(message.media, types.MessageMediaWebPage): if message.file and not isinstance(message.media, types.MessageMediaWebPage):
file_name = get_file_name(message) file_name = get_file_name(message)
file_size = get_human_size(message.file.size) file_size = get_human_size(message.file.size)
@ -114,7 +124,7 @@ class Views:
else: else:
caption = False caption = False
return { return_val = {
'found': True, 'found': True,
'name': file_name, 'name': file_name,
'id': file_id, 'id': file_id,
@ -125,19 +135,20 @@ class Views:
} }
elif message.message: elif message.message:
text = Markup.escape(message.raw_text).__str__().replace('\n', '<br>') text = Markup.escape(message.raw_text).__str__().replace('\n', '<br>')
return { return_val = {
'found': True, 'found': True,
'media': False, 'media': False,
'text': text, 'text': text,
'title': "Telegram Index"
} }
else: else:
return { return_val = {
'found':False, 'found':False,
'reason' : "Some kind of entry that I cannot display", 'reason' : "Some kind of entry that I cannot display",
'title': "Telegram Index"
} }
log.debug(f"data for {file_id} in {chat_id} returned as {return_val}")
return return_val
async def download_get(self, req): async def download_get(self, req):
return await self.handle_request(req) return await self.handle_request(req)
@ -160,11 +171,13 @@ class Views:
message = await self.client.get_messages(entity=chat_id, ids=file_id) message = await self.client.get_messages(entity=chat_id, ids=file_id)
if not message or not message.file: if not message or not message.file:
log.info(f"no result for {file_id} in {chat_id}")
return web.Response(status=410, text="410: Gone. Access to the target resource is no longer available!") return web.Response(status=410, text="410: Gone. Access to the target resource is no longer available!")
if thumb and message.document: if thumb and message.document:
thumbnail = message.document.thumbs thumbnail = message.document.thumbs
if not thumbnail: if not thumbnail:
log.info(f"no thumbnail for {file_id} in {chat_id}")
return web.Response(status=404, text="404: Not Found") return web.Response(status=404, text="404: Not Found")
thumbnail = thumbnail[-1] thumbnail = thumbnail[-1]
mime_type = 'image/jpeg' mime_type = 'image/jpeg'
@ -188,6 +201,7 @@ class Views:
if (limit > size) or (offset < 0) or (limit < offset): if (limit > size) or (offset < 0) or (limit < offset):
raise ValueError("range not in acceptable format") raise ValueError("range not in acceptable format")
except ValueError: except ValueError:
log.info("Range Not Satisfiable", exc_info=True)
return web.Response( return web.Response(
status=416, status=416,
text="416: Range Not Satisfiable", text="416: Range Not Satisfiable",
@ -198,6 +212,7 @@ class Views:
if not head: if not head:
body = self.client.download(media, size, offset, limit) body = self.client.download(media, size, offset, limit)
log.info(f"Serving file {message.id} in {chat_id} ; Range: {offset} - {limit}")
else: else:
body = None body = None