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