package com.architjn.acjmusicplayer.task;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import com.afollestad.async.Action;
import com.architjn.acjmusicplayer.R;
import com.architjn.acjmusicplayer.utils.handlers.ArtistImgHandler;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
/**
* Created by architjn on 18/12/15.
*/
public class FetchArtist {
private int random;
private ArtistImgHandler handler;
private String url;
private Context context;
private String name;
private String jsonResult;
private Bitmap downloadedImg;
public FetchArtist(Context context, String name, int random, ArtistImgHandler handler) {
this.context = context;
this.name = name;
this.context = context;
this.name = name;
this.random = random;
this.handler = handler;
if (name == null || name.matches("<unknown>")) {
} else {
StringBuilder builder = new StringBuilder();
builder.append(context.getResources().getString(R.string.artist_fetch_url));
try {
builder.append("&artist=" + URLEncoder.encode(name, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
builder.append("&api_key=" + context.getResources().getString(R.string.api));
builder.append("&format=json");
this.url = builder.toString();
runTask();
}
}
public void runTask() {
new Action<String>() {
@NonNull
@Override
public String id() {
return name; //some unique Id
}
@Nullable
@Override
protected String run() throws InterruptedException {
backgroundTask();
return null;
}
@Override
protected void done(@Nullable String result) {
}
}.execute();
}
private void backgroundTask() {
List<NameValuePair> params = new ArrayList<NameValuePair>();
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
try {
httppost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse response = httpclient.execute(httppost);
jsonResult = inputStreamToString(response.getEntity().getContent())
.toString();
if (jsonResult != null) {
try {
JSONObject jsonResponse = new JSONObject(jsonResult);
JSONArray imageArray = jsonResponse.getJSONObject("artist").getJSONArray("image");
for (int i = 0; i < imageArray.length(); i++) {
JSONObject image = imageArray.getJSONObject(i);
if (image.optString("size").matches("large") &&
!image.optString("#text").matches("")) {
downloadedImg = downloadBitmap(image.optString("#text"));
String newUrl = saveImageToStorage(downloadedImg);
handler.updateArtistArtWorkInDB(name, newUrl);
handler.onDownloadComplete(newUrl);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
} catch (ClientProtocolException e) {
Log.e("e", "error1");
e.printStackTrace();
} catch (IOException e) {
Log.e("e", "error2");
e.printStackTrace();
}
}
private String saveImageToStorage(Bitmap bitmap) {
StringBuilder fileName = new StringBuilder();
fileName.append("cache-img-");
Calendar c = Calendar.getInstance();
fileName.append(c.get(Calendar.DATE)).append("-");
fileName.append(c.get(Calendar.MONTH)).append("-");
fileName.append(c.get(Calendar.YEAR)).append("-");
fileName.append(c.get(Calendar.HOUR)).append("-");
fileName.append(c.get(Calendar.MINUTE)).append("-");
fileName.append(c.get(Calendar.SECOND)).append("-");
fileName.append(random).append("-");
fileName.append((random / 3) * 5);
fileName.append(".png");
File sdCardDirectory = Environment.getExternalStorageDirectory();
String filePath = sdCardDirectory + "/" + context.getResources()
.getString(R.string.app_name) + "/artist/";
(new File(filePath)).mkdirs();
File noMedia = new File(filePath, ".nomedia");
if (!noMedia.exists()) try {
noMedia.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
File image = new File(filePath, fileName.toString());
if (image.exists()) image.delete();
try {
FileOutputStream out = new FileOutputStream(image);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
return image.getPath();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private Bitmap downloadBitmap(String url) {
// initilize the default HTTP client object
final DefaultHttpClient client = new DefaultHttpClient();
//forming a HttoGet request
final HttpGet getRequest = new HttpGet(url);
try {
HttpResponse response = client.execute(getRequest);
//check 200 OK for success
final int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) {
Log.w("ImageDownloader", "Error " + statusCode +
" while retrieving bitmap from " + url);
return null;
}
final HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream inputStream = null;
try {
// getting contents from the stream
inputStream = entity.getContent();
// decoding stream data back into image Bitmap that android understands
final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
} finally {
if (inputStream != null) {
inputStream.close();
}
entity.consumeContent();
}
}
} catch (Exception e) {
// You Could provide a more explicit error message for IOException
getRequest.abort();
Log.e("ImageDownloader", "Something went wrong while" +
" retrieving bitmap from " + url + e.toString());
}
return null;
}
private StringBuilder inputStreamToString(InputStream is) {
String rLine = "";
StringBuilder answer = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
try {
while ((rLine = rd.readLine()) != null) {
answer.append(rLine);
}
} catch (IOException e) {
e.printStackTrace();
}
return answer;
}
}