diff --git a/app/src/main/java/com/github/catvod/utils/DownloadMT.kt b/app/src/main/java/com/github/catvod/utils/DownloadMT.kt index 6d9be388..f216f04c 100644 --- a/app/src/main/java/com/github/catvod/utils/DownloadMT.kt +++ b/app/src/main/java/com/github/catvod/utils/DownloadMT.kt @@ -15,9 +15,9 @@ import kotlinx.coroutines.joinAll import kotlinx.coroutines.launch import okhttp3.Response import org.apache.commons.lang3.StringUtils -import java.io.InputStream +import java.io.PipedInputStream +import java.io.PipedOutputStream import java.io.SequenceInputStream -import java.util.Vector object DownloadMT { val THREAD_NUM: Int = Runtime.getRuntime().availableProcessors() * 2 @@ -29,7 +29,7 @@ object DownloadMT { /* val service = Executors.newFixedThreadPool(THREAD_NUM) SpiderDebug.log("--proxyMultiThread: THREAD_NUM " + THREAD_NUM)*/ - val seqInputStream: SequenceInputStream? + try { //缓存,避免每次都请求total等信息 @@ -70,7 +70,7 @@ object DownloadMT { // 存储执行结果的List val jobs = mutableListOf() - val channels = List(THREAD_NUM) { Channel() } + val channels = List(THREAD_NUM) { Channel() } for ((index, part) in partList.withIndex()) { @@ -82,34 +82,48 @@ object DownloadMT { headerNew["range"] = newRange headerNew["Range"] = newRange jobs += CoroutineScope(Dispatchers.IO).launch { - downloadRange(url, headerNew)?.let { channels[index].send(it) }; + val res = downloadRange(url, headerNew) + + if (res != null) { + val buffer = ByteArray(1024) + var bytesRead: Int = 0 + + while (res.body()?.byteStream()?.read(buffer).also { + if (it != null) { + bytesRead = it + } + } != -1) { + // 处理读取的数据 + channels[index].send(buffer.copyOfRange(0, bytesRead)) + + } + channels[index].close() // 发送完成后关闭通道 + SpiderDebug.log("---第" + index + "块下载完成" + ";Content-Range:" + res.headers()["Content-Range"]) + SpiderDebug.log("---第" + index + "块下载完成" + ";content-range:" + res.headers()["content-range"]) + } } - - } - val inputStreams: MutableList = ArrayList() + val pipedOutputStream = PipedOutputStream(); + val pipedInputStream = PipedInputStream(pipedOutputStream); + CoroutineScope(Dispatchers.Default).launch { repeat(jobs.size) { index -> launch { - val response = channels[index].receive() - val body = response.body();/* int bytesRead; - while ((bytesRead = body.byteStream().read(bytes)) != -1) { - out.write(bytes, 0, bytesRead); - }*/ - inputStreams.add(body!!.byteStream()) + for (bytes in channels[index]) { + // 处理读取的数据 + + pipedOutputStream.write(bytes); + + } - SpiderDebug.log("---第" + index + "块下载完成" + ";Content-Range:" + response.headers()["Content-Range"]) - SpiderDebug.log("---第" + index + "块下载完成" + ";content-range:" + response.headers()["content-range"]) } } // 等待所有下载完成 jobs.joinAll() } - seqInputStream = SequenceInputStream(Vector(inputStreams).elements()) - // SpiderDebug.log(" ++proxy res data:" + Json.toJson(response.body())); var contentType: String? = resHeader["Content-Type"] @@ -134,8 +148,8 @@ object DownloadMT { SpiderDebug.log("----proxy res contentType:$contentType") // SpiderDebug.log("++proxy res body:" + response.body()); SpiderDebug.log("----proxy res respHeaders:" + Json.toJson(resHeader)) - SpiderDebug.log("----proxy inputstream:$seqInputStream") - return arrayOf(206, contentType, seqInputStream, resHeader) + + return arrayOf(206, contentType, pipedInputStream, resHeader) } catch (e: Exception) { SpiderDebug.log("proxyMultiThread error:" + e.message) diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 193d2c37..94749607 100644 Binary files a/jar/custom_spider.jar and b/jar/custom_spider.jar differ diff --git a/jar/custom_spider.jar.md5 b/jar/custom_spider.jar.md5 index f6c422e3..0fd6e7f8 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -d7d6052ea18536e48b17bdfb64a06a39 +b3a1b239c84bb4efd8628434147ad47a diff --git a/json/test.json b/json/test.json index f8c4147a..e4c40c70 100644 --- a/json/test.json +++ b/json/test.json @@ -1,5 +1,5 @@ { - "spider": "https://gh-proxy.com/https://raw.githubusercontent.com/lushunming/AndroidCatVodSpider/multiThreadkt/jar/custom_spider.jar;md5;d7d6052ea18536e48b17bdfb64a06a39", + "spider": "https://gh-proxy.com/https://raw.githubusercontent.com/lushunming/AndroidCatVodSpider/multiThreadkt/jar/custom_spider.jar;md5;b3a1b239c84bb4efd8628434147ad47a", "lives": [ { "name": "电视直播",