Merge remote-tracking branch 'origin/master'

pull/141/head
kunfei 5 years ago
commit 9a48e4212e
  1. 3
      app/src/main/assets/web/bookshelf.html
  2. 22
      app/src/main/assets/web/bookshelf.js
  3. 37
      app/src/main/java/io/legado/app/service/DownloadService.kt

@ -28,6 +28,9 @@
<div class="clear"></div> <div class="clear"></div>
<div id="chapter" class="chapter"></div> <div id="chapter" class="chapter"></div>
<div id="content" class="content"></div> <div id="content" class="content"></div>
<div id="page" class="button">
<center><button id='up'>上一章</button><button id='down'>下一章</button></center>
</div>
</div> </div>
</div> </div>
<script src="bookshelf.js"></script> <script src="bookshelf.js"></script>

@ -6,6 +6,8 @@
, books , books
; ;
var now_chapter = -1;
var formatTime = value => { var formatTime = value => {
return new Date(value).toLocaleString('zh-CN', { return new Date(value).toLocaleString('zh-CN', {
hour12: false, year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit" hour12: false, year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"
@ -62,6 +64,7 @@ var init = () => {
}); });
$$('#books img').forEach(bookImg => $$('#books img').forEach(bookImg =>
bookImg.addEventListener("click", () => { bookImg.addEventListener("click", () => {
now_chapter = -1
$('#allcontent').classList.add("read"); $('#allcontent').classList.add("read");
var book = books[bookImg.getAttribute("data-series-num")]; var book = books[bookImg.getAttribute("data-series-num")];
$("#info").innerHTML = `<img src="${bookImg.src}"> $("#info").innerHTML = `<img src="${bookImg.src}">
@ -130,6 +133,24 @@ $('#showchapter').addEventListener("click", () => {
window.location.hash = "#chapter"; window.location.hash = "#chapter";
}); });
$('#up').addEventListener('click', e => {
if (now_chapter > 0) {
now_chapter--;
let clickEvent = document.createEvent('MouseEvents');
clickEvent.initEvent("click", true, false);
$('[data-index="' + now_chapter + '"]').dispatchEvent(clickEvent);
}
});
$('#down').addEventListener('click', e => {
if (now_chapter > -1) {
now_chapter++;
let clickEvent = document.createEvent('MouseEvents');
clickEvent.initEvent("click", true, false);
$('[data-index="' + now_chapter + '"]').dispatchEvent(clickEvent);
}
});
$('#chapter').addEventListener("click", (e) => { $('#chapter').addEventListener("click", (e) => {
if (e.target.tagName === "BUTTON") { if (e.target.tagName === "BUTTON") {
var url = e.target.getAttribute("data-url"); var url = e.target.getAttribute("data-url");
@ -141,6 +162,7 @@ $('#chapter').addEventListener("click", (e) => {
if (!index && (0 != index)) { if (!index && (0 != index)) {
alert("未取得章节索引"); alert("未取得章节索引");
} }
now_chapter = parseInt(index);
$("#content").innerHTML = "<p>" + name + " 加载中...</p>"; $("#content").innerHTML = "<p>" + name + " 加载中...</p>";
fetch(apiAddress("getBookContent", url, index), { mode: "cors" }) fetch(apiAddress("getBookContent", url, index), { mode: "cors" })
.then(res => res.json()) .then(res => res.json())

@ -29,8 +29,10 @@ class DownloadService : BaseService() {
private val handler = Handler() private val handler = Handler()
private var runnable: Runnable = Runnable { upDownload() } private var runnable: Runnable = Runnable { upDownload() }
private val downloadMap = hashMapOf<String, LinkedHashSet<BookChapter>>() private val downloadMap = hashMapOf<String, LinkedHashSet<BookChapter>>()
private val downloadCount = hashMapOf<String, DownloadCount>();
private val finalMap = hashMapOf<String, LinkedHashSet<BookChapter>>() private val finalMap = hashMapOf<String, LinkedHashSet<BookChapter>>()
private var notificationContent = "正在启动下载" private var notificationContent = "正在启动下载"
private val notificationBuilder by lazy { private val notificationBuilder by lazy {
val builder = NotificationCompat.Builder(this, AppConst.channelIdDownload) val builder = NotificationCompat.Builder(this, AppConst.channelIdDownload)
.setSmallIcon(R.drawable.ic_download) .setSmallIcon(R.drawable.ic_download)
@ -97,6 +99,11 @@ class DownloadService : BaseService() {
finalMap.remove(bookUrl) finalMap.remove(bookUrl)
} }
private fun updateNotification(downloadCount:DownloadCount, totalCount: Int, content: String){
notificationContent =
"进度:${downloadCount.downloadFinishedCount}/$totalCount,成功:${downloadCount.successCount},$content"
}
private fun download() { private fun download() {
val task = Coroutine.async(this, context = searchPool) { val task = Coroutine.async(this, context = searchPool) {
downloadMap.forEach { entry -> downloadMap.forEach { entry ->
@ -106,6 +113,9 @@ class DownloadService : BaseService() {
val bookSource = val bookSource =
App.db.bookSourceDao().getBookSource(book.origin) ?: return@async App.db.bookSourceDao().getBookSource(book.origin) ?: return@async
val webBook = WebBook(bookSource) val webBook = WebBook(bookSource)
downloadCount[entry.key] = DownloadCount()
entry.value.forEach { chapter -> entry.value.forEach { chapter ->
if (!isActive) return@async if (!isActive) return@async
if (downloadMap.containsKey(book.bookUrl)) { if (downloadMap.containsKey(book.bookUrl)) {
@ -116,16 +126,19 @@ class DownloadService : BaseService() {
scope = this, scope = this,
context = searchPool context = searchPool
) )
.onStart { //.onStart {
notificationContent = chapter.title // notificationContent = "启动:" + chapter.title
} //}
.onSuccess(IO) { content -> .onSuccess(IO) { content ->
content?.let { content?.let {
downloadCount[entry.key]?.increaseSuccess()
BookHelp.saveContent(book, chapter, content) BookHelp.saveContent(book, chapter, content)
} }
} }
.onFinally(IO) { .onFinally(IO) {
synchronized(this@DownloadService) { synchronized(this@DownloadService) {
downloadCount[entry.key]?.increaseFinished()
downloadCount[entry.key]?.let { updateNotification(it, entry.value.size, chapter.title) }
val chapterMap = val chapterMap =
finalMap[book.bookUrl] finalMap[book.bookUrl]
?: linkedSetOf<BookChapter>().apply { ?: linkedSetOf<BookChapter>().apply {
@ -135,9 +148,14 @@ class DownloadService : BaseService() {
if (chapterMap.size == entry.value.size) { if (chapterMap.size == entry.value.size) {
downloadMap.remove(book.bookUrl) downloadMap.remove(book.bookUrl)
finalMap.remove(book.bookUrl) finalMap.remove(book.bookUrl)
downloadCount.remove(entry.key)
} }
} }
} }
} else{
//无需下载的,设置为增加成功
downloadCount[entry.key]?.increaseSuccess()
downloadCount[entry.key]?.increaseFinished()
} }
} }
} }
@ -176,4 +194,17 @@ class DownloadService : BaseService() {
val notification = builder.build() val notification = builder.build()
startForeground(AppConst.notificationIdDownload, notification) startForeground(AppConst.notificationIdDownload, notification)
} }
}
class DownloadCount{
@Volatile public var downloadFinishedCount = 0 // 下载完成的条目数量
@Volatile public var successCount = 0 //下载成功的条目数量
fun increaseSuccess(){
++successCount;
}
fun increaseFinished(){
++downloadFinishedCount;
}
} }
Loading…
Cancel
Save