add logging
This commit is contained in:
parent
4d0a757c94
commit
0ae39532c3
|
@ -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()
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
42
app/main.py
42
app/main.py
|
@ -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)
|
|
|
@ -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)
|
||||||
|
|
|
@ -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>
|
||||||
|
|
35
app/views.py
35
app/views.py
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue