feat: add reader methods to all DVM request events for server processing

Each request event now exposes typed reader methods so DVM servers can
extract inputs, parameters, and configuration from incoming requests:
- inputs() returns List<InputTag> with value, type, relay, marker
- Kind-specific readers like language(), model(), searchQuery(), pow(), etc.
- Shared TagArrayExt with dvmParam(), dvmParamAll(), dvmParamValues()

Also adds readers to existing 5300/5301 events (dvmPubKey, user, relays).

https://claude.ai/code/session_017aamEDeRtQ2H9u5U9B5F1C
This commit is contained in:
Claude
2026-03-30 03:21:19 +00:00
parent cd4b352bdf
commit 273af03c9f
20 changed files with 232 additions and 0 deletions
@@ -28,6 +28,9 @@ import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.utils.TimeUtils
@Stable
@@ -40,6 +43,18 @@ class NIP90ContentDiscoveryRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun dvmPubKey(): HexKey? = tags.firstOrNull { it.size >= 2 && it[0] == "p" }?.get(1)
fun relays() = tags.relays()
fun params() = tags.params()
fun user(): String? = tags.dvmParam("user")
fun maxResults(): String? = tags.dvmParam("max_results")
companion object {
const val KIND = 5300
const val ALT = "NIP90 Content Discovery request"
@@ -26,7 +26,11 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam
import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType
import com.vitorpamplona.quartz.nip90Dvms.tags.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +43,18 @@ class NIP90ContentSearchRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun searchQuery(): String? = tags.firstInputByType("text")?.value
fun users(): String? = tags.dvmParam("users")
fun since(): Long? = tags.dvmParam("since")?.toLongOrNull()
fun until(): Long? = tags.dvmParam("until")?.toLongOrNull()
fun maxResults(): Int? = tags.dvmParam("max_results")?.toIntOrNull()
companion object {
const val KIND = 5302
const val ALT = "NIP90 Content Search request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParamAll
import com.vitorpamplona.quartz.nip90Dvms.tags.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +42,14 @@ class NIP90EventCountRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun relays(): List<String> = tags.dvmParamAll("relay")
fun groups(): List<String> = tags.dvmParamAll("group")
fun filterJson(): String = content
companion object {
const val KIND = 5400
const val ALT = "NIP90 Event Count request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam
import com.vitorpamplona.quartz.nip90Dvms.tags.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +42,12 @@ class NIP90EventPowDelegationRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun eventJsons(): List<String> = inputs().filter { it.type == "text" }.map { it.value }
fun pow(): Int? = tags.dvmParam("pow")?.toIntOrNull()
companion object {
const val KIND = 5970
const val ALT = "NIP90 Event PoW Delegation request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParamValues
import com.vitorpamplona.quartz.nip90Dvms.tags.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +42,12 @@ class NIP90EventPublishScheduleRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun eventJsons(): List<String> = inputs().filter { it.type == "text" }.map { it.value }
fun relays(): List<String> = tags.dvmParamValues("relays") ?: emptyList()
companion object {
const val KIND = 5905
const val ALT = "NIP90 Event Publish Schedule request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType
import com.vitorpamplona.quartz.nip90Dvms.tags.inputEvent
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.utils.TimeUtils
@Immutable
@@ -38,6 +41,10 @@ class NIP90EventTimestampingRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun eventIdToStamp(): HexKey? = tags.firstInputByType("event")?.value
companion object {
const val KIND = 5900
const val ALT = "NIP90 Event Timestamping request"
@@ -26,8 +26,12 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam
import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType
import com.vitorpamplona.quartz.nip90Dvms.tags.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputUrl
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -40,6 +44,22 @@ class NIP90ImageGenerationRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun prompt(): String? = tags.firstInputByType("text")?.value
fun sourceImageUrl(): String? = tags.firstInputByType("url")?.value
fun model(): String? = tags.dvmParam("model")
fun lora(): String? = tags.dvmParam("lora")
fun ratio(): String? = tags.dvmParam("ratio")
fun size(): String? = tags.dvmParam("size")
fun negativePrompt(): String? = tags.dvmParam("negative_prompt")
companion object {
const val KIND = 5100
const val ALT = "NIP90 Image Generation request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType
import com.vitorpamplona.quartz.nip90Dvms.tags.inputUrl
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.utils.TimeUtils
@Immutable
@@ -38,6 +41,10 @@ class NIP90ImageToVideoRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun imageUrl(): String? = tags.firstInputByType("url")?.value
companion object {
const val KIND = 5202
const val ALT = "NIP90 Image-to-Video request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType
import com.vitorpamplona.quartz.nip90Dvms.tags.inputUrl
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.utils.TimeUtils
@Immutable
@@ -38,6 +41,10 @@ class NIP90MalwareScanRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun fileUrl(): String? = tags.firstInputByType("url")?.value
companion object {
const val KIND = 5500
const val ALT = "NIP90 Malware Scan request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType
import com.vitorpamplona.quartz.nip90Dvms.tags.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.utils.TimeUtils
@Immutable
@@ -38,6 +41,10 @@ class NIP90OpReturnRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun text(): String? = tags.firstInputByType("text")?.value
companion object {
const val KIND = 5901
const val ALT = "NIP90 OP_RETURN Creation request"
@@ -26,7 +26,11 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam
import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType
import com.vitorpamplona.quartz.nip90Dvms.tags.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +43,12 @@ class NIP90PeopleSearchRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun searchQuery(): String? = tags.firstInputByType("text")?.value
fun maxResults(): Int? = tags.dvmParam("max_results")?.toIntOrNull()
companion object {
const val KIND = 5303
const val ALT = "NIP90 People Search request"
@@ -26,8 +26,12 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam
import com.vitorpamplona.quartz.nip90Dvms.tags.inputEvent
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.output
import com.vitorpamplona.quartz.nip90Dvms.tags.outputMimeType
import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -40,6 +44,12 @@ class NIP90SummarizationRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun outputMimeType(): String? = tags.outputMimeType()
fun length(): String? = tags.dvmParam("length")
companion object {
const val KIND = 5001
const val ALT = "NIP90 Summarization request"
@@ -24,4 +24,18 @@ import com.vitorpamplona.quartz.nip01Core.core.TagArray
fun TagArray.inputs() = mapNotNull(InputTag::parse)
fun TagArray.firstInputByType(type: String) = inputs().firstOrNull { it.type == type }
fun TagArray.outputMimeType() = firstNotNullOfOrNull(OutputTag::parse)?.mimeType
fun TagArray.dvmParams(): List<Pair<String, List<String>>> =
filter { it.size >= 3 && it[0] == "param" }
.map { it[1] to it.drop(2) }
fun TagArray.dvmParam(key: String): String? = firstOrNull { it.size >= 3 && it[0] == "param" && it[1] == key }?.getOrNull(2)
fun TagArray.dvmParamValues(key: String): List<String>? = firstOrNull { it.size >= 3 && it[0] == "param" && it[1] == key }?.drop(2)
fun TagArray.dvmParamAll(key: String): List<String> =
filter { it.size >= 3 && it[0] == "param" && it[1] == key }
.mapNotNull { it.getOrNull(2) }
@@ -26,8 +26,13 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParamValues
import com.vitorpamplona.quartz.nip90Dvms.tags.inputUrl
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.output
import com.vitorpamplona.quartz.nip90Dvms.tags.outputMimeType
import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -40,6 +45,16 @@ class NIP90TextExtractionRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun outputMimeType(): String? = tags.outputMimeType()
fun rangeStart(): String? = tags.dvmParamValues("range")?.getOrNull(0)
fun rangeEnd(): String? = tags.dvmParamValues("range")?.getOrNull(1)
fun alignment(): String? = tags.dvmParam("alignment")
companion object {
const val KIND = 5000
const val ALT = "NIP90 Text Extraction request"
@@ -26,8 +26,12 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam
import com.vitorpamplona.quartz.nip90Dvms.tags.inputPrompt
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.output
import com.vitorpamplona.quartz.nip90Dvms.tags.outputMimeType
import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -40,6 +44,22 @@ class NIP90TextGenerationRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun outputMimeType(): String? = tags.outputMimeType()
fun model(): String? = tags.dvmParam("model")
fun maxTokens(): Int? = tags.dvmParam("max_tokens")?.toIntOrNull()
fun temperature(): Double? = tags.dvmParam("temperature")?.toDoubleOrNull()
fun topK(): Int? = tags.dvmParam("top_k")?.toIntOrNull()
fun topP(): Double? = tags.dvmParam("top_p")?.toDoubleOrNull()
fun frequencyPenalty(): Double? = tags.dvmParam("frequency_penalty")?.toDoubleOrNull()
companion object {
const val KIND = 5050
const val ALT = "NIP90 Text Generation request"
@@ -26,7 +26,11 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam
import com.vitorpamplona.quartz.nip90Dvms.tags.firstInputByType
import com.vitorpamplona.quartz.nip90Dvms.tags.inputText
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +43,12 @@ class NIP90TextToSpeechRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun text(): String? = tags.firstInputByType("text")?.value
fun language(): String? = tags.dvmParam("language")
companion object {
const val KIND = 5250
const val ALT = "NIP90 Text-to-Speech request"
@@ -26,7 +26,10 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam
import com.vitorpamplona.quartz.nip90Dvms.tags.inputEvent
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -39,6 +42,10 @@ class NIP90TranslationRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun language(): String? = tags.dvmParam("language")
companion object {
const val KIND = 5002
const val ALT = "NIP90 Translation request"
@@ -26,6 +26,9 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.utils.TimeUtils
@Immutable
@@ -37,6 +40,12 @@ class NIP90UserDiscoveryRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun dvmPubKey(): HexKey? = tags.firstOrNull { it.size >= 2 && it[0] == "p" }?.get(1)
fun user(): String? = tags.dvmParam("user")
companion object {
const val KIND = 5301
const val ALT = "NIP90 User Discovery request"
@@ -26,8 +26,12 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParamValues
import com.vitorpamplona.quartz.nip90Dvms.tags.inputUrl
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.output
import com.vitorpamplona.quartz.nip90Dvms.tags.outputMimeType
import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -40,6 +44,14 @@ class NIP90VideoConversionRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun outputMimeType(): String? = tags.outputMimeType()
fun rangeStart(): String? = tags.dvmParamValues("range")?.getOrNull(0)
fun rangeEnd(): String? = tags.dvmParamValues("range")?.getOrNull(1)
companion object {
const val KIND = 5200
const val ALT = "NIP90 Video Conversion request"
@@ -26,8 +26,13 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate
import com.vitorpamplona.quartz.nip31Alts.alt
import com.vitorpamplona.quartz.nip90Dvms.tags.InputTag
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParam
import com.vitorpamplona.quartz.nip90Dvms.tags.dvmParamValues
import com.vitorpamplona.quartz.nip90Dvms.tags.inputUrl
import com.vitorpamplona.quartz.nip90Dvms.tags.inputs
import com.vitorpamplona.quartz.nip90Dvms.tags.output
import com.vitorpamplona.quartz.nip90Dvms.tags.outputMimeType
import com.vitorpamplona.quartz.nip90Dvms.tags.param
import com.vitorpamplona.quartz.utils.TimeUtils
@@ -40,6 +45,18 @@ class NIP90VideoTranslationRequestEvent(
content: String,
sig: HexKey,
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun inputs(): List<InputTag> = tags.inputs()
fun outputMimeType(): String? = tags.outputMimeType()
fun language(): String? = tags.dvmParam("language")
fun subtitle(): String? = tags.dvmParam("subtitle")
fun rangeStart(): String? = tags.dvmParamValues("range")?.getOrNull(0)
fun rangeEnd(): String? = tags.dvmParamValues("range")?.getOrNull(1)
companion object {
const val KIND = 5201
const val ALT = "NIP90 Video Translation request"