.dotfiles/.config/newsboat/scripts/imagePager.scala

59 lines
1.9 KiB
Scala
Raw Normal View History

2024-09-21 19:14:02 -04:00
import scala.io.Source
import java.net.URL
import sys.process._
import scala.io.Source
import scala.concurrent.{Await, Future}
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
def isImage(url: String): Boolean = {
val connection = URL(url).openConnection()
connection.setDoOutput(false)
val contentType = connection.getHeaderField("Content-Type")
contentType match {
case null => return false
case contentType: String => contentType.startsWith("image/")
}
}
@main
def imagePager(kittyString: String, newsboatArticle: String) = {
val kitty = kittyString.toBoolean
val urlPattern = """https?://\S+""".r
val images = Source.fromFile(newsboatArticle)
.getLines
.flatMap(urlPattern.findAllIn(_))
.map(url => Future { (url, isImage(url)) })
.toList
val filteredImages = Await.result(Future.sequence(images), Duration.Inf)
.collect { case (url, true) => url }
if (!filteredImages.isEmpty) {
kitty match {
case true => {
//val cols = s"tput cols".!!
//val lines = s"tput lines".!!
//val dimensions = s"${cols}x${lines}@0x0".replaceAll("\n", "")
// This code is mostly from @heussd's kitty-imager-pager.sh bash script
// for rendering images with kitty (pull request #1956 on newsboat)
val kittyImages = filteredImages
.map(image => s"kitty +kitten icat --hold --scale-up --place \"$$dims\" $image")
.toSeq
(Seq(
"dims=\"$(tput cols)x$(tput lines)@0x0\"",
"clear",
"kitty +kitten icat --clear",
) ++ kittyImages :+ "clear").foreach(println)
}
case false => s"feh ${filteredImages.mkString(" ")}".!!
}
}
}