| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -7,21 +7,17 @@ import com.script.SimpleBindings | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import io.legado.app.R | 
					 | 
					 | 
					 | 
					import io.legado.app.R | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import io.legado.app.constant.AppConst | 
					 | 
					 | 
					 | 
					import io.legado.app.constant.AppConst | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import io.legado.app.data.appDb | 
					 | 
					 | 
					 | 
					import io.legado.app.data.appDb | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					import io.legado.app.data.entities.BaseSource | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import io.legado.app.data.entities.Book | 
					 | 
					 | 
					 | 
					import io.legado.app.data.entities.Book | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import io.legado.app.data.entities.BookChapter | 
					 | 
					 | 
					 | 
					import io.legado.app.data.entities.BookChapter | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import io.legado.app.data.entities.BaseSource | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import io.legado.app.exception.TocEmptyException | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import io.legado.app.exception.NoStackTraceException | 
					 | 
					 | 
					 | 
					import io.legado.app.exception.NoStackTraceException | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					import io.legado.app.exception.TocEmptyException | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import io.legado.app.help.BookHelp | 
					 | 
					 | 
					 | 
					import io.legado.app.help.BookHelp | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import io.legado.app.help.config.AppConfig | 
					 | 
					 | 
					 | 
					import io.legado.app.help.config.AppConfig | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import io.legado.app.model.analyzeRule.AnalyzeUrl | 
					 | 
					 | 
					 | 
					import io.legado.app.model.analyzeRule.AnalyzeUrl | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import io.legado.app.utils.* | 
					 | 
					 | 
					 | 
					import io.legado.app.utils.* | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import splitties.init.appCtx | 
					 | 
					 | 
					 | 
					import splitties.init.appCtx | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import java.io.File | 
					 | 
					 | 
					 | 
					import java.io.* | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import java.io.FileInputStream | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import java.io.FileOutputStream | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import java.io.FileNotFoundException | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import java.io.InputStream | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import java.util.regex.Pattern | 
					 | 
					 | 
					 | 
					import java.util.regex.Pattern | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					/** | 
					 | 
					 | 
					 | 
					/** | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -50,6 +46,20 @@ object LocalBook { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        throw FileNotFoundException("${uri.path} 文件不存在") | 
					 | 
					 | 
					 | 
					        throw FileNotFoundException("${uri.path} 文件不存在") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    fun getLastModified(book: Book): Result<Long> { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        return kotlin.runCatching { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            val uri = Uri.parse(book.bookUrl) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            if (uri.isContentScheme()) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                return@runCatching DocumentFile.fromSingleUri(appCtx, uri)!!.lastModified() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            val file = File(uri.path!!) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            if (file.exists()) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                return@runCatching File(uri.path!!).lastModified() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            throw FileNotFoundException("${uri.path} 文件不存在") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    @Throws(Exception::class) | 
					 | 
					 | 
					 | 
					    @Throws(Exception::class) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    fun getChapterList(book: Book): ArrayList<BookChapter> { | 
					 | 
					 | 
					 | 
					    fun getChapterList(book: Book): ArrayList<BookChapter> { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        val chapters = when { | 
					 | 
					 | 
					 | 
					        val chapters = when { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -228,7 +238,7 @@ object LocalBook { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        val lastPath = urlNoOption.substringAfterLast("/") | 
					 | 
					 | 
					 | 
					        val lastPath = urlNoOption.substringAfterLast("/") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        val fileType = lastPath.substringAfterLast(".") | 
					 | 
					 | 
					 | 
					        val fileType = lastPath.substringAfterLast(".") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        val type = analyzeUrl.type | 
					 | 
					 | 
					 | 
					        val type = analyzeUrl.type | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        return type ?: fileType ?: "unknown" | 
					 | 
					 | 
					 | 
					        return type ?: fileType | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    private fun saveBookFile( | 
					 | 
					 | 
					 | 
					    private fun saveBookFile( | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -262,13 +272,13 @@ object LocalBook { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    //文件类书源 合并在线书籍信息 在线 > 本地 | 
					 | 
					 | 
					 | 
					    //文件类书源 合并在线书籍信息 在线 > 本地 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    fun mergeBook(localBook: Book, onLineBook: Book?): Book { | 
					 | 
					 | 
					 | 
					    fun mergeBook(localBook: Book, onLineBook: Book?): Book { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        onLineBook ?: return localBook | 
					 | 
					 | 
					 | 
					        onLineBook ?: return localBook | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        val mergeBook = localBook | 
					 | 
					 | 
					 | 
					        localBook.name = onLineBook.name.ifBlank { localBook.name } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        mergeBook.name = if (onLineBook.name.isBlank()) localBook.name else onLineBook.name | 
					 | 
					 | 
					 | 
					        localBook.author = onLineBook.author.ifBlank { localBook.author } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        mergeBook.author = if (onLineBook.author.isBlank()) localBook.author else onLineBook.author | 
					 | 
					 | 
					 | 
					        localBook.coverUrl = onLineBook.coverUrl | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        mergeBook.coverUrl = onLineBook.coverUrl | 
					 | 
					 | 
					 | 
					        localBook.intro = | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        mergeBook.intro = if (onLineBook.intro.isNullOrBlank()) localBook.intro else onLineBook.intro | 
					 | 
					 | 
					 | 
					            if (onLineBook.intro.isNullOrBlank()) localBook.intro else onLineBook.intro | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        mergeBook.save() | 
					 | 
					 | 
					 | 
					        localBook.save() | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        return mergeBook | 
					 | 
					 | 
					 | 
					        return localBook | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
					 | 
					 | 
					
  |