package org.freemp.droid.playlist; import android.app.Activity; import android.net.Uri; import android.os.AsyncTask; import com.androidquery.AQuery; import com.androidquery.callback.AjaxCallback; import com.androidquery.callback.AjaxStatus; import org.freemp.droid.ClsTrack; import org.freemp.droid.FileUtils; import org.freemp.droid.MediaUtils; import org.json.JSONArray; import org.json.JSONObject; import java.io.File; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Iterator; /** * Created by recoil on 01.06.14. */ public class TaskGetArtists extends AsyncTask { private final WeakReference<Activity> mActivity; private final WeakReference<OnTaskGetArtists> mOnTaskGetArtists; private final WeakReference<OnProgressUpdateMy> mOnProgressUpdate; private boolean refresh; private int newArtworksCounter; private AQuery aq; public TaskGetArtists(Activity activity, int type, boolean refresh, OnTaskGetArtists onTaskGetArtists, OnProgressUpdateMy onProgressUpdateMy) { mActivity = new WeakReference<Activity>(activity); mOnTaskGetArtists = new WeakReference<OnTaskGetArtists>(onTaskGetArtists); mOnProgressUpdate = new WeakReference<OnProgressUpdateMy>(onProgressUpdateMy); this.refresh = refresh; } @Override protected Object doInBackground(Object... params) { Activity activity = mActivity.get(); if (null == activity) { return null; } ArrayList<ClsTrack> artistsTracks = new ArrayList<ClsTrack>(); if (!refresh) { artistsTracks = (ArrayList<ClsTrack>) FileUtils.readObject("artistsTracks", activity); if (artistsTracks != null && artistsTracks.size() > 0) { return artistsTracks; } artistsTracks = new ArrayList<ClsTrack>(); } ArrayList<ClsArrTrack> arrTracks = new MakePlaylistFS(activity, refresh).getArrTracks(); //выкидываем все дубликаты альбомов //сортируем по альбому aq = new AQuery(activity); for (ClsArrTrack t : arrTracks) { ArrayList<ClsTrack> allTracks = t.getPlaylists(); //Создаем итератор и выкидываем дубли Iterator<ClsTrack> iterator = allTracks.iterator(); String artist = ""; int total = allTracks.size(); int step = 0; newArtworksCounter = 0; while (iterator.hasNext()) { onUpdate((int) (100 * step / total)); step++; ClsTrack track = iterator.next(); final String currentArtist = "" + track.getArtist().toLowerCase(); if (currentArtist.equals(artist) || currentArtist.equals("")) { continue; } else { artist = currentArtist; boolean stop = false; for (ClsTrack clsTrack : artistsTracks) { if (clsTrack.getArtist().toLowerCase().equals(artist)) { stop = true; break; } } if (stop) { continue; } if (MediaUtils.getArtistQuick(activity, track, 300, 300) != null) { artistsTracks.add(track); continue; } else { //noartwork (refresh or first start) String url = String.format("http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&api_key=0cb75104931acd7f44f571ed12cff105&artist=%s&format=json", Uri.encode(track.getArtist())); AjaxCallback<JSONObject> cb = new AjaxCallback<JSONObject>(); cb.url(url).type(JSONObject.class).fileCache(true).expire(3600 * 60 * 1000); aq.sync(cb); JSONObject result = cb.getResult(); if (result != null) { JSONObject jsonObject = null; String albumArtImageLink = null; try { jsonObject = result.getJSONObject("artist"); JSONArray image = jsonObject.getJSONArray("image"); for (int i = 0; i < image.length(); i++) { jsonObject = image.getJSONObject(i); if (jsonObject.getString("size").equals("extralarge")) { albumArtImageLink = Uri.decode(jsonObject.getString("#text")); } } if (!albumArtImageLink.equals("")) { //download image String path = MediaUtils.getArtistPath(track); if (path == null) { continue; } File file = new File(path); AjaxCallback<File> cbFile = new AjaxCallback<File>(); cbFile.url(albumArtImageLink).type(File.class).targetFile(file); aq.sync(cbFile); AjaxStatus status = cbFile.getStatus(); if (status.getCode() == 200) { artistsTracks.add(track); newArtworksCounter++; } else { file.delete(); continue; } } else { //art not found continue; } } catch (Exception e) { iterator.remove(); e.printStackTrace(); } } else { iterator.remove(); } } } } } FileUtils.writeObject("artistsTracks", activity, artistsTracks); return artistsTracks; } protected void onUpdate(Integer... progress) { OnProgressUpdateMy onProgressUpdateMy = mOnProgressUpdate.get(); if (onProgressUpdateMy != null) { onProgressUpdateMy.OnArtistsProgress(progress[0]); } } protected void onPostExecute(Object result) { OnTaskGetArtists onTaskGetArtists = mOnTaskGetArtists.get(); Activity activity = mActivity.get(); if (null != onTaskGetArtists) { onTaskGetArtists.OnTaskResult(result); } if (null != activity) { ((ActPlaylist) activity).setRefreshing(false); ((ActPlaylist) activity).setRefreshActionButtonState(); } } public static interface OnTaskGetArtists { public void OnTaskResult(Object result); } public static interface OnProgressUpdateMy { public void OnArtistsProgress(int progress); } }