All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mchange.feedletter.masto.scala Maven / Gradle / Ivy

package com.mchange.feedletter

import scala.util.Using
import com.mchange.conveniences.string.*
import com.mchange.feedletter.Destination.Key

/*
private def filenameForMimeType( mimeType : String ) : String =
  val simpleMimeType =
    val semi = mimeType.indexOf(';') 
    if semi >= 0 then mimeType.substring(0,semi).trim else mimeType.trim
  simpleMimeType match
    case ...

  val base = scala.util.Random.nextLong()
*/

def postMedia( accessToken : String, instanceUrl : String, media : ItemContent.Media ) : String =
  val mediaEndpoint = pathJoin( instanceUrl, "api/v2/media" )
  val mbFilename =
    val lastSlash = media.url.lastIndexOf("/")
    if lastSlash >= 0 then
      media.url.substring(lastSlash+1).toOptionNotBlank
    else
      None
  val data = requests.get(media.url).data.array
  val fileMultiItem =
    mbFilename match
      case Some(fn) => requests.MultiItem("file", data=data, filename=fn)
      case None     => requests.MultiItem("file", data=data)
  val multipart =
    media.alt match
      case Some( text ) => requests.MultiPart( fileMultiItem, requests.MultiItem("description", data=text) )
      case None         => requests.MultiPart( fileMultiItem )
  val headers = Map (
    "Authorization" -> s"Bearer ${accessToken}",
  )
  val response = requests.post( mediaEndpoint, data=multipart, headers=headers )
  val jsonOut = ujson.read(response.text())
  jsonOut.obj("id").str // the id comes back as a JSON *String*, not a number

def mastoPost( as : AppSetup, mastoPostable : MastoPostable ) =
  val accessTokenKey = s"feedletter.masto.access.token.${mastoPostable.name}"
  val accessToken = as.secrets.get( accessTokenKey ).getOrElse:
    throw new NoAccessToken( s"No access token found in application secrets under key '${accessTokenKey}'." )
  val mediaIds = mastoPostable.media.map( media => postMedia(accessToken, mastoPostable.instanceUrl.str, media) )
  val statusEndpoint = pathJoin( mastoPostable.instanceUrl.str, "api/v1/statuses/" )
  val headers = Map (
    "Authorization" -> s"Bearer ${accessToken}",
    "Content-Type"  ->  "application/json",
  )
  val jsonData =
    val obj = ujson.Obj(
      "status" -> ujson.Str(mastoPostable.finalContent),
      "media_ids" -> ujson.Arr( mediaIds.map( ujson.Str.apply )* ),
    )
    ujson.write(obj)
  requests.post( statusEndpoint, data=jsonData, headers=headers )







© 2015 - 2025 Weber Informatics LLC | Privacy Policy