Shuffle
Walter Bright
newshound1 at digitalmars.com
Thu Jan 24 20:35:04 PST 2008
For fun, I ordered a new car stereo that would play music from an SD
card or USB stick(rather than from CD), and installed it over the
weekend. The problem is loading songs onto the SD card from my home
music server, which I like to hear played at random.
The solution is a simple D program, shuffle, which will randomly copy
music files to an SD card until it fills up. Have some fun with it!
----------------------------
/* Program to randomly copy music files from source to destination device.
* Written in the D programming language.
* Written by Walter Bright, http://www.digitalmars.com
* Placed into the Public Domain.
*/
import std.file;
import std.stdio;
import std.string;
import std.c.stdlib;
import std.path;
import std.random;
int main(string[] args)
{
if (args.length != 3)
{ writefln("Usage: shuffle fromdir todir");
exit(1);
}
auto fromdir = args[1];
auto todir = args[2];
/* Recursively search for all the mp3 and wma files in directory
fromdir
* and put them into files[]
*/
string[] files;
bool callback(DirEntry *de)
{
if (de.isdir)
listdir(de.name, &callback); // recurse into subdirectories
else
{
// Collect only files with mp3 and wma extensions
auto ext = getExt(de.name);
if (fnmatch(ext, "mp3") || fnmatch(ext, "wma"))
files ~= de.name;
}
return true; // keep going
}
std.file.listdir(fromdir, &callback);
writefln(files.length, " music files");
/* The loop will normally quit via an exception when the target device
* is full. But if there are not enough files in the source to fill
* up the target, the loop ensures it will still eventually quit.
*/
for (size_t i = 0; i < files.length; i++)
{
auto j = std.random.rand() % files.length;
auto fromfile = files[j];
auto tofile = std.path.join(todir, basename(fromfile));
writefln("%s => %s", fromfile, tofile);
std.file.copy(fromfile, tofile);
}
writefln("Done");
return 0;
}
More information about the Digitalmars-d-announce
mailing list