kt线程和分片优化
This commit is contained in:
parent
f4facd0f69
commit
aa41a5fed1
|
|
@ -9,15 +9,15 @@ import com.github.catvod.utils.ProxyVideo.proxy
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
|
import kotlinx.coroutines.async
|
||||||
import kotlinx.coroutines.channels.Channel
|
import kotlinx.coroutines.channels.Channel
|
||||||
|
import kotlinx.coroutines.joinAll
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
import org.apache.commons.lang3.StringUtils
|
import org.apache.commons.lang3.StringUtils
|
||||||
import java.io.ByteArrayInputStream
|
import java.io.ByteArrayInputStream
|
||||||
import java.io.InputStream
|
import java.io.ByteArrayOutputStream
|
||||||
import java.io.SequenceInputStream
|
|
||||||
import java.util.Vector
|
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
||||||
object DownloadMT {
|
object DownloadMT {
|
||||||
|
|
@ -89,10 +89,10 @@ object DownloadMT {
|
||||||
|
|
||||||
// 存储执行结果的List
|
// 存储执行结果的List
|
||||||
val jobs = mutableListOf<Job>()
|
val jobs = mutableListOf<Job>()
|
||||||
|
val channels = List(threadNum) { Channel<ByteArray>() }
|
||||||
val inputStreams = MutableList<InputStream>(threadNum) { ByteArrayInputStream( ByteArray(1024)) }
|
|
||||||
for ((index, part) in partList.withIndex()) {
|
for ((index, part) in partList.withIndex()) {
|
||||||
|
|
||||||
|
|
||||||
val newRange = "bytes=" + part[0] + "-" + part[1]
|
val newRange = "bytes=" + part[0] + "-" + part[1]
|
||||||
SpiderDebug.log("下载开始;newRange:$newRange")
|
SpiderDebug.log("下载开始;newRange:$newRange")
|
||||||
|
|
||||||
|
|
@ -103,7 +103,8 @@ object DownloadMT {
|
||||||
jobs += CoroutineScope(Dispatchers.IO).launch {
|
jobs += CoroutineScope(Dispatchers.IO).launch {
|
||||||
val res = downloadRange(url, headerNew)
|
val res = downloadRange(url, headerNew)
|
||||||
|
|
||||||
if (res != null) {/* val buffer = ByteArray(1024)
|
if (res != null) {
|
||||||
|
val buffer = ByteArray(1024)
|
||||||
var bytesRead: Int = 0
|
var bytesRead: Int = 0
|
||||||
|
|
||||||
while (res.body()?.byteStream()?.read(buffer).also {
|
while (res.body()?.byteStream()?.read(buffer).also {
|
||||||
|
|
@ -112,16 +113,18 @@ object DownloadMT {
|
||||||
}
|
}
|
||||||
} != -1) {
|
} != -1) {
|
||||||
// 处理读取的数据
|
// 处理读取的数据
|
||||||
channels[index].send(buffer.copyOfRange(0, bytesRead))*/
|
channels[index].send(buffer.copyOfRange(0, bytesRead))
|
||||||
inputStreams.add(index, res.body()?.byteStream()!!)
|
|
||||||
|
}
|
||||||
|
channels[index].close() // 发送完成后关闭通道
|
||||||
SpiderDebug.log("---第" + index + "块下载完成" + ";Content-Range:" + res.headers()["Content-Range"])
|
SpiderDebug.log("---第" + index + "块下载完成" + ";Content-Range:" + res.headers()["Content-Range"])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var contentType: String? = ""/* val outputStream = ByteArrayOutputStream();
|
val outputStream = ByteArrayOutputStream();
|
||||||
var pipedInputStream: ByteArrayInputStream? = null
|
var pipedInputStream: ByteArrayInputStream? = null
|
||||||
|
var contentType: String? = ""
|
||||||
|
|
||||||
val res = CoroutineScope(Dispatchers.Default).async {
|
val res = CoroutineScope(Dispatchers.Default).async {
|
||||||
repeat(jobs.size) { index ->
|
repeat(jobs.size) { index ->
|
||||||
|
|
@ -135,7 +138,7 @@ object DownloadMT {
|
||||||
// 等待所有下载完成
|
// 等待所有下载完成
|
||||||
jobs.joinAll()
|
jobs.joinAll()
|
||||||
}
|
}
|
||||||
res.await()*/
|
res.await()
|
||||||
|
|
||||||
// SpiderDebug.log(" ++proxy res data:" + Json.toJson(response.body()));
|
// SpiderDebug.log(" ++proxy res data:" + Json.toJson(response.body()));
|
||||||
contentType = resHeader["Content-Type"]
|
contentType = resHeader["Content-Type"]
|
||||||
|
|
@ -162,10 +165,10 @@ object DownloadMT {
|
||||||
SpiderDebug.log("----proxy res contentType:$contentType")
|
SpiderDebug.log("----proxy res contentType:$contentType")
|
||||||
// SpiderDebug.log("++proxy res body:" + response.body());
|
// SpiderDebug.log("++proxy res body:" + response.body());
|
||||||
SpiderDebug.log("----proxy res respHeaders:" + Json.toJson(resHeader))
|
SpiderDebug.log("----proxy res respHeaders:" + Json.toJson(resHeader))
|
||||||
val sequenceInputStream = SequenceInputStream(Vector(inputStreams).elements());
|
pipedInputStream = ByteArrayInputStream(outputStream.toByteArray());
|
||||||
|
outputStream.close()
|
||||||
|
|
||||||
|
return arrayOf(206, contentType, pipedInputStream, resHeader)
|
||||||
return arrayOf(206, contentType, sequenceInputStream, resHeader)
|
|
||||||
|
|
||||||
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -1 +1 @@
|
||||||
0fdb7b55ab057fc9f8d455bf438ec1fd
|
8b6de828883275e559c19d37c8dff9d1
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"spider": "https://ghproxy.net/https://raw.githubusercontent.com/lushunming/AndroidCatVodSpider/multiThreadkt/jar/custom_spider.jar;md5;0fdb7b55ab057fc9f8d455bf438ec1fd",
|
"spider": "https://ghproxy.net/https://raw.githubusercontent.com/lushunming/AndroidCatVodSpider/multiThreadkt/jar/custom_spider.jar;md5;8b6de828883275e559c19d37c8dff9d1",
|
||||||
"lives": [
|
"lives": [
|
||||||
{
|
{
|
||||||
"name": "电视直播",
|
"name": "电视直播",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue