playmusicexporter/playmusicexporter/src/main/java/re/jcg/playmusicexporter/utils/MusicPathBuilder.java
Mark Gillespie 7502842cdd Change {group} tag to {playlist} ({group} is still understood in switch for backwards compat).
Tidy up tag list dialog (missing \n in de)
Include {playlist} in the separate tag list for the playlists.
2017-01-20 23:33:37 +00:00

198 lines
7.5 KiB
Java

/*
* Copyright (c) 2015 David Schulte
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package re.jcg.playmusicexporter.utils;
import android.text.TextUtils;
import de.arcus.framework.logger.Logger;
import de.arcus.playmusiclib.items.MusicTrack;
/**
* Helper class te create a path by a user defined structure
*/
public class MusicPathBuilder {
/**
* Hides the constructor
*/
private MusicPathBuilder() {}
/**
* Generates a path from a user defined patter
* @param musicTrack The music track data
* @param patter The patter
* @return Returns the file path
*/
public static String Build(MusicTrack musicTrack, String patter)
{
String path = "";
int pos = 0;
// While there is an open tag
while (patter.indexOf('{', pos) >= 0)
{
// Gets the start and the end of the tag
int posStart = patter.indexOf('{', pos);
int posEnd = patter.indexOf('}', posStart);
// Gets the equal sign
int posEqual = patter.indexOf('=', posStart);
// Adds the part between this tag and the last one to the path
path += patter.substring(pos, posStart);
if (posEnd >= 0) {
// Name of the tag
String name;
String value = "";
// There is an equal sign
if (posEqual >= 0 && posEqual < posEnd) {
name = patter.substring(posStart + 1, posEqual);
} else {
name = patter.substring(posStart + 1, posEnd);
}
// Trim and lower
name = name.trim().toLowerCase();
// Gets the values
switch (name) {
case "album-artist":
if (!TextUtils.isEmpty(musicTrack.getAlbumArtist()))
value = musicTrack.getAlbumArtist();
break;
case "album":
if (!TextUtils.isEmpty(musicTrack.getAlbum()))
value = musicTrack.getAlbum();
break;
case "playlist":
case "group": //previous name, for compatability
if (!TextUtils.isEmpty(musicTrack.getContainerName()))
value = musicTrack.getContainerName();
break;
case "artist":
if (!TextUtils.isEmpty(musicTrack.getArtist()))
value = musicTrack.getArtist();
break;
case "title":
if (!TextUtils.isEmpty(musicTrack.getTitle()))
value = musicTrack.getTitle();
break;
case "disc":
if (musicTrack.getDiscNumber() > 0)
value = String.valueOf(musicTrack.getDiscNumber());
break;
case "no":
if (musicTrack.getTrackNumber() > 0)
value = String.valueOf(musicTrack.getTrackNumber());
break;
case "group-no":
if (musicTrack.getContainerPosition() > 0)
value = String.valueOf(musicTrack.getContainerPosition());
break;
case "year":
if (!TextUtils.isEmpty(musicTrack.getYear()))
value = musicTrack.getYear();
break;
case "genre":
if (!TextUtils.isEmpty(musicTrack.getGenre()))
value = musicTrack.getGenre();
break;
default:
// Unknown tag
Logger.getInstance().logWarning("MusicPathBuilder", "Unknown tag '" + name + "'");
break;
}
// Equal sign exists
if (posEqual >= 0 && posEqual < posEnd && !TextUtils.isEmpty(value)) {
String format = patter.substring(posEqual + 1, posEnd);
// Gets the insert sign
int posInsertStart = format.indexOf('$');
if (posInsertStart >= 0) {
int posInsertEnd = posInsertStart + 1;
// Search the end
while(posInsertEnd < format.length() && format.charAt(posInsertEnd) == '$') {
posInsertEnd ++;
}
// Fill Zeros
while(value.length() < posInsertEnd - posInsertStart) {
value = "0" + value;
}
// Adds the rest of the format to the value
value = format.substring(0, posInsertStart) + value + format.substring(posInsertEnd);
} else {
// Missing insert sign
Logger.getInstance().logWarning("MusicPathBuilder", "Cloud not find replace symbol ('$') of format attribute in tag '" + name + "'");
}
}
// Adds the value
path += cleanFilename(value);
pos = posEnd + 1;
} else {
path += "{";
pos = posStart + 1;
Logger.getInstance().logWarning("MusicPathBuilder", "Cloud not find end symbol ('}') of the tag in patter '" + patter + "'");
}
}
// Insert end
path += patter.substring(pos, patter.length());
// Remove double slash
while(path.contains("//"))
path = path.replace("//", "/");
// Return path
return path;
}
/**
* Removes forbidden chars in the filename
* @param filename The filename
* @return Returns the new clean filename
*/
public static String cleanFilename(String filename)
{
// Forbidden chars
filename = filename.replace('\\', '-');
filename = filename.replace('/', '-');
filename = filename.replace(':', '-');
filename = filename.replace('*', '-');
filename = filename.replace('?', '-');
filename = filename.replace('"', '-');
filename = filename.replace('<', '-');
filename = filename.replace('>', '-');
filename = filename.replace('|', '-');
return filename;
}
}