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