From 6a1ddaeabb63ac5325037ef2a8bfe1dcc9a7fa40 Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Sun, 20 Sep 2020 18:12:05 +0200 Subject: [PATCH] Use LocalRSSDataSource isUrlRSSResource --- .../readrops/api/localfeed/LocalRSSHelper.kt | 35 +++++++------------ .../app/viewmodels/AddFeedsViewModel.java | 15 ++++---- 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/api/src/main/java/com/readrops/api/localfeed/LocalRSSHelper.kt b/api/src/main/java/com/readrops/api/localfeed/LocalRSSHelper.kt index 13894e6a..313d564a 100644 --- a/api/src/main/java/com/readrops/api/localfeed/LocalRSSHelper.kt +++ b/api/src/main/java/com/readrops/api/localfeed/LocalRSSHelper.kt @@ -1,18 +1,14 @@ package com.readrops.api.localfeed -import com.readrops.api.utils.UnknownFormatException import java.io.InputStream import java.util.regex.Pattern object LocalRSSHelper { private const val RSS_DEFAULT_CONTENT_TYPE = "application/rss+xml" - private const val RSS_TEXT_CONTENT_TYPE = "text/xml" - private const val RSS_APPLICATION_CONTENT_TYPE = "application/xml" private const val ATOM_CONTENT_TYPE = "application/atom+xml" private const val JSONFEED_CONTENT_TYPE = "application/feed+json" private const val JSON_CONTENT_TYPE = "application/json" - private const val HTML_CONTENT_TYPE = "text/html" private const val RSS_2_REGEX = "rss.*version=\"2.0\"" @@ -26,8 +22,7 @@ object LocalRSSHelper { RSS_DEFAULT_CONTENT_TYPE -> RSSType.RSS_2 ATOM_CONTENT_TYPE -> RSSType.ATOM JSON_CONTENT_TYPE, JSONFEED_CONTENT_TYPE -> RSSType.JSONFEED - RSS_TEXT_CONTENT_TYPE, RSS_APPLICATION_CONTENT_TYPE, HTML_CONTENT_TYPE -> RSSType.UNKNOWN - else -> throw UnknownFormatException("Unknown content type : $contentType") + else -> RSSType.UNKNOWN } } @@ -37,27 +32,21 @@ object LocalRSSHelper { fun getRSSContentType(content: InputStream): RSSType { val stringBuffer = StringBuffer() val reader = content.bufferedReader() + var type = RSSType.UNKNOWN - var currentLine = reader.readLine() - while (currentLine != null) { - stringBuffer.append(currentLine) + // we get the first 10 lines which should be sufficient to get the type, + // otherwise iterating over the whole file could be too slow + for (i in 0..9) stringBuffer.append(reader.readLine()) - if (Pattern.compile(RSS_2_REGEX).matcher(stringBuffer.toString()).find()) { - reader.close() - content.close() - - return RSSType.RSS_2 - } else if (Pattern.compile(ATOM_REGEX).matcher(stringBuffer.toString()).find()) { - reader.close() - content.close() - - return RSSType.ATOM - } - - currentLine = reader.readLine() + if (Pattern.compile(RSS_2_REGEX).matcher(stringBuffer.toString()).find()) { + type = RSSType.RSS_2 + } else if (Pattern.compile(ATOM_REGEX).matcher(stringBuffer.toString()).find()) { + type = RSSType.ATOM } - return RSSType.UNKNOWN + reader.close() + content.close() + return type } enum class RSSType { diff --git a/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java b/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java index 804ae2eb..303fdb0e 100644 --- a/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java +++ b/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java @@ -7,13 +7,14 @@ import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; -import com.readrops.db.Database; -import com.readrops.db.entities.account.Account; +import com.readrops.api.localfeed.LocalRSSDataSource; +import com.readrops.api.utils.HttpManager; import com.readrops.app.repositories.ARepository; import com.readrops.app.utils.FeedInsertionResult; import com.readrops.app.utils.HtmlParser; import com.readrops.app.utils.ParsingResult; -import com.readrops.api.localfeed.RSSQuery; +import com.readrops.db.Database; +import com.readrops.db.entities.account.Account; import java.util.ArrayList; import java.util.List; @@ -47,15 +48,15 @@ public class AddFeedsViewModel extends AndroidViewModel { public Single> parseUrl(String url) { return Single.create(emitter -> { - RSSQuery rssApi = new RSSQuery(); + LocalRSSDataSource dataSource = new LocalRSSDataSource(HttpManager.getInstance().getOkHttpClient()); List results = new ArrayList<>(); - if (rssApi.isUrlFeedLink(url)) { + if (dataSource.isUrlRSSResource(url)) { ParsingResult parsingResult = new ParsingResult(url, null); results.add(parsingResult); - - } else + } else { results.addAll(HtmlParser.getFeedLink(url)); + } emitter.onSuccess(results); });