private suspend fun syncFeeds(feeds: List<Feed>) {
coroutineScope {
- val client = HttpClient.newBuilder().build()
+ val client = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.NORMAL).build()
val jobs = feeds.map { feed ->
async(Dispatchers.IO) {
try {
val request = requestBuilder.build()
val response = client.send(request, HttpResponse.BodyHandlers.ofInputStream())
- if(response.statusCode() > 299) {
- throw Exception("HTTP error: ${response.statusCode()}")
- }
- response.body().use { stream ->
- val input = SyndFeedInput()
- val syndFeed = input.build(XmlReader(stream))
- val items = mutableListOf<Item>()
- println("Fetched feed: ${syndFeed.title}")
- syndFeed.entries.forEach { entry ->
- //println(" ${entry.title} - ${entry.link}")
+ val statusCode = response.statusCode()
+ if(statusCode > 299) {
+ // TODO: handle 401
+ throw Exception("HTTP error: ${statusCode}")
+ } else {
+ response.body().use { stream ->
+ val input = SyndFeedInput()
+ val syndFeed = input.build(XmlReader(stream))
+ val items = mutableListOf<Item>()
+ println("Fetched feed: ${syndFeed.title}")
+ syndFeed.entries.forEach { entry ->
+ //println(" ${entry.title} - ${entry.link}")
- val item = Item(0)
- item.feedId = feed.id
- item.title = entry.title
- item.link = entry.link
- item.category = entry.categories.firstOrNull()?.name
- item.description = entry.description?.value
- item.author = entry.author
- entry.publishedDate?.let {
- item.pubDate = it.toInstant()
- }
- entry.updatedDate?.let {
- item.updated = it.toInstant()
- }
- item.guid = entry.uri
- val contents = entry.contents
- contents.forEach { content ->
- if(content.type == null) {
- item.contentText = content.value
- } else {
- if(content.type == "html") {
- item.contentHtml = content.value
- } else if(content.type == "text") {
+ val item = Item(0)
+ item.feedId = feed.id
+ item.title = entry.title
+ item.link = entry.link
+ item.category = entry.categories.firstOrNull()?.name
+ item.description = entry.description?.value
+ item.author = entry.author
+ entry.publishedDate?.let {
+ item.pubDate = it.toInstant()
+ }
+ entry.updatedDate?.let {
+ item.updated = it.toInstant()
+ }
+ item.guid = entry.uri
+ val contents = entry.contents
+ contents.forEach { content ->
+ if(content.type == null) {
item.contentText = content.value
+ } else {
+ if(content.type == "html") {
+ item.contentHtml = content.value
+ } else if(content.type == "text") {
+ item.contentText = content.value
+ }
}
}
- }
- items.add(item)
+ items.add(item)
+ }
+ Database.addItems(items)
+ Database.updateFeedDate(feed)
}
- Database.addItems(items)
- Database.updateFeedDate(feed)
}
} catch (e: Exception) {
println("Failed to fetch ${feed.uri}: ${e.message}")