#!/usr/bin/python
# track.py : Periodically prints a file's size.
#            Exits if size doesn't change in
#            TIMEOUT seconds.
#            Useful to track downloads.
#
# author :   Deepak Sarda
#            firstname.lastname@gmail.com
#
# TODO :     Add runtime options for update-delay
#            and timeout

__author__      = 'Deepak Sarda'
__version__     = '0.5'
__copyright__   = '(c) 2005 Deepak Sarda'
__license__     = 'Public Domain'
__url__         = 'http://www.antrix.net/'

import sys
from os import path
import time

UPDATE_DELAY = 0.8
TIMEOUT = 10

if len(sys.argv) != 2:
    print "Usage: $ %s file_to_track" % sys.argv[0]
    raise SystemExit

fullname = sys.argv[1]

if not path.isfile(fullname):
    print "%s is not a valid file!" % fullname
    raise SystemExit

def getSize(_file):
    """getSize(filename) -> string\n\nReturns size of file. Human readability
of returned string given more importance than accuracy."""

    bytes = path.getsize(_file)
    if bytes > 1024*1024:
        mbytes = bytes/(1024*1024)
        bytes -= mbytes*1024*1024
        if bytes > 1024:
            kbytes = bytes/1024
            return '%d.%d megabytes' % (mbytes,kbytes)
        else:
            return '%d megabytes' % mbytes
    if bytes > 1024:
        kbytes = bytes/1024
        bytes -= kbytes*1024
        if bytes:
            return '%d.%d kilobytes' % (kbytes,bytes)
        else:
            return '%d kilobytes' % kbytes
    return '%d bytes' % bytes
#end of getSize

basename, filename = path.split(fullname)
sys.stdout.write(filename)
bars = ['-','\\','|','/']

i = 0
while 1:
    try:
        size = getSize(fullname)
        msg = ' %s %s' % (bars[i%4], size)
        sys.stdout.write(msg)
        sys.stdout.flush()
        time.sleep(UPDATE_DELAY)
        sys.stdout.write('\b'*len(msg))
        i += 1
        #We exit if file hasn't changed in TIMEOUT seconds
        if time.time() - path.getctime(fullname) > TIMEOUT:
            print "\n%s hasn't changed in %d seconds." % (filename, TIMEOUT)
            break
    except:
        #dummy print so that after exit, shell prompt starts on a new line
        print
        break