Fetch list of harmonie files

This commit is contained in:
Guntis Smaukstelis
2025-02-01 21:20:27 +02:00
parent 94d0612d80
commit d9303c2e16
3 changed files with 21 additions and 12 deletions
+17 -10
View File
@@ -1,9 +1,10 @@
package fetchDMI
import cats.effect._
import fs2.io.file.{Files, Path}
import cats.implicits.toTraverseOps
import fs2.io.file.{CopyFlag, CopyFlags, Files, Path}
import grib.GribParser
import org.http4s._
import org.http4s.client.Client
import org.http4s.ember.client.EmberClientBuilder
import org.typelevel.log4cats.Logger
import org.typelevel.log4cats.slf4j.Slf4jLogger
@@ -41,11 +42,14 @@ class FetchService(log: Logger[IO]) {
*/
private val baseUrl: IO[Uri] = IO(Uri.unsafeFromString(harmonieServerConfig.url))
private def makeRequest(client: Client[IO], url: Uri) = {
def fetchFromList(timeList: List[ZonedDateTime]): IO[List[String]] = {
timeList.traverse { time =>
fetchFromDateTime(time)
}
}
def fetchFromDateTime(time: ZonedDateTime) = {
private def fetchFromDateTime(time: ZonedDateTime): IO[String] = {
EmberClientBuilder.default[IO].build.use { client =>
for {
base <- baseUrl
@@ -55,18 +59,21 @@ class FetchService(log: Logger[IO]) {
"api-key" -> harmonieServerConfig.api_key,
)
urlWithParams = Uri.unsafeFromString(s"${base.toString}?${queryParams.toString}")
_ <- IO.println(urlWithParams)
request = Request[IO](Method.GET, urlWithParams)
_ <- Files[IO].createDirectories(Path("data"))
tmpPath = Path("data/tmp.grib")
_ <- client.stream(request)
.flatMap(_.body)
.through(Files[IO].writeAll(Path("data/tmp.grib")))
.through(Files[IO].writeAll(tmpPath))
.compile
.drain
} yield ()
gribList <- GribParser.parseFile(tmpPath)
gribTime = gribList.head.time
fileName = Path(s"data/harmonie_${gribTime.referenceTime}_${gribTime.forecastTime}.grib".replace(":", ""))
_ <- Files[IO].move(tmpPath, fileName, CopyFlags.apply(CopyFlag.ReplaceExisting))
_ <- log.info(fileName.toString)
fileNameStr = fileName.toString
} yield fileNameStr
}
}
@@ -10,8 +10,10 @@ object FetchServiceTest {
val program = for {
nowUTC <- IO(ZonedDateTime.now(ZoneOffset.UTC))
referenceTime = FileName.getClosestReferenceTime(nowUTC)
timeList = FileName.generateTimeList(referenceTime)
fetch <- FetchService.of
_ <- fetch.fetchFromDateTime(referenceTime)
nameList <- fetch.fetchFromList(timeList)
_ <- IO.println(nameList)
} yield ()
program.unsafeRunSync()
+1 -1
View File
@@ -26,7 +26,7 @@ object GribParser {
loop(0L, List.empty)
}
def parseGrib(path: Path, ptr: Long): IO[Grib] = {
private def parseGrib(path: Path, ptr: Long): IO[Grib] = {
for {
res0 <- parse0(path, ptr)
(version, discipline, gribLength, len0) = res0