|  |  |  | @ -1,5 +1,6 @@ | 
			
		
	
		
			
				
					|  |  |  |  | package io.legado.app.help.book | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | import android.graphics.BitmapFactory | 
			
		
	
		
			
				
					|  |  |  |  | import android.os.ParcelFileDescriptor | 
			
		
	
		
			
				
					|  |  |  |  | import androidx.documentfile.provider.DocumentFile | 
			
		
	
		
			
				
					|  |  |  |  | import io.legado.app.constant.AppLog | 
			
		
	
	
		
			
				
					|  |  |  | @ -16,6 +17,7 @@ import kotlinx.coroutines.* | 
			
		
	
		
			
				
					|  |  |  |  | import kotlinx.coroutines.Dispatchers.IO | 
			
		
	
		
			
				
					|  |  |  |  | import org.apache.commons.text.similarity.JaccardSimilarity | 
			
		
	
		
			
				
					|  |  |  |  | import splitties.init.appCtx | 
			
		
	
		
			
				
					|  |  |  |  | import java.io.ByteArrayInputStream | 
			
		
	
		
			
				
					|  |  |  |  | import java.io.File | 
			
		
	
		
			
				
					|  |  |  |  | import java.io.FileNotFoundException | 
			
		
	
		
			
				
					|  |  |  |  | import java.io.FileOutputStream | 
			
		
	
	
		
			
				
					|  |  |  | @ -147,6 +149,9 @@ object BookHelp { | 
			
		
	
		
			
				
					|  |  |  |  |             ImageUtils.decode( | 
			
		
	
		
			
				
					|  |  |  |  |                 src, bytes, isCover = false, bookSource, book | 
			
		
	
		
			
				
					|  |  |  |  |             )?.let { | 
			
		
	
		
			
				
					|  |  |  |  |                 if (!checkImage(bytes)) { | 
			
		
	
		
			
				
					|  |  |  |  |                     AppLog.put("图片 $src 下载错误,数据异常") | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |                 FileUtils.createFileIfNotExist( | 
			
		
	
		
			
				
					|  |  |  |  |                     downloadDir, | 
			
		
	
		
			
				
					|  |  |  |  |                     cacheFolderName, | 
			
		
	
	
		
			
				
					|  |  |  | @ -157,7 +162,7 @@ object BookHelp { | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } catch (e: Exception) { | 
			
		
	
		
			
				
					|  |  |  |  |             e.printStackTrace() | 
			
		
	
		
			
				
					|  |  |  |  |             AppLog.put("${src}下载错误", e) | 
			
		
	
		
			
				
					|  |  |  |  |             AppLog.put("图片 $src 下载错误", e) | 
			
		
	
		
			
				
					|  |  |  |  |         } finally { | 
			
		
	
		
			
				
					|  |  |  |  |             downloadImages.remove(src) | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
	
		
			
				
					|  |  |  | @ -255,17 +260,41 @@ object BookHelp { | 
			
		
	
		
			
				
					|  |  |  |  |         if (!hasContent(book, bookChapter)) { | 
			
		
	
		
			
				
					|  |  |  |  |             return false | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         var ret = true | 
			
		
	
		
			
				
					|  |  |  |  |         val op = BitmapFactory.Options() | 
			
		
	
		
			
				
					|  |  |  |  |         op.inJustDecodeBounds = true | 
			
		
	
		
			
				
					|  |  |  |  |         getContent(book, bookChapter)?.let { | 
			
		
	
		
			
				
					|  |  |  |  |             val matcher = AppPattern.imgPattern.matcher(it) | 
			
		
	
		
			
				
					|  |  |  |  |             while (matcher.find()) { | 
			
		
	
		
			
				
					|  |  |  |  |                 matcher.group(1)?.let { src -> | 
			
		
	
		
			
				
					|  |  |  |  |                     val image = getImage(book, src) | 
			
		
	
		
			
				
					|  |  |  |  |                     if (!image.exists()) { | 
			
		
	
		
			
				
					|  |  |  |  |                         return false | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 val src = matcher.group(1)!! | 
			
		
	
		
			
				
					|  |  |  |  |                 val image = getImage(book, src) | 
			
		
	
		
			
				
					|  |  |  |  |                 if (!image.exists()) { | 
			
		
	
		
			
				
					|  |  |  |  |                     ret = false | 
			
		
	
		
			
				
					|  |  |  |  |                     continue | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |                 if (SvgUtils.getSize(image.absolutePath) != null) { | 
			
		
	
		
			
				
					|  |  |  |  |                     continue | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |                 BitmapFactory.decodeFile(image.absolutePath, op) | 
			
		
	
		
			
				
					|  |  |  |  |                 if (op.outWidth < 1 && op.outHeight < 1) { | 
			
		
	
		
			
				
					|  |  |  |  |                     ret = false | 
			
		
	
		
			
				
					|  |  |  |  |                     image.delete() | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         return ret | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     private fun checkImage(bytes: ByteArray): Boolean { | 
			
		
	
		
			
				
					|  |  |  |  |         if (SvgUtils.getSize(ByteArrayInputStream(bytes)) != null) { | 
			
		
	
		
			
				
					|  |  |  |  |             return true | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         val op = BitmapFactory.Options() | 
			
		
	
		
			
				
					|  |  |  |  |         op.inJustDecodeBounds = true | 
			
		
	
		
			
				
					|  |  |  |  |         BitmapFactory.decodeByteArray(bytes, 0, bytes.size, op) | 
			
		
	
		
			
				
					|  |  |  |  |         if (op.outWidth < 1 && op.outHeight < 1) { | 
			
		
	
		
			
				
					|  |  |  |  |             return false | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         return true | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |