|
|
|
#!/usr/bin/env python
|
|
|
|
"""
|
|
|
|
This is a program that generates playlists based on the size of the
|
|
|
|
largest file/directory. It searches directories, getting their size
|
|
|
|
and lists the first file in the largest direcotry.
|
|
|
|
"""
|
|
|
|
|
|
|
|
import errno
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
|
|
|
|
class File:
|
|
|
|
"""A file has a size and a name"""
|
|
|
|
|
|
|
|
def __init__(self, path):
|
|
|
|
self.name = path
|
|
|
|
self.size = os.path.getsize(self.name)
|
|
|
|
|
|
|
|
def get_size(self):
|
|
|
|
"""Get the size of the current file"""
|
|
|
|
return self.size
|
|
|
|
|
|
|
|
def get_name(self):
|
|
|
|
"""Get the name of the current file"""
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
class Directory:
|
|
|
|
"""A directory is a list that can contain files and other directories."""
|
|
|
|
|
|
|
|
def __init__(self, path):
|
|
|
|
self.path = path
|
|
|
|
self.files = []
|
|
|
|
|
|
|
|
files = os.listdir(path)
|
|
|
|
files.sort()
|
|
|
|
for fil in files:
|
|
|
|
if type(fil).__name__ == "str":
|
|
|
|
self.files.append(File("%s/%s" % (path, fil)))
|
|
|
|
|
|
|
|
def get_dir_name(self):
|
|
|
|
"""Get the name of the current directory."""
|
|
|
|
return self.path
|
|
|
|
|
|
|
|
def get_dir_size(self):
|
|
|
|
"""Get the size of the current directory."""
|
|
|
|
ret = 0
|
|
|
|
for fil in self.files:
|
|
|
|
ret += fil.get_size()
|
|
|
|
return ret
|
|
|
|
|
|
|
|
def get_head_file(self):
|
|
|
|
"""Get the 'head' file in the directory."""
|
|
|
|
return self.files[0].get_name()
|
|
|
|
|
|
|
|
def num_files(self):
|
|
|
|
"""Get the number of files in the directory."""
|
|
|
|
return len(self.files)
|
|
|
|
|
|
|
|
def remove_head_file(self):
|
|
|
|
"""Remove the head file from being counted."""
|
|
|
|
self.files = self.files[1:]
|
|
|
|
|
|
|
|
def sort_dir(direct):
|
|
|
|
"""Sort the directories by size."""
|
|
|
|
return direct.get_dir_size()
|
|
|
|
|
|
|
|
def main():
|
|
|
|
"""The main script."""
|
|
|
|
try:
|
|
|
|
base_dir = sys.argv[1]
|
|
|
|
except IndexError:
|
|
|
|
print "Must enter path of directory to search. Example: %s ./foo" % \
|
|
|
|
sys.argv[0]
|
|
|
|
os.abort()
|
|
|
|
|
|
|
|
if os.path.exists(base_dir) == False:
|
|
|
|
print "Could not find path: '%s'" % base_dir
|
|
|
|
os.abort()
|
|
|
|
|
|
|
|
if base_dir[-1] == "/":
|
|
|
|
base_dir = base_dir[:-1]
|
|
|
|
|
|
|
|
base_dir_listing = os.listdir(base_dir)
|
|
|
|
directories = []
|
|
|
|
|
|
|
|
for direct in base_dir_listing:
|
|
|
|
rel_dir = "%s/%s" % (base_dir, direct)
|
|
|
|
|
|
|
|
if os.path.islink(rel_dir) == False and os.path.isdir(rel_dir):
|
|
|
|
directories.append(Directory(rel_dir))
|
|
|
|
|
|
|
|
while directories:
|
|
|
|
directories.sort(key=sort_dir)
|
|
|
|
directories.reverse()
|
|
|
|
headfile = directories[0].get_head_file()
|
|
|
|
#headfile = headfile.replace('podcasts/', 'podcast/', 1)
|
|
|
|
#print headfile
|
|
|
|
try:
|
|
|
|
sys.stdout.write("%s\n" % headfile)
|
|
|
|
except IOError as e:
|
|
|
|
if e.errno == errno.EPIPE:
|
|
|
|
return
|
|
|
|
raise e
|
|
|
|
directories[0].remove_head_file()
|
|
|
|
if directories[0].num_files() == 0:
|
|
|
|
directories = directories[1:]
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|