Advertisement
Guest User

gview.py

a guest
Feb 7th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.32 KB | None | 0 0
  1. #!/usr/bin/python3
  2.  
  3. FAQ = '''
  4. =================
  5. ====== ФАК ======
  6. =================
  7. В: ЧТО ЭТО ТАКОЕ?
  8. О: Скрипт для просмотра анимированных гифок в отдельно взятой папке.
  9.  
  10. В: ЧТО ОН ДЕЛАЕТ?
  11. О: Открывает браузер с веб-страницей, на которой отображаются гифки.
  12.  
  13. В: ЧТО ЕМУ НАДО?
  14. О: Питон 3.6. Можно 3.5, но никак не 2.7.
  15.  
  16. В: КАК ЭТИМ ПОЛЬЗОВАТЬСЯ?
  17. О: Есть джва пути:
  18.    1. Закинуть файл со скриптом (gview.py) в папку с гифками и просто дважды щелкнуть.
  19.    2. Через командную строку вписать первым агрументом путь к папке, типа так:
  20.            > python gview.py C:\Pics\Gifs
  21.  
  22. В: ТАМ ВИРУС?
  23. О: Обязательно.
  24.  
  25. В: А КРОМЕ .GIF ЕЩЕ ФОРМАТОВ МОЖНО?
  26. О: Ниже (в коде) есть массив FILE_FORMATS, его можно дополнить расширениями.
  27.   Или вообще удалить фрагмент строки 'if x.suffix in FILE_FORMATS' ниже в коде.
  28.  
  29. В: У МЕНЯ ЭТОТ ПОРТ НЕ ОТКРЫВАЕТСЯ.
  30. О: Порт и адрес сервера можно указать аргументами -p и -a соответственно.
  31. '''
  32.  
  33. from http.server import BaseHTTPRequestHandler, HTTPServer, SimpleHTTPRequestHandler
  34. from pathlib import Path
  35. import webbrowser
  36. import os
  37. import argparse
  38.  
  39. FILE_FORMATS = ['.gif']
  40. HTML_TEMPLATE = '''
  41. <!DOCTYPE html>
  42. <html>
  43. <head>
  44.  <title>Гифки</title>
  45.  <meta charset="utf-8">
  46.  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
  47.  <link rel="shortcut icon" href="https://nowere.net/favicon.gif">
  48. </head>
  49. <body>
  50. <main class="container">
  51.  <div class="row">
  52.    {}
  53.  </div>
  54. </div>
  55. </main>
  56. </body>
  57. </html>
  58. '''
  59. IMG_TEMPLATE = '''
  60. <div class="col">
  61.    <img src="{path}" title="{title}" class="img-thumbnail"/>
  62.    <a href="{path}">{title}</a>
  63. </div>
  64. '''
  65.  
  66. # HTTPRequestHandler class
  67. class testHTTPServer_RequestHandler(SimpleHTTPRequestHandler):
  68.  
  69.     # GET
  70.     def do_GET(self):
  71.         print('p', self.path)
  72.         if self.path == '/':
  73.             self.sendHTML()
  74.         else:
  75.             super().do_GET()
  76.  
  77.     def sendHTML(self):
  78.         # Send response status code
  79.         self.send_response(200)
  80.  
  81.         # Send headers
  82.         self.send_header('Content-type','text/html')
  83.         self.end_headers()
  84.  
  85.         # Send message back to client
  86.         os.chdir(args.path)
  87.         p = Path('.')
  88.         content = ''.join([IMG_TEMPLATE.format_map({'path': os.fspath(x), 'title': x}) for x in p.iterdir() if x.suffix in FILE_FORMATS])
  89.         # Write content as utf-8 data
  90.         message = HTML_TEMPLATE
  91.         message = message.format(content)
  92.         self.wfile.write(bytes(message, "utf8"))
  93.         return
  94.  
  95.  
  96. def run(ip, port):
  97.   print('starting server...')
  98.  
  99.   server_address = (ip, port)
  100.   httpd = HTTPServer(server_address, testHTTPServer_RequestHandler)
  101.   print('running server...')
  102.   httpd.serve_forever()
  103.  
  104.  
  105. if __name__ == '__main__':
  106.     parser = argparse.ArgumentParser(prog='gview.py', description=FAQ, formatter_class=argparse.RawDescriptionHelpFormatter,
  107.                                      usage='python %(prog)s [options]')
  108.     parser.add_argument('path', type=str, nargs='?', default='.',
  109.                         help='Путь к папке с гифками, если не указан, откроется текущая папка')
  110.     parser.add_argument('-p', '--port', type=int, default=8080, metavar='P',
  111.                         help='Порт сервера, по умолчанию 8080')
  112.     parser.add_argument('-a', '--address', type=str, default='127.0.0.1', metavar='A',
  113.                         help='Адрес сервера, по умолчанию 127.0.0.1')
  114.  
  115.     args = parser.parse_args()
  116.     print(args)
  117.     parser.print_help()
  118.     url = 'http://{}:{}'.format(args.address, args.port)
  119.     webbrowser.open_new(url)
  120.     run(args.address, args.port)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement