parent
							
								
									75c8bd3388
								
							
						
					
					
						commit
						8b76649226
					
				| @ -0,0 +1,123 @@ | ||||
| package io.legado.app.model.localBook | ||||
| 
 | ||||
| import android.content.Context | ||||
| import android.text.TextUtils | ||||
| import io.legado.app.data.entities.BookChapter | ||||
| import net.sf.jazzlib.ZipFile | ||||
| import nl.siegmann.epublib.domain.Book | ||||
| import nl.siegmann.epublib.domain.TOCReference | ||||
| import nl.siegmann.epublib.epub.EpubReader | ||||
| import nl.siegmann.epublib.service.MediatypeService | ||||
| import org.jsoup.Jsoup | ||||
| import java.io.File | ||||
| import java.io.IOException | ||||
| import java.nio.charset.Charset | ||||
| import java.util.* | ||||
| 
 | ||||
| class EPUBFile(context: Context, val book: io.legado.app.data.entities.Book) { | ||||
|     var epubBook: Book? = null | ||||
|     private lateinit var mCharset: Charset | ||||
| 
 | ||||
|     init { | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     fun readBook(file: File?): Book? { | ||||
|         return try { | ||||
|             val epubReader = EpubReader() | ||||
|             val lazyTypes = | ||||
|                 arrayOf( | ||||
|                     MediatypeService.CSS, | ||||
|                     MediatypeService.GIF, | ||||
|                     MediatypeService.JPG, | ||||
|                     MediatypeService.PNG, | ||||
|                     MediatypeService.MP3, | ||||
|                     MediatypeService.MP4 | ||||
|                 ) | ||||
|             val zipFile = ZipFile(file) | ||||
|             epubReader.readEpubLazy(zipFile, "utf-8", Arrays.asList(*lazyTypes)) | ||||
|         } catch (e: Exception) { | ||||
|             null | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fun getChapterList(epubBook: Book): ArrayList<BookChapter> { | ||||
|         val metadata = epubBook.metadata | ||||
|         book.name = metadata.firstTitle | ||||
|         if (metadata.authors.size > 0) { | ||||
|             val author = | ||||
|                 metadata.authors[0].toString().replace("^, |, $".toRegex(), "") | ||||
|             book.author = author | ||||
|         } | ||||
|         if (metadata.descriptions.size > 0) { | ||||
|             book.intro = Jsoup.parse(metadata.descriptions[0]).text() | ||||
|         } | ||||
|         val chapterList = ArrayList<BookChapter>() | ||||
|         val refs = | ||||
|             epubBook.tableOfContents.tocReferences | ||||
|         if (refs == null || refs.isEmpty()) { | ||||
|             val spineReferences = | ||||
|                 epubBook.spine.spineReferences | ||||
|             var i = 0 | ||||
|             val size = spineReferences.size | ||||
|             while (i < size) { | ||||
|                 val resource = | ||||
|                     spineReferences[i].resource | ||||
|                 var title = resource.title | ||||
|                 if (TextUtils.isEmpty(title)) { | ||||
|                     try { | ||||
|                         val doc = | ||||
|                             Jsoup.parse(String(resource.data, mCharset)) | ||||
|                         val elements = doc.getElementsByTag("title") | ||||
|                         if (elements.size > 0) { | ||||
|                             title = elements[0].text() | ||||
|                         } | ||||
|                     } catch (e: IOException) { | ||||
|                         e.printStackTrace() | ||||
|                     } | ||||
|                 } | ||||
|                 val chapter = BookChapter() | ||||
|                 chapter.index = i | ||||
|                 chapter.bookUrl = book.bookUrl | ||||
|                 chapter.url = resource.href | ||||
|                 if (i == 0 && title.isEmpty()) { | ||||
|                     chapter.title = "封面" | ||||
|                 } else { | ||||
|                     chapter.title = title | ||||
|                 } | ||||
|                 chapterList.add(chapter) | ||||
|                 i++ | ||||
|             } | ||||
|         } else { | ||||
|             parseMenu(chapterList, refs, 0) | ||||
|             for (i in chapterList.indices) { | ||||
|                 chapterList[i].index = i | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return chapterList | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     private fun parseMenu( | ||||
|         chapterList: ArrayList<BookChapter>, | ||||
|         refs: List<TOCReference>?, | ||||
|         level: Int | ||||
|     ) { | ||||
|         if (refs == null) return | ||||
|         for (ref in refs) { | ||||
|             if (ref.resource != null) { | ||||
|                 val chapter = BookChapter() | ||||
|                 chapter.bookUrl = book.bookUrl | ||||
|                 chapter.title = ref.title | ||||
|                 chapter.url = ref.completeHref | ||||
|                 chapterList.add(chapter) | ||||
|             } | ||||
|             if (ref.children != null && !ref.children.isEmpty()) { | ||||
|                 parseMenu(chapterList, ref.children, level + 1) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue