commonMain.net.folivo.trixnity.clientserverapi.client.MediaApiClient.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of trixnity-clientserverapi-client Show documentation
Show all versions of trixnity-clientserverapi-client Show documentation
Multiplatform Kotlin SDK for matrix-protocol
package net.folivo.trixnity.clientserverapi.client
import io.ktor.client.plugins.*
import io.ktor.http.*
import kotlinx.coroutines.flow.MutableStateFlow
import net.folivo.trixnity.clientserverapi.model.media.*
import kotlin.time.Duration
interface MediaApiClient {
/**
* @see [GetMediaConfig]
*/
suspend fun getConfig(): Result
/**
* @see [CreateMedia]
*/
suspend fun createMedia(): Result
/**
* @see [UploadMedia]
*/
suspend fun upload(
media: Media,
progress: MutableStateFlow? = null,
timeout: Duration = Duration.INFINITE,
): Result
/**
* @see [UploadMediaByContentUri]
*/
suspend fun upload(
serverName: String,
mediaId: String,
media: Media,
progress: MutableStateFlow? = null,
timeout: Duration = Duration.INFINITE,
): Result
/**
* @see [DownloadMedia]
*/
@Deprecated("use download with downloadHandler")
suspend fun download(
mxcUri: String,
allowRemote: Boolean? = null,
progress: MutableStateFlow? = null,
timeout: Duration = Duration.INFINITE,
): Result
/**
* @see [DownloadMedia]
*/
suspend fun download(
mxcUri: String,
allowRemote: Boolean? = null,
progress: MutableStateFlow? = null,
timeout: Duration = Duration.INFINITE,
downloadHandler: suspend (Media) -> Unit
): Result
/**
* @see [DownloadThumbnail]
*/
@Deprecated("use downloadThumbnail with downloadHandler")
suspend fun downloadThumbnail(
mxcUri: String,
width: Long,
height: Long,
method: ThumbnailResizingMethod,
allowRemote: Boolean? = null,
progress: MutableStateFlow? = null,
timeout: Duration = Duration.INFINITE,
): Result
/**
* @see [DownloadThumbnail]
*/
suspend fun downloadThumbnail(
mxcUri: String,
width: Long,
height: Long,
method: ThumbnailResizingMethod,
allowRemote: Boolean? = null,
progress: MutableStateFlow? = null,
timeout: Duration = Duration.INFINITE,
downloadHandler: suspend (Media) -> Unit
): Result
/**
* @see [GetUrlPreview]
*/
suspend fun getUrlPreview(
url: String,
timestamp: Long? = null,
): Result
}
class MediaApiClientImpl(private val httpClient: MatrixClientServerApiHttpClient) : MediaApiClient {
override suspend fun getConfig(): Result =
httpClient.request(GetMediaConfig)
override suspend fun createMedia(): Result =
httpClient.request(CreateMedia)
override suspend fun upload(
media: Media,
progress: MutableStateFlow?,
timeout: Duration,
): Result =
httpClient.request(UploadMedia(media.filename), media) {
timeout {
requestTimeoutMillis = timeout.inWholeMilliseconds
}
if (progress != null)
onUpload { transferred, total ->
progress.value = FileTransferProgress(transferred, total)
}
}
override suspend fun upload(
serverName: String,
mediaId: String,
media: Media,
progress: MutableStateFlow?,
timeout: Duration,
): Result =
httpClient.request(UploadMediaByContentUri(serverName, mediaId, media.filename), media) {
timeout {
requestTimeoutMillis = timeout.inWholeMilliseconds
}
if (progress != null)
onUpload { transferred, total ->
progress.value = FileTransferProgress(transferred, total)
}
}
@Deprecated("use download with downloadHandler")
override suspend fun download(
mxcUri: String,
allowRemote: Boolean?,
progress: MutableStateFlow?,
timeout: Duration,
): Result {
val uri = Url(mxcUri)
if (uri.protocol.name != "mxc") return Result.failure(IllegalArgumentException("url protocol was not mxc"))
val (serverName, mediaId) = mxcUri.removePrefix("mxc://")
.let { it.substringBefore("/") to it.substringAfter("/") }
return httpClient.request(DownloadMedia(serverName, mediaId, allowRemote)) {
method = HttpMethod.Get
timeout {
requestTimeoutMillis = timeout.inWholeMilliseconds
}
if (progress != null)
onDownload { transferred, total ->
progress.value = FileTransferProgress(transferred, total)
}
}
}
override suspend fun download(
mxcUri: String,
allowRemote: Boolean?,
progress: MutableStateFlow?,
timeout: Duration,
downloadHandler: suspend (Media) -> Unit
): Result {
val uri = Url(mxcUri)
if (uri.protocol.name != "mxc") return Result.failure(IllegalArgumentException("url protocol was not mxc"))
val (serverName, mediaId) = mxcUri.removePrefix("mxc://")
.let { it.substringBefore("/") to it.substringAfter("/") }
return httpClient.withRequest(
endpoint = DownloadMedia(serverName, mediaId, allowRemote),
requestBuilder = {
method = HttpMethod.Get
timeout {
requestTimeoutMillis = timeout.inWholeMilliseconds
}
if (progress != null)
onDownload { transferred, total ->
progress.value = FileTransferProgress(transferred, total)
}
},
responseHandler = downloadHandler
)
}
@Deprecated("use downloadThumbnail with downloadHandler")
override suspend fun downloadThumbnail(
mxcUri: String,
width: Long,
height: Long,
method: ThumbnailResizingMethod,
allowRemote: Boolean?,
progress: MutableStateFlow?,
timeout: Duration,
): Result {
val uri = Url(mxcUri)
if (uri.protocol.name != "mxc") return Result.failure(IllegalArgumentException("url protocol was not mxc"))
val (serverName, mediaId) = mxcUri.removePrefix("mxc://")
.let { it.substringBefore("/") to it.substringAfter("/") }
return httpClient.request(
DownloadThumbnail(
serverName = serverName,
mediaId = mediaId,
width = width,
height = height,
method = method,
allowRemote = allowRemote,
)
) {
this.method = HttpMethod.Get
timeout {
requestTimeoutMillis = timeout.inWholeMilliseconds
}
if (progress != null)
onDownload { transferred, total ->
progress.value = FileTransferProgress(transferred, total)
}
}
}
override suspend fun downloadThumbnail(
mxcUri: String,
width: Long,
height: Long,
method: ThumbnailResizingMethod,
allowRemote: Boolean?,
progress: MutableStateFlow?,
timeout: Duration,
downloadHandler: suspend (Media) -> Unit
): Result {
val uri = Url(mxcUri)
if (uri.protocol.name != "mxc") return Result.failure(IllegalArgumentException("url protocol was not mxc"))
val (serverName, mediaId) = mxcUri.removePrefix("mxc://")
.let { it.substringBefore("/") to it.substringAfter("/") }
return httpClient.withRequest(
endpoint = DownloadThumbnail(
serverName = serverName,
mediaId = mediaId,
width = width,
height = height,
method = method,
allowRemote = allowRemote,
),
requestBuilder = {
this.method = HttpMethod.Get
timeout {
requestTimeoutMillis = timeout.inWholeMilliseconds
}
if (progress != null)
onDownload { transferred, total ->
progress.value = FileTransferProgress(transferred, total)
}
},
responseHandler = downloadHandler
)
}
override suspend fun getUrlPreview(
url: String,
timestamp: Long?,
): Result =
httpClient.request(GetUrlPreview(url, timestamp))
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy