You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			110 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
#!/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()
 |