721 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			721 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| package com.novelbook.android.service;
 | |
| 
 | |
| import android.app.IntentService;
 | |
| import android.app.Service;
 | |
| import android.content.Intent;
 | |
| import android.os.Bundle;
 | |
| import android.os.Handler;
 | |
| import android.os.IBinder;
 | |
| import android.os.Message;
 | |
| import android.text.TextUtils;
 | |
| import android.util.Log;
 | |
| 
 | |
| 
 | |
| import com.novelbook.android.db.Chapter;
 | |
| import com.novelbook.android.db.DownloadTask;
 | |
| import com.novelbook.android.db.SiteRule;
 | |
| import com.novelbook.android.netutils.HttpMethods;
 | |
| import com.novelbook.android.netutils.NetUtil;
 | |
| import com.novelbook.android.utils.BookUtil;
 | |
| 
 | |
| import com.novelbook.android.utils.NovelParseUtil;
 | |
| import com.novelbook.android.utils.PageFactory;
 | |
| 
 | |
| import org.json.JSONException;
 | |
| import org.json.JSONObject;
 | |
| import org.litepal.LitePal;
 | |
| 
 | |
| import java.io.File;
 | |
| import java.io.FileOutputStream;
 | |
| import java.io.IOException;
 | |
| import java.io.OutputStreamWriter;
 | |
| 
 | |
| import java.util.ArrayList;
 | |
| import java.util.Date;
 | |
| import java.util.HashMap;
 | |
| import java.util.List;
 | |
| import java.util.Map;
 | |
| 
 | |
| import java.util.concurrent.ConcurrentHashMap;
 | |
| 
 | |
| 
 | |
| import okhttp3.Call;
 | |
| import okhttp3.Callback;
 | |
| import okhttp3.Request;
 | |
| import okhttp3.Response;
 | |
| import okhttp3.ResponseBody;
 | |
| 
 | |
| 
 | |
| public class ServiceDownload extends Service {
 | |
|     private static final String TAG ="ServiceDownload" ;
 | |
| 
 | |
|     private   final String storagePath = BookUtil.storagePath;
 | |
|     private   final String cachedPath = BookUtil.cachedPath;
 | |
|     private   final String chapterPath = BookUtil.chapterPath;
 | |
| 
 | |
|     public final String EXTR_TASKID ="taskId";
 | |
|     public final String EXTR_OFFSET ="offset"; //多线程下载,每个线程取章节偏移数量
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    // public ServiceDownload(String name) {
 | |
|   //      super(name);
 | |
|   //  }
 | |
|   /*  public ServiceDownload() {
 | |
|         super("ServiceDownload");
 | |
|     }*/
 | |
| 
 | |
|      private Map<Integer,SiteRule>  siteRuleMap = new HashMap<Integer,SiteRule>()  ;  // key = novelId
 | |
|      private DownloadTask processingTask  ;
 | |
|      private int taskIndex=0;
 | |
|      private int chaptIndex=0;
 | |
| 
 | |
|     private Map<Integer ,List<Chapter>> tasksMap = new  ConcurrentHashMap<Integer, List<Chapter>>();// key = taskId
 | |
|     private Map<Integer ,List<Chapter>> tasksMapDone = new  ConcurrentHashMap<Integer, List<Chapter>>();// key = taskId
 | |
| 
 | |
|     @Override
 | |
|     public void onCreate() {
 | |
|         super.onCreate();
 | |
|         Log.d(TAG,"test service onCreate...");
 | |
| 
 | |
|         /*
 | |
|         downloadTasks =LitePal.where("status = ?","0").find(DownloadTask.class);
 | |
|         for(DownloadTask dt :downloadTasks){
 | |
|             List<Chapter> chps =Chapter.getUnCachedChapters(dt.getNovelId(),dt.getDomain());
 | |
|             if(chps.size()>0) {
 | |
|                 SiteRule sr = SiteRule.getSiteRuleByDomain(dt.getDomain());
 | |
|                 siteRuleMap.put(dt.getNovelId(), sr);
 | |
|                 tasksMap.put(dt.getId(), chps);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         for(DownloadTask tmp: downloadTasks){
 | |
|             Log.d(TAG, String.format("test service task list : %s",tmp.getId()));
 | |
|         }
 | |
|         */
 | |
| 
 | |
| 
 | |
|     }
 | |
|     @Override
 | |
|     public int onStartCommand(Intent intent, int flags, int startId){
 | |
|         // // QLog.getLogger().d( TAG,TAG+"... service NaviSvc onStartCommand.....," );
 | |
|         onHandleIntent(intent);
 | |
|         // We want this service to continue running until it is explicitly
 | |
|         // stopped, so return sticky.
 | |
| //		return START_NOT_STICKY;		//TODO: checking why can not stop the service.
 | |
|         return START_STICKY;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     @Override
 | |
|     public void onStart(Intent intent, int startId) {
 | |
|         super.onStart(intent, startId);
 | |
|         Log.d(TAG,"test service onStart");
 | |
|     }
 | |
| 
 | |
| 
 | |
|     @Override
 | |
|     public void onDestroy() {
 | |
|         Log.d(TAG,"test service onDestroy");
 | |
|         super.onDestroy();
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public IBinder onBind(Intent intent) {
 | |
|         // TODO Auto-generated method stub
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     private List<DownloadTask> downloadTasks = new ArrayList<DownloadTask>();
 | |
| 
 | |
|     List<Integer> cancelId =new ArrayList<Integer>();
 | |
| 
 | |
|     protected void onHandleIntent( Intent intent) {
 | |
|         Log.d(TAG,"ServiceDownload onHandleIntent...begin");
 | |
|         if(null==intent){
 | |
|             return;
 | |
|         }
 | |
|         String key ="taskId";
 | |
|         int taskId =0;
 | |
| 
 | |
|         if ( intent.hasExtra(key)){
 | |
|             taskId=	intent.getExtras().getInt(key);
 | |
|             DownloadTask dt = LitePal.find(DownloadTask.class,taskId);
 | |
| 
 | |
|             if(intent.hasExtra("start")){
 | |
|                 if(!intent.getBooleanExtra("start",true)){
 | |
|                     cancelId.add(taskId);
 | |
|                     for(DownloadTask  t : downloadTasks){
 | |
|                         if( t.getId() == taskId){
 | |
|                              t.setDownSatus(DownloadTask.DownStatus.暂停下载);
 | |
|                             break;
 | |
|                         }
 | |
|                     }
 | |
|                     stopTask(taskId);
 | |
| 
 | |
|                 }else{
 | |
|                     boolean newTask = true;
 | |
| 
 | |
|                     if(cancelId.contains(taskId)){
 | |
|                         cancelId.remove(cancelId.indexOf(taskId));
 | |
|                     }
 | |
|                     for(DownloadTask  t : downloadTasks){
 | |
|                         if(t.getId() == taskId){
 | |
|                             newTask =false;
 | |
|                             break;
 | |
|                         }
 | |
|                     }
 | |
| 
 | |
|                     if(newTask) {
 | |
|                         startNewTask(dt);
 | |
|                     } else {
 | |
| 
 | |
|                         for (DownloadTask t : downloadTasks) {
 | |
|                             if (t.getId() == taskId) {
 | |
|                                 t.setDownSatus(DownloadTask.DownStatus.正在下载);
 | |
|                                 break;
 | |
|                             }
 | |
|                         }
 | |
|                     }
 | |
| 
 | |
|                     startTask(taskId);
 | |
| 
 | |
|                     if(taskIndex==0) {
 | |
| 
 | |
|                         //  handler.sendEmptyMessage(1);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| 
 | |
|         }
 | |
|         else{
 | |
|             Log.d(TAG,"ServiceDownload  downloadTask size: " +downloadTasks.size());
 | |
| 
 | |
| 
 | |
|                 new Thread() {
 | |
| 
 | |
|                     @Override
 | |
|                     public void run() {
 | |
|                         List<DownloadTask> tmp = LitePal.findAll(DownloadTask.class);
 | |
| 
 | |
|                         if (downloadTasks.size() == 0) {
 | |
|                             taskIndex = 0;
 | |
|                             for (DownloadTask dt : tmp) {
 | |
|                                 startNewTask(dt);
 | |
|                             }
 | |
| 
 | |
|                         }else{
 | |
| 
 | |
|                             for (DownloadTask dt : tmp) {
 | |
|                                 boolean exist = false;
 | |
|                                 for(DownloadTask t: downloadTasks){
 | |
|                                     if(t.getId() == dt.getId()){
 | |
|                                         exist =true;
 | |
|                                         break;
 | |
|                                     }
 | |
|                                 }
 | |
|                                 if(!exist){
 | |
|                                     startNewTask(dt);
 | |
|                                 }
 | |
| 
 | |
|                             }
 | |
| 
 | |
|                         }
 | |
|                         if (taskIndex == 0) {
 | |
|                             startTask();
 | |
|                             //  handler.sendEmptyMessage(1);
 | |
|                         }
 | |
|                     }
 | |
|                 }.start();
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|           /*
 | |
|              if(processingTask==null) {
 | |
|                 startTask();
 | |
|             }*/
 | |
|         }
 | |
|         Log.d(TAG,"ServiceDownload test service onHandleIntent...over");
 | |
|     }
 | |
| 
 | |
| 
 | |
|     Handler handler = new Handler()  {
 | |
|         @Override
 | |
|         public void handleMessage(Message msg) {
 | |
|        /*     if(msg.what ==1){
 | |
|                 startTask();
 | |
|             }else*/
 | |
|             if (msg.what == 2) {
 | |
|                 if(!NetUtil.isNetworkConnected()) {
 | |
|         /*            Intent broadcastIntent = new Intent();
 | |
|                     broadcastIntent.setAction("ServiceDownload.ChapterContent.finished");
 | |
|                     broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
 | |
|                     broadcastIntent.putExtra("network", "没有网络了,下载失败");
 | |
|                     sendBroadcast(broadcastIntent);*/
 | |
|                     return;
 | |
|                 }
 | |
| 
 | |
|                 int tIndex = msg.getData().getInt("tIndex");
 | |
| 
 | |
| 
 | |
|                 if (tIndex >= downloadTasks.size()) {
 | |
|                     return;
 | |
|                 }
 | |
|                 int taskId = downloadTasks.get(tIndex).getId();
 | |
|                /* if( downloadTasks.get(taskId).getDownSatus() == DownloadTask.DownStatus.等待下载){
 | |
|                     return;
 | |
|                 }
 | |
|                 if(tasksMap.get(processingTask.getId())==null){
 | |
|                     return;
 | |
|                 }
 | |
|                 */
 | |
| 
 | |
|                 if (tasksMap.get(taskId) == null) {
 | |
|                     return;
 | |
|                 }
 | |
| 
 | |
|                 Log.d(TAG, String.format("%s start new chapt download---- taskId :%s, chapter count %s,chaptIndex %s", TAG
 | |
|                         , processingTask.getId(),
 | |
|                         tasksMap.get(processingTask.getId()).size(), chaptIndex));
 | |
| 
 | |
|                 //  if(taskIndex==tIndex+1){
 | |
| 
 | |
| 
 | |
|                 Intent  broadcastIntent = new Intent();
 | |
|                 broadcastIntent.setAction("ServiceDownload.ChapterContent.finished");
 | |
|                 broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
 | |
|                 broadcastIntent.putExtra("progress", processingTask.getFinishedChpats() > processingTask.getTotalChapts() ? processingTask.getTotalChapts() : processingTask.getFinishedChpats());
 | |
|                 broadcastIntent.putExtra("novelId", processingTask.getNovelId());
 | |
|                 broadcastIntent.putExtra("taskId", processingTask.getId());
 | |
|                 sendBroadcast(broadcastIntent);
 | |
| 
 | |
|                 //   }
 | |
|                 //
 | |
|                 if (downloadTasks.get(tIndex).getDownSatus() != DownloadTask.DownStatus.正在下载) {
 | |
| 
 | |
|                     startNewTask();
 | |
|                     return;
 | |
| 
 | |
|                 }
 | |
|                 //   if(  Chapter.getUnCachedChapters(taskId).size() >0 ){
 | |
|                 //if( tasksMap.get(taskId).size()-1 > chaptIndex){
 | |
| 
 | |
|                 if (tasksMap.get(taskId).size() - 1 > chaptIndex) {
 | |
|                     chaptIndex++;
 | |
|                     //  }
 | |
| 
 | |
|                       /*  else{
 | |
|                             startNewTask();
 | |
|                             return;
 | |
|                         }*/
 | |
| 
 | |
| 
 | |
|                 } else {
 | |
|                     Log.d(TAG, String.format("%s task done ---- taskId :%s, chapter count %s,chaptIndex %s", TAG, processingTask.getId(),
 | |
|                             tasksMap.get(processingTask.getId()).size(), chaptIndex));
 | |
|                     //章节全部处理完毕了
 | |
| 
 | |
|                     if (taskId == processingTask.getId()
 | |
|                             && tasksMapDone.get(taskId) != null
 | |
|                             && tasksMapDone.get(taskId).size() == tasksMap.get(taskId).size()) {
 | |
|                         int abc = 1;
 | |
|                         abc++;
 | |
|                         processingTask.setFinishedChpats(processingTask.getTotalChapts());
 | |
|                         processingTask.setStatus(1);
 | |
|                         processingTask.setDownSatus(DownloadTask.DownStatus.下载完成);
 | |
|                         processingTask.update(processingTask.getId());
 | |
|                         tasksMap.remove(taskId);
 | |
| 
 | |
| 
 | |
|                         broadcastIntent = new Intent();
 | |
|                         broadcastIntent.setAction("ServiceDownload.ChapterContent.finished");
 | |
|                         broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
 | |
|                         broadcastIntent.putExtra("progress", processingTask.getTotalChapts());
 | |
|                         broadcastIntent.putExtra("status", processingTask.getStatus());
 | |
|                         broadcastIntent.putExtra("taskId", processingTask.getId());
 | |
|                         sendBroadcast(broadcastIntent);
 | |
| 
 | |
| 
 | |
|                     }
 | |
|                     startNewTask();
 | |
|                     return;
 | |
|                 }
 | |
| 
 | |
|                 doDownloadContent(tIndex, chaptIndex);
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|         };
 | |
| 
 | |
|     void startNewTask(){
 | |
|         if(!NetUtil.isNetworkConnected()){
 | |
|             Intent broadcastIntent = new Intent();
 | |
|             broadcastIntent.setAction("ServiceDownload.ChapterContent.finished");
 | |
|             broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
 | |
| 
 | |
|             broadcastIntent.putExtra("network", "没有网络了,下载失败");
 | |
|             sendBroadcast(broadcastIntent);
 | |
| 
 | |
|             return;
 | |
|         }
 | |
|         taskIndex=0;
 | |
|         startTask(); //auto start next task
 | |
|     }
 | |
| 
 | |
|     private void stopTask(int taskId) {
 | |
| 
 | |
|         if(processingTask==null || processingTask.getId()==taskId) {
 | |
|             //startTask();//to start next
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 启动指定task
 | |
|      * @param taskId
 | |
|      */
 | |
|     private void startTask(int taskId) {
 | |
|         if ( downloadTasks.size()==0){
 | |
|             return;
 | |
|         }
 | |
|         if(processingTask!=null) {
 | |
|             processingTask.update(processingTask.getId());
 | |
|         }
 | |
|         taskIndex=0;
 | |
|         for(DownloadTask task : downloadTasks) {
 | |
|             if(task.getId()==taskId) {
 | |
|                 processingTask = task;
 | |
|                 break;
 | |
|             }
 | |
|             taskIndex++;
 | |
|         }
 | |
| 
 | |
|         processingTask.setDownSatus(DownloadTask.DownStatus.正在下载);
 | |
|         chaptIndex=0;
 | |
|         doDownloadContent(taskIndex,chaptIndex);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * auto next task
 | |
|      */
 | |
|     private void startTask() {
 | |
|        if ( downloadTasks.size()==0 || downloadTasks.size() <=taskIndex){
 | |
|            Log.d(TAG,"ServiceDownload No Task to do, exit.");
 | |
| 
 | |
|            return;
 | |
|        }
 | |
|         if(processingTask!=null) {
 | |
|             processingTask.update(processingTask.getId());
 | |
|         }
 | |
| 
 | |
|         Log.d(TAG,"ServiceDownload start task to download,index " +taskIndex);
 | |
| 
 | |
|        /* if(downloadTasks.size() <=taskIndex){
 | |
|             taskIndex=0;
 | |
|             processingTask =null;
 | |
|          //   Log.d(TAG,"No task to download.");
 | |
|            // return;
 | |
|         }*/
 | |
| 
 | |
|         processingTask =    downloadTasks.get(taskIndex);
 | |
|       if(processingTask.getDownSatus()== DownloadTask.DownStatus.暂停下载
 | |
|        ||processingTask.getDownSatus()== DownloadTask.DownStatus.下载完成
 | |
|       ){
 | |
|             taskIndex++;
 | |
|             startTask();
 | |
|             return;
 | |
|         }
 | |
|         processingTask.setDownSatus(DownloadTask.DownStatus.正在下载);
 | |
|         chaptIndex=0;
 | |
|         doDownloadContent(taskIndex,chaptIndex);
 | |
|         if(taskIndex < downloadTasks.size()-1){
 | |
|             taskIndex++;
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
| 
 | |
|     void doDownloadContent(int taskIndex,int chaptIndex){
 | |
|         Message mg = Message.obtain();
 | |
|         mg.what =2;
 | |
|         Bundle bundleData = new Bundle();
 | |
|         bundleData.putInt("tIndex", taskIndex);
 | |
|         mg.setData(bundleData);
 | |
|         Log.d(TAG, String.format("ServiceDownload--- taskId: %s ",processingTask.getId()));
 | |
|         List<Chapter> chps = tasksMap.get(processingTask.getId());
 | |
|         if(chps!=null && chps.size()>0 && chps.size() >chaptIndex) {
 | |
|             Chapter chapter = chps.get(chaptIndex);
 | |
| 
 | |
|            /* while(!NetUtil.isNetworkConnected() ){
 | |
|                 try {
 | |
|                     Thread.sleep(100);
 | |
|                 } catch (InterruptedException e) {
 | |
|                     e.printStackTrace();
 | |
|                 }
 | |
|             }*/
 | |
| 
 | |
|             if (NetUtil.isNetworkConnected() && TextUtils.isEmpty(chapter.getChapterPath())) {
 | |
|                 try {
 | |
|                     ServiceDownload(taskIndex,chapter);
 | |
|                 } catch (JSONException e) {
 | |
|                     e.printStackTrace();
 | |
|                 } catch (InterruptedException e) {
 | |
|                     e.printStackTrace();
 | |
|                // } catch (IOException e) {
 | |
|               //      e.printStackTrace();
 | |
|                 }
 | |
| 
 | |
|             } else {
 | |
|                 handler.sendMessage(mg);
 | |
|             }
 | |
|         }else{
 | |
|             handler.sendMessage(mg);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|       void startNewTask(DownloadTask dt){
 | |
| 
 | |
| 
 | |
| 
 | |
|         if(dt!=null){
 | |
|             List<Chapter> chps = Chapter.getUnCachedChapters(dt.getId());
 | |
|             if(chps==null || chps.size()==0){
 | |
|                 return;
 | |
|             }
 | |
|             SiteRule siteRule = SiteRule. getSiteRuleByDomain(dt.getDomain());
 | |
|             if(siteRule==null){
 | |
|                 //to do get siterule from web
 | |
|                 Log.d(TAG, String.format("没找到site rule: %s",dt.getDomain()));
 | |
|             }else {
 | |
|                 siteRuleMap.put(dt.getNovelId(),siteRule);
 | |
| 
 | |
|                 downloadTasks.add(dt);
 | |
| 
 | |
|               /*  for(DownloadTask tmp: downloadTasks){
 | |
|                     Log.d(TAG, String.format("test service task list : %s",tmp.getId()));
 | |
|                 }*/
 | |
| 
 | |
| 
 | |
|                 tasksMap.put(dt.getId(), chps);
 | |
|               /*  if(taskIndex==0) {
 | |
|                     startTask();
 | |
|                   //  handler.sendEmptyMessage(1);
 | |
|                 }*/
 | |
|             }
 | |
|         }
 | |
|         /*
 | |
|         new Thread() {
 | |
| 
 | |
|             @Override
 | |
|             public void run() {
 | |
| 
 | |
| 
 | |
| 
 | |
|             }
 | |
|         }.start();
 | |
| 
 | |
|         */
 | |
|     }
 | |
|     private void ServiceDownload(int taskIndex, Chapter chapter ) throws JSONException, InterruptedException {
 | |
| 
 | |
|         int taskID=  downloadTasks.get(taskIndex).getId() ;
 | |
|         int msg =2;
 | |
|         Message mg = Message.obtain();
 | |
|         mg.what =msg;
 | |
|         Bundle bundleData = new Bundle();
 | |
|         bundleData.putInt("tIndex", taskIndex);
 | |
|         mg.setData(bundleData);
 | |
|         String url = chapter.getChapterUrl();
 | |
|         if( TextUtils.isEmpty( url)){
 | |
|           //  handler.sendEmptyMessage(msg);
 | |
|             handler.sendMessage(mg);
 | |
|             return ;
 | |
|         }
 | |
|         long startTime= new Date().getTime();
 | |
|         Log.d(TAG,String.format("ServiceDownload----start download %s from %s",   chapter.getChapterName()  ,url ));
 | |
| 
 | |
| 
 | |
| 
 | |
|         //  Log.d( "ServiceDownload",String.format("ServiceDownload isDownloadChapt: %s",isDownloadChapt));
 | |
|         JSONObject siteJson = new JSONObject();
 | |
|         siteJson.put("chapterContentRegex", siteRuleMap.get(chapter.getNovelId()).getChapterContentRegex());
 | |
|         siteJson.put("chapterContentDumpRegex",  siteRuleMap.get(chapter.getNovelId()).getChapterContentDumpRegex());
 | |
|         Request request = getTagRequest(url);
 | |
|         HttpMethods.getOkClient().newCall(request).enqueue(new Callback() {
 | |
|             @Override
 | |
|             public void onFailure(Call call, IOException e) {
 | |
|                 handler.sendMessage(mg);
 | |
|              //   handler.sendEmptyMessage(msg);
 | |
| 
 | |
|                 //  Log.d( "ServiceDownload",String.format("ServiceDownload fail, isDownloadChapt: %s",isDownloadChapt));
 | |
|                 e.printStackTrace();
 | |
|                 // throw new RuntimeException("Error during writing " + fileChapterName( index));
 | |
|             }
 | |
| 
 | |
|             @Override
 | |
|             public void onResponse(Call call, Response response){
 | |
|                 ResponseBody body = response.body();
 | |
|                 if (body != null ) {
 | |
|                     if(response.code()!=200){
 | |
|                         Log.d(TAG, "ServiceDownload----network failure returnCode " + response.code());
 | |
|                         //  setDownloadFlag(true);
 | |
|                         //  chaptDownStatus.put(index, BookUtil.DownloadStatus.failure);
 | |
|                         //   Log.d( "ServiceDownload",String.format("ServiceDownload error %s ,isDownloadChapt: %s",  response.code(),isDownloadChapt));
 | |
|                        // handler.sendEmptyMessage(msg);
 | |
|                         handler.sendMessage(mg);
 | |
|                     return;
 | |
|                     }
 | |
| 
 | |
|                     try {
 | |
|                        // NovelParseUtil.enconding(body, siteRuleMap.get(chapter.getNovelId()).getEncoding());
 | |
|                         String bodyStr =NovelParseUtil.enconding(body, siteRuleMap.get(chapter.getNovelId()).getEncoding());; //body.string();
 | |
|                         String title = chapter.getChapterName();
 | |
|                         String chapterContent = title+ "\n" + NovelParseUtil.getChapterContent(bodyStr, siteJson);
 | |
|                         char[] buf = chapterContent.toCharArray();
 | |
|                         File file = new File(fileChapterName(chapter));
 | |
|                         file.createNewFile();
 | |
| 
 | |
|                         final OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileChapterName(chapter)), "utf-8");//"UTF-16LE"); // UTF-16LE 比 utf-8 文件小
 | |
|                         writer.write(buf);
 | |
|                         writer.close();
 | |
|                         Log.d( "ServiceDownload",String.format("ServiceDownload file created:  %s",  file.getPath()));
 | |
|                         processingTask.setFinishedChpats(processingTask.getFinishedChpats()+1);
 | |
|                         processingTask.update(processingTask.getId());
 | |
|                         Thread.sleep(siteRuleMap.get(chapter.getNovelId()).getMiniInterval4AccessChapter());
 | |
|                         //  setDownloadFlag(true);
 | |
|                     } catch (IOException | JSONException | InterruptedException e) {
 | |
|                         e.printStackTrace();
 | |
|                         //  throw new RuntimeException("Error during writing " + fileChapterName( index));
 | |
|                     }
 | |
|                     finally {
 | |
|                         body.close();
 | |
| 
 | |
| 
 | |
|                         //  setDownloadFlag(true);
 | |
|                     }
 | |
| 
 | |
|                     chapter.setChapterPath(fileChapterName(chapter));
 | |
|                     chapter.update(chapter.getId());
 | |
|                    if(! tasksMapDone.containsKey(taskID)){
 | |
|                        tasksMapDone.put(taskID,new ArrayList<Chapter>());
 | |
|                    }
 | |
| 
 | |
|                     tasksMapDone.get(taskID).add(chapter);
 | |
| 
 | |
|                     handler.sendMessage(mg);
 | |
|                     //setDownloadFlag(true);
 | |
|                     //   chaptDownStatus.put(index, BookUtil.DownloadStatus.success);
 | |
|                     Log.d(TAG,String.format("ServiceDownload---- finished download %s, cost time %s ,content path %s ",  chapter.getChapterName(),  new Date().getTime() -startTime ,chapter.getChapterPath()   ));
 | |
| 
 | |
|                 }
 | |
|             }
 | |
|         });
 | |
| 
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 直接
 | |
|      * @param chapter
 | |
|      * @throws JSONException
 | |
|      * @throws InterruptedException
 | |
| 
 | |
| 
 | |
|     private void ServiceDownload2( Chapter chapter ) throws IOException, JSONException, InterruptedException {
 | |
| 
 | |
|         int msg = 2;
 | |
| 
 | |
|         String url = chapter.getChapterUrl();
 | |
|         if (TextUtils.isEmpty(url)) {
 | |
|             handler.sendEmptyMessage(msg);
 | |
|             return;
 | |
|         }
 | |
|         long startTime = new Date().getTime();
 | |
|         Log.d(TAG, String.format("ServiceDownload----start download %s from %s", chapter.getChapterName(), url));
 | |
| 
 | |
| 
 | |
|         //  Log.d( "ServiceDownload",String.format("ServiceDownload isDownloadChapt: %s",isDownloadChapt));
 | |
|         JSONObject siteJson = new JSONObject();
 | |
|         siteJson.put("chapterContentRegex", siteRuleMap.get(chapter.getNovelId()).getChapterContentRegex());
 | |
|         siteJson.put("chapterContentDumpRegex", siteRuleMap.get(chapter.getNovelId()).getChapterContentDumpRegex());
 | |
|         Request request = getTagRequest(url);
 | |
|         Response response = HttpMethods.getOkClient().newCall(request).execute();
 | |
|         ResponseBody body = response.body();
 | |
|         if (body != null) {
 | |
|             if (response.code() != 200) {
 | |
|                 Log.d(TAG, "ServiceDownload----network failure returnCode " + response.code());
 | |
|                 //  setDownloadFlag(true);
 | |
|                 //  chaptDownStatus.put(index, BookUtil.DownloadStatus.failure);
 | |
|                 //   Log.d( "ServiceDownload",String.format("ServiceDownload error %s ,isDownloadChapt: %s",  response.code(),isDownloadChapt));
 | |
|                 handler.sendEmptyMessage(msg);
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             try {
 | |
|                 String bodyStr = body.string();
 | |
|                 String title = chapter.getChapterName();
 | |
|                 String chapterContent = title + "\n" + NovelParseUtil.getChapterContent(bodyStr, siteJson);
 | |
|                 char[] buf = chapterContent.toCharArray();
 | |
|                 File file = new File(fileChapterName(chapter));
 | |
|                 file.createNewFile();
 | |
| 
 | |
|                 final OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileChapterName(chapter)), "utf-8");//"UTF-16LE"); // UTF-16LE 比 utf-8 文件小
 | |
|                 writer.write(buf);
 | |
|                 writer.close();
 | |
|                 Log.d("ServiceDownload", String.format("ServiceDownload file created:  %s", file.getPath()));
 | |
|                 processingTask.setFinishedChpats(processingTask.getFinishedChpats() + 1);
 | |
|                 processingTask.update(processingTask.getId());
 | |
|                 Thread.sleep(siteRuleMap.get(chapter.getNovelId()).getMiniInterval4AccessChapter());
 | |
|                 //  setDownloadFlag(true);
 | |
|             } catch (IOException | JSONException | InterruptedException e) {
 | |
|                 e.printStackTrace();
 | |
|                 //  throw new RuntimeException("Error during writing " + fileChapterName( index));
 | |
|             } finally {
 | |
|                 body.close();
 | |
| 
 | |
| 
 | |
|                 //  setDownloadFlag(true);
 | |
|             }
 | |
| 
 | |
|             chapter.setChapterPath(fileChapterName(chapter));
 | |
|             chapter.update(chapter.getId());
 | |
|             handler.sendEmptyMessage(msg);
 | |
| 
 | |
|             //setDownloadFlag(true);
 | |
|             //   chaptDownStatus.put(index, BookUtil.DownloadStatus.success);
 | |
|             Log.d(TAG, String.format("ServiceDownload---- finished download %s, cost time %s ,content path %s ", chapter.getChapterName(), new Date().getTime() - startTime, chapter.getChapterPath()));
 | |
| 
 | |
|         }
 | |
| 
 | |
| 
 | |
|     }
 | |
| */
 | |
| 
 | |
|     protected String fileChapterName(Chapter chapter ) {
 | |
|             return  getChapterPath(chapter.getNovelId()) +chapter.getDomain()+"/"+ chapter.getIndex() ;
 | |
| 
 | |
|     }
 | |
|     String getChapterPath(int novelId){
 | |
|         File file = new File(chapterPath +novelId);
 | |
|         if(!file.exists()){
 | |
|             file.mkdir();
 | |
|         }
 | |
|         return  chapterPath +novelId+"/";
 | |
|     }
 | |
| 
 | |
|     private Request getTagRequest(String url) {
 | |
|         return new  Request.Builder()
 | |
|                 .tag(processingTask.getNovelId()) //标记
 | |
|                 .url(url)
 | |
|                 // .header("User-Agent", "OkHttp Example")
 | |
|                 .build();
 | |
|     }
 | |
| 
 | |
| 
 | |
| 
 | |
| }
 |