Skip to content

Commit

Permalink
feat: 支持磁链下载
Browse files Browse the repository at this point in the history
  • Loading branch information
Greatwallcorner committed Dec 15, 2024
1 parent 03d9dfd commit e3dbbcc
Show file tree
Hide file tree
Showing 16 changed files with 238 additions and 103 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
- [x] 优化从搜索页进入详情页的时候使用的搜索结果集
- [x] 优化搜索调用次数,搜索页搜索时,默认搜索两个站源,如果为空则继续搜索,如过用户想加载更多,手动点击加载更多的按钮
- [x] vlcj
- [x] 支持文件夹浏览
- [ ] 自更新
- [ ] webview
- [ ] 下载 aria2
- [ ] 支持文件夹浏览
- [ ] 自更新

# screenshoot
## 首页
Expand Down
23 changes: 0 additions & 23 deletions composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -82,29 +82,6 @@ kotlin {
// DLNA
implementation("org.jupnp.bom:org.jupnp.bom.compile:3.0.2")
implementation("org.jupnp:org.jupnp.support:3.0.2")
// // https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api
// implementation("javax.servlet:javax.servlet-api:4.0.1")
// // https://mvnrepository.com/artifact/org.eclipse.jetty.ee10/jetty-ee10-servlet
// implementation("org.eclipse.jetty.ee10:jetty-ee10-servlet:12.0.14")
// // https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-server
// implementation("org.eclipse.jetty:jetty-server:12.0.14")
// // https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-client
// implementation("org.eclipse.jetty:jetty-client:12.0.14")

// api("javax.servlet:javax.servlet-api:4.0.1")
// // https://mvnrepository.com/artifact/org.eclipse.jetty.ee10/jetty-ee10-servlet
// api("org.eclipse.jetty.ee10:jetty-ee10-servlet:12.0.14")
// // https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-server
// api("org.eclipse.jetty:jetty-server:12.0.14")
// // https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-client
// api("org.eclipse.jetty:jetty-client:12.0.14")
// // https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-servlet
// api("org.eclipse.jetty:jetty-servlet:11.0.24")






api("com.arkivanov.decompose:decompose:2.2.2")
api("com.arkivanov.decompose:extensions-compose-jetbrains:2.2.2")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@ import java.security.MessageDigest
import java.util.*

object Utils {

// 可下载
private val prefix = listOf("magnet")

fun isDownloadLink(str:String):Boolean{
prefix.forEach { if(str.startsWith(it)) return true }
return false
}

fun md5(str:String):String{
try {
if(StringUtils.isBlank(str)) return ""
Expand All @@ -29,7 +38,7 @@ object Utils {
return md5(Paths.jar(name)).equals(md5, ignoreCase = true)
}

fun md5(file: File?): String {
fun md5(file: File): String {
try {
val digest = MessageDigest.getInstance("MD5")
val fis = FileInputStream(file)
Expand Down
8 changes: 7 additions & 1 deletion composeApp/src/commonMain/kotlin/com/corner/dlna/Registry.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ import org.jupnp.model.meta.LocalDevice
import org.jupnp.model.meta.RemoteDevice
import org.jupnp.registry.Registry
import org.jupnp.registry.RegistryListener
import upnp.TVMDevice


object Registry {
class Registry {
val registry = object : RegistryListener {
override fun remoteDeviceDiscoveryStarted(registry: Registry?, device: RemoteDevice?) {
println(
Expand Down Expand Up @@ -67,6 +68,7 @@ object Registry {
fun init(){
val upnpServiceImpl = UpnpServiceImpl()
upnpServiceImpl.registry.addListener(registry)
upnpServiceImpl.registry.addDevice(TVMDevice())
upnpServiceImpl.controlPoint.search(STAllHeader())


Expand All @@ -82,4 +84,8 @@ object Registry {
// upnpServiceImpl.startup()

}
}

fun main() {
Registry().init();
}
44 changes: 35 additions & 9 deletions composeApp/src/commonMain/kotlin/com/corner/dlna/TVMDevice.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package upnp

import com.corner.dlna.TVConnectionManagerService
import com.corner.dlna.TvMAudioRenderingControlService
import org.jupnp.binding.annotations.AnnotationLocalServiceBinder
import org.jupnp.model.DefaultServiceManager
import org.jupnp.model.meta.*
import org.jupnp.model.types.UDADeviceType
import org.jupnp.model.types.UDN
import org.jupnp.support.renderingcontrol.AbstractAudioRenderingControl


class TVMDevice
Expand All @@ -15,13 +17,13 @@ class TVMDevice
),
UDADeviceType("tvm"),
DeviceDetails("TV Multiplatform"),
createICons(),
createIcons(),
createService(),
) {

}

fun createICons(): Array<Icon> {
fun createIcons(): Array<Icon> {
val list = arrayListOf<Icon>()
list.add(
Icon(
Expand Down Expand Up @@ -56,27 +58,51 @@ fun createICons(): Array<Icon> {
return list.toTypedArray()
}

@Suppress("UNCHECKED_CAST")
fun createService(): Array<LocalService<out Any>?>{
val services = arrayOfNulls<LocalService<out Any>>(2)
val service = AnnotationLocalServiceBinder().read(TVConnectionManagerService::class.java) as LocalService<TVConnectionManagerService>
service.manager = object: DefaultServiceManager<TVConnectionManagerService>(service, TVConnectionManagerService::class.java){
service.manager = object : DefaultServiceManager<TVConnectionManagerService>(service, null){
override fun getLockTimeoutMillis(): Int {
return 1000
return LOCK_TIMEOUT
}

override fun createServiceInstance(): TVConnectionManagerService {
return TVConnectionManagerService()
}
}
services[0] = service
// services[0] = service

val transport =
AnnotationLocalServiceBinder().read(TvAvTransportService::class.java) as LocalService<TvAvTransportService>
transport.manager = object:DefaultServiceManager<TvAvTransportService>(transport, TvAvTransportService::class.java){

transport.manager = object : DefaultServiceManager<TvAvTransportService>(transport, null){

override fun getLockTimeoutMillis(): Int {
return LOCK_TIMEOUT
}

override fun createServiceInstance(): TvAvTransportService {
return TvAvTransportService()
}
}
services[1] = transport
return services

return arrayOf(service, transport, createRenderingControl())
}

private const val LOCK_TIMEOUT = 5000

@Suppress("UNCHECKED_CAST")
private fun createRenderingControl(): LocalService<AbstractAudioRenderingControl> {
val renderingControlService: LocalService<AbstractAudioRenderingControl> = AnnotationLocalServiceBinder().read(AbstractAudioRenderingControl::class.java) as LocalService<AbstractAudioRenderingControl>
renderingControlService.setManager(object :
DefaultServiceManager<AbstractAudioRenderingControl>(renderingControlService, null) {
override fun getLockTimeoutMillis(): Int {
return LOCK_TIMEOUT
}

override fun createServiceInstance(): AbstractAudioRenderingControl {
return TvMAudioRenderingControlService()
}
})
return renderingControlService
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import org.jupnp.protocol.ProtocolFactory
import org.jupnp.registry.Registry


class TVMUpnpService: UpnpServiceImpl(DefaultUpnpServiceConfiguration()) {
class TVMUpnpService: UpnpServiceImpl(DefaultUpnpServiceConfiguration(12367/*NetUtil.getUsableLocalPort()*/)) {
private var localDevice: LocalDevice? = null;

override fun createRegistry(protocolFactory: ProtocolFactory?): Registry {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.corner.dlna

import org.jupnp.model.types.UnsignedIntegerFourBytes
import org.jupnp.model.types.UnsignedIntegerTwoBytes
import org.jupnp.support.model.Channel
import org.jupnp.support.renderingcontrol.AbstractAudioRenderingControl
import org.slf4j.LoggerFactory


class TvMAudioRenderingControlService:AbstractAudioRenderingControl() {
private val log = LoggerFactory.getLogger(this::class.java)

override fun getCurrentInstanceIds(): Array<UnsignedIntegerFourBytes> {
log.debug("getCurrentInstanceIds not yet implemented")
return emptyArray()
}

override fun getMute(instanceId: UnsignedIntegerFourBytes?, channelName: String?): Boolean {
TODO("Not yet implemented")
}

override fun setMute(instanceId: UnsignedIntegerFourBytes?, channelName: String?, desiredMute: Boolean) {
TODO("Not yet implemented")
}

override fun getVolume(instanceId: UnsignedIntegerFourBytes?, channelName: String?): UnsignedIntegerTwoBytes {
TODO("Not yet implemented")
}

override fun setVolume(
instanceId: UnsignedIntegerFourBytes?,
channelName: String?,
desiredVolume: UnsignedIntegerTwoBytes?
) {
log.info("setVolume instanceId:{} channelName:{} desiredVolume:{}", instanceId, channelName, desiredVolume)
}

override fun getCurrentChannels(): Array<Channel> {
TODO("Not yet implemented")
}
}
11 changes: 5 additions & 6 deletions composeApp/src/commonMain/kotlin/com/corner/init/Init.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import com.corner.ui.scene.showProgress
import org.apache.commons.lang3.StringUtils
import org.koin.core.context.startKoin
import org.slf4j.LoggerFactory
import upnp.TVMUpnpService


private val log = LoggerFactory.getLogger("Init")
Expand All @@ -34,10 +33,10 @@ class Init {
initPlatformSpecify()
Hot.getHotList()
VlcJInit.init()
GlobalModel.upnpService.value = TVMUpnpService().apply {
startup()
sendAlive()
}
// GlobalModel.upnpService.value = TVMUpnpService().apply {
// startup()
// sendAlive()
// }
} finally {
hideProgress()
}
Expand All @@ -57,7 +56,7 @@ class Init {
}
}

expect fun initPlatformSpecify();
expect fun initPlatformSpecify()

fun initConfig() {
log.info("initConfig start")
Expand Down
Loading

0 comments on commit e3dbbcc

Please sign in to comment.