nullable sun/moon and add attributions

This commit is contained in:
PranshulGG committed 2026-08-23 20:20:12 +05:30
1 parent 7303979d93
commit 1d39ddd941
31 files changed
+207 -148

No files matched your search

@@ -102,13 +102,13 @@ data class WeatherDaily(
val visibility: Int?, // NOTE: ALWAYS METERS (Minimum)
val humidity: Double?, // (Average)
val dewPoint: Double?, // (Average)
val sunrise: Long, // NOTE: ALWAYS MILLISECONDS
val sunset: Long, // NOTE: ALWAYS MILLISECONDS
val moonrise: Long, // NOTE: ALWAYS MILLISECONDS
val moonset: Long, // NOTE: ALWAYS MILLISECONDS
val sunrise: Long?, // NOTE: ALWAYS MILLISECONDS
val sunset: Long?, // NOTE: ALWAYS MILLISECONDS
val moonrise: Long?, // NOTE: ALWAYS MILLISECONDS
val moonset: Long?, // NOTE: ALWAYS MILLISECONDS
val moonPhase: MoonPhase,
val dawn: Long,
val dusk: Long
val dawn: Long?,
val dusk: Long?
) {
fun isWindSpeedValid(): Boolean {
@@ -143,4 +143,12 @@ data class WeatherDaily(
return pressureMsl != null && pressureMsl != -1.0
}
fun isMoonTimesValid(): Boolean {
return moonrise != null && moonset != null
}
fun isSunTimesValid(): Boolean {
return sunrise != null && sunset != null
}
}
@@ -30,7 +30,9 @@ import retrofit2.HttpException
import retrofit2.Response
import javax.inject.Inject
/**
* Initial AEMET integration implemented by https://github.com/reveler-hub
*/
class AemetRepository @Inject constructor(
val dao: LocationsDao,
val weatherDao: WeatherDao,
@@ -28,6 +28,11 @@ import kotlinx.coroutines.withContext
import retrofit2.Response
import javax.inject.Inject
/**
* Initial CWA integration implemented by https://github.com/reveler-hub
*/
// The cached "city key" for this source packs two values CWA needs into one delimited string,
// since LocationKeyEntity only has a single cityKey column: "{shortRangeEndpointId}|{townshipName}".
private const val CACHE_KEY_DELIMITER = "|"
@@ -41,7 +41,9 @@ import kotlin.math.cos
import kotlin.math.sin
import kotlin.math.sqrt
/**
* Initial INMET integration implemented by https://github.com/altendorfme
*/
class InmetRepository @Inject constructor(
val dao: LocationsDao,
val weatherDao: WeatherDao,
@@ -35,6 +35,12 @@ import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import javax.inject.Inject
/**
* Initial JMA integration implemented by https://github.com/reveler-hub
*/
// The cached "city key" packs three values into one delimited string (LocationKeyEntity only
// has a single cityKey column), so a warm-cache read needs zero extra network calls:
// "{class10Code}|{officeCode}|{amedasId}".
@@ -204,7 +210,8 @@ class JmaRepository @Inject constructor(
for (bucket in listOf(boundary, boundary.minusHours(3))) {
val path = bucket.format(DateTimeFormatter.ofPattern("yyyyMMdd_HH"))
try {
val result = api.getAmedasCurrent(amedasId, path).entries.maxByOrNull { it.key }?.value
val result =
api.getAmedasCurrent(amedasId, path).entries.maxByOrNull { it.key }?.value
if (result != null) return result
} catch (e: Exception) {
// try the previous bucket
@@ -205,6 +205,10 @@ class NwsRepository @Inject constructor(
}
}
/**
* Initial NWS alerts integration implemented by https://github.com/reveler-hub
*/
override suspend fun getAlerts(
location: Location,
isManualRefresh: Boolean,
@@ -33,6 +33,10 @@ import kotlinx.coroutines.withContext
import java.net.UnknownHostException
import javax.inject.Inject
/**
* Initial Pirate Weather integration implemented by https://github.com/altendorfme
*/
class PirateWeatherRepository @Inject constructor(
val dao: LocationsDao,
val weatherDao: WeatherDao,
@@ -38,11 +38,11 @@ data class DailyWeatherEntity(
val visibility: Int?,
val humidity: Double?,
val dewPoint: Double?,
val sunrise: Long,
val sunset: Long,
val moonrise: Long,
val moonset: Long,
val sunrise: Long?,
val sunset: Long?,
val moonrise: Long?,
val moonset: Long?,
val moonPhase: MoonPhase,
val dawn: Long,
val dusk: Long
val dawn: Long?,
val dusk: Long?
)
@@ -128,13 +128,13 @@ fun AccuWeatherBundle.toDomain(location: Location): Weather {
visibility = null,
humidity = humidity,
dewPoint = null,
sunrise = sunTimings[index].sunrise ?: -0L,
sunset = sunTimings[index].sunset ?: -0L,
moonrise = moonTimings[index].moonrise ?: -0L,
moonset = moonTimings[index].moonset ?: -0L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: -0L,
dusk = sunTimings[index].dusk ?: -0L
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk
)
},
)
@@ -24,6 +24,9 @@ import java.time.LocalDate
// AEMET reports wind speed in km/h already, matching this app's canonical unit - no conversion needed.
/**
* Initial AEMET integration implemented by https://github.com/reveler-hub
*/
private data class AemetHourPoint(
val time: Long,
val condition: WeatherCondition,
@@ -139,14 +142,14 @@ fun AemetForecastJson.toDomain(location: Location): Weather {
visibility = null,
humidity = humidityAvg,
dewPoint = null,
sunrise = sunTimings.getOrNull(index)?.sunrise ?: 0L,
sunset = sunTimings.getOrNull(index)?.sunset ?: 0L,
moonrise = moonTimings.getOrNull(index)?.moonrise ?: 0L,
moonset = moonTimings.getOrNull(index)?.moonset ?: 0L,
sunrise = sunTimings.getOrNull(index)?.sunrise,
sunset = sunTimings.getOrNull(index)?.sunset,
moonrise = moonTimings.getOrNull(index)?.moonrise,
moonset = moonTimings.getOrNull(index)?.moonset,
moonPhase = moonTimings.getOrNull(index)?.phase
?: com.pranshulgg.weather_master_app.core.model.astro.MoonPhase.NEW_MOON,
dawn = sunTimings.getOrNull(index)?.dawn ?: 0L,
dusk = sunTimings.getOrNull(index)?.dusk ?: 0L
dawn = sunTimings.getOrNull(index)?.dawn,
dusk = sunTimings.getOrNull(index)?.dusk
)
}
)
@@ -144,13 +144,13 @@ private fun computeDaily(
visibility = visibilityMin?.toInt(),
humidity = humidityAvg,
dewPoint = null,
sunrise = sunTimings[index].sunrise ?: -1L,
sunset = sunTimings[index].sunset ?: -1L,
moonrise = moonTimings[index].moonrise ?: -1L,
moonset = moonTimings[index].moonset ?: -1L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: -1L,
dusk = sunTimings[index].dusk ?: -1L
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk
)
}
@@ -121,13 +121,13 @@ fun ChinaForecastJson.toDomain(location: Location): Weather {
visibility = null,
humidity = null,
dewPoint = null,
sunrise = sunTimings[it].sunrise ?: -1L,
sunset = sunTimings[it].sunset ?: -1L,
moonrise = moonTimings[it].moonrise ?: -1L,
moonset = moonTimings[it].moonset ?: -1L,
sunrise = sunTimings[it].sunrise,
sunset = sunTimings[it].sunset,
moonrise = moonTimings[it].moonrise,
moonset = moonTimings[it].moonset,
moonPhase = moonTimings[it].phase,
dawn = sunTimings[it].dawn ?: -1L,
dusk = sunTimings[it].dusk ?: -1L
dawn = sunTimings[it].dawn,
dusk = sunTimings[it].dusk
)
}
@@ -22,6 +22,10 @@ import com.pranshulgg.weather_master_app.core.utils.weather.computing.computeDai
import com.pranshulgg.weather_master_app.core.utils.weather.forecast.findHourlyIndexForTime
import java.time.OffsetDateTime
/**
* Initial CWA integration implemented by https://github.com/reveler-hub
*/
// CWA reports wind speed in m/s - needs converting to this app's canonical km/h.
// Temperature is already Celsius. CWA's forecast product has no rain-amount-in-mm field at all
// (only probability + a text description), so rain/snowfall are always 0.0/null here, same
@@ -144,13 +148,13 @@ fun CwaForecastBundle.toDomain(location: Location): Weather {
visibility = null,
humidity = humidityAvg,
dewPoint = dewPointAvg,
sunrise = sunTimings.getOrNull(index)?.sunrise ?: 0L,
sunset = sunTimings.getOrNull(index)?.sunset ?: 0L,
moonrise = moonTimings.getOrNull(index)?.moonrise ?: 0L,
moonset = moonTimings.getOrNull(index)?.moonset ?: 0L,
sunrise = sunTimings.getOrNull(index)?.sunrise,
sunset = sunTimings.getOrNull(index)?.sunset,
moonrise = moonTimings.getOrNull(index)?.moonrise,
moonset = moonTimings.getOrNull(index)?.moonset,
moonPhase = moonTimings.getOrNull(index)?.phase ?: MoonPhase.NEW_MOON,
dawn = sunTimings.getOrNull(index)?.dawn ?: 0L,
dusk = sunTimings.getOrNull(index)?.dusk ?: 0L
dawn = sunTimings.getOrNull(index)?.dawn,
dusk = sunTimings.getOrNull(index)?.dusk
)
}
)
@@ -154,13 +154,13 @@ private fun computeDaily(
weatherCondition = condition,
time = time,
precipitationProbabilityMax = precipitationProbabilityMax,
sunrise = sunTimings[index].sunrise ?: -0L,
sunset = sunTimings[index].sunset ?: -0L,
moonrise = moonTimings[index].moonrise ?: -0L,
moonset = moonTimings[index].moonset ?: -0L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: 0L,
dusk = sunTimings[index].dusk ?: 0L,
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk,
humidity = avgHumidity,
pressureMsl = avgPressure,
visibility = minVisibility.roundToInt(),
@@ -125,13 +125,13 @@ fun EcccWeatherJson.toDomain(location: Location): Weather {
time = time,
precipitationProbabilityMax = it.precipProbability?.toSafeDouble()?.roundToInt()
?: getMaxPrecipitationProbability(hourly, time),
sunrise = sunTimings[index].sunrise ?: -0L,
sunset = sunTimings[index].sunset ?: -0L,
moonrise = moonTimings[index].moonrise ?: -0L,
moonset = moonTimings[index].moonset ?: -0L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: 0L,
dusk = sunTimings[index].dusk ?: 0L,
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk,
pressureMsl = null,
visibility = null,
humidity = null,
@@ -262,13 +262,13 @@ private fun computeDaily(
weatherCondition = condition,
time = dailyIt.key,
precipitationProbabilityMax = precipitationProbabilityMax,
sunrise = sunTimings[index].sunrise ?: -0L,
sunset = sunTimings[index].sunset ?: -0L,
moonrise = moonTimings[index].moonrise ?: -0L,
moonset = moonTimings[index].moonset ?: -0L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: 0L,
dusk = sunTimings[index].dusk ?: 0L,
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk,
pressureMsl = avgPressure,
visibility = minVisibility?.roundToInt(),
humidity = avgHumidity,
@@ -134,13 +134,13 @@ fun GismeteoModel.toDomain(location: Location): Weather {
visibility = null,
humidity = humidityMin,
dewPoint = null,
sunrise = sunTimings[index].sunrise ?: -0L,
sunset = sunTimings[index].sunset ?: -0L,
moonrise = moonTimings[index].moonrise ?: -0L,
moonset = moonTimings[index].moonset ?: -0L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: 0L,
dusk = sunTimings[index].dusk ?: 0L,
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk,
)
}
@@ -212,13 +212,13 @@ fun ImdForecastModel.toDomain(location: Location): Weather {
visibility = null,
humidity = humidityAvg,
dewPoint = null,
sunrise = sunTimings[index].sunrise ?: -0L,
sunset = sunTimings[index].sunset ?: -0L,
moonrise = moonTimings[index].moonrise ?: -0L,
moonset = moonTimings[index].moonset ?: -0L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: 0L,
dusk = sunTimings[index].dusk ?: 0L,
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk,
)
},
)
@@ -25,6 +25,10 @@ import java.time.ZoneId
import java.time.format.DateTimeFormatter
/**
* Initial INMET integration implemented by https://github.com/altendorfme
*/
data class InmetWeatherBundle(
val forecast: Map<String, Map<String, InmetDayJson>>,
val hourlyObservations: List<InmetHourlyEntryJson>?
@@ -164,13 +168,13 @@ fun InmetWeatherBundle.toDomain(location: Location): Weather {
val sun = sunTimings[index]
val moon = moonTimings[index]
dailyEntries[index] = day.copy(
sunrise = sun.sunrise ?: -1L,
sunset = sun.sunset ?: -1L,
moonrise = moon.moonrise ?: -1L,
moonset = moon.moonset ?: -1L,
sunrise = sun.sunrise,
sunset = sun.sunset,
moonrise = moon.moonrise,
moonset = moon.moonset,
moonPhase = moon.phase,
dawn = sun.dawn ?: -1L,
dusk = sun.dusk ?: -1L
dawn = sun.dawn,
dusk = sun.dusk
)
}
}
@@ -119,13 +119,13 @@ fun List<IpmaForecastJson>.toDomain(location: Location): Weather {
visibility = null,
humidity = it.humidity.toSafeDouble(),
dewPoint = null,
sunrise = sunTimings[index].sunrise ?: -1L,
sunset = sunTimings[index].sunset ?: -1L,
moonrise = moonTimings[index].moonrise ?: -1L,
moonset = moonTimings[index].moonset ?: -1L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: -1L,
dusk = sunTimings[index].dusk ?: -1L,
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk,
)
}
)
@@ -21,6 +21,11 @@ import com.pranshulgg.weather_master_app.core.utils.weather.astronomy.getSunTimi
import com.pranshulgg.weather_master_app.core.utils.weather.forecast.findHourlyIndexForTime
import java.time.OffsetDateTime
/**
* Initial JMA integration implemented by https://github.com/reveler-hub
*/
// JMA reports wind speed as a level+range in m/s (converted to km/h below) and temperature
// already in Celsius. The forecast product has no rain/snow-amount field at all (only
// probability), so rain/snowfall are always 0.0/null here, same treatment IPMA/AEMET/CWA use
@@ -58,7 +63,8 @@ fun JmaForecastBundle.toDomain(location: Location): Weather {
fun popAt(targetMillis: Long): Int? {
val index = popTimeDefines.indexOfLast { it <= targetMillis }
if (index == -1) return null
val blockEnd = popTimeDefines.getOrNull(index + 1) ?: (popTimeDefines[index] + 6 * 3_600_000L)
val blockEnd =
popTimeDefines.getOrNull(index + 1) ?: (popTimeDefines[index] + 6 * 3_600_000L)
if (targetMillis >= blockEnd) return null
return pops.getOrNull(index)?.toSafeProbability()
}
@@ -169,13 +175,13 @@ fun JmaForecastBundle.toDomain(location: Location): Weather {
visibility = null,
humidity = null,
dewPoint = null,
sunrise = sunTimings.getOrNull(index)?.sunrise ?: 0L,
sunset = sunTimings.getOrNull(index)?.sunset ?: 0L,
moonrise = moonTimings.getOrNull(index)?.moonrise ?: 0L,
moonset = moonTimings.getOrNull(index)?.moonset ?: 0L,
sunrise = sunTimings.getOrNull(index)?.sunrise,
sunset = sunTimings.getOrNull(index)?.sunset,
moonrise = moonTimings.getOrNull(index)?.moonrise,
moonset = moonTimings.getOrNull(index)?.moonset,
moonPhase = moonTimings.getOrNull(index)?.phase ?: MoonPhase.NEW_MOON,
dawn = sunTimings.getOrNull(index)?.dawn ?: 0L,
dusk = sunTimings.getOrNull(index)?.dusk ?: 0L
dawn = sunTimings.getOrNull(index)?.dawn,
dusk = sunTimings.getOrNull(index)?.dusk
)
}
)
@@ -198,13 +198,13 @@ private fun computeDaily(
visibility = null,
humidity = humidityMin,
dewPoint = null,
sunrise = sunTimings[index].sunrise ?: -1L,
sunset = sunTimings[index].sunset ?: -1L,
moonrise = moonTimings[index].moonrise ?: -1L,
moonset = moonTimings[index].moonset ?: -1L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: -1L,
dusk = sunTimings[index].dusk ?: -1L
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk
)
}.take(4)
@@ -161,13 +161,13 @@ private fun computeDaily(
weatherCondition = condition,
time = time,
precipitationProbabilityMax = null,
sunrise = sunTimings[index].sunrise ?: -0L,
sunset = sunTimings[index].sunset ?: -0L,
moonrise = moonTimings[index].moonrise ?: -0L,
moonset = moonTimings[index].moonset ?: -0L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: 0L,
dusk = sunTimings[index].dusk ?: 0L,
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk,
pressureMsl = avgPressure,
visibility = null,
humidity = avgHumidity,
@@ -191,13 +191,13 @@ private fun computeDaily(data: MetNorwayForecastJson, location: Location): List<
weatherCondition = condition,
time = time,
precipitationProbabilityMax = null,
sunrise = sunTimings[index].sunrise ?: -0L,
sunset = sunTimings[index].sunset ?: -0L,
moonrise = moonTimings[index].moonrise ?: -0L,
moonset = moonTimings[index].moonset ?: -0L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: 0L,
dusk = sunTimings[index].dusk ?: 0L,
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk,
pressureMsl = avgPressure,
visibility = null,
humidity = avgHumidity,
@@ -156,13 +156,13 @@ fun MetOfficeForecastJson.toDomain(location: Location): Weather {
.takeIf { it != -1 },
humidity = humidityAvg,
dewPoint = dewPointAvg,
sunrise = sunTimings[index].sunrise ?: -0L,
sunset = sunTimings[index].sunset ?: -0L,
moonrise = moonTimings[index].moonrise ?: -0L,
moonset = moonTimings[index].moonset ?: -0L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: 0L,
dusk = sunTimings[index].dusk ?: 0L,
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk,
)
}
)
@@ -210,13 +210,13 @@ fun NwsWeatherJsonBundle.toDomain(location: Location): Weather {
weatherCondition = condition,
time = time,
precipitationProbabilityMax = precipitationProbabilityMax.roundToInt(), // item.probabilityOfPrecipitation.value from daily is wrong?
sunrise = sunTimings[index].sunrise ?: -0L,
sunset = sunTimings[index].sunset ?: -0L,
moonrise = moonTimings[index].moonrise ?: -0L,
moonset = moonTimings[index].moonset ?: -0L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: 0L,
dusk = sunTimings[index].dusk ?: 0L,
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk,
pressureMsl = null,
visibility = minVisibility?.roundToInt(),
humidity = avgHumidity,
@@ -5,6 +5,11 @@ import com.pranshulgg.weather_master_app.core.model.weather.alerts.AlertSeverity
import com.pranshulgg.weather_master_app.core.network.sources.weather.nws.json.NwsAlertsJson
import java.time.OffsetDateTime
/**
* Initial NWS alerts integration implemented by https://github.com/reveler-hub
*/
fun NwsAlertsJson.toDomain(locationId: String): List<Alert> {
return features.orEmpty().mapNotNull { feature ->
val properties = feature.properties ?: return@mapNotNull null
@@ -103,13 +103,13 @@ fun OpenMeteoWeatherJson.toDomain(location: Location): Weather {
weatherCondition = condition,
time = daily.time[it].secondsToMilliseconds(), // Open-Meteo returns in seconds
precipitationProbabilityMax = daily.precipitationProbabilityMax[it],
sunrise = sunTimings[it].sunrise ?: -0L,
sunset = sunTimings[it].sunset ?: -0L,
moonrise = moonTimings[it].moonrise ?: -0L,
moonset = moonTimings[it].moonset ?: -0L,
sunrise = sunTimings[it].sunrise,
sunset = sunTimings[it].sunset,
moonrise = moonTimings[it].moonrise,
moonset = moonTimings[it].moonset,
moonPhase = moonTimings[it].phase,
dawn = sunTimings[it].dawn ?: 0L,
dusk = sunTimings[it].dusk ?: 0L,
dawn = sunTimings[it].dawn,
dusk = sunTimings[it].dusk,
pressureMsl = daily.pressureMsl[it],
visibility = daily.visibility[it],
humidity = daily.humidity[it]?.toDouble(),
@@ -146,13 +146,13 @@ fun OpenWeatherJsonBundle.toDomain(location: Location): Weather {
visibility = minVisibility?.toInt(),
humidity = humidityAvg,
dewPoint = avgDewPoint,
sunrise = sunTimings.sunrise ?: -1L,
sunset = sunTimings.sunset ?: -1L,
moonrise = moonTimings.moonrise ?: -1L,
moonset = moonTimings.moonset ?: -1L,
sunrise = sunTimings.sunrise,
sunset = sunTimings.sunset,
moonrise = moonTimings.moonrise,
moonset = moonTimings.moonset,
moonPhase = moonTimings.phase,
dawn = sunTimings.dawn ?: -1L,
dusk = sunTimings.dusk ?: -1L,
dawn = sunTimings.dawn,
dusk = sunTimings.dusk,
)
}
)
@@ -18,6 +18,11 @@ import com.pranshulgg.weather_master_app.core.utils.weather.astronomy.getMoonTim
import com.pranshulgg.weather_master_app.core.utils.weather.astronomy.getSunTimings
import kotlin.math.roundToInt
/**
* Initial Pirate Weather integration implemented by https://github.com/altendorfme
*/
fun PirateWeatherJson.toDomain(location: Location): Weather {
val utcOffsetSeconds = (offset * 3600).toLong()
@@ -106,13 +111,13 @@ private fun PirateWeatherDailyDataJson.toWeatherDaily(
weatherCondition = PirateWeatherConditionMap.getCondition(icon),
time = time.secondsToMilliseconds(),
precipitationProbabilityMax = (precipProbability?.times(100))?.roundToInt(),
sunrise = sunTimings[index].sunrise ?: 0L,
sunset = sunTimings[index].sunset ?: 0L,
moonrise = moonTimings[index].moonrise ?: 0L,
moonset = moonTimings[index].moonset ?: 0L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: 0L,
dusk = sunTimings[index].dusk ?: 0L,
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk,
pressureMsl = pressure,
visibility = visibility?.let { (it * 1000).roundToInt() },
humidity = (humidity?.times(100)),
@@ -169,13 +169,13 @@ private fun computeDaily(data: SmhiForecastJson, location: Location): List<Weath
weatherCondition = condition,
time = time,
precipitationProbabilityMax = precipitationProbabilityMax,
sunrise = sunTimings[index].sunrise ?: -0L,
sunset = sunTimings[index].sunset ?: -0L,
moonrise = moonTimings[index].moonrise ?: -0L,
moonset = moonTimings[index].moonset ?: -0L,
sunrise = sunTimings[index].sunrise,
sunset = sunTimings[index].sunset,
moonrise = moonTimings[index].moonrise,
moonset = moonTimings[index].moonset,
moonPhase = moonTimings[index].phase,
dawn = sunTimings[index].dawn ?: 0L,
dusk = sunTimings[index].dusk ?: 0L,
dawn = sunTimings[index].dawn,
dusk = sunTimings[index].dusk,
pressureMsl = avgPressure,
visibility = DistanceUnit.KM.convert(minVisibility, DistanceUnit.M)?.roundToInt(),
humidity = avgHumidity,