def albums_in_dir(path): """Recursively searches the given directory and returns an iterable of (path, items) where path is a containing directory and items is a list of Items that is probably an album. Specifically, any folder containing any media files is an album. """ for root, dirs, files in sorted_walk(path): # Get a list of items in the directory. items = [] for filename in files: try: i = library.Item.from_path(os.path.join(root, filename)) except mediafile.FileTypeError: pass except mediafile.UnreadableFileError: log.warn('unreadable file: ' + filename) else: items.append(i) # If it's nonempty, yield it. if items: yield root, items
def albums_in_dir(path): """Recursively searches the given directory and returns an iterable of (path, items) where path is a containing directory and items is a list of Items that is probably an album. Specifically, any folder containing any media files is an album. """ for root, dirs, files in sorted_walk(path): # Get a list of items in the directory. items = [] for filename in files: try: i = library.Item.from_path(os.path.join(root, filename)) except mediafile.FileTypeError: pass except mediafile.UnreadableFileError: log.warn('unreadable file: ' + filename) else: items.append(i) # If it's nonempty, yield it. if items: yield root, items
def albums_in_dir(path, ignore=()): """Recursively searches the given directory and returns an iterable of (path, items) where path is a containing directory and items is a list of Items that is probably an album. Specifically, any folder containing any media files is an album. Directories and file names that match the glob patterns in ``ignore`` are skipped. """ collapse_root = None collapse_items = None for root, dirs, files in sorted_walk(path, ignore): # Get a list of items in the directory. items = [] for filename in files: try: i = library.Item.from_path(os.path.join(root, filename)) except mediafile.FileTypeError: pass except mediafile.UnreadableFileError: log.warn('unreadable file: ' + filename) else: items.append(i) # If we're collapsing, test to see whether we should continue to # collapse. If so, just add to the collapsed item set; # otherwise, end the collapse and continue as normal. if collapse_root is not None: if collapse_root in ancestry(root): # Still collapsing. collapse_items += items continue else: # Collapse finished. Yield the collapsed directory and # proceed to process the current one. if collapse_items: yield collapse_root, collapse_items collapse_root = collapse_items = None # Does the current directory look like a multi-disc album? If # so, begin collapsing here. if dirs and not items: # Must be only directories. multidisc = False for marker in MULTIDISC_MARKERS: pat = MULTIDISC_PAT_FMT % marker if all(re.search(pat, dirname, re.I) for dirname in dirs): multidisc = True break # This becomes True only when all directories match a # pattern for a single marker. if multidisc: # Start collapsing; continue to the next iteration. collapse_root = root collapse_items = [] continue # If it's nonempty, yield it. if items: yield root, items # Clear out any unfinished collapse. if collapse_root is not None and collapse_items: yield collapse_root, collapse_items
def albums_in_dir(path, ignore=()): """Recursively searches the given directory and returns an iterable of (path, items) where path is a containing directory and items is a list of Items that is probably an album. Specifically, any folder containing any media files is an album. Directories and file names that match the glob patterns in ``ignore`` are skipped. """ collapse_root = None collapse_items = None for root, dirs, files in sorted_walk(path, ignore): # Get a list of items in the directory. items = [] for filename in files: try: i = library.Item.from_path(os.path.join(root, filename)) except mediafile.FileTypeError: pass except mediafile.UnreadableFileError: log.warn('unreadable file: ' + filename) else: items.append(i) # If we're collapsing, test to see whether we should continue to # collapse. If so, just add to the collapsed item set; # otherwise, end the collapse and continue as normal. if collapse_root is not None: if collapse_root in ancestry(root): # Still collapsing. collapse_items += items continue else: # Collapse finished. Yield the collapsed directory and # proceed to process the current one. if collapse_items: yield collapse_root, collapse_items collapse_root = collapse_items = None # Does the current directory look like a multi-disc album? If # so, begin collapsing here. if dirs and not items: # Must be only directories. multidisc = False for marker in MULTIDISC_MARKERS: pat = MULTIDISC_PAT_FMT % marker if all(re.search(pat, dirname, re.I) for dirname in dirs): multidisc = True break # This becomes True only when all directories match a # pattern for a single marker. if multidisc: # Start collapsing; continue to the next iteration. collapse_root = root collapse_items = [] continue # If it's nonempty, yield it. if items: yield root, items # Clear out any unfinished collapse. if collapse_root is not None and collapse_items: yield collapse_root, collapse_items