Files
G4G0-1/Semester 1/Programming 1/Java/examples/projects/chapter13/musicplayer/TrackReader.java
2024-01-15 20:14:10 +00:00

92 lines
2.9 KiB
Java
Executable File

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
/**
* A helper class for our music application. This class can read files from the file system
* from a given folder with a specified suffix. It will interpret the file name as artist/
* track title information.
*
* It is expected that file names of music tracks follow a standard format of artist name
* and track name, separated by a dash. For example: TheBeatles-HereComesTheSun.mp3
*
* @author David J. Barnes and Michael Kölling
* @version 2016.02.29
*/
public class TrackReader
{
/**
* Create the track reader, ready to read tracks from the music library folder.
*/
public TrackReader()
{
// Nothing to do here.
}
/**
* Read music files from the given library folder
* with the given suffix.
* @param folder The folder to look for files.
* @param suffix The suffix of the audio type.
*/
public ArrayList<Track> readTracks(String folder, final String suffix)
{
File audioFolder = new File(folder);
ArrayList<Track> tracks = new ArrayList<>();
File[] audioFiles = audioFolder.listFiles(new FilenameFilter() {
/**
* Accept files with matching suffix.
* @param dir The directory containing the file.
* @param name The name of the file.
* @return true if the name ends with the suffix.
*/
public boolean accept(File dir, String name)
{
return name.toLowerCase().endsWith(suffix);
}
});
// Put all the matching files into the organizer.
for(File file : audioFiles) {
Track trackDetails = decodeDetails(file);
tracks.add(trackDetails);
}
return tracks;
}
/**
* Try to decode details of the artist and the title
* from the file name.
* It is assumed that the details are in the form:
* artist-title.mp3
* @param file The track file.
* @return A Track containing the details.
*/
private Track decodeDetails(File file)
{
// The information needed.
String artist = "unknown";
String title = "unknown";
String filename = file.getPath();
// Look for artist and title in the name of the file.
String details = file.getName();
String[] parts = details.split("-");
if(parts.length == 2) {
artist = parts[0];
String titlePart = parts[1];
// Remove a file-type suffix.
parts = titlePart.split("\\.");
if(parts.length >= 1) {
title = parts[0];
}
else {
title = titlePart;
}
}
return new Track(artist, title, filename);
}
}