Advertisement
Zanoab

hbsender.py

Dec 11th, 2014
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.25 KB | None | 0 0
  1. #!/usr/bin/python
  2. from __future__ import print_function, unicode_literals
  3.  
  4. import argparse
  5. parser = argparse.ArgumentParser(description="Sends the provided 3dsx file to the hbmenu.")
  6. parser.add_argument(dest='file', action='store',
  7.     help="Sends the specified file.")
  8. parser.add_argument(dest='address', action='store',
  9.     help="Address to send the file.")
  10. parser.add_argument(dest='port', action='store', type=int, nargs="?", default=9000)
  11. args = parser.parse_args()
  12.  
  13. import sys, socket, time, contextlib
  14.  
  15. # Check arguments
  16. if ":" in args.address:
  17.     args.address, port = args.address.split(":", 1)
  18.     if port:
  19.         if port.isdigit():
  20.             args.port = int(port)
  21.         else:
  22.             raise ValueError("'{}' is an invalid port")
  23.  
  24. print("Checking '{}'".format(args.file))
  25. with open(args.file, 'rb') as f:
  26.     # Get file size
  27.     f.seek(0, 2)
  28.     fSize = f.tell()
  29.     f.seek(0, 0)
  30.     print("'{}': {} bytes".format(args.file, fSize))
  31.     if fSize <= 0:
  32.         sys.exit("Empty file")
  33.    
  34.     print("Connecting to {}:{}...".format(args.address, args.port))
  35.     s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0)
  36.     s.connect((args.address, args.port))
  37.     print("Connected!")
  38.    
  39.     @contextlib.contextmanager
  40.     def statusline(endMsg=""):
  41.         yield
  42.         sys.stdout.write("\n")
  43.         if endMsg:
  44.             print(endMsg)
  45.    
  46.     bSize = -1
  47.     try:
  48.         with statusline():
  49.             write, flush, d = sys.stdout.write, sys.stdout.flush, len("{:,}".format(fSize))
  50.             # sent = 0
  51.             fSent = 0
  52.             buffer = b""
  53.             e = 0
  54.             while fSent < fSize:
  55.                 c = f.tell()
  56.                 if c < fSize:
  57.                     # if bSize <= 0 and len(buffer) <= sent:
  58.                     #   buffer = f.read()
  59.                     #   sent = 0
  60.                     # elif len(buffer) - sent < bSize:
  61.                     #   buffer = buffer[sent:]+f.read(min(bSize, fSize - c))
  62.                     #   sent = 0
  63.                     if bSize <= 0 and not len(buffer):
  64.                         buffer = f.read()
  65.                     elif len(buffer) < bSize:
  66.                         buffer += f.read(min(bSize, fSize - c))
  67.                
  68.                 # a = s.send(buffer[sent:])
  69.                 # sent += a
  70.                 # fSent += a
  71.                
  72.                 a = s.send(buffer)
  73.                 buffer = buffer[a:]
  74.                 fSent += a
  75.                
  76.                 if time.time() - e > 1:
  77.                     write('\rSending... {: >{},} / {:,} bytes ({: >.3}%) '.format(fSent, d, fSize, fSent * 100.0 / fSize))
  78.                     flush()
  79.                     e = time.time()
  80.     except:
  81.         print("Aborted!")
  82.         raise
  83.     finally:
  84.         s.close()
  85.  
  86. sys.exit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement