[Slim-Checkins] r12507 - in /trunk/server: HTML/EN/html/ HTML/EN/html/docs/ HTML/EN/settings/server/ Slim/Control/ Slim/Utils/ Slim/Web/Settings/Server/
mherger at svn.slimdevices.com
mherger at svn.slimdevices.com
Wed Aug 8 04:21:02 PDT 2007
Author: mherger
Date: Wed Aug 8 04:21:01 2007
New Revision: 12507
URL: http://svn.slimdevices.com?rev=12507&view=rev
Log:
Bug: n/a
Description: refactor file/folder selectors
- use existing Slim::Utils::Misc::readDirectory instead of Slim::Utils::Filesystem
- rename CLI "filesystem" command to "readdirectory"
- add new filter types to the "readdirectory" command, allowing to filter for filenames, filetypes etc.
Removed:
trunk/server/Slim/Utils/Filesystem.pm
Modified:
trunk/server/HTML/EN/html/docs/cli-api.html
trunk/server/HTML/EN/html/fileselector.js
trunk/server/HTML/EN/settings/server/fileselector.html
trunk/server/Slim/Control/Queries.pm
trunk/server/Slim/Control/Request.pm
trunk/server/Slim/Utils/Misc.pm
trunk/server/Slim/Web/Settings/Server/FileSelector.pm
trunk/server/Slim/Web/Settings/Server/Wizard.pm
Modified: trunk/server/HTML/EN/html/docs/cli-api.html
URL: http://svn.slimdevices.com/trunk/server/HTML/EN/html/docs/cli-api.html?rev=12507&r1=12506&r2=12507&view=diff
==============================================================================
--- trunk/server/HTML/EN/html/docs/cli-api.html (original)
+++ trunk/server/HTML/EN/html/docs/cli-api.html Wed Aug 8 04:21:01 2007
@@ -102,7 +102,7 @@
Browse Music Folder functionality.
</li>
<li>
- Added the "<a href="#filesystem">filesystem</a>" query, to browse
+ Added the "<a href="#readdirectory">readdirectory</a>" query, to browse
file systems from the server's point of view (local & network shares)
</li>
<li>
@@ -5909,7 +5909,7 @@
<strong><code><a href="#displaystatus">displaystatus</a></code></strong>
</li>
<li>
- <strong><code><a href="#filesystem">filesystem</a></code></strong>
+ <strong><code><a href="#readdirectory">readdirectory</a></code></strong>
</li>
</ul>
@@ -6670,10 +6670,10 @@
<br>
-<p id="filesystem">
- <strong>
- <code>
- filesystem
+<p id="readdirectory">
+ <strong>
+ <code>
+ readdirectory
<start>
<itemsPerResponse>
<taggedParameters>
@@ -6681,7 +6681,7 @@
</strong>
</p>
<p>
- The "filesystem" query allows to browse filesystems from the server's point of view.
+ The "readdirectory" query allows to browse filesystems from the server's point of view.
This can be used to eg. select music folders. Local filesystems are supported, as are UNC paths
on Windows systems (eg. \\server\musicshare).
<br>
@@ -6713,9 +6713,13 @@
<td>
filter
</td>
- <td>
- 'foldersonly', 'filesonly', or any filter expression to be used when listing the
- folder's content.
+ <td>Filter the output according to one of the following keywords (regulare expressions can be used):
+ <ul>
+ <li>filter:foldersonly - list folders only
+ <li>filter:filesonly - list files only
+ <li>filter:filename:xy - list files with "xy" in the filename only
+ <li>filter:filetype:xyz - list file type .xyz only
+ <li>filter:xyz - any expression filter path/filenames
</td>
</tr>
</table>
@@ -6752,9 +6756,9 @@
Example:
</p>
<blockquote>
- Request: "filesystem 0 10 root://edelzwerg/mp3"
- <br>
- Response: "filesystem 0 10 root%3A%2F%2Fedelzwerg%2Fmp3 count%3A251 item%3A%5C%5Cedelzwerg%5Cmp3%5CAerosmith isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CAir isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CAlanis%20Morissette isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CAldo%20Romano%2C%20Michel%20Benita%2C%20Glenn%20Ferris%2C%20Paolo%20Fresu isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CAli%20Farka%20Toure isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CAll%20Saints isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CManu%20Katche isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CSinead%20O'Connor isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CShakira isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CAnastacia isdir%3A1"
+ Request: "readdirectory 0 10 root://edelzwerg/mp3"
+ <br>
+ Response: "readdirectory 0 10 root%3A%2F%2Fedelzwerg%2Fmp3 count%3A251 item%3A%5C%5Cedelzwerg%5Cmp3%5CAerosmith isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CAir isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CAlanis%20Morissette isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CAldo%20Romano%2C%20Michel%20Benita%2C%20Glenn%20Ferris%2C%20Paolo%20Fresu isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CAli%20Farka%20Toure isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CAll%20Saints isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CManu%20Katche isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CSinead%20O'Connor isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CShakira isdir%3A1 item%3A%5C%5Cedelzwerg%5Cmp3%5CAnastacia isdir%3A1"
</blockquote>
Modified: trunk/server/HTML/EN/html/fileselector.js
URL: http://svn.slimdevices.com/trunk/server/HTML/EN/html/fileselector.js?rev=12507&r1=12506&r2=12507&view=diff
==============================================================================
--- trunk/server/HTML/EN/html/fileselector.js (original)
+++ trunk/server/HTML/EN/html/fileselector.js Wed Aug 8 04:21:01 2007
@@ -8,7 +8,7 @@
getParams: function(node){
var cliQuery = [
- 'filesystem',
+ 'readdirectory',
0,
99999
];
@@ -83,7 +83,8 @@
// set the root node
var root = new Ext.tree.AsyncTreeNode({
- text: 'root'
+ text: 'root',
+ id: '/'
});
this.setRootNode(root);
Modified: trunk/server/HTML/EN/settings/server/fileselector.html
URL: http://svn.slimdevices.com/trunk/server/HTML/EN/settings/server/fileselector.html?rev=12507&r1=12506&r2=12507&view=diff
==============================================================================
--- trunk/server/HTML/EN/settings/server/fileselector.html (original)
+++ trunk/server/HTML/EN/settings/server/fileselector.html Wed Aug 8 04:21:01 2007
@@ -39,7 +39,7 @@
<div id="folderselector" style="overflow:auto; height:200px; width:400px;"></div>
<input type="text" name="audiodir" id="audiodir" value="[% audiodir %]" size="80">
- <h1>A file selector</h1>
+ <h1>A file selector (XML files only)</h1>
<div id="fileselector" style="overflow:auto; height:200px; width:400px;"></div>
<input type="text" name="xml_path" id="xml_path" value="[% xml_path %]" size="80">
</body>
@@ -50,6 +50,7 @@
});
new FileSelector('fileselector', {
+ filter: 'filetype:xml',
input: 'xml_path'
});
</script>
Modified: trunk/server/Slim/Control/Queries.pm
URL: http://svn.slimdevices.com/trunk/server/Slim/Control/Queries.pm?rev=12507&r1=12506&r2=12507&view=diff
==============================================================================
--- trunk/server/Slim/Control/Queries.pm (original)
+++ trunk/server/Slim/Control/Queries.pm Wed Aug 8 04:21:01 2007
@@ -830,13 +830,13 @@
}
-sub filesystemQuery {
- my $request = shift;
-
- $log->debug("filesystemQuery");
+sub readDirectoryQuery {
+ my $request = shift;
+
+ $log->debug("readDirectoryQuery");
# check this is the correct query.
- if ($request->isNotQuery([['filesystem']])) {
+ if ($request->isNotQuery([['readdirectory']])) {
$request->setStatusBadDispatch();
return;
}
@@ -847,19 +847,43 @@
my $folder = $request->getParam('folder');
my $filter = $request->getParam('filter');
- if ($filter) {
+ use File::Spec::Functions qw(catdir);
+ my @fsitems;
+ if ($folder eq '/' && Slim::Utils::OSDetect::OS() eq 'win') {
+ @fsitems = map { "$_:" } Win32::DriveInfo::DrivesInUse();
+ }
+ else {
+ $filter ||= '';
+
+ my $filterRE = qr/./;
+
+ # search within filename
+ if ($filter =~ /^filename:(.*)/) {
+ # @fsitems = grep { $_ !~ /$1/i ? not -f catdir($folder, $_) : 1 } @fsitems;
+ $log->debug("filename: $1");
+ $filterRE = qr/$1/i;
+ }
+ elsif ($filter =~ /^filetype:(.*)/) {
+ $log->debug("filetype: $1");
+ $filterRE = qr/\.(?:$1)$/;
+ }
+
+ # get file system items in $folder
+ @fsitems = Slim::Utils::Misc::readDirectory($folder, $filterRE);
+
if ($filter =~ /^foldersonly$/) {
- $filter = sub { -d };
+ @fsitems = grep { -d catdir($folder, $_) } @fsitems;
}
elsif ($filter =~ /^filesonly$/) {
- $filter = sub { -f };
- }
- }
-
- # get file system items in $folder
- my $fsitems = Slim::Utils::Filesystem::getChildren($folder, $filter);
-
- my $count = @$fsitems;
+ @fsitems = grep { -f catdir($folder, $_) } @fsitems;
+ }
+ # search anywhere within path/filename
+ elsif ($filter && $filter !~ /^(?:filename|filetype):/) {
+ @fsitems = grep { catdir($folder, $_) =~ /$filter/i } @fsitems;
+ }
+ }
+
+ my $count = @fsitems;
$count += 0;
$request->addResult('count', $count);
@@ -869,13 +893,29 @@
my $idx = $start;
my $cnt = 0;
- if (scalar(@$fsitems) > 0) {
- for my $item (@$fsitems[$start..$end]) {
- $request->addResultLoop('fsitems_loop', $cnt, 'path', $item);
- $request->addResultLoop('fsitems_loop', $cnt, 'name',
- ($item =~ m|[\/\\]([^\/\\]*)$| ? $1 : $item)
- );
- $request->addResultLoop('fsitems_loop', $cnt, 'isfolder', -d $item || 0);
+ if (scalar(@fsitems) > 0) {
+ # sort folders < files
+ @fsitems = sort {
+ my $aa = catdir($folder, $a);
+ my $bb = catdir($folder, $b);
+
+ if (-d $aa) {
+ if (-d $bb) { uc($a) cmp uc($b) }
+ else { -1 }
+ }
+ else {
+ if (-d $bb) { 1 }
+ else { uc($a) cmp uc($b) }
+ }
+ } @fsitems;
+
+ my $path;
+ for my $item (@fsitems[$start..$end]) {
+ $path = catdir($folder, $item);
+
+ $request->addResultLoop('fsitems_loop', $cnt, 'path', $path);
+ $request->addResultLoop('fsitems_loop', $cnt, 'name', $item );
+ $request->addResultLoop('fsitems_loop', $cnt, 'isfolder', -d $path || 0);
$idx++;
$cnt++;
Modified: trunk/server/Slim/Control/Request.pm
URL: http://svn.slimdevices.com/trunk/server/Slim/Control/Request.pm?rev=12507&r1=12506&r2=12507&view=diff
==============================================================================
--- trunk/server/Slim/Control/Request.pm (original)
+++ trunk/server/Slim/Control/Request.pm Wed Aug 8 04:21:01 2007
@@ -469,7 +469,7 @@
addDispatch(['displaynow', '?', '?'], [1, 1, 0, \&Slim::Control::Queries::displaynowQuery]);
addDispatch(['displaystatus'], [1, 1, 1, \&Slim::Control::Queries::displaystatusQuery]);
addDispatch(['duration', '?'], [1, 1, 0, \&Slim::Control::Queries::cursonginfoQuery]);
- addDispatch(['filesystem', '_index', '_quantity'], [0, 1, 1, \&Slim::Control::Queries::filesystemQuery]);
+ addDispatch(['readdirectory', '_index', '_quantity'], [0, 1, 1, \&Slim::Control::Queries::readDirectoryQuery]);
addDispatch(['genre', '?'], [1, 1, 0, \&Slim::Control::Queries::cursonginfoQuery]);
addDispatch(['genres', '_index', '_quantity'], [0, 1, 1, \&Slim::Control::Queries::genresQuery]);
addDispatch(['info', 'total', 'albums', '?'], [0, 1, 0, \&Slim::Control::Queries::infoTotalQuery]);
Modified: trunk/server/Slim/Utils/Misc.pm
URL: http://svn.slimdevices.com/trunk/server/Slim/Utils/Misc.pm?rev=12507&r1=12506&r2=12507&view=diff
==============================================================================
--- trunk/server/Slim/Utils/Misc.pm (original)
+++ trunk/server/Slim/Utils/Misc.pm Wed Aug 8 04:21:01 2007
@@ -849,7 +849,7 @@
# __ is a match against our old __history and __mac playlists.
# ._Foo is a OS X meta file.
next if $item =~ /^__\S+\.m3u$/;
- next if $item =~ /^\._/;
+ next if $item =~ /^\./;
if ($ignore ne '') {
next if $item =~ /$ignore/;
Modified: trunk/server/Slim/Web/Settings/Server/FileSelector.pm
URL: http://svn.slimdevices.com/trunk/server/Slim/Web/Settings/Server/FileSelector.pm?rev=12507&r1=12506&r2=12507&view=diff
==============================================================================
--- trunk/server/Slim/Web/Settings/Server/FileSelector.pm (original)
+++ trunk/server/Slim/Web/Settings/Server/FileSelector.pm Wed Aug 8 04:21:01 2007
@@ -9,7 +9,18 @@
use base qw(Slim::Web::Settings);
use Slim::Utils::Prefs;
-use Slim::Utils::Filesystem;
+use Slim::Utils::Log;
+use Slim::Utils::Misc qw(readDirectory);
+use File::Spec::Functions qw(:ALL);
+
+BEGIN {
+ if ($^O =~ /Win32/) {
+ require Win32::File;
+ require Win32::DriveInfo;
+ }
+}
+
+my $log = logger('os.files');
my $pages = {
'autocomplete' => 'settings/server/fileselector_autocomplete.html',
@@ -47,7 +58,50 @@
sub autoCompleteHandler {
my ($client, $paramRef) = @_;
- $paramRef->{'folders'} = Slim::Utils::Filesystem::getChildren($paramRef->{'currDir'}, $paramRef->{'foldersonly'} ? sub { -d } : undef);
+ my @subdirs;
+ my $currDir = $paramRef->{'currDir'};
+
+ if (Slim::Utils::OSDetect::OS() eq 'win') {
+ $currDir = undef if ($currDir =~ /^\\+$/);
+ }
+
+ # a correct folder
+ if (-d $currDir) {
+ $log->debug('regular folder: ' . $currDir);
+ @subdirs = readDirectory($currDir, qr/./);
+ }
+
+ # something else...
+ elsif ($currDir) {
+ $log->debug('unknown folder: ' . $currDir);
+
+ # partial file/foldernames - filter the list of the parent folder
+ my ($parent, $file);
+ if ($currDir =~ /^(\\\\\w.*)\\.+/ && Slim::Utils::OSDetect::OS() eq 'win') {
+ $parent = $1;
+ }
+ else {
+ (my $vol, $parent, $file) = eval { splitpath($currDir) };
+ }
+
+ if ($parent && $parent ne '.' && -d $parent) {
+ @subdirs = grep /^$file/i, readDirectory($parent, qr/./);
+ $currDir = $parent;
+ }
+
+ # didn't find anything useful - display a list of reasonable choices (root, drive letters)
+ if (Slim::Utils::OSDetect::OS() eq 'win' && !@subdirs) {
+ @subdirs = map { "$_:" } Win32::DriveInfo::DrivesInUse();
+ }
+ elsif (!@subdirs && !$parent) {
+ @subdirs = readDirectory('/', qr/./);
+ }
+ }
+
+ @subdirs = map { catdir($currDir, $_) } @subdirs;
+ @subdirs = grep { -d } @subdirs if ($paramRef->{'foldersonly'});
+
+ $paramRef->{'folders'} = \@subdirs;
return Slim::Web::HTTP::filltemplatefile($pages->{'autocomplete'}, $paramRef);
}
Modified: trunk/server/Slim/Web/Settings/Server/Wizard.pm
URL: http://svn.slimdevices.com/trunk/server/Slim/Web/Settings/Server/Wizard.pm?rev=12507&r1=12506&r2=12507&view=diff
==============================================================================
--- trunk/server/Slim/Web/Settings/Server/Wizard.pm (original)
+++ trunk/server/Slim/Web/Settings/Server/Wizard.pm Wed Aug 8 04:21:01 2007
@@ -10,7 +10,6 @@
use Slim::Utils::Log;
use Slim::Utils::Prefs;
-use Slim::Utils::Filesystem;
my $showProxy = 1;
my $prefs = preferences('server');
More information about the checkins
mailing list