59 lines
1.9 KiB
Scala
59 lines
1.9 KiB
Scala
|
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(" ")}".!!
|
||
|
}
|
||
|
}
|
||
|
}
|