package com.turtleplayer.presentation;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import com.mpatric.mp3agic.InvalidDataException;
import com.mpatric.mp3agic.Mp3File;
import com.mpatric.mp3agic.UnsupportedTagException;
import com.turtleplayer.model.AlbumArtLocation;
import com.turtleplayer.model.Track;
import com.turtleplayer.persistance.framework.executor.OperationExecutor;
import com.turtleplayer.persistance.framework.filter.FieldFilter;
import com.turtleplayer.persistance.framework.filter.Operator;
import com.turtleplayer.persistance.source.sql.First;
import com.turtleplayer.persistance.source.sqlite.QuerySqlite;
import com.turtleplayer.persistance.turtle.FsReader;
import com.turtleplayer.persistance.turtle.db.TurtleDatabase;
import com.turtleplayer.persistance.turtle.db.structure.Tables;
import com.turtleplayer.persistance.turtle.mapping.AlbumArtLocationCreator;
import com.turtleplayer.preferences.Preferences;
import com.turtleplayer.util.Shorty;
import java.io.IOException;
/**
* TURTLE PLAYER
* <p/>
* Licensed under MIT & GPL
* <p/>
* 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.
* <p/>
* More Information @ www.turtle-player.co.uk
*
* @author Simon Honegger (Hoene84)
*/
public abstract class AlbumArtResolver extends AsyncTask<Track, Void, Bitmap>
{
private final TurtleDatabase db;
protected AlbumArtResolver(TurtleDatabase db)
{
this.db = db;
}
@Override
protected Bitmap doInBackground(Track... params)
{
Thread.currentThread().setName(Thread.currentThread().getName() + ":AlbumArtResolver");
for(LookupStrategy lookupStrategy : new LookupStrategy[]{
new CachedFsLookupStrategy(),
new IdTagLookupStrategy(),
new FsLookupStrategy()
})
{
try{
Bitmap albumArt = lookupStrategy.lookup(params[0]);
if(albumArt != null) return albumArt;
}
catch (Exception e)
{
Log.e(Preferences.TAG, "Error reading albumArt for :" + params[0].getFullPath(), e);
}
}
return null;
}
private interface LookupStrategy
{
Bitmap lookup(Track track);
}
private class CachedFsLookupStrategy implements LookupStrategy
{
public Bitmap lookup(Track track)
{
AlbumArtLocation albumArtLocation = OperationExecutor.execute(
db,
new QuerySqlite<Tables.AlbumArtLocations, Tables.AlbumArtLocations, AlbumArtLocation>(new FieldFilter<Tables.AlbumArtLocations, AlbumArtLocation, String>(Tables.AlbumArtLocations.PATH, Operator.EQ, track.getPath()),
new First<AlbumArtLocation>(Tables.ALBUM_ART_LOCATIONS, new AlbumArtLocationCreator())));
if(albumArtLocation != null)
{
return BitmapFactory.decodeFile(albumArtLocation.getAlbumArtpath());
}
return null;
}
}
private class FsLookupStrategy implements LookupStrategy
{
public Bitmap lookup(Track track)
{
String albumArtPath = FsReader.getAlbumArt(track.getPath(), db);
if(!Shorty.isVoid(albumArtPath))
{
return BitmapFactory.decodeFile(albumArtPath);
}
return null;
}
}
private class IdTagLookupStrategy implements LookupStrategy
{
public Bitmap lookup(Track track)
{
try
{
synchronized (Mp3File.class)
{
Mp3File mp3file = new Mp3File(track.getFullPath(), false);
if(mp3file.hasId3v2Tag() && mp3file.getId3v2Tag().getAlbumImage() != null)
{
byte[] albumImage = mp3file.getId3v2Tag().getAlbumImage();
return BitmapFactory.decodeByteArray(albumImage, 0, albumImage.length);
}
}
}
catch (IOException e)
{
Log.e(Preferences.TAG, "Error reading albumArt for :" + track.getFullPath(), e);
return null;
}
catch (UnsupportedTagException e)
{
Log.e(Preferences.TAG, "Error reading albumArt for :" + track.getFullPath(), e);
return null;
}
catch (InvalidDataException e)
{
Log.e(Preferences.TAG, "Error reading albumArt for :" + track.getFullPath(), e);
return null;
}
return null;
}
}
}