Custom RTMP saved accounts, RTMP test server, composition pipeline

- Backend: POST /providers/accounts/custom-rtmp to save reusable RTMP servers
- Backend: Encrypt rtmpUrl/streamKey in existing token fields, decrypt on GET
- Backend: Skip token revocation on DELETE for CUSTOM_RTMP accounts
- Backend: Decrypt CUSTOM_RTMP credentials into destinations on plan create/update
- Android: Add rtmpUrl/streamKey to LinkedAccount entity + shared parcelable (Room v6)
- Android: Add Custom RTMP dialog in AccountsScreen, auto-fill in plan destination picker
- Android: Handle CUSTOM_RTMP accounts in CreatePlanViewModel.loadExistingPlan
- Add local RTMP test server (tools/rtmp-server.js) with auto-ffplay on publish
- Add composition pipeline native code
This commit is contained in:
2026-03-01 10:50:23 +01:00
parent c1ff5351b7
commit c632e22033
35 changed files with 2822 additions and 98 deletions

View File

@@ -11,6 +11,8 @@ data class LinkedAccount(
val avatarUrl: String? = null,
val isAuthenticated: Boolean = false,
val isEnabled: Boolean = true,
val rtmpUrl: String? = null,
val streamKey: String? = null,
) : Parcelable {
constructor(parcel: Parcel) : this(
@@ -21,6 +23,8 @@ data class LinkedAccount(
avatarUrl = parcel.readString(),
isAuthenticated = parcel.readInt() != 0,
isEnabled = if (parcel.dataAvail() > 0) parcel.readInt() != 0 else true,
rtmpUrl = if (parcel.dataAvail() > 0) parcel.readString() else null,
streamKey = if (parcel.dataAvail() > 0) parcel.readString() else null,
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
@@ -31,6 +35,8 @@ data class LinkedAccount(
parcel.writeString(avatarUrl)
parcel.writeInt(if (isAuthenticated) 1 else 0)
parcel.writeInt(if (isEnabled) 1 else 0)
parcel.writeString(rtmpUrl)
parcel.writeString(streamKey)
}
override fun describeContents(): Int = 0