sub readDirectory { my ($class, $dirname, $validRE) = @_; $validRE ||= Slim::Music::Info::validTypeExtensions(); my @diritems = (); my $log = Slim::Utils::Log::logger('os.files'); my ($volume) = splitpath($dirname); if ($volume && $class->isWinDrive($volume) && !$class->isDriveReady($volume)) { $log->debug("drive [$dirname] not ready"); return @diritems; } Win32::OLE->Option(CP => Win32::OLE::CP_UTF8); my $fsObj = Win32::OLE->new('Scripting.FileSystemObject'); my $folderObj = $fsObj->GetFolder($dirname) || do { $log->debug("opendir on [$dirname] failed: $!"); return @diritems; }; $log->info("Reading directory: $dirname"); foreach my $item (in $folderObj->SubFolders) { my $folder = $item->Name; # call idle streams to service timers - used for blocking animation. if (scalar @diritems % 3) { main::idleStreams(); } next unless Slim::Utils::Misc::fileFilter($dirname, $item->ShortName, $validRE); push @diritems, $folder; } if ( $log->is_info ) { $log->info("Directory contains " . scalar(@diritems) . " items"); } return sort(@diritems); }