diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index f72af1db2..9d164cf68 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -382,21 +382,24 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, } } - public func createFeed(with name: String?, editedName: String?, url: String) -> Feed? { + public func createFeed(with name: String?, editedName: String?, url: String) -> Feed { // For syncing, this may need to be an async method with a callback, // since it will likely need to call the server. - - let metadata = feedMetadata(feedID: url) - let feed = Feed(account: self, url: url, feedID: url, metadata: metadata) - if let name = name, feed.name == nil { - feed.name = name - } - if let editedName = editedName, feed.editedName == nil { - feed.editedName = editedName - } - + return createFeed(with: name, editedName: editedName, url: url, feedId: url, homePageURL: nil) + + } + + func createFeed(with name: String?, editedName: String?, url: String, feedId: String, homePageURL: String?) -> Feed { + + let metadata = feedMetadata(feedID: feedId) + let feed = Feed(account: self, url: url, feedID: feedId, metadata: metadata) + feed.name = name + feed.editedName = editedName + feed.homePageURL = homePageURL + return feed + } public func canAddFolder(_ folder: Folder, to containingFolder: Folder?) -> Bool { diff --git a/Frameworks/Account/Account.xcodeproj/project.pbxproj b/Frameworks/Account/Account.xcodeproj/project.pbxproj index 879eeffa5..d3e2ec323 100644 --- a/Frameworks/Account/Account.xcodeproj/project.pbxproj +++ b/Frameworks/Account/Account.xcodeproj/project.pbxproj @@ -10,6 +10,11 @@ 5107A099227DE42E00C7C3C5 /* AccountCredentialsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5107A098227DE42E00C7C3C5 /* AccountCredentialsTest.swift */; }; 5107A09B227DE49500C7C3C5 /* TestAccountManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5107A09A227DE49500C7C3C5 /* TestAccountManager.swift */; }; 5107A09D227DE77700C7C3C5 /* TestTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5107A09C227DE77700C7C3C5 /* TestTransport.swift */; }; + 513323082281070D00C30F19 /* AccountFeedSyncTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 513323072281070C00C30F19 /* AccountFeedSyncTest.swift */; }; + 5133230A2281082F00C30F19 /* subscriptions_initial.json in Resources */ = {isa = PBXBuildFile; fileRef = 513323092281082F00C30F19 /* subscriptions_initial.json */; }; + 5133230C2281088A00C30F19 /* subscriptions_add.json in Resources */ = {isa = PBXBuildFile; fileRef = 5133230B2281088A00C30F19 /* subscriptions_add.json */; }; + 5133230E2281089500C30F19 /* icons.json in Resources */ = {isa = PBXBuildFile; fileRef = 5133230D2281089500C30F19 /* icons.json */; }; + 5133231122810EB200C30F19 /* FeedbinIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5133230F22810E5700C30F19 /* FeedbinIcon.swift */; }; 5144EA49227B497600D19003 /* FeedbinAPICaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5144EA48227B497600D19003 /* FeedbinAPICaller.swift */; }; 5144EA4E227B829A00D19003 /* FeedbinAccountDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5144EA4D227B829A00D19003 /* FeedbinAccountDelegate.swift */; }; 51D58755227F53BE00900287 /* FeedbinTag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51D58754227F53BE00900287 /* FeedbinTag.swift */; }; @@ -23,7 +28,7 @@ 841974251F6DDCE4006346C4 /* AccountDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841974241F6DDCE4006346C4 /* AccountDelegate.swift */; }; 841D4D702106B40400DD04E6 /* ArticlesDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841D4D6F2106B40400DD04E6 /* ArticlesDatabase.framework */; }; 841D4D722106B40A00DD04E6 /* Articles.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841D4D712106B40A00DD04E6 /* Articles.framework */; }; - 84245C851FDDD8CB0074AFBB /* FeedbinFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84245C841FDDD8CB0074AFBB /* FeedbinFeed.swift */; }; + 84245C851FDDD8CB0074AFBB /* FeedbinSubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84245C841FDDD8CB0074AFBB /* FeedbinSubscription.swift */; }; 844B297D2106C7EC004020B3 /* Feed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 844B297C2106C7EC004020B3 /* Feed.swift */; }; 844B297F210CE37E004020B3 /* UnreadCountProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 844B297E210CE37E004020B3 /* UnreadCountProvider.swift */; }; 844B2981210CE3BF004020B3 /* RSWeb.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 844B2980210CE3BF004020B3 /* RSWeb.framework */; }; @@ -37,10 +42,8 @@ 84B99C9F1FAE8D3200ECDEDB /* ContainerPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B99C9E1FAE8D3200ECDEDB /* ContainerPath.swift */; }; 84C3654A1F899F3B001EC85C /* CombinedRefreshProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C365491F899F3B001EC85C /* CombinedRefreshProgress.swift */; }; 84C8B3F41F89DE430053CCA6 /* DataExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C8B3F31F89DE430053CCA6 /* DataExtensions.swift */; }; - 84CAD7161FDF2E22000F0755 /* FeedbinArticle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CAD7151FDF2E22000F0755 /* FeedbinArticle.swift */; }; - 84D096212174169100D77525 /* FeedbinArticleIDArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D096202174169100D77525 /* FeedbinArticleIDArray.swift */; }; + 84CAD7161FDF2E22000F0755 /* FeedbinEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CAD7151FDF2E22000F0755 /* FeedbinEntry.swift */; }; 84D09623217418DC00D77525 /* FeedbinTagging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D09622217418DC00D77525 /* FeedbinTagging.swift */; }; - 84D0962521741B8500D77525 /* FeedbinSavedSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D0962421741B8500D77525 /* FeedbinSavedSearch.swift */; }; 84EAC4822148CC6300F154AB /* RSDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84EAC4812148CC6300F154AB /* RSDatabase.framework */; }; 84F1F06E2243524700DA0616 /* AccountMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AF4EA3222CFDD100F6A800 /* AccountMetadata.swift */; }; 84F73CF1202788D90000BCEF /* ArticleFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F73CF0202788D80000BCEF /* ArticleFetcher.swift */; }; @@ -95,6 +98,11 @@ 5107A098227DE42E00C7C3C5 /* AccountCredentialsTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountCredentialsTest.swift; sourceTree = ""; }; 5107A09A227DE49500C7C3C5 /* TestAccountManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestAccountManager.swift; sourceTree = ""; }; 5107A09C227DE77700C7C3C5 /* TestTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestTransport.swift; sourceTree = ""; }; + 513323072281070C00C30F19 /* AccountFeedSyncTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountFeedSyncTest.swift; sourceTree = ""; }; + 513323092281082F00C30F19 /* subscriptions_initial.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = subscriptions_initial.json; sourceTree = ""; }; + 5133230B2281088A00C30F19 /* subscriptions_add.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = subscriptions_add.json; sourceTree = ""; }; + 5133230D2281089500C30F19 /* icons.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = icons.json; sourceTree = ""; }; + 5133230F22810E5700C30F19 /* FeedbinIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinIcon.swift; sourceTree = ""; }; 5144EA48227B497600D19003 /* FeedbinAPICaller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinAPICaller.swift; sourceTree = ""; }; 5144EA4D227B829A00D19003 /* FeedbinAccountDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinAccountDelegate.swift; sourceTree = ""; }; 51D58754227F53BE00900287 /* FeedbinTag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinTag.swift; sourceTree = ""; }; @@ -111,7 +119,7 @@ 8419742D1F6DDE96006346C4 /* LocalAccountRefresher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAccountRefresher.swift; sourceTree = ""; }; 841D4D6F2106B40400DD04E6 /* ArticlesDatabase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ArticlesDatabase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 841D4D712106B40A00DD04E6 /* Articles.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Articles.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 84245C841FDDD8CB0074AFBB /* FeedbinFeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinFeed.swift; sourceTree = ""; }; + 84245C841FDDD8CB0074AFBB /* FeedbinSubscription.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinSubscription.swift; sourceTree = ""; }; 844B297C2106C7EC004020B3 /* Feed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Feed.swift; sourceTree = ""; }; 844B297E210CE37E004020B3 /* UnreadCountProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnreadCountProvider.swift; sourceTree = ""; }; 844B2980210CE3BF004020B3 /* RSWeb.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RSWeb.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -126,10 +134,8 @@ 84B99C9E1FAE8D3200ECDEDB /* ContainerPath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContainerPath.swift; sourceTree = ""; }; 84C365491F899F3B001EC85C /* CombinedRefreshProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CombinedRefreshProgress.swift; sourceTree = ""; }; 84C8B3F31F89DE430053CCA6 /* DataExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataExtensions.swift; sourceTree = ""; }; - 84CAD7151FDF2E22000F0755 /* FeedbinArticle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinArticle.swift; sourceTree = ""; }; - 84D096202174169100D77525 /* FeedbinArticleIDArray.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinArticleIDArray.swift; sourceTree = ""; }; + 84CAD7151FDF2E22000F0755 /* FeedbinEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinEntry.swift; sourceTree = ""; }; 84D09622217418DC00D77525 /* FeedbinTagging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinTagging.swift; sourceTree = ""; }; - 84D0962421741B8500D77525 /* FeedbinSavedSearch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinSavedSearch.swift; sourceTree = ""; }; 84EAC4812148CC6300F154AB /* RSDatabase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RSDatabase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 84F73CF0202788D80000BCEF /* ArticleFetcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleFetcher.swift; sourceTree = ""; }; D511EEB5202422BB00712EC3 /* Account_project_debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Account_project_debug.xcconfig; sourceTree = ""; }; @@ -170,6 +176,9 @@ 51D58758227F630B00900287 /* tags_add.json */, 51D58757227F630B00900287 /* tags_delete.json */, 51D58759227F630B00900287 /* tags_initial.json */, + 513323092281082F00C30F19 /* subscriptions_initial.json */, + 5133230B2281088A00C30F19 /* subscriptions_add.json */, + 5133230D2281089500C30F19 /* icons.json */, ); path = JSON; sourceTree = ""; @@ -207,10 +216,9 @@ children = ( 5144EA4D227B829A00D19003 /* FeedbinAccountDelegate.swift */, 5144EA48227B497600D19003 /* FeedbinAPICaller.swift */, - 84CAD7151FDF2E22000F0755 /* FeedbinArticle.swift */, - 84D096202174169100D77525 /* FeedbinArticleIDArray.swift */, - 84245C841FDDD8CB0074AFBB /* FeedbinFeed.swift */, - 84D0962421741B8500D77525 /* FeedbinSavedSearch.swift */, + 84CAD7151FDF2E22000F0755 /* FeedbinEntry.swift */, + 5133230F22810E5700C30F19 /* FeedbinIcon.swift */, + 84245C841FDDD8CB0074AFBB /* FeedbinSubscription.swift */, 51D58754227F53BE00900287 /* FeedbinTag.swift */, 84D09622217418DC00D77525 /* FeedbinTagging.swift */, ); @@ -271,6 +279,7 @@ children = ( 5107A098227DE42E00C7C3C5 /* AccountCredentialsTest.swift */, 51D5875D227F643C00900287 /* AccountFolderSyncTest.swift */, + 513323072281070C00C30F19 /* AccountFeedSyncTest.swift */, 5107A09C227DE77700C7C3C5 /* TestTransport.swift */, 5107A09A227DE49500C7C3C5 /* TestAccountManager.swift */, 51D58756227F62E300900287 /* JSON */, @@ -439,9 +448,12 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5133230E2281089500C30F19 /* icons.json in Resources */, 51D5875B227F630B00900287 /* tags_add.json in Resources */, + 5133230C2281088A00C30F19 /* subscriptions_add.json in Resources */, 51D5875C227F630B00900287 /* tags_initial.json in Resources */, 51D5875A227F630B00900287 /* tags_delete.json in Resources */, + 5133230A2281082F00C30F19 /* subscriptions_initial.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -455,7 +467,6 @@ 84C8B3F41F89DE430053CCA6 /* DataExtensions.swift in Sources */, 84C3654A1F899F3B001EC85C /* CombinedRefreshProgress.swift in Sources */, 8469F81C1F6DD15E0084783E /* Account.swift in Sources */, - 84D096212174169100D77525 /* FeedbinArticleIDArray.swift in Sources */, 5144EA4E227B829A00D19003 /* FeedbinAccountDelegate.swift in Sources */, 846E77451F6EF9B900A165E2 /* Container.swift in Sources */, 84F73CF1202788D90000BCEF /* ArticleFetcher.swift in Sources */, @@ -465,16 +476,16 @@ 84B2D4D02238CD8A00498ADA /* FeedMetadata.swift in Sources */, 5144EA49227B497600D19003 /* FeedbinAPICaller.swift in Sources */, 84B99C9F1FAE8D3200ECDEDB /* ContainerPath.swift in Sources */, + 5133231122810EB200C30F19 /* FeedbinIcon.swift in Sources */, 846E77501F6EF9C400A165E2 /* LocalAccountRefresher.swift in Sources */, 51D58755227F53BE00900287 /* FeedbinTag.swift in Sources */, 84D09623217418DC00D77525 /* FeedbinTagging.swift in Sources */, - 84CAD7161FDF2E22000F0755 /* FeedbinArticle.swift in Sources */, - 84D0962521741B8500D77525 /* FeedbinSavedSearch.swift in Sources */, + 84CAD7161FDF2E22000F0755 /* FeedbinEntry.swift in Sources */, 841974011F6DD1EC006346C4 /* Folder.swift in Sources */, 846E774F1F6EF9C000A165E2 /* LocalAccountDelegate.swift in Sources */, 844B297F210CE37E004020B3 /* UnreadCountProvider.swift in Sources */, 84F1F06E2243524700DA0616 /* AccountMetadata.swift in Sources */, - 84245C851FDDD8CB0074AFBB /* FeedbinFeed.swift in Sources */, + 84245C851FDDD8CB0074AFBB /* FeedbinSubscription.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -484,6 +495,7 @@ files = ( 51D5875E227F643C00900287 /* AccountFolderSyncTest.swift in Sources */, 5107A09B227DE49500C7C3C5 /* TestAccountManager.swift in Sources */, + 513323082281070D00C30F19 /* AccountFeedSyncTest.swift in Sources */, 5107A09D227DE77700C7C3C5 /* TestTransport.swift in Sources */, 5107A099227DE42E00C7C3C5 /* AccountCredentialsTest.swift in Sources */, ); diff --git a/Frameworks/Account/AccountMetadata.swift b/Frameworks/Account/AccountMetadata.swift index 963dcd31c..37e144741 100644 --- a/Frameworks/Account/AccountMetadata.swift +++ b/Frameworks/Account/AccountMetadata.swift @@ -19,6 +19,7 @@ final class AccountMetadata: Codable { static let subscriptions = "subscriptions" static let tags = "tags" static let taggings = "taggings" + static let icons = "icons" } enum CodingKeys: String, CodingKey { diff --git a/Frameworks/Account/AccountTests/AccountFeedSyncTest.swift b/Frameworks/Account/AccountTests/AccountFeedSyncTest.swift new file mode 100644 index 000000000..37c871ea9 --- /dev/null +++ b/Frameworks/Account/AccountTests/AccountFeedSyncTest.swift @@ -0,0 +1,65 @@ +// +// AccountFullSyncTest.swift +// AccountTests +// +// Created by Maurice Parker on 5/6/19. +// Copyright © 2019 Ranchero Software, LLC. All rights reserved. +// + +import XCTest +@testable import Account + +class AccountFeedSyncTest: XCTestCase { + + override func setUp() { + } + + override func tearDown() { + } + + func testDownloadSync() { + + let testTransport = TestTransport() + testTransport.testFiles["https://api.feedbin.com/v2/tags.json"] = "tags_add.json" + testTransport.testFiles["https://api.feedbin.com/v2/subscriptions.json"] = "subscriptions_initial.json" + testTransport.testFiles["https://api.feedbin.com/v2/icons.json"] = "icons.json" + let account = TestAccountManager.shared.createAccount(type: .feedbin, transport: testTransport) + + // Test initial folders + let initialExpection = self.expectation(description: "Initial feeds") + account.refreshAll() { + initialExpection.fulfill() + } + waitForExpectations(timeout: 5, handler: nil) + + XCTAssertEqual(224, account.flattenedFeeds().count) + + let daringFireball = account.idToFeedDictionary["1296379"] + XCTAssertEqual("Daring Fireball", daringFireball!.name) + XCTAssertEqual("https://daringfireball.net/feeds/json", daringFireball!.url) + XCTAssertEqual("https://daringfireball.net/", daringFireball!.homePageURL) + XCTAssertEqual("https://favicons.feedbinusercontent.com/6ac/6acc098f35ed2bcc0915ca89d50a97e5793eda45.png", daringFireball!.faviconURL) + + // Test Adding a Feed + testTransport.testFiles["https://api.feedbin.com/v2/subscriptions.json"] = "subscriptions_add.json" + + // Test initial folders + let addExpection = self.expectation(description: "Add feeds") + account.refreshAll() { + addExpection.fulfill() + } + waitForExpectations(timeout: 5, handler: nil) + + XCTAssertEqual(225, account.flattenedFeeds().count) + + let bPixels = account.idToFeedDictionary["1096623"] + XCTAssertEqual("Beautiful Pixels", bPixels!.name) + XCTAssertEqual("https://feedpress.me/beautifulpixels", bPixels!.url) + XCTAssertEqual("https://beautifulpixels.com/", bPixels!.homePageURL) + XCTAssertEqual("https://favicons.feedbinusercontent.com/ea0/ea010c658d6e356e49ab239b793dc415af707b05.png", bPixels?.faviconURL) + + TestAccountManager.shared.deleteAccount(account) + + } + +} diff --git a/Frameworks/Account/AccountTests/JSON/icons.json b/Frameworks/Account/AccountTests/JSON/icons.json new file mode 100644 index 000000000..2e3a25221 --- /dev/null +++ b/Frameworks/Account/AccountTests/JSON/icons.json @@ -0,0 +1 @@ +[{"host":"rx-marin.com","url":"https://favicons.feedbinusercontent.com/8ed/8eda7e52714937c29049be409d46301f6a35f141.png"},{"host":"lapcatsoftware.com","url":"https://favicons.feedbinusercontent.com/438/4385bdd5464c45afdafa9028d1ce4a4aef78db97.png"},{"host":"alwaysrightinstitute.github.io","url":"https://favicons.feedbinusercontent.com/03e/03eb5d06eedda8cfa6ab48dee4a55797e3f69fcd.png"},{"host":"twobithistory.org","url":"https://favicons.feedbinusercontent.com/0da/0dab2f2de1956859405025f6545dcf34625e26a1.png"},{"host":"blog.warpfactor.io","url":"https://favicons.feedbinusercontent.com/762/76261be5d7dddcff4b08c4133e0d813627794fba.png"},{"host":"www.vadimbulavin.com","url":"https://favicons.feedbinusercontent.com/0c4/0c47ec0e8b00ba23dd252cb98797373c6cf73d51.png"},{"host":"alisoftware.github.io","url":"https://favicons.feedbinusercontent.com/474/474001eb49e4f5653853502f452668aed3ef1084.png"},{"host":"swiftunboxed.com","url":"https://favicons.feedbinusercontent.com/035/035b23e03ed2aa52797d19a79c213c01131900bc.png"},{"host":"beckyhansmeyer.com","url":"https://favicons.feedbinusercontent.com/a4f/a4ff3fc87b1825757f31b53c3cb779c117c90565.png"},{"host":"holko.pl","url":"https://favicons.feedbinusercontent.com/93c/93c2d0ef4f1dc75a38bb6b5060fb0594d32ad619.png"},{"host":"marco.org","url":"https://favicons.feedbinusercontent.com/245/24504efcc6df52a37692e90dc43038d21e209a1c.png"},{"host":"williamboles.me","url":"https://favicons.feedbinusercontent.com/12d/12ded7c0c296e8907ead2d77e13de315108e5ced.png"},{"host":"rhonabwy.com","url":"https://favicons.feedbinusercontent.com/058/058f692cebfaca8f8dcae42f4a9f7adb8c63be5b.png"},{"host":"jvns.ca","url":"https://favicons.feedbinusercontent.com/af2/af282a13ddc9f0775f260823d76a9e6e94d68463.png"},{"host":"www.swwritings.com","url":"https://favicons.feedbinusercontent.com/552/5527f0f896785167cba00a0e4694f9b6d8760584.png"},{"host":"iosdev.tools","url":"https://favicons.feedbinusercontent.com/0a3/0a3c875c393015be787684c35daf744b621f834b.png"},{"host":"blog.gaiagps.com","url":"https://favicons.feedbinusercontent.com/ee6/ee6f6412fb48b870102103785ce61e04635f3479.png"},{"host":"makeapppie.com","url":"https://favicons.feedbinusercontent.com/42f/42fdacb56d47fbbec45087e2bf8b92e39a7f92c7.png"},{"host":"changelog.com","url":"https://favicons.feedbinusercontent.com/08d/08dbc956f8608bd78c2ef710c3ee86c6c7da201b.png"},{"host":"redditblog.com","url":"https://favicons.feedbinusercontent.com/905/90580f5e28318c1fd27ba2c63a9376ce53d530c6.png"},{"host":"freshswift.net","url":"https://favicons.feedbinusercontent.com/e09/e090794e599163e213a4ec181d6bb35e4711d50b.png"},{"host":"www.russbishop.net","url":"https://favicons.feedbinusercontent.com/3ec/3ec206ccd52fd7a66a714e7201146538a572b3b2.png"},{"host":"cate.blog","url":"https://favicons.feedbinusercontent.com/710/7108e77ee6fb04316bba8fc3c3f9e64a980f8c04.png"},{"host":"blog.jessfraz.com","url":"https://favicons.feedbinusercontent.com/eb8/eb88ec6346d4f52b421c59430d9b6e602607e377.png"},{"host":"githubengineering.com","url":"https://favicons.feedbinusercontent.com/c16/c16669b5a982dda02b07574a1797385d39d8af5a.png"},{"host":"blog.krzyzanowskim.com","url":"https://favicons.feedbinusercontent.com/781/781fc0cd942b3dc8417e0ff2379f91066fdd042c.png"},{"host":"www.figure.ink","url":"https://favicons.feedbinusercontent.com/430/430ea85bd9e1bb1f340327d3e88046f06bc0caa5.png"},{"host":"appventure.me","url":"https://favicons.feedbinusercontent.com/cae/caeffdbbeb0b2015c7232f4d2db5b631237fdcd5.png"},{"host":"blog.benjamin-encz.de","url":"https://favicons.feedbinusercontent.com/768/768c021e615106d368dcfeb16daf01beeff161df.png"},{"host":"pspdfkit.com","url":"https://favicons.feedbinusercontent.com/c38/c383c2f9605a045587160b1e71bfac9d4c0cd7b9.png"},{"host":"www.sixcolors.com","url":"https://favicons.feedbinusercontent.com/9f9/9f95dfac94e40455ac2373db0b58c71d88805c46.png"},{"host":"indieweb.org","url":"https://favicons.feedbinusercontent.com/6b5/6b5fe45f67675549b737cb1a385dc416a3ccba54.png"},{"host":"recoursive.com","url":"https://favicons.feedbinusercontent.com/ce4/ce47e83f7e56f375e1c71c49b3cebd62815da7d4.png"},{"host":"finestructure.co","url":"https://favicons.feedbinusercontent.com/053/0536357c9f3bcdbc8e8aa1bbc510943f53b86f18.png"},{"host":"www.appleworld.today","url":"https://favicons.feedbinusercontent.com/cb3/cb3bdf79fc677895f8c02fa4d57f677c0f16c860.png"},{"host":"a-coding.com","url":"https://favicons.feedbinusercontent.com/41b/41b094eda4ab6dfed852888e2d1ee700c7651287.png"},{"host":"fluffy.es","url":"https://favicons.feedbinusercontent.com/41b/41b094eda4ab6dfed852888e2d1ee700c7651287.png"},{"host":"redqueencoder.com","url":"https://favicons.feedbinusercontent.com/8e1/8e1fc65092d7e84a7bb4776c9974ce50dd53de8d.png"},{"host":"halmueller.wordpress.com","url":"https://favicons.feedbinusercontent.com/058/058f692cebfaca8f8dcae42f4a9f7adb8c63be5b.png"},{"host":"qualitycoding.org","url":"https://favicons.feedbinusercontent.com/59f/59f1aaf4e569ea13d1d1f49b77da178f8ebb8d5d.png"},{"host":"www.objc.io","url":"https://favicons.feedbinusercontent.com/894/89497d28a350d955d0fe01cc5d4c27f3ec853cea.png"},{"host":"rolandleth.com","url":"https://favicons.feedbinusercontent.com/851/851ba2d2bd1d3f058c2b8c2476b5ed14826937e1.png"},{"host":"wptavern.com","url":"https://favicons.feedbinusercontent.com/0fe/0feb1eddb79be6f270de0bb34f02fc1971450911.png"},{"host":"www.ioscreator.com","url":"https://favicons.feedbinusercontent.com/abb/abbe5f24dae7833b596beab1c431f58e1c1c95e0.png"},{"host":"andysylvester.com","url":"https://favicons.feedbinusercontent.com/6a4/6a419190bf673d0ec4909925be91d0d0d5a2f405.png"},{"host":"ruby-on-wheels.github.io","url":"https://favicons.feedbinusercontent.com/812/812096ffa8bbf0ae688737f3b5e85873c8f7b669.png"},{"host":"apontious.com","url":"https://favicons.feedbinusercontent.com/90b/90b6cfff3aaf7f5d9b612c2ff60e653e4b59eba0.png"},{"host":"bendodson.com","url":"https://favicons.feedbinusercontent.com/dbd/dbdb592abb03eb183803550cfa471a0c9d9073ca.png"},{"host":"www.theverge.com","url":"https://favicons.feedbinusercontent.com/5c4/5c4515b3f844281641160a880f16c1f60bd56622.png"},{"host":"www.agirlandhervan.com","url":"https://favicons.feedbinusercontent.com/9b5/9b5171edc19f123338174e28a530af5f51d1870e.png"},{"host":"timekl.com","url":"https://favicons.feedbinusercontent.com/5de/5de3df3b2923ea634410cd58e89c092d57b160cd.png"},{"host":"www.hillelwayne.com","url":"https://favicons.feedbinusercontent.com/846/846e08fde2695996e19fb48e99cfc02bf17383a8.png"},{"host":"holtwick.de","url":"https://favicons.feedbinusercontent.com/01e/01e8872db1e4c3a20392828f76941abe3d3ece56.png"},{"host":"152percent.com","url":"https://favicons.feedbinusercontent.com/e28/e281e814111c6d75b2a1e8c83a027efce8fa8ac2.png"},{"host":"furbo.org","url":"https://favicons.feedbinusercontent.com/654/65480a9e864192bb3b4a9455e8847a3bede9533b.png"},{"host":"arstechnica.com","url":"https://favicons.feedbinusercontent.com/213/213c2dd30b89a5f9d66870c7d5ebcbaa1dba84ce.png"},{"host":"shapeof.com","url":"https://favicons.feedbinusercontent.com/35d/35d1836e735eb0eb6e7b5efb9d2bc83bc34fd5b3.png"},{"host":"scripting.com","url":"https://favicons.feedbinusercontent.com/409/409a1e7a61bf2e2df3607123042c6fb50f683d3e.png"},{"host":"xkcd.com","url":"https://favicons.feedbinusercontent.com/c0e/c0ed7ce58b9292af84743a5908fe6a0c3fa8af73.png"},{"host":"www.omnigroup.com","url":"https://favicons.feedbinusercontent.com/6af/6af24e26991b2d35dfb802665d5938d1d7297fcc.png"},{"host":"bitsplitting.org","url":"https://favicons.feedbinusercontent.com/bf8/bf8092654512ee8f441b43f330eab8d1dd50bf0c.png"},{"host":"www.youtube.com","url":"https://favicons.feedbinusercontent.com/22f/22fede5b3794b820911f31de9971009c7498bcdd.png"},{"host":"www.asymco.com","url":"https://favicons.feedbinusercontent.com/01f/01fd3cd1504735e1fece04dd93b15974125db436.png"},{"host":"samwize.com","url":"https://favicons.feedbinusercontent.com/9f5/9f5754e00161eec90b0db57c8897195c75b947a6.png"},{"host":"daringfireball.net","url":"https://favicons.feedbinusercontent.com/6ac/6acc098f35ed2bcc0915ca89d50a97e5793eda45.png"},{"host":"mjtsai.com","url":"https://favicons.feedbinusercontent.com/dff/dff54c78e835dd8aa026feb0dc0bfc2cdc6cc06a.png"},{"host":"www.dejal.com","url":"https://favicons.feedbinusercontent.com/beb/bebf5fd366cbb729d10a445106ec4fac9524defb.png"},{"host":"maniacdev.com","url":"https://favicons.feedbinusercontent.com/7d4/7d485cf3ec1e6ece935e6aa2330de71f1d98e398.png"},{"host":"inessential.com","url":"https://favicons.feedbinusercontent.com/fba/fba8c6e0a192b3a1bdb3e4537dfe735b9d5f0efc.png"},{"host":"smallbiztrends.com","url":"https://favicons.feedbinusercontent.com/19b/19baca88aa7075a217473c40f6cf170069a5e3df.png"},{"host":"medium.com","url":"https://favicons.feedbinusercontent.com/19f/19fe38872f4b8c8b43900c62e2a787796bf39920.png"},{"host":"spin.atomicobject.com","url":"https://favicons.feedbinusercontent.com/d63/d6361ff10e6bef1e9aa41620b17aafc12a5aec53.png"},{"host":"cdevroe.com","url":"https://favicons.feedbinusercontent.com/9a6/9a6b8e1f0a605a75342445459c40d1721a6c8545.png"},{"host":"benjaminmayo.co.uk","url":"https://favicons.feedbinusercontent.com/21f/21f1b0c0e0741db7adb3de88de96d9a707cdfdf9.png"},{"host":"robnapier.net","url":"https://favicons.feedbinusercontent.com/c50/c50ccca8ef4322e582a49566efc31db098e8e99d.png"},{"host":"ijoshsmith.com","url":"https://favicons.feedbinusercontent.com/9f2/9f2605e4e735d53e633f1fa1968842d4bc7b803a.png"},{"host":"chris.eidhof.nl","url":"https://favicons.feedbinusercontent.com/ebe/ebeb7818855f33bc6ec308905df77d9f37294e68.png"},{"host":"aaron.vegh.ca","url":"https://favicons.feedbinusercontent.com/599/59953d1e84a0d3816e3011fde3abb88c63a24821.png"},{"host":"blog.metaobject.com","url":"https://favicons.feedbinusercontent.com/c14/c1481a2e397e239395f319f687d35d51c92db6b0.png"},{"host":"benscheirman.com","url":"https://favicons.feedbinusercontent.com/41b/41b094eda4ab6dfed852888e2d1ee700c7651287.png"},{"host":"www.amusingplanet.com","url":"https://favicons.feedbinusercontent.com/6c9/6c9d5f2f46020f92851ff739d9f5e01a7f626563.png"},{"host":"shashikantjagtap.net","url":"https://favicons.feedbinusercontent.com/e6e/e6ec943bb9c07472e5dade43ee27328e1ef52d07.png"},{"host":"blog.alltheflow.com","url":"https://favicons.feedbinusercontent.com/ece/ecef6b3094f6519318aaa2765af9348549dbb832.png"},{"host":"soffes.blog","url":"https://favicons.feedbinusercontent.com/701/7010ae7e5d1ba537b526aea32ea0e6d4c0c5e86e.png"},{"host":"conradstoll.com","url":"https://favicons.feedbinusercontent.com/f43/f438f1b89bc8c468551a0357ffcc86603c5796ea.png"},{"host":"kayathomas.info","url":"https://favicons.feedbinusercontent.com/058/058f692cebfaca8f8dcae42f4a9f7adb8c63be5b.png"},{"host":"desiatov.com","url":"https://favicons.feedbinusercontent.com/40b/40bdf294e79ed6033e2a7f258c5dcaddd14f0bfe.png"},{"host":"nnw.ranchero.com","url":"https://favicons.feedbinusercontent.com/417/4175d8e69c2c7c67026ef1afa5015f20ad6d8d44.png"},{"host":"ashishkakkad.com","url":"https://favicons.feedbinusercontent.com/a2f/a2f53f87a350b54c2ab9d3a284dbdd3c062b715e.png"},{"host":"elegantchaos.com","url":"https://favicons.feedbinusercontent.com/d41/d410ee8ff30e2e29948ac6eda4778195fe12cfad.png"},{"host":"www.iosdev.recipes","url":"https://favicons.feedbinusercontent.com/6c8/6c8c8c3d3788130787381226959b102fdb615389.png"},{"host":"pfandrade.me","url":"https://favicons.feedbinusercontent.com/b8e/b8eb8318d23653c92527aed625f1d007492bb4f5.png"},{"host":"rambo.codes","url":"https://favicons.feedbinusercontent.com/a67/a67c72191bc7fbd6f4563586cec09596d4e8d5ce.png"},{"host":"www.danablankenhorn.com","url":"https://favicons.feedbinusercontent.com/5bd/5bdf1269411196af59c888d6cdb909fcb4bf3814.png"},{"host":"www.codinghorror.com","url":"https://favicons.feedbinusercontent.com/3cf/3cffc4b347c3587f19fe222caaac69f63b9a5e73.png"},{"host":"vandogtraveller.com","url":"https://favicons.feedbinusercontent.com/a54/a54084a5ad77ea64175991f87b66fe17ed10cd16.png"},{"host":"blog.instapaper.com","url":"https://favicons.feedbinusercontent.com/10b/10ba3904c25fc54d861e209011d4d3230e51f50b.png"},{"host":"www.swiftbysundell.com","url":"https://favicons.feedbinusercontent.com/75c/75c3da1d0d1341fe3ddd8c548f3b36c37c4211ef.png"},{"host":"brehaut.net","url":"https://favicons.feedbinusercontent.com/021/021dbc369da15d868e8693bc17cfc9225916d9aa.png"},{"host":"blog.kulman.sk","url":"https://favicons.feedbinusercontent.com/07d/07db6aa1a036677f111b3f504e0597b5f01a4b96.png"},{"host":"davidbarnard.com","url":"https://favicons.feedbinusercontent.com/568/5686027019109882f9a25e1353d428b2ce9a1fd8.png"},{"host":"www.colejoplin.com","url":"https://favicons.feedbinusercontent.com/39c/39c5523f02f3f3f164f2ccb2b42daf225644129b.png"},{"host":"weretherussos.com","url":"https://favicons.feedbinusercontent.com/ca3/ca34bdb0e72a91ca70fde298dc2a522a2d8750cf.png"},{"host":"www.onechicktravels.com","url":"https://favicons.feedbinusercontent.com/bee/bee45e59ce317cbc05f29c2f452ee2e42126fc14.png"},{"host":"www.editorscut.com","url":"https://favicons.feedbinusercontent.com/4c4/4c4241668a1949ea9f328e892e73c2b9472f5b86.png"},{"host":"vanvaya.com","url":"https://favicons.feedbinusercontent.com/511/511edeefee341f8b6f257a90cfe69617a85d2f07.png"},{"host":"campervanlife.eu","url":"https://favicons.feedbinusercontent.com/9ec/9ecacb8ead9d523a1b0c5c7fd3e9940ce1d5da2d.png"},{"host":"vincode.io","url":"https://favicons.feedbinusercontent.com/eb5/eb5e4c3b8f65c4c3fa8ec98cd0b03f4e35666b3f.png"},{"host":"beaniesandbikinisblog.com","url":"https://favicons.feedbinusercontent.com/8e4/8e45d4a5a58c008099d2c5b12512dab84136549d.png"},{"host":"agostini.tech","url":"https://favicons.feedbinusercontent.com/f36/f36105c511f0beaf14f670f5f7757b44fcbcaf83.png"},{"host":"om.co","url":"https://favicons.feedbinusercontent.com/3fc/3fce84be79756251d8f3455a3d139c5e3eae6a6c.png"},{"host":"xcoders.org","url":"https://favicons.feedbinusercontent.com/678/678b8cb344a74a6549c3cbc40e8360307cdc27a8.png"},{"host":"blog.waveapps.com","url":"https://favicons.feedbinusercontent.com/7a0/7a00aa775983c2859177d24a41bec0d02d8112fc.png"},{"host":"sme-blog.com","url":"https://favicons.feedbinusercontent.com/c42/c424804a8316a8b006f2cf4e135816cacc9ec7dc.png"},{"host":"swiftrocks.com","url":"https://favicons.feedbinusercontent.com/341/34156bad239e9be362bf323444d90813a0206256.png"},{"host":"codea.io","url":"https://favicons.feedbinusercontent.com/ec8/ec85766ec37fc88f64f882c3d62375aac811d139.png"},{"host":"www.manton.org","url":"https://favicons.feedbinusercontent.com/9dd/9dd287b31b4106c35f8ccc738402c742431d37d3.png"},{"host":"ilya.puchka.me","url":"https://favicons.feedbinusercontent.com/33e/33e7296ca33cd56330c4e12768b0bcfceab204c1.png"},{"host":"benjaminscholtysik.com","url":"https://favicons.feedbinusercontent.com/a6f/a6fb447108a047ebfbd7037388ae84130a132d4b.png"},{"host":"geek-is-stupid.github.io","url":"https://favicons.feedbinusercontent.com/492/49215454864fc0dde34cbc5b316fa32f6da27abf.png"},{"host":"jonathant.com","url":"https://favicons.feedbinusercontent.com/586/586943be9f21425044ae00dc742814612b0e39ab.png"},{"host":"www.highcaffeinecontent.com","url":"https://favicons.feedbinusercontent.com/cc2/cc2a945c07eebb6fe99ef1258bedb46e2a612676.png"},{"host":"theswiftpost.co","url":"https://favicons.feedbinusercontent.com/894/89451561ac852776a8e25694eeb3a9223f02542f.png"},{"host":"martinmitrevski.com","url":"https://favicons.feedbinusercontent.com/cea/cea45cbd5a17997fd177ed0cd1c530b2c42d8af5.png"},{"host":"mikemikina.com","url":"https://favicons.feedbinusercontent.com/807/8070e8ede1e9e564de6f003402d8be579b350ac2.png"},{"host":"pedrommcarrasco.github.io","url":"https://favicons.feedbinusercontent.com/523/523b68e3d0de24c6d485beea8ef338c749d396ed.png"},{"host":"apoorvatyagi.com","url":"https://favicons.feedbinusercontent.com/604/604d1ee179ed89ed8ac5d7169d59c03dd58307a6.png"},{"host":"extras.waynewbishop.com","url":"https://favicons.feedbinusercontent.com/abb/abbe5f24dae7833b596beab1c431f58e1c1c95e0.png"},{"host":"dmtopolog.com","url":"https://favicons.feedbinusercontent.com/8fa/8fad257eb78cc8c1cdf8c739d07fcd58dd1d981d.png"},{"host":"mokacoding.com","url":"https://favicons.feedbinusercontent.com/dfc/dfc53bd0cb27e02603c1691ab4f58c1bb203809a.png"},{"host":"ioscoachfrank.com","url":"https://favicons.feedbinusercontent.com/8b9/8b971dc19a869a2f98cc416cbec8f0670e683194.png"},{"host":"www.swiftindepth.com","url":"https://favicons.feedbinusercontent.com/267/267510e0407b7fdaf1ba1176687b9f2a667bec6c.png"},{"host":"www.natethompson.io","url":"https://favicons.feedbinusercontent.com/18e/18e03d098a2c158ec6a26a44df8a11d6ee4b346f.png"},{"host":"feedbin.com","url":"https://favicons.feedbinusercontent.com/276/2766ca8d872ab2557860ceba646e83417f45cf4b.png"},{"host":"localhost","url":"https://favicons.feedbinusercontent.com/276/2766ca8d872ab2557860ceba646e83417f45cf4b.png"},{"host":"www.bignerdranch.com","url":"https://favicons.feedbinusercontent.com/66a/66a95c74a441c8b95b8b4d0a62fd6552ebcb1ec1.png"},{"host":"www.jessesquires.com","url":"https://favicons.feedbinusercontent.com/ce3/ce390d46d10648950ea08535c73815576042b28a.png"},{"host":"www.avanderlee.com","url":"https://favicons.feedbinusercontent.com/57a/57ad05ee7a3923dd78c0f443af1a9c62be29fc31.png"},{"host":"ppinera.es","url":"https://favicons.feedbinusercontent.com/840/8409386f6afa675c693c9a9c10907f232f6b58ba.png"},{"host":"cocoawithlove.com","url":"https://favicons.feedbinusercontent.com/c0a/c0a7bace5dc521af56d0049b1c50e315b143ada5.png"},{"host":"weblog.rogueamoeba.com","url":"https://favicons.feedbinusercontent.com/e62/e6290a175f6ff1d95ac4a94062d9a5f047077c4a.png"},{"host":"www.nomadswithavan.com","url":"https://favicons.feedbinusercontent.com/a95/a95a957efb2380f061755888ee7a3abe6ffeb0ef.png"},{"host":"beesbuzz.biz","url":"https://favicons.feedbinusercontent.com/3c8/3c8ef44b63c30e78c4a3a120005e56f94898f90d.png"},{"host":"theswiftdev.com","url":"https://favicons.feedbinusercontent.com/438/438d25ae944eafe7dfc6c9b507210dfc8f3d465b.png"},{"host":"kottke.org","url":"https://favicons.feedbinusercontent.com/210/2102980d236c8aae8f1962858ca14873be6623f9.png"},{"host":"aplus.rs","url":"https://favicons.feedbinusercontent.com/1c2/1c2b9b936f978d570917074a95f2338eb87dcb90.png"},{"host":"mrandmrsadventure.com","url":"https://favicons.feedbinusercontent.com/bda/bda71b164944e049b29fc367409dd629b30a2d7c.png"},{"host":"www.alexcurylo.com","url":"https://favicons.feedbinusercontent.com/d49/d49ebb2b42e47513179805e1ba1c8766a78b85f7.png"},{"host":"authenticavl.com","url":"https://favicons.feedbinusercontent.com/669/66997e107aba7a27fa37c8a9216b7a605edbf3b3.png"},{"host":"gnomadhome.com","url":"https://favicons.feedbinusercontent.com/7fc/7fc8f48b1f22c594f79db2a5226d95a604d009b5.png"},{"host":"blog.jaredsinclair.com","url":"https://favicons.feedbinusercontent.com/871/87131f77ec87a264e7d97b83c362176fcb5e8da4.png"},{"host":"bearfoottheory.com","url":"https://favicons.feedbinusercontent.com/662/662d0f4ae750f2c37829fe09461b86ef962d8f81.png"},{"host":"useyourloaf.com","url":"https://favicons.feedbinusercontent.com/ad3/ad35912ed6c38d7b75a8eb2a976ca564b6f32e5a.png"},{"host":"www.escapecampervans.com","url":"https://favicons.feedbinusercontent.com/b17/b1705bf9a05de49b46426c326ee7f555b62c4992.png"},{"host":"www.dusantadic.dev","url":"https://favicons.feedbinusercontent.com/833/833d1ebcb88066f6fdef02e1086adb10f2ddfbb4.png"},{"host":"denzhadanov.com","url":"https://favicons.feedbinusercontent.com/19f/19fe38872f4b8c8b43900c62e2a787796bf39920.png"},{"host":"www.freshbooks.com","url":"https://favicons.feedbinusercontent.com/967/9672eaa782aeabdae8536bab95de58ccf72dfe93.png"},{"host":"brianschrader.com","url":"https://favicons.feedbinusercontent.com/659/659ab4690b1e0941fecc880c2ffacb58d25ee5dd.png"},{"host":"beautifulpixels.com","url":"https://favicons.feedbinusercontent.com/ea0/ea010c658d6e356e49ab239b793dc415af707b05.png"},{"host":"www.hackingwithswift.com","url":"https://favicons.feedbinusercontent.com/e50/e5066d1c60cc0f5e6f051ca1f548bc2f4a3d97c5.png"},{"host":"stratechery.com","url":"https://favicons.feedbinusercontent.com/17b/17b79b4175c49a83a1af537b396979d151aaf9ba.png"},{"host":"www.macrumors.com","url":"https://favicons.feedbinusercontent.com/1f9/1f90b650fd73eda3fd922c1f3e3f1eb8bd05692f.png"},{"host":"nshipster.com","url":"https://favicons.feedbinusercontent.com/6dd/6dded986c778961ad69844e4f8c544c06bbbb416.png"}] \ No newline at end of file diff --git a/Frameworks/Account/AccountTests/JSON/subscriptions_add.json b/Frameworks/Account/AccountTests/JSON/subscriptions_add.json new file mode 100644 index 000000000..e40c2993b --- /dev/null +++ b/Frameworks/Account/AccountTests/JSON/subscriptions_add.json @@ -0,0 +1 @@ +[{"id":4844298,"created_at":"2019-05-05T14:47:19.178100Z","feed_id":1486863,"title":"iOS Dev Recipes","feed_url":"https://www.iosdev.recipes/rss.xml","site_url":"https://www.iosdev.recipes"},{"id":4844297,"created_at":"2019-05-05T14:47:15.793641Z","feed_id":15452,"title":"Atomic Spin","feed_url":"http://feeds.feedblitz.com/atomicspin","site_url":"https://spin.atomicobject.com"},{"id":4844296,"created_at":"2019-05-05T14:47:15.671645Z","feed_id":1578301,"title":"Swift – Simon's Sanitarium","feed_url":"http://simonfairbairn.com/tag/swift/feed/","site_url":"http://simonfairbairn.com"},{"id":4844295,"created_at":"2019-05-05T14:47:15.216340Z","feed_id":1364385,"title":"a-coding","feed_url":"https://a-coding.com/rss/","site_url":"https://a-coding.com/"},{"id":4844294,"created_at":"2019-05-05T14:47:14.461697Z","feed_id":1597435,"title":"Swift Dev Journal","feed_url":"https://www.swiftdevjournal.com/feed/","site_url":"https://www.swiftdevjournal.com"},{"id":4844293,"created_at":"2019-05-05T14:47:14.352425Z","feed_id":98472,"title":"Amusing Planet","feed_url":"http://feeds.feedburner.com/amusingplanet","site_url":"http://www.amusingplanet.com/"},{"id":4844292,"created_at":"2019-05-05T14:47:13.980121Z","feed_id":1486842,"title":"iOS Coach Frank","feed_url":"http://ioscoachfrank.com/feed/atom.xml","site_url":"https://ioscoachfrank.com/"},{"id":4844291,"created_at":"2019-05-05T14:47:13.731919Z","feed_id":1605375,"title":"BiteofanApple by Brian Schrader","feed_url":"https://brianschrader.com/feed.json","site_url":"https://brianschrader.com"},{"id":4844290,"created_at":"2019-05-05T14:47:12.083703Z","feed_id":1388169,"title":"Warp your mobile development - Articles","feed_url":"https://twittemb.github.io/feed.xml","site_url":"http://blog.warpfactor.io"},{"id":4844289,"created_at":"2019-05-05T14:47:11.550664Z","feed_id":1424879,"title":"one fifty two","feed_url":"https://152percent.com/blog?format=rss","site_url":"https://152percent.com/"},{"id":4844288,"created_at":"2019-05-05T14:47:11.345489Z","feed_id":1176579,"title":"Cocoa with Love on Cocoa with Love","feed_url":"http://www.cocoawithlove.com/feed.xml?alt=rss","site_url":"https://www.cocoawithlove.com/"},{"id":4844287,"created_at":"2019-05-05T14:47:10.776956Z","feed_id":1605374,"title":"Vanlife – Vincode","feed_url":"https://vincode.io/blog/category/vanlife/feed/","site_url":"https://vincode.io"},{"id":4844286,"created_at":"2019-05-05T14:47:10.485640Z","feed_id":547888,"title":"objc.io","feed_url":"http://www.objc.io/feed.xml","site_url":"http://www.objc.io"},{"id":4844285,"created_at":"2019-05-05T14:47:10.460625Z","feed_id":1528640,"title":"Bravely Go","feed_url":"https://blog.waveapps.com/feed/","site_url":"https://blog.waveapps.com"},{"id":4844284,"created_at":"2019-05-05T14:47:10.234446Z","feed_id":1211804,"title":"This Week in the IndieWeb","feed_url":"https://indieweb.org/this-week/feed.xml","site_url":"https://indieweb.org/this-week"},{"id":4844283,"created_at":"2019-05-05T14:47:10.216704Z","feed_id":1528652,"title":"FreshBooks","feed_url":"https://www.freshbooks.com/feed","site_url":"https://www.freshbooks.com"},{"id":4844282,"created_at":"2019-05-05T14:47:10.173434Z","feed_id":1486846,"title":"De Programmatica Ipsum","feed_url":"https://deprogrammaticaipsum.com/feed/","site_url":"https://deprogrammaticaipsum.com"},{"id":4844281,"created_at":"2019-05-05T14:47:10.127761Z","feed_id":1340283,"title":"Eternal Storms Software Blog","feed_url":"https://blog.eternalstorms.at/feed/","site_url":"https://blog.eternalstorms.at"},{"id":4844280,"created_at":"2019-05-05T14:47:10.079950Z","feed_id":1221017,"title":"Apple World Today","feed_url":"https://www.appleworld.today/blog?format=RSS","site_url":"https://www.appleworld.today/"},{"id":4844279,"created_at":"2019-05-05T14:47:09.919597Z","feed_id":1176732,"title":"Upvoted","feed_url":"https://redditblog.com/feed/","site_url":"https://redditblog.com"},{"id":4844278,"created_at":"2019-05-05T14:47:09.912041Z","feed_id":143536,"title":"The Omni Group","feed_url":"https://www.omnigroup.com/blog/rss/","site_url":"https://www.omnigroup.com/"},{"id":4844277,"created_at":"2019-05-05T14:47:09.903081Z","feed_id":1241233,"title":"Engineering – The GitHub Blog","feed_url":"https://githubengineering.com/atom.xml","site_url":"https://github.blog"},{"id":4844276,"created_at":"2019-05-05T14:47:09.901124Z","feed_id":1062583,"title":"Feedbin","feed_url":"https://feedbin.com/blog/atom.xml","site_url":"https://feedbin.com"},{"id":4844275,"created_at":"2019-05-05T14:47:09.880170Z","feed_id":1605285,"title":"Instapaper","feed_url":"https://blog.instapaper.com/rss","site_url":"https://blog.instapaper.com/"},{"id":4844274,"created_at":"2019-05-05T14:47:09.843600Z","feed_id":387024,"title":"Under the Microscope","feed_url":"http://rogueamoeba.com/utm/feed/","site_url":"https://weblog.rogueamoeba.com"},{"id":4844273,"created_at":"2019-05-05T14:47:09.796116Z","feed_id":1528975,"title":"Xcoders","feed_url":"https://xcoders.org/feed.xml","site_url":"https://xcoders.org/"},{"id":4844272,"created_at":"2019-05-05T14:47:09.793206Z","feed_id":1229997,"title":"Big Nerd Ranch","feed_url":"https://www.bignerdranch.com/feed.xml","site_url":"https://www.bignerdranch.com/"},{"id":4844271,"created_at":"2019-05-05T14:47:09.551647Z","feed_id":1488022,"title":"NetNewsWire","feed_url":"https://nnw.ranchero.com/feed.json","site_url":"https://nnw.ranchero.com/"},{"id":4844270,"created_at":"2019-05-05T14:47:09.452217Z","feed_id":1067438,"title":"Inside PSPDFKit","feed_url":"https://pspdfkit.com/blog/feed.atom","site_url":"https://pspdfkit.com/blog"},{"id":4844269,"created_at":"2019-05-05T14:47:09.435856Z","feed_id":1538463,"title":"Codea \u0026 Shade","feed_url":"https://codea.io/blog/feed/","site_url":"https://codea.io/blog"},{"id":4844268,"created_at":"2019-05-05T14:47:09.424075Z","feed_id":1528649,"title":"Small Business Accounting Blog","feed_url":"http://business-accounting-guides.com/business-accounting.xml","site_url":"http://www.business-accounting-guides.com/business-accounting-blog.html"},{"id":4844267,"created_at":"2019-05-05T14:47:09.409498Z","feed_id":1528643,"title":"THE SMALL BUSINESS BLOG","feed_url":"http://sme-blog.com/feed/","site_url":"http://sme-blog.com"},{"id":4844266,"created_at":"2019-05-05T14:47:09.323233Z","feed_id":1320545,"title":"Small Business Trends","feed_url":"https://feeds.feedburner.com/SmallBusinessTrends","site_url":"https://smallbiztrends.com"},{"id":4844265,"created_at":"2019-05-05T14:47:09.307701Z","feed_id":1913,"title":"Ars Technica","feed_url":"http://feeds.arstechnica.com/arstechnica/index","site_url":"https://arstechnica.com"},{"id":4844264,"created_at":"2019-05-05T14:47:09.299012Z","feed_id":1528650,"title":"B\u0026J Bookkeeping and Taxes","feed_url":"http://houstonbookkeeper.net/feed/","site_url":"https://houstonbookkeeper.net"},{"id":4844263,"created_at":"2019-05-05T14:47:09.278149Z","feed_id":1113164,"title":"Six Colors","feed_url":"https://feedpress.me/sixcolors","site_url":"https://www.sixcolors.com/"},{"id":4844262,"created_at":"2019-05-05T14:47:09.272805Z","feed_id":1463575,"title":"Two-Bit History","feed_url":"https://twobithistory.org/feed.xml","site_url":"https://twobithistory.org/"},{"id":4844261,"created_at":"2019-05-05T14:47:09.268484Z","feed_id":105,"title":"kottke.org","feed_url":"http://feeds.kottke.org/main","site_url":"http://kottke.org/"},{"id":4844260,"created_at":"2019-05-05T14:47:09.220987Z","feed_id":747836,"title":"Andy Sylvester's Web","feed_url":"http://andysylvester.com/feed/","site_url":"http://andysylvester.com"},{"id":4844259,"created_at":"2019-05-05T14:47:09.205819Z","feed_id":1713,"title":"The Verge - All Posts","feed_url":"http://www.theverge.com/rss/full.xml","site_url":"https://www.theverge.com/"},{"id":4844258,"created_at":"2019-05-05T14:47:09.163967Z","feed_id":1051845,"title":"All The Flow","feed_url":"https://blog.alltheflow.com/rss/","site_url":"http://blog.alltheflow.com/"},{"id":4844257,"created_at":"2019-05-05T14:47:09.160509Z","feed_id":1735,"title":"MacRumors: Mac News and Rumors - All Stories","feed_url":"http://feeds.macrumors.com/MacRumors-All","site_url":"https://www.macrumors.com"},{"id":4844256,"created_at":"2019-05-05T14:47:09.115894Z","feed_id":1030946,"title":"Crunchy Development","feed_url":"http://alisoftware.github.io/feed.xml","site_url":"http://alisoftware.github.io/"},{"id":4844255,"created_at":"2019-05-05T14:47:09.074824Z","feed_id":1211114,"title":"Changelog","feed_url":"https://changelog.com/feed","site_url":"https://changelog.com/"},{"id":4844254,"created_at":"2019-05-05T14:47:08.940434Z","feed_id":1388089,"title":"Simon Wolf's Writings","feed_url":"http://www.swwritings.com/feed.xml","site_url":"https://www.swwritings.com"},{"id":4844253,"created_at":"2019-05-05T14:47:08.914802Z","feed_id":1472912,"title":"Patrick Balestra","feed_url":"https://patrickbalestra.com/feed.xml","site_url":"https://balestrapatrick.github.io/"},{"id":4844252,"created_at":"2019-05-05T14:47:08.885221Z","feed_id":1099459,"title":"denzhadanov - Medium","feed_url":"https://denzhadanov.com/feed/","site_url":"https://denzhadanov.com?source=rss----5255a3782276---4"},{"id":4844251,"created_at":"2019-05-05T14:47:08.838988Z","feed_id":169025,"title":"xkcd.com","feed_url":"https://xkcd.com/rss.xml","site_url":"https://xkcd.com/"},{"id":4844250,"created_at":"2019-05-05T14:47:08.817486Z","feed_id":1578297,"title":"Stories by Zanella Gaétan on Medium","feed_url":"https://medium.com/feed/@gaetan.zanella","site_url":"https://medium.com/@gaetan.zanella?source=rss-a2f0ed98a4b6------2"},{"id":4844249,"created_at":"2019-05-05T14:47:08.791736Z","feed_id":1424888,"title":"Igor Kulman on Coding Journal","feed_url":"https://blog.kulman.sk/index.xml","site_url":"https://blog.kulman.sk/"},{"id":4844248,"created_at":"2019-05-05T14:47:08.782644Z","feed_id":1177901,"title":"Aaron Vegh","feed_url":"http://aaron.vegh.ca/rss/","site_url":"http://aaron.vegh.ca/"},{"id":4844247,"created_at":"2019-05-05T14:47:08.762218Z","feed_id":1486813,"title":"Race Condition","feed_url":"http://racecondition.software/feed.xml","site_url":"http://www.racecondition.software"},{"id":4844246,"created_at":"2019-05-05T14:47:08.755161Z","feed_id":1014335,"title":"Jonathan Tarud","feed_url":"http://feed.jonathant.com/","site_url":"https://www.jonathant.com"},{"id":4844245,"created_at":"2019-05-05T14:47:08.747671Z","feed_id":1436884,"title":"Dave DeLong","feed_url":"https://davedelong.com/feed.xml","site_url":"https://davedelong.com/"},{"id":4844244,"created_at":"2019-05-05T14:47:08.739362Z","feed_id":1468269,"title":"@samwize","feed_url":"https://samwize.com/feed.xml","site_url":"https://samwize.com/"},{"id":4844243,"created_at":"2019-05-05T14:47:08.724609Z","feed_id":1505016,"title":"Device Blogs - Medium","feed_url":"https://medium.com/feed/device-blogs","site_url":"https://medium.com/device-blogs?source=rss----75b2e3c15714---4"},{"id":4844242,"created_at":"2019-05-05T14:47:08.702528Z","feed_id":1578290,"title":"Stories by Jimmy M Andersson on Medium","feed_url":"https://medium.com/feed/@JimmyMAndersson","site_url":"https://medium.com/@JimmyMAndersson?source=rss-163113c6fbf8------2"},{"id":4844241,"created_at":"2019-05-05T14:47:08.699891Z","feed_id":1545252,"title":"Benjamin Scholtysik","feed_url":"https://benjaminscholtysik.com/feed/","site_url":"https://benjaminscholtysik.com"},{"id":4844240,"created_at":"2019-05-05T14:47:08.688868Z","feed_id":1453910,"title":"Bitsplitting.org","feed_url":"https://bitsplitting.org/feed/json/","site_url":"https://bitsplitting.org"},{"id":4844239,"created_at":"2019-05-05T14:47:08.667608Z","feed_id":1127707,"title":"[Thinking inside a large box];","feed_url":"http://blog.benjamin-encz.de/index.xml","site_url":"http://blog.benjamin-encz.de/"},{"id":4844238,"created_at":"2019-05-05T14:47:08.664948Z","feed_id":1064554,"title":"Becky Hansmeyer","feed_url":"http://beckyhansmeyer.com/feed/","site_url":"https://beckyhansmeyer.com"},{"id":4844237,"created_at":"2019-05-05T14:47:08.664865Z","feed_id":1094799,"title":"Swift Unboxed","feed_url":"https://swiftunboxed.com/feed.xml","site_url":"https://swiftunboxed.com/"},{"id":4844236,"created_at":"2019-05-05T14:47:08.660910Z","feed_id":1525481,"title":"This is Kyle","feed_url":"http://thisiskyle.me/feed.xml","site_url":"http://thisiskyle.me/"},{"id":4844235,"created_at":"2019-05-05T14:47:08.639963Z","feed_id":1486854,"title":"Fluffy 📱","feed_url":"https://fluffy.es/rss/","site_url":"https://fluffy.es/"},{"id":4844234,"created_at":"2019-05-05T14:47:08.638340Z","feed_id":1559907,"title":"Hi, I’m Sam","feed_url":"https://soffes.blog/rss.xml","site_url":"https://soffes.blog"},{"id":4844233,"created_at":"2019-05-05T14:47:08.634252Z","feed_id":1486812,"title":"Ashish Kakkad","feed_url":"http://ashishkakkad.com/feed/","site_url":"http://ashishkakkad.com"},{"id":4844232,"created_at":"2019-05-05T14:47:08.628806Z","feed_id":1565908,"title":"Alejandro Martinez","feed_url":"https://alejandromp.com/blog/feed.xml","site_url":"http://alejandromp.com"},{"id":4844231,"created_at":"2019-05-05T14:47:08.612577Z","feed_id":1516541,"title":"@topolog's tech blog","feed_url":"https://dmtopolog.com/feed/","site_url":"https://dmtopolog.com"},{"id":4844230,"created_at":"2019-05-05T14:47:08.602442Z","feed_id":780733,"title":"Structure and Interpretation of Computer Programmers","feed_url":"http://www.sicpers.info/feed/","site_url":"https://www.sicpers.info"},{"id":4844229,"created_at":"2019-05-05T14:47:08.561072Z","feed_id":1177914,"title":"Making App Pie","feed_url":"https://makeapppie.com/feed/","site_url":"https://makeapppie.com"},{"id":4844228,"created_at":"2019-05-05T14:47:08.560545Z","feed_id":230857,"title":"XCBLOG","feed_url":"http://shashikantjagtap.net/feed/","site_url":"https://shashikantjagtap.net"},{"id":4844227,"created_at":"2019-05-05T14:47:08.536794Z","feed_id":1556686,"title":"Samantha John","feed_url":"https://samanthajohn.com/feed.xml","site_url":"/"},{"id":4844226,"created_at":"2019-05-05T14:47:08.532285Z","feed_id":1559420,"title":"geek-is-stupid","feed_url":"https://geek-is-stupid.github.io/feed.xml","site_url":"https://geek-is-stupid.github.io"},{"id":4844225,"created_at":"2019-05-05T14:47:08.515360Z","feed_id":37,"title":"Coding Horror","feed_url":"http://feeds.feedburner.com/codinghorror/","site_url":"https://blog.codinghorror.com/"},{"id":4844224,"created_at":"2019-05-05T14:47:08.513655Z","feed_id":1597437,"title":"Luke Smith – iOS and Swift","feed_url":"http://www.lukecsmith.co.uk/feed/","site_url":"https://www.lukecsmith.co.uk"},{"id":4844223,"created_at":"2019-05-05T14:47:08.483151Z","feed_id":1344882,"title":"Jesse Squires","feed_url":"https://www.jessesquires.com/feed.xml","site_url":"https://www.jessesquires.com"},{"id":4844222,"created_at":"2019-05-05T14:47:08.463074Z","feed_id":60926,"title":"Quality Coding","feed_url":"http://feeds.feedburner.com/qualitycoding","site_url":"https://qualitycoding.org"},{"id":4844221,"created_at":"2019-05-05T14:47:08.457008Z","feed_id":1388165,"title":"Fresh Swift","feed_url":"http://freshswift.net/index.xml","site_url":"http://freshswift.net/"},{"id":4844220,"created_at":"2019-05-05T14:47:08.452198Z","feed_id":1553728,"title":"Swift in Depth","feed_url":"https://swiftindepth.com/feed.xml","site_url":"https://www.swiftindepth.com"},{"id":4844219,"created_at":"2019-05-05T14:47:08.443613Z","feed_id":1418311,"title":"Hal Mueller's Blog","feed_url":"https://halmueller.wordpress.com/feed/","site_url":"https://halmueller.wordpress.com"},{"id":4844218,"created_at":"2019-05-05T14:47:08.443605Z","feed_id":1578271,"title":"Dušan Tadić","feed_url":"https://www.dusantadic.dev/index.xml","site_url":"https://www.dusantadic.dev/"},{"id":4844217,"created_at":"2019-05-05T14:47:08.411672Z","feed_id":1221779,"title":"Accidentally in Code","feed_url":"https://cate.blog/feed/","site_url":"https://cate.blog"},{"id":4844216,"created_at":"2019-05-05T14:47:08.404321Z","feed_id":1463706,"title":"NSHipster","feed_url":"https://nshipster.com/feed.xml","site_url":"https://nshipster.com/"},{"id":4844215,"created_at":"2019-05-05T14:47:08.388329Z","feed_id":1578299,"title":"Mike Mikina","feed_url":"https://mikemikina.com/feed.xml","site_url":"https://mikemikina.com/"},{"id":4844214,"created_at":"2019-05-05T14:47:08.357576Z","feed_id":1078919,"title":"Natasha The Robot","feed_url":"https://www.natashatherobot.com/feed/","site_url":"https://www.natashatherobot.com"},{"id":4844213,"created_at":"2019-05-05T14:47:08.326167Z","feed_id":1596199,"title":"don’t panic","feed_url":"https://www.timekl.com/atom.xml","site_url":"https://timekl.com/"},{"id":4844212,"created_at":"2019-05-05T14:47:08.287891Z","feed_id":1486828,"title":"Swift Post","feed_url":"https://theswiftpost.co/feed/","site_url":"https://theswiftpost.co"},{"id":4844211,"created_at":"2019-05-05T14:47:08.238928Z","feed_id":874888,"title":"The Red Queen Coder","feed_url":"http://redqueencoder.com/feed/","site_url":"http://redqueencoder.com"},{"id":4844210,"created_at":"2019-05-05T14:47:08.214067Z","feed_id":1578282,"title":"Stories by Fady Derias on Medium","feed_url":"https://medium.com/feed/@fadiderias","site_url":"https://medium.com/@fadiderias?source=rss-da92204bda7b------2"},{"id":4844209,"created_at":"2019-05-05T14:47:08.180467Z","feed_id":961696,"title":"Figure","feed_url":"http://www.figure.ink/blog?format=RSS","site_url":"http://www.figure.ink/"},{"id":4844208,"created_at":"2019-05-05T14:47:08.177752Z","feed_id":1377938,"title":"Dirk Holtwick","feed_url":"https://holtwick.de/atom.xml","site_url":"https://holtwick.de/"},{"id":4844207,"created_at":"2019-05-05T14:47:08.141394Z","feed_id":1449461,"title":"SwiftRocks","feed_url":"https://swiftrocks.com/rss.xml","site_url":"https://swiftrocks.com"},{"id":4844206,"created_at":"2019-05-05T14:47:08.137608Z","feed_id":1424885,"title":"Under The Bridge","feed_url":"https://www.alexcurylo.com/feed/","site_url":"https://www.alexcurylo.com"},{"id":4844205,"created_at":"2019-05-05T14:47:08.123407Z","feed_id":989928,"title":"Ramblings from Jessie","feed_url":"https://blog.jessfraz.com/index.xml","site_url":"https://blog.jessfraz.com/index.xml"},{"id":4844204,"created_at":"2019-05-05T14:47:08.115960Z","feed_id":1389178,"title":"Khawer Khaliq","feed_url":"https://khawerkhaliq.com/feed/","site_url":"https://khawerkhaliq.com"},{"id":4844203,"created_at":"2019-05-05T14:47:08.111950Z","feed_id":1481847,"title":"Kaya Thomas","feed_url":"https://kayathomas.info/feed/","site_url":"https://kayathomas.info"},{"id":4844202,"created_at":"2019-05-05T14:47:08.111002Z","feed_id":1150642,"title":"The.Swift.Dev.","feed_url":"https://theswiftdev.com/rss/","site_url":"https://theswiftdev.com/"},{"id":4844201,"created_at":"2019-05-05T14:47:08.092606Z","feed_id":1578279,"title":"Stories by Marcin Jackowski on Medium","feed_url":"https://medium.com/feed/@marcinjackowski","site_url":"https://medium.com/@marcinjackowski?source=rss-6c77af54b675------2"},{"id":4844200,"created_at":"2019-05-05T14:47:08.092099Z","feed_id":1487018,"title":"Paulo's Blog | Programming, technology, running a business and everything else","feed_url":"https://pfandrade.me/index.xml","site_url":"https://pfandrade.me/"},{"id":4844199,"created_at":"2019-05-05T14:47:08.091202Z","feed_id":1346114,"title":"Pedro Piñera","feed_url":"http://ppinera.es/feed.xml","site_url":"https://ppinera.es"},{"id":4844198,"created_at":"2019-05-05T14:47:08.077033Z","feed_id":1424889,"title":"agostini.tech","feed_url":"https://agostini.tech/feed/","site_url":"https://agostini.tech"},{"id":4844197,"created_at":"2019-05-05T14:47:08.070911Z","feed_id":1012582,"title":"Ilya Puchka","feed_url":"http://ilya.puchka.me/rss/","site_url":"http://ilya.puchka.me/"},{"id":4844196,"created_at":"2019-05-05T14:47:08.062250Z","feed_id":1424878,"title":"Matteo Manferdini","feed_url":"https://matteomanferdini.com/feed/","site_url":"https://matteomanferdini.com"},{"id":4844194,"created_at":"2019-05-05T14:47:08.059731Z","feed_id":1095014,"title":"Rhonabwy","feed_url":"https://rhonabwy.com/feed/","site_url":"https://rhonabwy.com"},{"id":4844195,"created_at":"2019-05-05T14:47:08.059703Z","feed_id":1578284,"title":"Noah Gilmore","feed_url":"https://noahgilmore.com/blog/ios.xml","site_url":"https://noahgilmore.com"},{"id":4844193,"created_at":"2019-05-05T14:47:08.053782Z","feed_id":1377354,"title":"Hillel Wayne","feed_url":"https://www.hillelwayne.com/index.xml","site_url":"https://www.hillelwayne.com/"},{"id":4844192,"created_at":"2019-05-05T14:47:08.040977Z","feed_id":1510180,"title":"Editors Cut","feed_url":"https://editorscut.com/rss.xml","site_url":"http://www.editorscut.com/Blog/"},{"id":4844191,"created_at":"2019-05-05T14:47:08.037327Z","feed_id":1578292,"title":"ultrajoke","feed_url":"https://blog.spacemanlabs.com/feed/","site_url":"https://blog.spacemanlabs.com"},{"id":4844190,"created_at":"2019-05-05T14:47:08.029288Z","feed_id":1388622,"title":"Alexander Grebenyuk","feed_url":"http://kean.github.io/feed.xml","site_url":"http://kean.github.io/"},{"id":4844189,"created_at":"2019-05-05T14:47:08.025459Z","feed_id":1296383,"title":"inessential","feed_url":"http://inessential.com/feed.json","site_url":"http://inessential.com/"},{"id":4844188,"created_at":"2019-05-05T14:47:08.024880Z","feed_id":1578300,"title":"Stories by Niamh Power on Medium","feed_url":"https://medium.com/feed/@niamhpower","site_url":"https://medium.com/@niamhpower?source=rss-61de4ad69c14------2"},{"id":4844186,"created_at":"2019-05-05T14:47:08.022947Z","feed_id":1578275,"title":"Stories by Adrian Śliwa on Medium","feed_url":"https://medium.com/feed/@adrianmsliwa","site_url":"https://medium.com/@adrianmsliwa?source=rss-e68597695f05------2"},{"id":4844187,"created_at":"2019-05-05T14:47:08.022916Z","feed_id":25184,"title":"iOS App Dev Libraries, Controls, Tutorials, Examples and Tools","feed_url":"http://feeds.feedburner.com/maniacdev","site_url":"https://maniacdev.com"},{"id":4844185,"created_at":"2019-05-05T14:47:08.020517Z","feed_id":1505017,"title":"Stories by Geoff Hackworth on Medium","feed_url":"https://medium.com/feed/@hacknicity","site_url":"https://medium.com/@hacknicity?source=rss-4a59fa99a5c4------2"},{"id":4844184,"created_at":"2019-05-05T14:47:08.012652Z","feed_id":1237279,"title":"iOScreator","feed_url":"https://www.ioscreator.com/tutorials?format=RSS","site_url":"https://www.ioscreator.com/"},{"id":4844183,"created_at":"2019-05-05T14:47:08.008472Z","feed_id":1572820,"title":"High Caffeine Content","feed_url":"https://www.highcaffeinecontent.com/blog/rss.xml","site_url":"https://www.highcaffeinecontent.com/blog/"},{"id":4844182,"created_at":"2019-05-05T14:47:07.988835Z","feed_id":1578288,"title":"Stories by Serhii Kharauzov on Medium","feed_url":"https://medium.com/feed/@sergkharauzov","site_url":"https://medium.com/@sergkharauzov?source=rss-435333b617b0------2"},{"id":4844181,"created_at":"2019-05-05T14:47:07.983344Z","feed_id":1399906,"title":"Elegant Chaos","feed_url":"http://elegantchaos.com/rss.xml","site_url":"http://elegantchaos.com"},{"id":4844180,"created_at":"2019-05-05T14:47:07.979514Z","feed_id":1486836,"title":"SwiftLee","feed_url":"https://www.avanderlee.com/feed/","site_url":"https://www.avanderlee.com"},{"id":4844179,"created_at":"2019-05-05T14:47:07.975933Z","feed_id":1424887,"title":"Stories by Bartosz Polaczyk on Medium","feed_url":"https://medium.com/feed/@londeix","site_url":"https://medium.com/@londeix?source=rss-455e6a104b5e------2"},{"id":4844178,"created_at":"2019-05-05T14:47:07.942886Z","feed_id":1506640,"title":"Cole's Huginn","feed_url":"http://www.colejoplin.com/feed/","site_url":"http://www.colejoplin.com"},{"id":4844177,"created_at":"2019-05-05T14:47:07.918621Z","feed_id":861611,"title":"Russ Bishop","feed_url":"http://www.russbishop.net/feed","site_url":"http://www.russbishop.net"},{"id":4844176,"created_at":"2019-05-05T14:47:07.915789Z","feed_id":1418314,"title":"iOS – Marc Palmer","feed_url":"https://marcpalmer.net/category/ios/feed/","site_url":"https://marcpalmer.net"},{"id":4844175,"created_at":"2019-05-05T14:47:07.914281Z","feed_id":1239214,"title":"Weaponized Fluff","feed_url":"https://apontious.com/feed/","site_url":"https://apontious.com"},{"id":4844174,"created_at":"2019-05-05T14:47:07.896027Z","feed_id":1153329,"title":"iJoshSmith","feed_url":"https://ijoshsmith.com/feed/","site_url":"https://ijoshsmith.com"},{"id":4844173,"created_at":"2019-05-05T14:47:07.895292Z","feed_id":26795,"title":"David Barnard - Blog","feed_url":"http://davidbarnard.com/rss","site_url":"http://davidbarnard.com/"},{"id":4844172,"created_at":"2019-05-05T14:47:07.884701Z","feed_id":1119253,"title":"rx_marin\u0026lt;blog\u0026gt;","feed_url":"http://rx-marin.com/index.xml","site_url":"http://rx-marin.com/"},{"id":4844171,"created_at":"2019-05-05T14:47:07.875871Z","feed_id":1511092,"title":"JP Simard","feed_url":"https://www.jpsim.com/atom.xml","site_url":"https://jpsim.com/"},{"id":4844170,"created_at":"2019-05-05T14:47:07.866418Z","feed_id":1501797,"title":"Rambo.codes","feed_url":"https://rambo.codes/feed.xml","site_url":"https://rambo.codes/"},{"id":4844169,"created_at":"2019-05-05T14:47:07.862213Z","feed_id":1149420,"title":"WordPress Tavern","feed_url":"https://wptavern.com/feed","site_url":"https://wptavern.com"},{"id":4844167,"created_at":"2019-05-05T14:47:07.856616Z","feed_id":913020,"title":"Conrad Stoll","feed_url":"http://conradstoll.com/blog?format=RSS","site_url":"http://conradstoll.com/"},{"id":4844168,"created_at":"2019-05-05T14:47:07.854661Z","feed_id":1367414,"title":"iOS Dev Tools","feed_url":"https://iosdev.tools/rss.php","site_url":"https://iosdev.tools"},{"id":4844166,"created_at":"2019-05-05T14:47:07.824198Z","feed_id":95556,"title":"Khanlou","feed_url":"http://khanlou.com/feed/","site_url":"http://khanlou.com/"},{"id":4844165,"created_at":"2019-05-05T14:47:07.822535Z","feed_id":1510178,"title":"busybee: Plaidophile","feed_url":"https://beesbuzz.biz/blog/feed","site_url":"https://beesbuzz.biz/blog/chatter/6384-Test-post"},{"id":4844164,"created_at":"2019-05-05T14:47:07.807685Z","feed_id":1576799,"title":"Jason Zurita's Blog","feed_url":"https://www.jasonzurita.com/feed.xml","site_url":"http://jasonzurita.com"},{"id":4844163,"created_at":"2019-05-05T14:47:07.804058Z","feed_id":1274281,"title":"The Desolation of Blog","feed_url":"https://lapcatsoftware.com/articles/atom.xml","site_url":"http://lapcatsoftware.com/articles/index.html"},{"id":4844162,"created_at":"2019-05-05T14:47:07.799707Z","feed_id":1069647,"title":"Swift.org","feed_url":"https://swift.org/atom.xml","site_url":""},{"id":4844161,"created_at":"2019-05-05T14:47:07.794207Z","feed_id":1192662,"title":"Ole Begemann","feed_url":"https://oleb.net/blog/atom.xml","site_url":"https://oleb.net/blog/"},{"id":4844160,"created_at":"2019-05-05T14:47:07.762971Z","feed_id":1365909,"title":"Timac","feed_url":"https://blog.timac.org/index.xml","site_url":"https://blog.timac.org/"},{"id":4844159,"created_at":"2019-05-05T14:47:07.746643Z","feed_id":1486826,"title":"YASB","feed_url":"https://www.vadimbulavin.com/feed","site_url":"http://www.vadimbulavin.com"},{"id":4844158,"created_at":"2019-05-05T14:47:07.706292Z","feed_id":74,"title":"furbo.org","feed_url":"http://furbo.org/feed/","site_url":"https://furbo.org"},{"id":4844157,"created_at":"2019-05-05T14:47:07.656125Z","feed_id":17463,"title":"Colin Devroe","feed_url":"http://cdevroe.com/feed/","site_url":"http://cdevroe.com"},{"id":4844156,"created_at":"2019-05-05T14:47:07.652342Z","feed_id":1376302,"title":"Stories by Pablo Villar on Medium","feed_url":"https://medium.com/feed/@volbap","site_url":"https://medium.com/@volbap?source=rss-2261535f21e------2"},{"id":4844155,"created_at":"2019-05-05T14:47:07.639608Z","feed_id":1578277,"title":"Gabriel Theodoropoulos","feed_url":"https://gtiapps.com/?feed=rss2","site_url":"https://gtiapps.com"},{"id":4844154,"created_at":"2019-05-05T14:47:07.564036Z","feed_id":1074742,"title":"Marco.org","feed_url":"https://marco.org/rss","site_url":"https://marco.org/"},{"id":4844153,"created_at":"2019-05-05T14:47:07.551449Z","feed_id":35102,"title":"Jared Sinclair","feed_url":"http://blog.jaredsinclair.com/rss","site_url":"https://jaredsinclair.com/"},{"id":4844152,"created_at":"2019-05-05T14:47:07.542591Z","feed_id":1296380,"title":"The Shape of Everything","feed_url":"http://shapeof.com/feed.json","site_url":"http://shapeof.com/"},{"id":4844151,"created_at":"2019-05-05T14:47:07.508610Z","feed_id":1578287,"title":"Stories by Ross Butler on Medium","feed_url":"https://medium.com/feed/@rwbutler","site_url":"https://medium.com/@rwbutler?source=rss-48f7d614a0e6------2"},{"id":4844150,"created_at":"2019-05-05T14:47:07.401523Z","feed_id":1338599,"title":"Swift Developer News - Hacking with Swift","feed_url":"https://www.hackingwithswift.com/articles/rss","site_url":"https://www.hackingwithswift.com/articles/rss"},{"id":4844149,"created_at":"2019-05-05T14:47:07.400748Z","feed_id":1291156,"title":"Swift by Sundell","feed_url":"https://www.swiftbysundell.com/?format=rss","site_url":"https://www.swiftbysundell.com/"},{"id":4844148,"created_at":"2019-05-05T14:47:07.388422Z","feed_id":1200837,"title":"Julia Evans","feed_url":"https://jvns.ca/atom.xml","site_url":"http://jvns.ca"},{"id":4844147,"created_at":"2019-05-05T14:47:07.346638Z","feed_id":1424881,"title":"Recoursive","feed_url":"https://recoursive.com/tag/ios/index.xml","site_url":"http://recoursive.com"},{"id":4844146,"created_at":"2019-05-05T14:47:07.343782Z","feed_id":1505579,"title":"A Lazy Sequence","feed_url":"https://brehaut.net/feeds/everything.json","site_url":"https://brehaut.net/"},{"id":4844145,"created_at":"2019-05-05T14:47:07.298274Z","feed_id":1388351,"title":"Stories by Raul Riera on Medium","feed_url":"https://medium.com/feed/@raulriera","site_url":"https://medium.com/@raulriera?source=rss-8501090bb2de------2"},{"id":4844144,"created_at":"2019-05-05T14:47:07.281812Z","feed_id":1303511,"title":"Belle B. Cooper","feed_url":"http://blog.bellebcooper.com/feeds/all.atom.xml","site_url":"http://blog.bellebcooper.com/"},{"id":4844143,"created_at":"2019-05-05T14:47:07.234534Z","feed_id":1519998,"title":"metablog","feed_url":"https://blog.metaobject.com/feeds/posts/default","site_url":"https://blog.metaobject.com/"},{"id":4844142,"created_at":"2019-05-05T14:47:07.227808Z","feed_id":1578272,"title":"Stories by Emilio Peláez on Medium","feed_url":"https://medium.com/feed/@Pelaez","site_url":"https://medium.com/@Pelaez?source=rss-aff864e8163------2"},{"id":4844141,"created_at":"2019-05-05T14:47:07.131292Z","feed_id":1486815,"title":"Max Desiatov","feed_url":"https://desiatov.com/rss.xml","site_url":"https://desiatov.com"},{"id":4844140,"created_at":"2019-05-05T14:47:07.067485Z","feed_id":16340,"title":"Erica Sadun","feed_url":"http://ericasadun.com/feed/","site_url":"https://ericasadun.com"},{"id":4844139,"created_at":"2019-05-05T14:47:06.953642Z","feed_id":1525506,"title":"Pierre Felgines","feed_url":"https://felginep.github.io/feed.xml","site_url":"https://felginep.github.io/"},{"id":4844137,"created_at":"2019-05-05T14:47:06.694409Z","feed_id":1578273,"title":"Stories by Gwenn Guihal on Medium","feed_url":"https://medium.com/feed/@_myrddin_","site_url":"https://medium.com/@_myrddin_?source=rss-aae4165d399------2"},{"id":4844136,"created_at":"2019-05-05T14:47:06.584185Z","feed_id":1359517,"title":"A+ programming moments","feed_url":"http://aplus.rs/index.xml","site_url":"http://aplus.rs/"},{"id":4844135,"created_at":"2019-05-05T14:47:06.569933Z","feed_id":1270217,"title":"kristina.io","feed_url":"https://kristina.io/feed/","site_url":"https://kristina.io"},{"id":4844134,"created_at":"2019-05-05T14:47:06.532979Z","feed_id":1021976,"title":"Andrew Bancroft","feed_url":"https://www.andrewcbancroft.com/feed/","site_url":"https://www.andrewcbancroft.com"},{"id":4844133,"created_at":"2019-05-05T14:47:06.522510Z","feed_id":860220,"title":"Arek Holko","feed_url":"http://feeds.feedburner.com/ArkadiuszHolko","site_url":"https://holko.pl"},{"id":4844132,"created_at":"2019-05-05T14:47:06.401434Z","feed_id":1223531,"title":"Roland Leth","feed_url":"https://rolandleth.com/feed","site_url":"https://rolandleth.com"},{"id":4844131,"created_at":"2019-05-05T14:47:06.373829Z","feed_id":1578296,"title":"Brian Donohue – Makin’ that Instapaper","feed_url":"http://bthdonohue.com/feed.xml","site_url":"/"},{"id":4844130,"created_at":"2019-05-05T14:47:06.281801Z","feed_id":1017026,"title":"mokacoding","feed_url":"http://www.mokacoding.com/feed.xml","site_url":"http://www.mokacoding.com"},{"id":4844129,"created_at":"2019-05-05T14:47:06.256960Z","feed_id":1381532,"title":"martinmitrevski","feed_url":"https://martinmitrevski.com/feed/","site_url":"https://martinmitrevski.com"},{"id":4844128,"created_at":"2019-05-05T14:47:06.032936Z","feed_id":1407941,"title":"Chris Eidhof","feed_url":"http://chris.eidhof.nl/index.xml","site_url":"http://chris.eidhof.nl/"},{"id":4844127,"created_at":"2019-05-05T14:47:05.949327Z","feed_id":4269,"title":"David Sinclair's blog","feed_url":"http://www.dejal.com/blog/feed","site_url":"http://www.dejal.com/blog/2"},{"id":4844126,"created_at":"2019-05-05T14:47:05.808587Z","feed_id":972279,"title":"Marcin Krzyżanowski","feed_url":"http://blog.krzyzanowskim.com/rss/","site_url":"https://blog.krzyzanowskim.com/"},{"id":4844125,"created_at":"2019-05-05T14:47:05.798590Z","feed_id":1539758,"title":"Zoë Smith","feed_url":"https://www.zoesmith.io/index.xml","site_url":"/"},{"id":4844124,"created_at":"2019-05-05T14:47:05.747763Z","feed_id":1076603,"title":"Stories by Max Howell on Medium","feed_url":"https://medium.com/feed/@mxcl","site_url":"https://medium.com/@mxcl?source=rss-87f057c6e50c------2"},{"id":4844123,"created_at":"2019-05-05T14:47:05.694483Z","feed_id":694239,"title":"Bartosz Ciechanowski","feed_url":"http://ciechanowski.me/atom.xml","site_url":"https://ciechanow.ski/"},{"id":4844122,"created_at":"2019-05-05T14:47:05.691834Z","feed_id":1411746,"title":"Free - Extras","feed_url":"https://extras.waynewbishop.com/swift?format=rss","site_url":"https://extras.waynewbishop.com/swift/"},{"id":4844121,"created_at":"2019-05-05T14:47:05.598332Z","feed_id":1578285,"title":"Pedro Carrasco","feed_url":"https://pedrommcarrasco.github.io/atom.xml","site_url":"https://pedrommcarrasco.github.io/"},{"id":4844120,"created_at":"2019-05-05T14:47:05.566176Z","feed_id":1260873,"title":"Use Your Loaf - iOS Development News \u0026 Tips","feed_url":"https://useyourloaf.com/blog/rss.xml","site_url":"https://useyourloaf.com/blog/"},{"id":4844119,"created_at":"2019-05-05T14:47:05.539656Z","feed_id":1271644,"title":"Michael Tsai","feed_url":"https://mjtsai.com/blog/feed/","site_url":"https://mjtsai.com/blog"},{"id":4844118,"created_at":"2019-05-05T14:47:05.458457Z","feed_id":1082983,"title":"Ben Dodson's Blog - Freelance iPhone Developer and WallaBee Founder","feed_url":"https://bendodson.com/rss.xml","site_url":"https://bendodson.com/"},{"id":4844117,"created_at":"2019-05-05T14:47:05.360992Z","feed_id":1424893,"title":"William Boles","feed_url":"https://williamboles.me/rss/","site_url":"https://williamboles.me/"},{"id":4844116,"created_at":"2019-05-05T14:47:05.340796Z","feed_id":1023777,"title":"Appventure","feed_url":"http://appventure.me/rss-feed","site_url":"http://appventure.me"},{"id":4844115,"created_at":"2019-05-05T14:47:05.311925Z","feed_id":1574913,"title":"Stories by Alan on Medium","feed_url":"https://medium.com/feed/@alanzeino","site_url":"https://medium.com/@alanzeino?source=rss-9e185327ea4b------2"},{"id":4844113,"created_at":"2019-05-05T14:47:05.263791Z","feed_id":1418558,"title":"Stories by VAPOR on Medium","feed_url":"https://medium.com/feed/@codevapor","site_url":"https://medium.com/@codevapor?source=rss-26bf5124725c------2"},{"id":4844114,"created_at":"2019-05-05T14:47:05.263408Z","feed_id":1578278,"title":"Stories by Jean Mainguy on Medium","feed_url":"https://medium.com/feed/@jhandguy","site_url":"https://medium.com/@jhandguy?source=rss-60d6fa56fda3------2"},{"id":4844112,"created_at":"2019-05-05T14:47:05.249910Z","feed_id":1388263,"title":"Ben Scheirman","feed_url":"https://benscheirman.com/rss/","site_url":"https://benscheirman.com/"},{"id":4844111,"created_at":"2019-05-05T14:47:05.184013Z","feed_id":1578274,"title":"apoorva.","feed_url":"https://apoorvatyagi.com/feed/","site_url":"https://apoorvatyagi.com"},{"id":4844110,"created_at":"2019-05-05T14:47:05.167103Z","feed_id":1598316,"title":"Nate Thompson","feed_url":"https://www.natethompson.io///feed.xml","site_url":"http://www.natethompson.io/"},{"id":4844109,"created_at":"2019-05-05T14:47:05.157808Z","feed_id":1418313,"title":"finestructure","feed_url":"https://finestructure.co/blog?format=RSS","site_url":"https://finestructure.co/"},{"id":4844108,"created_at":"2019-05-05T14:47:05.135649Z","feed_id":1423653,"title":"Indie Stack","feed_url":"https://indiestack.com/feed/","site_url":"https://indiestack.com"},{"id":4844107,"created_at":"2019-05-05T14:47:05.098990Z","feed_id":1372247,"title":"Kombi Life","feed_url":"https://kombilife.com/feed/","site_url":"https://kombilife.com"},{"id":4844106,"created_at":"2019-05-05T14:47:05.084425Z","feed_id":1424883,"title":"The Always Right Institute","feed_url":"https://www.alwaysrightinstitute.com/feed","site_url":"http://alwaysrightinstitute.github.io/"},{"id":4844105,"created_at":"2019-05-05T14:47:05.028470Z","feed_id":1255081,"title":"Tales of a vanlife couple","feed_url":"http://www.van-tramp.com/wp/feed/","site_url":"https://www.van-tramp.com/wp"},{"id":4844103,"created_at":"2019-05-05T14:47:05.001731Z","feed_id":1510174,"title":"Authentic Asheville","feed_url":"https://authenticavl.com/feed/","site_url":"https://authenticavl.com"},{"id":4844102,"created_at":"2019-05-05T14:47:04.976094Z","feed_id":1510177,"title":"Vanvaya","feed_url":"https://vanvaya.com/feed/","site_url":"https://vanvaya.com"},{"id":4844100,"created_at":"2019-05-05T14:47:04.973714Z","feed_id":1510173,"title":"Westfalia Digital Nomads","feed_url":"https://westfaliadigitalnomads.com/feed/","site_url":"https://westfaliadigitalnomads.com"},{"id":4844101,"created_at":"2019-05-05T14:47:04.971987Z","feed_id":1510183,"title":"Traipsing About","feed_url":"https://www.traipsingabout.com/feed/","site_url":"https://www.traipsingabout.com"},{"id":4844104,"created_at":"2019-05-05T14:47:04.970946Z","feed_id":1510185,"title":"Campervan.Life","feed_url":"https://campervanlife.eu/feed/","site_url":"https://campervanlife.eu"},{"id":4844099,"created_at":"2019-05-05T14:47:04.929305Z","feed_id":1510172,"title":"Blog - Kaya Lindsay","feed_url":"https://www.onechicktravels.com/blog?format=RSS","site_url":"https://www.onechicktravels.com/blog/"},{"id":4844098,"created_at":"2019-05-05T14:47:04.927363Z","feed_id":1510181,"title":"Travel Therapy – Tiny Van Big Living","feed_url":"http://tinyvanbigliving.com/category/travel-therapy/feed/","site_url":"http://tinyvanbigliving.com"},{"id":4844097,"created_at":"2019-05-05T14:47:04.917864Z","feed_id":1510186,"title":"What’s New – WE'RE THE RUSSOS","feed_url":"https://weretherussos.com/category/all/feed/","site_url":"https://weretherussos.com"},{"id":4844096,"created_at":"2019-05-05T14:47:04.912674Z","feed_id":1356567,"title":"Ruby on Wheels","feed_url":"https://ruby-on-wheels.github.io/feed.xml","site_url":"https://ruby-on-wheels.github.io/"},{"id":4844095,"created_at":"2019-05-05T14:47:04.910023Z","feed_id":1156884,"title":"Nomads With a Van","feed_url":"http://www.nomadswithavan.com/feed/","site_url":"http://www.nomadswithavan.com"},{"id":4844094,"created_at":"2019-05-05T14:47:04.888291Z","feed_id":1510189,"title":"Vandog Traveller","feed_url":"https://vandogtraveller.com/feed/","site_url":"https://vandogtraveller.com"},{"id":4844093,"created_at":"2019-05-05T14:47:04.886203Z","feed_id":1261027,"title":"Blog - A Girl and Her Van","feed_url":"http://www.agirlandhervan.com/where-am-i?format=RSS","site_url":"http://www.agirlandhervan.com/where-am-i/"},{"id":4844092,"created_at":"2019-05-05T14:47:04.882624Z","feed_id":1510176,"title":"Van life – Bearfoot Theory","feed_url":"https://bearfoottheory.com/category/van-life/feed/","site_url":"https://bearfoottheory.com"},{"id":4844091,"created_at":"2019-05-05T14:47:04.874064Z","feed_id":1510175,"title":"VanlifeMagazine.co","feed_url":"http://vanlifemagazine.co/feed/","site_url":"https://vanlifemagazine.co"},{"id":4844090,"created_at":"2019-05-05T14:47:04.846407Z","feed_id":1510179,"title":"beanies \u0026 bikinis","feed_url":"http://beaniesandbikinisblog.com/feed/","site_url":"http://beaniesandbikinisblog.com"},{"id":4844089,"created_at":"2019-05-05T14:47:04.830976Z","feed_id":1470170,"title":"Gaia GPS","feed_url":"https://blog.gaiagps.com/feed/","site_url":"https://blog.gaiagps.com"},{"id":4844088,"created_at":"2019-05-05T14:47:04.827437Z","feed_id":1124009,"title":"Stories by Jean-Louis Gassée on Medium","feed_url":"https://medium.com/feed/@gassee","site_url":"https://medium.com/@gassee?source=rss-d6c6baafd47d------2"},{"id":4844087,"created_at":"2019-05-05T14:47:04.820397Z","feed_id":1347890,"title":"Gnomad Home","feed_url":"https://gnomadhome.com/feed/","site_url":"https://gnomadhome.com"},{"id":4844086,"created_at":"2019-05-05T14:47:04.808498Z","feed_id":1568536,"title":"4WD Action","feed_url":"https://www.youtube.com/feeds/videos.xml?channel_id=UCs-vWZu3t2ky3oImX83S_2Q","site_url":"https://www.youtube.com/channel/UCs-vWZu3t2ky3oImX83S_2Q"},{"id":4844085,"created_at":"2019-05-05T14:47:04.787238Z","feed_id":1510182,"title":"Blog – Escape Campervans","feed_url":"https://www.escapecampervans.com/blog/feed/","site_url":"https://www.escapecampervans.com"},{"id":4844084,"created_at":"2019-05-05T14:47:04.778405Z","feed_id":435047,"title":"Dana Blankenhorn","feed_url":"http://feeds.feedburner.com/danablankenhorn/gfvj","site_url":"https://www.danablankenhorn.com/"},{"id":4844083,"created_at":"2019-05-05T14:47:04.766230Z","feed_id":1510190,"title":"Mr and Mrs Adventure","feed_url":"https://mrandmrsadventure.com/feed/","site_url":"https://mrandmrsadventure.com"},{"id":4844082,"created_at":"2019-05-05T14:47:04.754809Z","feed_id":1320757,"title":"Bearfoot Theory","feed_url":"https://bearfoottheory.com/feed/","site_url":"https://bearfoottheory.com"},{"id":4844081,"created_at":"2019-05-05T14:47:04.749166Z","feed_id":1304436,"title":"Scripting News","feed_url":"http://scripting.com/rss.json","site_url":"http://scripting.com"},{"id":4844080,"created_at":"2019-05-05T14:47:04.741306Z","feed_id":1243036,"title":"On my Om","feed_url":"https://om.co/feed/","site_url":"https://om.co"},{"id":4844079,"created_at":"2019-05-05T14:47:04.732549Z","feed_id":1601,"title":"Asymco","feed_url":"http://www.asymco.com/feed/","site_url":"http://www.asymco.com"},{"id":4844078,"created_at":"2019-05-05T14:47:04.693753Z","feed_id":18627,"title":"Benjamin Mayo","feed_url":"http://feeds.feedburner.com/BenjaminMayo","site_url":"http://benjaminmayo.co.uk/"},{"id":4844077,"created_at":"2019-05-05T14:47:04.667780Z","feed_id":117722,"title":"Stratechery by Ben Thompson","feed_url":"http://stratechery.com/feed/","site_url":"https://stratechery.com"},{"id":4844076,"created_at":"2019-05-05T14:47:04.667023Z","feed_id":1298812,"title":"Manton Reece","feed_url":"http://www.manton.org/feed/json","site_url":"https://www.manton.org/"},{"id":4844075,"created_at":"2019-05-05T14:47:04.664541Z","feed_id":1296379,"title":"Daring Fireball","feed_url":"https://daringfireball.net/feeds/json","site_url":"https://daringfireball.net/"},{"id":4844074,"created_at":"2019-05-05T14:47:04.655345Z","feed_id":670040,"title":"Cocoaphony","feed_url":"http://robnapier.net/atom.xml","site_url":"https://robnapier.net/"},{"id":4841064,"created_at":"2019-05-02T23:19:52.793577Z","feed_id":1096623,"title":"Beautiful Pixels","feed_url":"https://feedpress.me/beautifulpixels","site_url":"https://beautifulpixels.com"}] \ No newline at end of file diff --git a/Frameworks/Account/AccountTests/JSON/subscriptions_initial.json b/Frameworks/Account/AccountTests/JSON/subscriptions_initial.json new file mode 100644 index 000000000..684417194 --- /dev/null +++ b/Frameworks/Account/AccountTests/JSON/subscriptions_initial.json @@ -0,0 +1 @@ +[{"id":4844298,"created_at":"2019-05-05T14:47:19.178100Z","feed_id":1486863,"title":"iOS Dev Recipes","feed_url":"https://www.iosdev.recipes/rss.xml","site_url":"https://www.iosdev.recipes"},{"id":4844297,"created_at":"2019-05-05T14:47:15.793641Z","feed_id":15452,"title":"Atomic Spin","feed_url":"http://feeds.feedblitz.com/atomicspin","site_url":"https://spin.atomicobject.com"},{"id":4844296,"created_at":"2019-05-05T14:47:15.671645Z","feed_id":1578301,"title":"Swift – Simon's Sanitarium","feed_url":"http://simonfairbairn.com/tag/swift/feed/","site_url":"http://simonfairbairn.com"},{"id":4844295,"created_at":"2019-05-05T14:47:15.216340Z","feed_id":1364385,"title":"a-coding","feed_url":"https://a-coding.com/rss/","site_url":"https://a-coding.com/"},{"id":4844294,"created_at":"2019-05-05T14:47:14.461697Z","feed_id":1597435,"title":"Swift Dev Journal","feed_url":"https://www.swiftdevjournal.com/feed/","site_url":"https://www.swiftdevjournal.com"},{"id":4844293,"created_at":"2019-05-05T14:47:14.352425Z","feed_id":98472,"title":"Amusing Planet","feed_url":"http://feeds.feedburner.com/amusingplanet","site_url":"http://www.amusingplanet.com/"},{"id":4844292,"created_at":"2019-05-05T14:47:13.980121Z","feed_id":1486842,"title":"iOS Coach Frank","feed_url":"http://ioscoachfrank.com/feed/atom.xml","site_url":"https://ioscoachfrank.com/"},{"id":4844291,"created_at":"2019-05-05T14:47:13.731919Z","feed_id":1605375,"title":"BiteofanApple by Brian Schrader","feed_url":"https://brianschrader.com/feed.json","site_url":"https://brianschrader.com"},{"id":4844290,"created_at":"2019-05-05T14:47:12.083703Z","feed_id":1388169,"title":"Warp your mobile development - Articles","feed_url":"https://twittemb.github.io/feed.xml","site_url":"http://blog.warpfactor.io"},{"id":4844289,"created_at":"2019-05-05T14:47:11.550664Z","feed_id":1424879,"title":"one fifty two","feed_url":"https://152percent.com/blog?format=rss","site_url":"https://152percent.com/"},{"id":4844288,"created_at":"2019-05-05T14:47:11.345489Z","feed_id":1176579,"title":"Cocoa with Love on Cocoa with Love","feed_url":"http://www.cocoawithlove.com/feed.xml?alt=rss","site_url":"https://www.cocoawithlove.com/"},{"id":4844287,"created_at":"2019-05-05T14:47:10.776956Z","feed_id":1605374,"title":"Vanlife – Vincode","feed_url":"https://vincode.io/blog/category/vanlife/feed/","site_url":"https://vincode.io"},{"id":4844286,"created_at":"2019-05-05T14:47:10.485640Z","feed_id":547888,"title":"objc.io","feed_url":"http://www.objc.io/feed.xml","site_url":"http://www.objc.io"},{"id":4844285,"created_at":"2019-05-05T14:47:10.460625Z","feed_id":1528640,"title":"Bravely Go","feed_url":"https://blog.waveapps.com/feed/","site_url":"https://blog.waveapps.com"},{"id":4844284,"created_at":"2019-05-05T14:47:10.234446Z","feed_id":1211804,"title":"This Week in the IndieWeb","feed_url":"https://indieweb.org/this-week/feed.xml","site_url":"https://indieweb.org/this-week"},{"id":4844283,"created_at":"2019-05-05T14:47:10.216704Z","feed_id":1528652,"title":"FreshBooks","feed_url":"https://www.freshbooks.com/feed","site_url":"https://www.freshbooks.com"},{"id":4844282,"created_at":"2019-05-05T14:47:10.173434Z","feed_id":1486846,"title":"De Programmatica Ipsum","feed_url":"https://deprogrammaticaipsum.com/feed/","site_url":"https://deprogrammaticaipsum.com"},{"id":4844281,"created_at":"2019-05-05T14:47:10.127761Z","feed_id":1340283,"title":"Eternal Storms Software Blog","feed_url":"https://blog.eternalstorms.at/feed/","site_url":"https://blog.eternalstorms.at"},{"id":4844280,"created_at":"2019-05-05T14:47:10.079950Z","feed_id":1221017,"title":"Apple World Today","feed_url":"https://www.appleworld.today/blog?format=RSS","site_url":"https://www.appleworld.today/"},{"id":4844279,"created_at":"2019-05-05T14:47:09.919597Z","feed_id":1176732,"title":"Upvoted","feed_url":"https://redditblog.com/feed/","site_url":"https://redditblog.com"},{"id":4844278,"created_at":"2019-05-05T14:47:09.912041Z","feed_id":143536,"title":"The Omni Group","feed_url":"https://www.omnigroup.com/blog/rss/","site_url":"https://www.omnigroup.com/"},{"id":4844277,"created_at":"2019-05-05T14:47:09.903081Z","feed_id":1241233,"title":"Engineering – The GitHub Blog","feed_url":"https://githubengineering.com/atom.xml","site_url":"https://github.blog"},{"id":4844276,"created_at":"2019-05-05T14:47:09.901124Z","feed_id":1062583,"title":"Feedbin","feed_url":"https://feedbin.com/blog/atom.xml","site_url":"https://feedbin.com"},{"id":4844275,"created_at":"2019-05-05T14:47:09.880170Z","feed_id":1605285,"title":"Instapaper","feed_url":"https://blog.instapaper.com/rss","site_url":"https://blog.instapaper.com/"},{"id":4844274,"created_at":"2019-05-05T14:47:09.843600Z","feed_id":387024,"title":"Under the Microscope","feed_url":"http://rogueamoeba.com/utm/feed/","site_url":"https://weblog.rogueamoeba.com"},{"id":4844273,"created_at":"2019-05-05T14:47:09.796116Z","feed_id":1528975,"title":"Xcoders","feed_url":"https://xcoders.org/feed.xml","site_url":"https://xcoders.org/"},{"id":4844272,"created_at":"2019-05-05T14:47:09.793206Z","feed_id":1229997,"title":"Big Nerd Ranch","feed_url":"https://www.bignerdranch.com/feed.xml","site_url":"https://www.bignerdranch.com/"},{"id":4844271,"created_at":"2019-05-05T14:47:09.551647Z","feed_id":1488022,"title":"NetNewsWire","feed_url":"https://nnw.ranchero.com/feed.json","site_url":"https://nnw.ranchero.com/"},{"id":4844270,"created_at":"2019-05-05T14:47:09.452217Z","feed_id":1067438,"title":"Inside PSPDFKit","feed_url":"https://pspdfkit.com/blog/feed.atom","site_url":"https://pspdfkit.com/blog"},{"id":4844269,"created_at":"2019-05-05T14:47:09.435856Z","feed_id":1538463,"title":"Codea \u0026 Shade","feed_url":"https://codea.io/blog/feed/","site_url":"https://codea.io/blog"},{"id":4844268,"created_at":"2019-05-05T14:47:09.424075Z","feed_id":1528649,"title":"Small Business Accounting Blog","feed_url":"http://business-accounting-guides.com/business-accounting.xml","site_url":"http://www.business-accounting-guides.com/business-accounting-blog.html"},{"id":4844267,"created_at":"2019-05-05T14:47:09.409498Z","feed_id":1528643,"title":"THE SMALL BUSINESS BLOG","feed_url":"http://sme-blog.com/feed/","site_url":"http://sme-blog.com"},{"id":4844266,"created_at":"2019-05-05T14:47:09.323233Z","feed_id":1320545,"title":"Small Business Trends","feed_url":"https://feeds.feedburner.com/SmallBusinessTrends","site_url":"https://smallbiztrends.com"},{"id":4844265,"created_at":"2019-05-05T14:47:09.307701Z","feed_id":1913,"title":"Ars Technica","feed_url":"http://feeds.arstechnica.com/arstechnica/index","site_url":"https://arstechnica.com"},{"id":4844264,"created_at":"2019-05-05T14:47:09.299012Z","feed_id":1528650,"title":"B\u0026J Bookkeeping and Taxes","feed_url":"http://houstonbookkeeper.net/feed/","site_url":"https://houstonbookkeeper.net"},{"id":4844263,"created_at":"2019-05-05T14:47:09.278149Z","feed_id":1113164,"title":"Six Colors","feed_url":"https://feedpress.me/sixcolors","site_url":"https://www.sixcolors.com/"},{"id":4844262,"created_at":"2019-05-05T14:47:09.272805Z","feed_id":1463575,"title":"Two-Bit History","feed_url":"https://twobithistory.org/feed.xml","site_url":"https://twobithistory.org/"},{"id":4844261,"created_at":"2019-05-05T14:47:09.268484Z","feed_id":105,"title":"kottke.org","feed_url":"http://feeds.kottke.org/main","site_url":"http://kottke.org/"},{"id":4844260,"created_at":"2019-05-05T14:47:09.220987Z","feed_id":747836,"title":"Andy Sylvester's Web","feed_url":"http://andysylvester.com/feed/","site_url":"http://andysylvester.com"},{"id":4844259,"created_at":"2019-05-05T14:47:09.205819Z","feed_id":1713,"title":"The Verge - All Posts","feed_url":"http://www.theverge.com/rss/full.xml","site_url":"https://www.theverge.com/"},{"id":4844258,"created_at":"2019-05-05T14:47:09.163967Z","feed_id":1051845,"title":"All The Flow","feed_url":"https://blog.alltheflow.com/rss/","site_url":"http://blog.alltheflow.com/"},{"id":4844257,"created_at":"2019-05-05T14:47:09.160509Z","feed_id":1735,"title":"MacRumors: Mac News and Rumors - All Stories","feed_url":"http://feeds.macrumors.com/MacRumors-All","site_url":"https://www.macrumors.com"},{"id":4844256,"created_at":"2019-05-05T14:47:09.115894Z","feed_id":1030946,"title":"Crunchy Development","feed_url":"http://alisoftware.github.io/feed.xml","site_url":"http://alisoftware.github.io/"},{"id":4844255,"created_at":"2019-05-05T14:47:09.074824Z","feed_id":1211114,"title":"Changelog","feed_url":"https://changelog.com/feed","site_url":"https://changelog.com/"},{"id":4844254,"created_at":"2019-05-05T14:47:08.940434Z","feed_id":1388089,"title":"Simon Wolf's Writings","feed_url":"http://www.swwritings.com/feed.xml","site_url":"https://www.swwritings.com"},{"id":4844253,"created_at":"2019-05-05T14:47:08.914802Z","feed_id":1472912,"title":"Patrick Balestra","feed_url":"https://patrickbalestra.com/feed.xml","site_url":"https://balestrapatrick.github.io/"},{"id":4844252,"created_at":"2019-05-05T14:47:08.885221Z","feed_id":1099459,"title":"denzhadanov - Medium","feed_url":"https://denzhadanov.com/feed/","site_url":"https://denzhadanov.com?source=rss----5255a3782276---4"},{"id":4844251,"created_at":"2019-05-05T14:47:08.838988Z","feed_id":169025,"title":"xkcd.com","feed_url":"https://xkcd.com/rss.xml","site_url":"https://xkcd.com/"},{"id":4844250,"created_at":"2019-05-05T14:47:08.817486Z","feed_id":1578297,"title":"Stories by Zanella Gaétan on Medium","feed_url":"https://medium.com/feed/@gaetan.zanella","site_url":"https://medium.com/@gaetan.zanella?source=rss-a2f0ed98a4b6------2"},{"id":4844249,"created_at":"2019-05-05T14:47:08.791736Z","feed_id":1424888,"title":"Igor Kulman on Coding Journal","feed_url":"https://blog.kulman.sk/index.xml","site_url":"https://blog.kulman.sk/"},{"id":4844248,"created_at":"2019-05-05T14:47:08.782644Z","feed_id":1177901,"title":"Aaron Vegh","feed_url":"http://aaron.vegh.ca/rss/","site_url":"http://aaron.vegh.ca/"},{"id":4844247,"created_at":"2019-05-05T14:47:08.762218Z","feed_id":1486813,"title":"Race Condition","feed_url":"http://racecondition.software/feed.xml","site_url":"http://www.racecondition.software"},{"id":4844246,"created_at":"2019-05-05T14:47:08.755161Z","feed_id":1014335,"title":"Jonathan Tarud","feed_url":"http://feed.jonathant.com/","site_url":"https://www.jonathant.com"},{"id":4844245,"created_at":"2019-05-05T14:47:08.747671Z","feed_id":1436884,"title":"Dave DeLong","feed_url":"https://davedelong.com/feed.xml","site_url":"https://davedelong.com/"},{"id":4844244,"created_at":"2019-05-05T14:47:08.739362Z","feed_id":1468269,"title":"@samwize","feed_url":"https://samwize.com/feed.xml","site_url":"https://samwize.com/"},{"id":4844243,"created_at":"2019-05-05T14:47:08.724609Z","feed_id":1505016,"title":"Device Blogs - Medium","feed_url":"https://medium.com/feed/device-blogs","site_url":"https://medium.com/device-blogs?source=rss----75b2e3c15714---4"},{"id":4844242,"created_at":"2019-05-05T14:47:08.702528Z","feed_id":1578290,"title":"Stories by Jimmy M Andersson on Medium","feed_url":"https://medium.com/feed/@JimmyMAndersson","site_url":"https://medium.com/@JimmyMAndersson?source=rss-163113c6fbf8------2"},{"id":4844241,"created_at":"2019-05-05T14:47:08.699891Z","feed_id":1545252,"title":"Benjamin Scholtysik","feed_url":"https://benjaminscholtysik.com/feed/","site_url":"https://benjaminscholtysik.com"},{"id":4844240,"created_at":"2019-05-05T14:47:08.688868Z","feed_id":1453910,"title":"Bitsplitting.org","feed_url":"https://bitsplitting.org/feed/json/","site_url":"https://bitsplitting.org"},{"id":4844239,"created_at":"2019-05-05T14:47:08.667608Z","feed_id":1127707,"title":"[Thinking inside a large box];","feed_url":"http://blog.benjamin-encz.de/index.xml","site_url":"http://blog.benjamin-encz.de/"},{"id":4844238,"created_at":"2019-05-05T14:47:08.664948Z","feed_id":1064554,"title":"Becky Hansmeyer","feed_url":"http://beckyhansmeyer.com/feed/","site_url":"https://beckyhansmeyer.com"},{"id":4844237,"created_at":"2019-05-05T14:47:08.664865Z","feed_id":1094799,"title":"Swift Unboxed","feed_url":"https://swiftunboxed.com/feed.xml","site_url":"https://swiftunboxed.com/"},{"id":4844236,"created_at":"2019-05-05T14:47:08.660910Z","feed_id":1525481,"title":"This is Kyle","feed_url":"http://thisiskyle.me/feed.xml","site_url":"http://thisiskyle.me/"},{"id":4844235,"created_at":"2019-05-05T14:47:08.639963Z","feed_id":1486854,"title":"Fluffy 📱","feed_url":"https://fluffy.es/rss/","site_url":"https://fluffy.es/"},{"id":4844234,"created_at":"2019-05-05T14:47:08.638340Z","feed_id":1559907,"title":"Hi, I’m Sam","feed_url":"https://soffes.blog/rss.xml","site_url":"https://soffes.blog"},{"id":4844233,"created_at":"2019-05-05T14:47:08.634252Z","feed_id":1486812,"title":"Ashish Kakkad","feed_url":"http://ashishkakkad.com/feed/","site_url":"http://ashishkakkad.com"},{"id":4844232,"created_at":"2019-05-05T14:47:08.628806Z","feed_id":1565908,"title":"Alejandro Martinez","feed_url":"https://alejandromp.com/blog/feed.xml","site_url":"http://alejandromp.com"},{"id":4844231,"created_at":"2019-05-05T14:47:08.612577Z","feed_id":1516541,"title":"@topolog's tech blog","feed_url":"https://dmtopolog.com/feed/","site_url":"https://dmtopolog.com"},{"id":4844230,"created_at":"2019-05-05T14:47:08.602442Z","feed_id":780733,"title":"Structure and Interpretation of Computer Programmers","feed_url":"http://www.sicpers.info/feed/","site_url":"https://www.sicpers.info"},{"id":4844229,"created_at":"2019-05-05T14:47:08.561072Z","feed_id":1177914,"title":"Making App Pie","feed_url":"https://makeapppie.com/feed/","site_url":"https://makeapppie.com"},{"id":4844228,"created_at":"2019-05-05T14:47:08.560545Z","feed_id":230857,"title":"XCBLOG","feed_url":"http://shashikantjagtap.net/feed/","site_url":"https://shashikantjagtap.net"},{"id":4844227,"created_at":"2019-05-05T14:47:08.536794Z","feed_id":1556686,"title":"Samantha John","feed_url":"https://samanthajohn.com/feed.xml","site_url":"/"},{"id":4844226,"created_at":"2019-05-05T14:47:08.532285Z","feed_id":1559420,"title":"geek-is-stupid","feed_url":"https://geek-is-stupid.github.io/feed.xml","site_url":"https://geek-is-stupid.github.io"},{"id":4844225,"created_at":"2019-05-05T14:47:08.515360Z","feed_id":37,"title":"Coding Horror","feed_url":"http://feeds.feedburner.com/codinghorror/","site_url":"https://blog.codinghorror.com/"},{"id":4844224,"created_at":"2019-05-05T14:47:08.513655Z","feed_id":1597437,"title":"Luke Smith – iOS and Swift","feed_url":"http://www.lukecsmith.co.uk/feed/","site_url":"https://www.lukecsmith.co.uk"},{"id":4844223,"created_at":"2019-05-05T14:47:08.483151Z","feed_id":1344882,"title":"Jesse Squires","feed_url":"https://www.jessesquires.com/feed.xml","site_url":"https://www.jessesquires.com"},{"id":4844222,"created_at":"2019-05-05T14:47:08.463074Z","feed_id":60926,"title":"Quality Coding","feed_url":"http://feeds.feedburner.com/qualitycoding","site_url":"https://qualitycoding.org"},{"id":4844221,"created_at":"2019-05-05T14:47:08.457008Z","feed_id":1388165,"title":"Fresh Swift","feed_url":"http://freshswift.net/index.xml","site_url":"http://freshswift.net/"},{"id":4844220,"created_at":"2019-05-05T14:47:08.452198Z","feed_id":1553728,"title":"Swift in Depth","feed_url":"https://swiftindepth.com/feed.xml","site_url":"https://www.swiftindepth.com"},{"id":4844219,"created_at":"2019-05-05T14:47:08.443613Z","feed_id":1418311,"title":"Hal Mueller's Blog","feed_url":"https://halmueller.wordpress.com/feed/","site_url":"https://halmueller.wordpress.com"},{"id":4844218,"created_at":"2019-05-05T14:47:08.443605Z","feed_id":1578271,"title":"Dušan Tadić","feed_url":"https://www.dusantadic.dev/index.xml","site_url":"https://www.dusantadic.dev/"},{"id":4844217,"created_at":"2019-05-05T14:47:08.411672Z","feed_id":1221779,"title":"Accidentally in Code","feed_url":"https://cate.blog/feed/","site_url":"https://cate.blog"},{"id":4844216,"created_at":"2019-05-05T14:47:08.404321Z","feed_id":1463706,"title":"NSHipster","feed_url":"https://nshipster.com/feed.xml","site_url":"https://nshipster.com/"},{"id":4844215,"created_at":"2019-05-05T14:47:08.388329Z","feed_id":1578299,"title":"Mike Mikina","feed_url":"https://mikemikina.com/feed.xml","site_url":"https://mikemikina.com/"},{"id":4844214,"created_at":"2019-05-05T14:47:08.357576Z","feed_id":1078919,"title":"Natasha The Robot","feed_url":"https://www.natashatherobot.com/feed/","site_url":"https://www.natashatherobot.com"},{"id":4844213,"created_at":"2019-05-05T14:47:08.326167Z","feed_id":1596199,"title":"don’t panic","feed_url":"https://www.timekl.com/atom.xml","site_url":"https://timekl.com/"},{"id":4844212,"created_at":"2019-05-05T14:47:08.287891Z","feed_id":1486828,"title":"Swift Post","feed_url":"https://theswiftpost.co/feed/","site_url":"https://theswiftpost.co"},{"id":4844211,"created_at":"2019-05-05T14:47:08.238928Z","feed_id":874888,"title":"The Red Queen Coder","feed_url":"http://redqueencoder.com/feed/","site_url":"http://redqueencoder.com"},{"id":4844210,"created_at":"2019-05-05T14:47:08.214067Z","feed_id":1578282,"title":"Stories by Fady Derias on Medium","feed_url":"https://medium.com/feed/@fadiderias","site_url":"https://medium.com/@fadiderias?source=rss-da92204bda7b------2"},{"id":4844209,"created_at":"2019-05-05T14:47:08.180467Z","feed_id":961696,"title":"Figure","feed_url":"http://www.figure.ink/blog?format=RSS","site_url":"http://www.figure.ink/"},{"id":4844208,"created_at":"2019-05-05T14:47:08.177752Z","feed_id":1377938,"title":"Dirk Holtwick","feed_url":"https://holtwick.de/atom.xml","site_url":"https://holtwick.de/"},{"id":4844207,"created_at":"2019-05-05T14:47:08.141394Z","feed_id":1449461,"title":"SwiftRocks","feed_url":"https://swiftrocks.com/rss.xml","site_url":"https://swiftrocks.com"},{"id":4844206,"created_at":"2019-05-05T14:47:08.137608Z","feed_id":1424885,"title":"Under The Bridge","feed_url":"https://www.alexcurylo.com/feed/","site_url":"https://www.alexcurylo.com"},{"id":4844205,"created_at":"2019-05-05T14:47:08.123407Z","feed_id":989928,"title":"Ramblings from Jessie","feed_url":"https://blog.jessfraz.com/index.xml","site_url":"https://blog.jessfraz.com/index.xml"},{"id":4844204,"created_at":"2019-05-05T14:47:08.115960Z","feed_id":1389178,"title":"Khawer Khaliq","feed_url":"https://khawerkhaliq.com/feed/","site_url":"https://khawerkhaliq.com"},{"id":4844203,"created_at":"2019-05-05T14:47:08.111950Z","feed_id":1481847,"title":"Kaya Thomas","feed_url":"https://kayathomas.info/feed/","site_url":"https://kayathomas.info"},{"id":4844202,"created_at":"2019-05-05T14:47:08.111002Z","feed_id":1150642,"title":"The.Swift.Dev.","feed_url":"https://theswiftdev.com/rss/","site_url":"https://theswiftdev.com/"},{"id":4844201,"created_at":"2019-05-05T14:47:08.092606Z","feed_id":1578279,"title":"Stories by Marcin Jackowski on Medium","feed_url":"https://medium.com/feed/@marcinjackowski","site_url":"https://medium.com/@marcinjackowski?source=rss-6c77af54b675------2"},{"id":4844200,"created_at":"2019-05-05T14:47:08.092099Z","feed_id":1487018,"title":"Paulo's Blog | Programming, technology, running a business and everything else","feed_url":"https://pfandrade.me/index.xml","site_url":"https://pfandrade.me/"},{"id":4844199,"created_at":"2019-05-05T14:47:08.091202Z","feed_id":1346114,"title":"Pedro Piñera","feed_url":"http://ppinera.es/feed.xml","site_url":"https://ppinera.es"},{"id":4844198,"created_at":"2019-05-05T14:47:08.077033Z","feed_id":1424889,"title":"agostini.tech","feed_url":"https://agostini.tech/feed/","site_url":"https://agostini.tech"},{"id":4844197,"created_at":"2019-05-05T14:47:08.070911Z","feed_id":1012582,"title":"Ilya Puchka","feed_url":"http://ilya.puchka.me/rss/","site_url":"http://ilya.puchka.me/"},{"id":4844196,"created_at":"2019-05-05T14:47:08.062250Z","feed_id":1424878,"title":"Matteo Manferdini","feed_url":"https://matteomanferdini.com/feed/","site_url":"https://matteomanferdini.com"},{"id":4844194,"created_at":"2019-05-05T14:47:08.059731Z","feed_id":1095014,"title":"Rhonabwy","feed_url":"https://rhonabwy.com/feed/","site_url":"https://rhonabwy.com"},{"id":4844195,"created_at":"2019-05-05T14:47:08.059703Z","feed_id":1578284,"title":"Noah Gilmore","feed_url":"https://noahgilmore.com/blog/ios.xml","site_url":"https://noahgilmore.com"},{"id":4844193,"created_at":"2019-05-05T14:47:08.053782Z","feed_id":1377354,"title":"Hillel Wayne","feed_url":"https://www.hillelwayne.com/index.xml","site_url":"https://www.hillelwayne.com/"},{"id":4844192,"created_at":"2019-05-05T14:47:08.040977Z","feed_id":1510180,"title":"Editors Cut","feed_url":"https://editorscut.com/rss.xml","site_url":"http://www.editorscut.com/Blog/"},{"id":4844191,"created_at":"2019-05-05T14:47:08.037327Z","feed_id":1578292,"title":"ultrajoke","feed_url":"https://blog.spacemanlabs.com/feed/","site_url":"https://blog.spacemanlabs.com"},{"id":4844190,"created_at":"2019-05-05T14:47:08.029288Z","feed_id":1388622,"title":"Alexander Grebenyuk","feed_url":"http://kean.github.io/feed.xml","site_url":"http://kean.github.io/"},{"id":4844189,"created_at":"2019-05-05T14:47:08.025459Z","feed_id":1296383,"title":"inessential","feed_url":"http://inessential.com/feed.json","site_url":"http://inessential.com/"},{"id":4844188,"created_at":"2019-05-05T14:47:08.024880Z","feed_id":1578300,"title":"Stories by Niamh Power on Medium","feed_url":"https://medium.com/feed/@niamhpower","site_url":"https://medium.com/@niamhpower?source=rss-61de4ad69c14------2"},{"id":4844186,"created_at":"2019-05-05T14:47:08.022947Z","feed_id":1578275,"title":"Stories by Adrian Śliwa on Medium","feed_url":"https://medium.com/feed/@adrianmsliwa","site_url":"https://medium.com/@adrianmsliwa?source=rss-e68597695f05------2"},{"id":4844187,"created_at":"2019-05-05T14:47:08.022916Z","feed_id":25184,"title":"iOS App Dev Libraries, Controls, Tutorials, Examples and Tools","feed_url":"http://feeds.feedburner.com/maniacdev","site_url":"https://maniacdev.com"},{"id":4844185,"created_at":"2019-05-05T14:47:08.020517Z","feed_id":1505017,"title":"Stories by Geoff Hackworth on Medium","feed_url":"https://medium.com/feed/@hacknicity","site_url":"https://medium.com/@hacknicity?source=rss-4a59fa99a5c4------2"},{"id":4844184,"created_at":"2019-05-05T14:47:08.012652Z","feed_id":1237279,"title":"iOScreator","feed_url":"https://www.ioscreator.com/tutorials?format=RSS","site_url":"https://www.ioscreator.com/"},{"id":4844183,"created_at":"2019-05-05T14:47:08.008472Z","feed_id":1572820,"title":"High Caffeine Content","feed_url":"https://www.highcaffeinecontent.com/blog/rss.xml","site_url":"https://www.highcaffeinecontent.com/blog/"},{"id":4844182,"created_at":"2019-05-05T14:47:07.988835Z","feed_id":1578288,"title":"Stories by Serhii Kharauzov on Medium","feed_url":"https://medium.com/feed/@sergkharauzov","site_url":"https://medium.com/@sergkharauzov?source=rss-435333b617b0------2"},{"id":4844181,"created_at":"2019-05-05T14:47:07.983344Z","feed_id":1399906,"title":"Elegant Chaos","feed_url":"http://elegantchaos.com/rss.xml","site_url":"http://elegantchaos.com"},{"id":4844180,"created_at":"2019-05-05T14:47:07.979514Z","feed_id":1486836,"title":"SwiftLee","feed_url":"https://www.avanderlee.com/feed/","site_url":"https://www.avanderlee.com"},{"id":4844179,"created_at":"2019-05-05T14:47:07.975933Z","feed_id":1424887,"title":"Stories by Bartosz Polaczyk on Medium","feed_url":"https://medium.com/feed/@londeix","site_url":"https://medium.com/@londeix?source=rss-455e6a104b5e------2"},{"id":4844178,"created_at":"2019-05-05T14:47:07.942886Z","feed_id":1506640,"title":"Cole's Huginn","feed_url":"http://www.colejoplin.com/feed/","site_url":"http://www.colejoplin.com"},{"id":4844177,"created_at":"2019-05-05T14:47:07.918621Z","feed_id":861611,"title":"Russ Bishop","feed_url":"http://www.russbishop.net/feed","site_url":"http://www.russbishop.net"},{"id":4844176,"created_at":"2019-05-05T14:47:07.915789Z","feed_id":1418314,"title":"iOS – Marc Palmer","feed_url":"https://marcpalmer.net/category/ios/feed/","site_url":"https://marcpalmer.net"},{"id":4844175,"created_at":"2019-05-05T14:47:07.914281Z","feed_id":1239214,"title":"Weaponized Fluff","feed_url":"https://apontious.com/feed/","site_url":"https://apontious.com"},{"id":4844174,"created_at":"2019-05-05T14:47:07.896027Z","feed_id":1153329,"title":"iJoshSmith","feed_url":"https://ijoshsmith.com/feed/","site_url":"https://ijoshsmith.com"},{"id":4844173,"created_at":"2019-05-05T14:47:07.895292Z","feed_id":26795,"title":"David Barnard - Blog","feed_url":"http://davidbarnard.com/rss","site_url":"http://davidbarnard.com/"},{"id":4844172,"created_at":"2019-05-05T14:47:07.884701Z","feed_id":1119253,"title":"rx_marin\u0026lt;blog\u0026gt;","feed_url":"http://rx-marin.com/index.xml","site_url":"http://rx-marin.com/"},{"id":4844171,"created_at":"2019-05-05T14:47:07.875871Z","feed_id":1511092,"title":"JP Simard","feed_url":"https://www.jpsim.com/atom.xml","site_url":"https://jpsim.com/"},{"id":4844170,"created_at":"2019-05-05T14:47:07.866418Z","feed_id":1501797,"title":"Rambo.codes","feed_url":"https://rambo.codes/feed.xml","site_url":"https://rambo.codes/"},{"id":4844169,"created_at":"2019-05-05T14:47:07.862213Z","feed_id":1149420,"title":"WordPress Tavern","feed_url":"https://wptavern.com/feed","site_url":"https://wptavern.com"},{"id":4844167,"created_at":"2019-05-05T14:47:07.856616Z","feed_id":913020,"title":"Conrad Stoll","feed_url":"http://conradstoll.com/blog?format=RSS","site_url":"http://conradstoll.com/"},{"id":4844168,"created_at":"2019-05-05T14:47:07.854661Z","feed_id":1367414,"title":"iOS Dev Tools","feed_url":"https://iosdev.tools/rss.php","site_url":"https://iosdev.tools"},{"id":4844166,"created_at":"2019-05-05T14:47:07.824198Z","feed_id":95556,"title":"Khanlou","feed_url":"http://khanlou.com/feed/","site_url":"http://khanlou.com/"},{"id":4844165,"created_at":"2019-05-05T14:47:07.822535Z","feed_id":1510178,"title":"busybee: Plaidophile","feed_url":"https://beesbuzz.biz/blog/feed","site_url":"https://beesbuzz.biz/blog/chatter/6384-Test-post"},{"id":4844164,"created_at":"2019-05-05T14:47:07.807685Z","feed_id":1576799,"title":"Jason Zurita's Blog","feed_url":"https://www.jasonzurita.com/feed.xml","site_url":"http://jasonzurita.com"},{"id":4844163,"created_at":"2019-05-05T14:47:07.804058Z","feed_id":1274281,"title":"The Desolation of Blog","feed_url":"https://lapcatsoftware.com/articles/atom.xml","site_url":"http://lapcatsoftware.com/articles/index.html"},{"id":4844162,"created_at":"2019-05-05T14:47:07.799707Z","feed_id":1069647,"title":"Swift.org","feed_url":"https://swift.org/atom.xml","site_url":""},{"id":4844161,"created_at":"2019-05-05T14:47:07.794207Z","feed_id":1192662,"title":"Ole Begemann","feed_url":"https://oleb.net/blog/atom.xml","site_url":"https://oleb.net/blog/"},{"id":4844160,"created_at":"2019-05-05T14:47:07.762971Z","feed_id":1365909,"title":"Timac","feed_url":"https://blog.timac.org/index.xml","site_url":"https://blog.timac.org/"},{"id":4844159,"created_at":"2019-05-05T14:47:07.746643Z","feed_id":1486826,"title":"YASB","feed_url":"https://www.vadimbulavin.com/feed","site_url":"http://www.vadimbulavin.com"},{"id":4844158,"created_at":"2019-05-05T14:47:07.706292Z","feed_id":74,"title":"furbo.org","feed_url":"http://furbo.org/feed/","site_url":"https://furbo.org"},{"id":4844157,"created_at":"2019-05-05T14:47:07.656125Z","feed_id":17463,"title":"Colin Devroe","feed_url":"http://cdevroe.com/feed/","site_url":"http://cdevroe.com"},{"id":4844156,"created_at":"2019-05-05T14:47:07.652342Z","feed_id":1376302,"title":"Stories by Pablo Villar on Medium","feed_url":"https://medium.com/feed/@volbap","site_url":"https://medium.com/@volbap?source=rss-2261535f21e------2"},{"id":4844155,"created_at":"2019-05-05T14:47:07.639608Z","feed_id":1578277,"title":"Gabriel Theodoropoulos","feed_url":"https://gtiapps.com/?feed=rss2","site_url":"https://gtiapps.com"},{"id":4844154,"created_at":"2019-05-05T14:47:07.564036Z","feed_id":1074742,"title":"Marco.org","feed_url":"https://marco.org/rss","site_url":"https://marco.org/"},{"id":4844153,"created_at":"2019-05-05T14:47:07.551449Z","feed_id":35102,"title":"Jared Sinclair","feed_url":"http://blog.jaredsinclair.com/rss","site_url":"https://jaredsinclair.com/"},{"id":4844152,"created_at":"2019-05-05T14:47:07.542591Z","feed_id":1296380,"title":"The Shape of Everything","feed_url":"http://shapeof.com/feed.json","site_url":"http://shapeof.com/"},{"id":4844151,"created_at":"2019-05-05T14:47:07.508610Z","feed_id":1578287,"title":"Stories by Ross Butler on Medium","feed_url":"https://medium.com/feed/@rwbutler","site_url":"https://medium.com/@rwbutler?source=rss-48f7d614a0e6------2"},{"id":4844150,"created_at":"2019-05-05T14:47:07.401523Z","feed_id":1338599,"title":"Swift Developer News - Hacking with Swift","feed_url":"https://www.hackingwithswift.com/articles/rss","site_url":"https://www.hackingwithswift.com/articles/rss"},{"id":4844149,"created_at":"2019-05-05T14:47:07.400748Z","feed_id":1291156,"title":"Swift by Sundell","feed_url":"https://www.swiftbysundell.com/?format=rss","site_url":"https://www.swiftbysundell.com/"},{"id":4844148,"created_at":"2019-05-05T14:47:07.388422Z","feed_id":1200837,"title":"Julia Evans","feed_url":"https://jvns.ca/atom.xml","site_url":"http://jvns.ca"},{"id":4844147,"created_at":"2019-05-05T14:47:07.346638Z","feed_id":1424881,"title":"Recoursive","feed_url":"https://recoursive.com/tag/ios/index.xml","site_url":"http://recoursive.com"},{"id":4844146,"created_at":"2019-05-05T14:47:07.343782Z","feed_id":1505579,"title":"A Lazy Sequence","feed_url":"https://brehaut.net/feeds/everything.json","site_url":"https://brehaut.net/"},{"id":4844145,"created_at":"2019-05-05T14:47:07.298274Z","feed_id":1388351,"title":"Stories by Raul Riera on Medium","feed_url":"https://medium.com/feed/@raulriera","site_url":"https://medium.com/@raulriera?source=rss-8501090bb2de------2"},{"id":4844144,"created_at":"2019-05-05T14:47:07.281812Z","feed_id":1303511,"title":"Belle B. Cooper","feed_url":"http://blog.bellebcooper.com/feeds/all.atom.xml","site_url":"http://blog.bellebcooper.com/"},{"id":4844143,"created_at":"2019-05-05T14:47:07.234534Z","feed_id":1519998,"title":"metablog","feed_url":"https://blog.metaobject.com/feeds/posts/default","site_url":"https://blog.metaobject.com/"},{"id":4844142,"created_at":"2019-05-05T14:47:07.227808Z","feed_id":1578272,"title":"Stories by Emilio Peláez on Medium","feed_url":"https://medium.com/feed/@Pelaez","site_url":"https://medium.com/@Pelaez?source=rss-aff864e8163------2"},{"id":4844141,"created_at":"2019-05-05T14:47:07.131292Z","feed_id":1486815,"title":"Max Desiatov","feed_url":"https://desiatov.com/rss.xml","site_url":"https://desiatov.com"},{"id":4844140,"created_at":"2019-05-05T14:47:07.067485Z","feed_id":16340,"title":"Erica Sadun","feed_url":"http://ericasadun.com/feed/","site_url":"https://ericasadun.com"},{"id":4844139,"created_at":"2019-05-05T14:47:06.953642Z","feed_id":1525506,"title":"Pierre Felgines","feed_url":"https://felginep.github.io/feed.xml","site_url":"https://felginep.github.io/"},{"id":4844137,"created_at":"2019-05-05T14:47:06.694409Z","feed_id":1578273,"title":"Stories by Gwenn Guihal on Medium","feed_url":"https://medium.com/feed/@_myrddin_","site_url":"https://medium.com/@_myrddin_?source=rss-aae4165d399------2"},{"id":4844136,"created_at":"2019-05-05T14:47:06.584185Z","feed_id":1359517,"title":"A+ programming moments","feed_url":"http://aplus.rs/index.xml","site_url":"http://aplus.rs/"},{"id":4844135,"created_at":"2019-05-05T14:47:06.569933Z","feed_id":1270217,"title":"kristina.io","feed_url":"https://kristina.io/feed/","site_url":"https://kristina.io"},{"id":4844134,"created_at":"2019-05-05T14:47:06.532979Z","feed_id":1021976,"title":"Andrew Bancroft","feed_url":"https://www.andrewcbancroft.com/feed/","site_url":"https://www.andrewcbancroft.com"},{"id":4844133,"created_at":"2019-05-05T14:47:06.522510Z","feed_id":860220,"title":"Arek Holko","feed_url":"http://feeds.feedburner.com/ArkadiuszHolko","site_url":"https://holko.pl"},{"id":4844132,"created_at":"2019-05-05T14:47:06.401434Z","feed_id":1223531,"title":"Roland Leth","feed_url":"https://rolandleth.com/feed","site_url":"https://rolandleth.com"},{"id":4844131,"created_at":"2019-05-05T14:47:06.373829Z","feed_id":1578296,"title":"Brian Donohue – Makin’ that Instapaper","feed_url":"http://bthdonohue.com/feed.xml","site_url":"/"},{"id":4844130,"created_at":"2019-05-05T14:47:06.281801Z","feed_id":1017026,"title":"mokacoding","feed_url":"http://www.mokacoding.com/feed.xml","site_url":"http://www.mokacoding.com"},{"id":4844129,"created_at":"2019-05-05T14:47:06.256960Z","feed_id":1381532,"title":"martinmitrevski","feed_url":"https://martinmitrevski.com/feed/","site_url":"https://martinmitrevski.com"},{"id":4844128,"created_at":"2019-05-05T14:47:06.032936Z","feed_id":1407941,"title":"Chris Eidhof","feed_url":"http://chris.eidhof.nl/index.xml","site_url":"http://chris.eidhof.nl/"},{"id":4844127,"created_at":"2019-05-05T14:47:05.949327Z","feed_id":4269,"title":"David Sinclair's blog","feed_url":"http://www.dejal.com/blog/feed","site_url":"http://www.dejal.com/blog/2"},{"id":4844126,"created_at":"2019-05-05T14:47:05.808587Z","feed_id":972279,"title":"Marcin Krzyżanowski","feed_url":"http://blog.krzyzanowskim.com/rss/","site_url":"https://blog.krzyzanowskim.com/"},{"id":4844125,"created_at":"2019-05-05T14:47:05.798590Z","feed_id":1539758,"title":"Zoë Smith","feed_url":"https://www.zoesmith.io/index.xml","site_url":"/"},{"id":4844124,"created_at":"2019-05-05T14:47:05.747763Z","feed_id":1076603,"title":"Stories by Max Howell on Medium","feed_url":"https://medium.com/feed/@mxcl","site_url":"https://medium.com/@mxcl?source=rss-87f057c6e50c------2"},{"id":4844123,"created_at":"2019-05-05T14:47:05.694483Z","feed_id":694239,"title":"Bartosz Ciechanowski","feed_url":"http://ciechanowski.me/atom.xml","site_url":"https://ciechanow.ski/"},{"id":4844122,"created_at":"2019-05-05T14:47:05.691834Z","feed_id":1411746,"title":"Free - Extras","feed_url":"https://extras.waynewbishop.com/swift?format=rss","site_url":"https://extras.waynewbishop.com/swift/"},{"id":4844121,"created_at":"2019-05-05T14:47:05.598332Z","feed_id":1578285,"title":"Pedro Carrasco","feed_url":"https://pedrommcarrasco.github.io/atom.xml","site_url":"https://pedrommcarrasco.github.io/"},{"id":4844120,"created_at":"2019-05-05T14:47:05.566176Z","feed_id":1260873,"title":"Use Your Loaf - iOS Development News \u0026 Tips","feed_url":"https://useyourloaf.com/blog/rss.xml","site_url":"https://useyourloaf.com/blog/"},{"id":4844119,"created_at":"2019-05-05T14:47:05.539656Z","feed_id":1271644,"title":"Michael Tsai","feed_url":"https://mjtsai.com/blog/feed/","site_url":"https://mjtsai.com/blog"},{"id":4844118,"created_at":"2019-05-05T14:47:05.458457Z","feed_id":1082983,"title":"Ben Dodson's Blog - Freelance iPhone Developer and WallaBee Founder","feed_url":"https://bendodson.com/rss.xml","site_url":"https://bendodson.com/"},{"id":4844117,"created_at":"2019-05-05T14:47:05.360992Z","feed_id":1424893,"title":"William Boles","feed_url":"https://williamboles.me/rss/","site_url":"https://williamboles.me/"},{"id":4844116,"created_at":"2019-05-05T14:47:05.340796Z","feed_id":1023777,"title":"Appventure","feed_url":"http://appventure.me/rss-feed","site_url":"http://appventure.me"},{"id":4844115,"created_at":"2019-05-05T14:47:05.311925Z","feed_id":1574913,"title":"Stories by Alan on Medium","feed_url":"https://medium.com/feed/@alanzeino","site_url":"https://medium.com/@alanzeino?source=rss-9e185327ea4b------2"},{"id":4844113,"created_at":"2019-05-05T14:47:05.263791Z","feed_id":1418558,"title":"Stories by VAPOR on Medium","feed_url":"https://medium.com/feed/@codevapor","site_url":"https://medium.com/@codevapor?source=rss-26bf5124725c------2"},{"id":4844114,"created_at":"2019-05-05T14:47:05.263408Z","feed_id":1578278,"title":"Stories by Jean Mainguy on Medium","feed_url":"https://medium.com/feed/@jhandguy","site_url":"https://medium.com/@jhandguy?source=rss-60d6fa56fda3------2"},{"id":4844112,"created_at":"2019-05-05T14:47:05.249910Z","feed_id":1388263,"title":"Ben Scheirman","feed_url":"https://benscheirman.com/rss/","site_url":"https://benscheirman.com/"},{"id":4844111,"created_at":"2019-05-05T14:47:05.184013Z","feed_id":1578274,"title":"apoorva.","feed_url":"https://apoorvatyagi.com/feed/","site_url":"https://apoorvatyagi.com"},{"id":4844110,"created_at":"2019-05-05T14:47:05.167103Z","feed_id":1598316,"title":"Nate Thompson","feed_url":"https://www.natethompson.io///feed.xml","site_url":"http://www.natethompson.io/"},{"id":4844109,"created_at":"2019-05-05T14:47:05.157808Z","feed_id":1418313,"title":"finestructure","feed_url":"https://finestructure.co/blog?format=RSS","site_url":"https://finestructure.co/"},{"id":4844108,"created_at":"2019-05-05T14:47:05.135649Z","feed_id":1423653,"title":"Indie Stack","feed_url":"https://indiestack.com/feed/","site_url":"https://indiestack.com"},{"id":4844107,"created_at":"2019-05-05T14:47:05.098990Z","feed_id":1372247,"title":"Kombi Life","feed_url":"https://kombilife.com/feed/","site_url":"https://kombilife.com"},{"id":4844106,"created_at":"2019-05-05T14:47:05.084425Z","feed_id":1424883,"title":"The Always Right Institute","feed_url":"https://www.alwaysrightinstitute.com/feed","site_url":"http://alwaysrightinstitute.github.io/"},{"id":4844105,"created_at":"2019-05-05T14:47:05.028470Z","feed_id":1255081,"title":"Tales of a vanlife couple","feed_url":"http://www.van-tramp.com/wp/feed/","site_url":"https://www.van-tramp.com/wp"},{"id":4844103,"created_at":"2019-05-05T14:47:05.001731Z","feed_id":1510174,"title":"Authentic Asheville","feed_url":"https://authenticavl.com/feed/","site_url":"https://authenticavl.com"},{"id":4844102,"created_at":"2019-05-05T14:47:04.976094Z","feed_id":1510177,"title":"Vanvaya","feed_url":"https://vanvaya.com/feed/","site_url":"https://vanvaya.com"},{"id":4844100,"created_at":"2019-05-05T14:47:04.973714Z","feed_id":1510173,"title":"Westfalia Digital Nomads","feed_url":"https://westfaliadigitalnomads.com/feed/","site_url":"https://westfaliadigitalnomads.com"},{"id":4844101,"created_at":"2019-05-05T14:47:04.971987Z","feed_id":1510183,"title":"Traipsing About","feed_url":"https://www.traipsingabout.com/feed/","site_url":"https://www.traipsingabout.com"},{"id":4844104,"created_at":"2019-05-05T14:47:04.970946Z","feed_id":1510185,"title":"Campervan.Life","feed_url":"https://campervanlife.eu/feed/","site_url":"https://campervanlife.eu"},{"id":4844099,"created_at":"2019-05-05T14:47:04.929305Z","feed_id":1510172,"title":"Blog - Kaya Lindsay","feed_url":"https://www.onechicktravels.com/blog?format=RSS","site_url":"https://www.onechicktravels.com/blog/"},{"id":4844098,"created_at":"2019-05-05T14:47:04.927363Z","feed_id":1510181,"title":"Travel Therapy – Tiny Van Big Living","feed_url":"http://tinyvanbigliving.com/category/travel-therapy/feed/","site_url":"http://tinyvanbigliving.com"},{"id":4844097,"created_at":"2019-05-05T14:47:04.917864Z","feed_id":1510186,"title":"What’s New – WE'RE THE RUSSOS","feed_url":"https://weretherussos.com/category/all/feed/","site_url":"https://weretherussos.com"},{"id":4844096,"created_at":"2019-05-05T14:47:04.912674Z","feed_id":1356567,"title":"Ruby on Wheels","feed_url":"https://ruby-on-wheels.github.io/feed.xml","site_url":"https://ruby-on-wheels.github.io/"},{"id":4844095,"created_at":"2019-05-05T14:47:04.910023Z","feed_id":1156884,"title":"Nomads With a Van","feed_url":"http://www.nomadswithavan.com/feed/","site_url":"http://www.nomadswithavan.com"},{"id":4844094,"created_at":"2019-05-05T14:47:04.888291Z","feed_id":1510189,"title":"Vandog Traveller","feed_url":"https://vandogtraveller.com/feed/","site_url":"https://vandogtraveller.com"},{"id":4844093,"created_at":"2019-05-05T14:47:04.886203Z","feed_id":1261027,"title":"Blog - A Girl and Her Van","feed_url":"http://www.agirlandhervan.com/where-am-i?format=RSS","site_url":"http://www.agirlandhervan.com/where-am-i/"},{"id":4844092,"created_at":"2019-05-05T14:47:04.882624Z","feed_id":1510176,"title":"Van life – Bearfoot Theory","feed_url":"https://bearfoottheory.com/category/van-life/feed/","site_url":"https://bearfoottheory.com"},{"id":4844091,"created_at":"2019-05-05T14:47:04.874064Z","feed_id":1510175,"title":"VanlifeMagazine.co","feed_url":"http://vanlifemagazine.co/feed/","site_url":"https://vanlifemagazine.co"},{"id":4844090,"created_at":"2019-05-05T14:47:04.846407Z","feed_id":1510179,"title":"beanies \u0026 bikinis","feed_url":"http://beaniesandbikinisblog.com/feed/","site_url":"http://beaniesandbikinisblog.com"},{"id":4844089,"created_at":"2019-05-05T14:47:04.830976Z","feed_id":1470170,"title":"Gaia GPS","feed_url":"https://blog.gaiagps.com/feed/","site_url":"https://blog.gaiagps.com"},{"id":4844088,"created_at":"2019-05-05T14:47:04.827437Z","feed_id":1124009,"title":"Stories by Jean-Louis Gassée on Medium","feed_url":"https://medium.com/feed/@gassee","site_url":"https://medium.com/@gassee?source=rss-d6c6baafd47d------2"},{"id":4844087,"created_at":"2019-05-05T14:47:04.820397Z","feed_id":1347890,"title":"Gnomad Home","feed_url":"https://gnomadhome.com/feed/","site_url":"https://gnomadhome.com"},{"id":4844086,"created_at":"2019-05-05T14:47:04.808498Z","feed_id":1568536,"title":"4WD Action","feed_url":"https://www.youtube.com/feeds/videos.xml?channel_id=UCs-vWZu3t2ky3oImX83S_2Q","site_url":"https://www.youtube.com/channel/UCs-vWZu3t2ky3oImX83S_2Q"},{"id":4844085,"created_at":"2019-05-05T14:47:04.787238Z","feed_id":1510182,"title":"Blog – Escape Campervans","feed_url":"https://www.escapecampervans.com/blog/feed/","site_url":"https://www.escapecampervans.com"},{"id":4844084,"created_at":"2019-05-05T14:47:04.778405Z","feed_id":435047,"title":"Dana Blankenhorn","feed_url":"http://feeds.feedburner.com/danablankenhorn/gfvj","site_url":"https://www.danablankenhorn.com/"},{"id":4844083,"created_at":"2019-05-05T14:47:04.766230Z","feed_id":1510190,"title":"Mr and Mrs Adventure","feed_url":"https://mrandmrsadventure.com/feed/","site_url":"https://mrandmrsadventure.com"},{"id":4844082,"created_at":"2019-05-05T14:47:04.754809Z","feed_id":1320757,"title":"Bearfoot Theory","feed_url":"https://bearfoottheory.com/feed/","site_url":"https://bearfoottheory.com"},{"id":4844081,"created_at":"2019-05-05T14:47:04.749166Z","feed_id":1304436,"title":"Scripting News","feed_url":"http://scripting.com/rss.json","site_url":"http://scripting.com"},{"id":4844080,"created_at":"2019-05-05T14:47:04.741306Z","feed_id":1243036,"title":"On my Om","feed_url":"https://om.co/feed/","site_url":"https://om.co"},{"id":4844079,"created_at":"2019-05-05T14:47:04.732549Z","feed_id":1601,"title":"Asymco","feed_url":"http://www.asymco.com/feed/","site_url":"http://www.asymco.com"},{"id":4844078,"created_at":"2019-05-05T14:47:04.693753Z","feed_id":18627,"title":"Benjamin Mayo","feed_url":"http://feeds.feedburner.com/BenjaminMayo","site_url":"http://benjaminmayo.co.uk/"},{"id":4844077,"created_at":"2019-05-05T14:47:04.667780Z","feed_id":117722,"title":"Stratechery by Ben Thompson","feed_url":"http://stratechery.com/feed/","site_url":"https://stratechery.com"},{"id":4844076,"created_at":"2019-05-05T14:47:04.667023Z","feed_id":1298812,"title":"Manton Reece","feed_url":"http://www.manton.org/feed/json","site_url":"https://www.manton.org/"},{"id":4844075,"created_at":"2019-05-05T14:47:04.664541Z","feed_id":1296379,"title":"Daring Fireball","feed_url":"https://daringfireball.net/feeds/json","site_url":"https://daringfireball.net/"},{"id":4844074,"created_at":"2019-05-05T14:47:04.655345Z","feed_id":670040,"title":"Cocoaphony","feed_url":"http://robnapier.net/atom.xml","site_url":"https://robnapier.net/"}] diff --git a/Frameworks/Account/AccountTests/TestTransport.swift b/Frameworks/Account/AccountTests/TestTransport.swift index 2f6e1c4bc..781edc98b 100644 --- a/Frameworks/Account/AccountTests/TestTransport.swift +++ b/Frameworks/Account/AccountTests/TestTransport.swift @@ -24,10 +24,17 @@ final class TestTransport: Transport { return } - let testFileName = testFiles[urlString]! - let testFileURL = Bundle(for: TestTransport.self).resourceURL!.appendingPathComponent(testFileName) - let data = try! Data(contentsOf: testFileURL) - completion(.success((HTTPHeaders(), data))) + if let testFileName = testFiles[urlString] { + let testFileURL = Bundle(for: TestTransport.self).resourceURL!.appendingPathComponent(testFileName) + let data = try! Data(contentsOf: testFileURL) + DispatchQueue.global(qos: .background).async { + completion(.success((HTTPHeaders(), data))) + } + } else { + DispatchQueue.global(qos: .background).async { + completion(.success((HTTPHeaders(), nil))) + } + } } diff --git a/Frameworks/Account/Feedbin/FeedbinAPICaller.swift b/Frameworks/Account/Feedbin/FeedbinAPICaller.swift index f5a5f55ea..a21ba0984 100644 --- a/Frameworks/Account/Feedbin/FeedbinAPICaller.swift +++ b/Frameworks/Account/Feedbin/FeedbinAPICaller.swift @@ -93,6 +93,46 @@ final class FeedbinAPICaller: NSObject { } + func retrieveSubscriptions(completionHandler completion: @escaping (Result<[FeedbinSubscription]?, Error>) -> Void) { + + let callURL = feedbinBaseURL.appendingPathComponent("subscriptions.json") + let conditionalGet = accountMetadata?.conditionalGetInfo[AccountMetadata.ConditionalGetKeys.subscriptions] + let request = URLRequest(url: callURL, credentials: credentials, conditionalGet: conditionalGet) + + transport.send(request: request, resultType: [FeedbinSubscription].self) { [weak self] result in + + switch result { + case .success(let (headers, subscriptions)): + self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.subscriptions, headers: headers) + completion(.success(subscriptions)) + case .failure(let error): + completion(.failure(error)) + } + + } + + } + + func retrieveIcons(completionHandler completion: @escaping (Result<[FeedbinIcon]?, Error>) -> Void) { + + let callURL = feedbinBaseURL.appendingPathComponent("icons.json") + let conditionalGet = accountMetadata?.conditionalGetInfo[AccountMetadata.ConditionalGetKeys.icons] + let request = URLRequest(url: callURL, credentials: credentials, conditionalGet: conditionalGet) + + transport.send(request: request, resultType: [FeedbinIcon].self) { [weak self] result in + + switch result { + case .success(let (headers, icons)): + self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.icons, headers: headers) + completion(.success(icons)) + case .failure(let error): + completion(.failure(error)) + } + + } + + } + } // MARK: Private diff --git a/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift b/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift index 19368b4d6..ca3cbf8a5 100644 --- a/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift +++ b/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift @@ -39,12 +39,17 @@ final class FeedbinAccountDelegate: AccountDelegate { var refreshProgress = DownloadProgress(numberOfTasks: 0) func refreshAll(for account: Account, completion: (() -> Void)? = nil) { - refreshAll(account) { [weak self] result in + refreshFolders(account) { [weak self] result in switch result { case .success(): - completion?() + DispatchQueue.main.async { + completion?() + } case .failure(let error): - self?.handleError(error) + DispatchQueue.main.async { + completion?() +// self?.handleError(error) + } } } } @@ -54,10 +59,14 @@ final class FeedbinAccountDelegate: AccountDelegate { caller.renameTag(oldName: folder.name ?? "", newName: name) { result in switch result { case .success: - folder.name = name - completion(.success(())) + DispatchQueue.main.async { + folder.name = name + completion(.success(())) + } case .failure(let error): - completion(.failure(error)) + DispatchQueue.main.async { + completion(.failure(error)) + } } } @@ -74,12 +83,17 @@ final class FeedbinAccountDelegate: AccountDelegate { caller.deleteTag(name: folder.name ?? "") { result in switch result { case .success: - account.deleteFolder(folder) - // TODO: Take the serialized taggings and reestablish the folder to feed relationships. Deleting - // a tag on Feedbin doesn't any feeds. - completion(.success(())) + DispatchQueue.main.async { + + account.deleteFolder(folder) + // TODO: Take the serialized taggings and reestablish the folder to feed relationships. Deleting + // a tag on Feedbin doesn't any feeds. + completion(.success(())) + } case .failure(let error): - completion(.failure(error)) + DispatchQueue.main.async { + completion(.failure(error)) + } } } @@ -95,7 +109,9 @@ final class FeedbinAccountDelegate: AccountDelegate { let caller = FeedbinAPICaller(transport: transport) caller.credentials = credentials caller.validateCredentials() { result in - completion(result) + DispatchQueue.main.async { + completion(result) + } } } @@ -108,8 +124,7 @@ private extension FeedbinAccountDelegate { func handleError(_ error: Error) { // TODO: We should do a better job of error handling here. - // We need to prompt for credentials and provide user friendly - // errors. + // We need to prompt for credentials if they are expired. #if os(macOS) NSApplication.shared.presentError(error) #else @@ -117,13 +132,13 @@ private extension FeedbinAccountDelegate { #endif } - func refreshAll(_ account: Account, completion: @escaping (Result) -> Void) { + func refreshFolders(_ account: Account, completion: @escaping (Result) -> Void) { caller.retrieveTags { [weak self] result in switch result { case .success(let tags): self?.syncFolders(account, tags) - completion(.success(())) + self?.refreshFeeds(account, completion: completion) case .failure(let error): completion(.failure(error)) } @@ -141,7 +156,9 @@ private extension FeedbinAccountDelegate { if let folders = account.folders { folders.forEach { folder in if !tagNames.contains(folder.name ?? "") { - account.deleteFolder(folder) + DispatchQueue.main.sync { + account.deleteFolder(folder) + } } } } @@ -157,10 +174,81 @@ private extension FeedbinAccountDelegate { // Make any folders Feedbin has, but we don't tagNames.forEach { tagName in if !folderNames.contains(tagName) { - account.ensureFolder(with: tagName) + DispatchQueue.main.sync { + _ = account.ensureFolder(with: tagName) + } } } } + func refreshFeeds(_ account: Account, completion: @escaping (Result) -> Void) { + caller.retrieveSubscriptions { [weak self] result in + switch result { + case .success(let subscriptions): + self?.syncFeeds(account, subscriptions) + self?.refreshFavicons(account, completion: completion) + case .failure(let error): + completion(.failure(error)) + } + } + + } + + func syncFeeds(_ account: Account, _ subscriptions: [FeedbinSubscription]?) { + guard let subscriptions = subscriptions else { return } + subscriptions.forEach { subscription in + syncFeed(account, subscription) + } + } + + func syncFeed(_ account: Account, _ subscription: FeedbinSubscription) { + + let subFeedId = String(subscription.feedID) + + DispatchQueue.main.sync { + if let feed = account.idToFeedDictionary[subFeedId] { + feed.name = subscription.name + feed.homePageURL = subscription.homePageURL + } else { + let feed = account.createFeed(with: subscription.name, editedName: nil, url: subscription.url, feedId: subFeedId, homePageURL: subscription.homePageURL) + account.addFeed(feed, to: nil) + } + } + + } + + func refreshFavicons(_ account: Account, completion: @escaping (Result) -> Void) { + + caller.retrieveIcons { [weak self] result in + switch result { + case .success(let icons): + self?.syncIcons(account, icons) + completion(.success(())) + case .failure(let error): + completion(.failure(error)) + } + } + + } + + func syncIcons(_ account: Account, _ icons: [FeedbinIcon]?) { + + guard let icons = icons else { return } + + let iconDict = Dictionary(uniqueKeysWithValues: icons.map { ($0.host, $0.url) } ) + + for feed in account.flattenedFeeds() { + for (key, value) in iconDict { + if feed.homePageURL?.contains(key) ?? false { + DispatchQueue.main.sync { + feed.faviconURL = value + } + break + } + } + } + + } + } diff --git a/Frameworks/Account/Feedbin/FeedbinArticle.swift b/Frameworks/Account/Feedbin/FeedbinArticle.swift deleted file mode 100644 index 574c230d8..000000000 --- a/Frameworks/Account/Feedbin/FeedbinArticle.swift +++ /dev/null @@ -1,106 +0,0 @@ -// -// FeedbinArticle.swift -// Account -// -// Created by Brent Simmons on 12/11/17. -// Copyright © 2017 Ranchero Software, LLC. All rights reserved. -// - -import Foundation -import RSParser -import RSCore - -struct FeedbinArticle { - - // https://github.com/feedbin/feedbin-api/blob/master/content/entries.md - // https://github.com/feedbin/feedbin-api/blob/master/content/updated-entries.md - // - // "id": 2077, - // "feed_id": 135, - // "title": "Objective-C Runtime Releases", - // "url": "http:\/\/mjtsai.com\/blog\/2013\/02\/02\/objective-c-runtime-releases\/", - // "author": "Michael Tsai", - // "content": "

Bavarious<\/a> created a GitHub repository<\/a> that shows the differences between versions of Apple\u2019s Objective-C runtime<\/a> that shipped with different versions of Mac OS X.<\/p>", - // "summary": "Bavarious created a GitHub repository that shows the differences between versions of Apple\u2019s Objective-C runtime that shipped with different versions of Mac OS X.", - // "published": "2013-02-03T01:00:19.000000Z", - // "created_at": "2013-02-04T01:00:19.127893Z" - - let articleID: Int - let feedID: Int - let title: String? - let url: String? - let authorName: String? - let contentHTML: String? - let contentDiffHTML: String? - let summary: String? - let datePublished: Date? - let dateArrived: Date? - - struct Key { - static let articleID = "id" - static let feedID = "feed_id" - static let title = "title" - static let url = "url" - static let authorName = "author" - static let contentHTML = "content" - static let contentDiffHTML = "content_diff" - static let summary = "summary" - static let datePublished = "published" - static let dateArrived = "created_at" - } - - init?(jsonDictionary: JSONDictionary) { - guard let articleID = jsonDictionary[Key.articleID] as? Int else { - return nil - } - guard let feedID = jsonDictionary[Key.feedID] as? Int else { - return nil - } - self.articleID = articleID - self.feedID = feedID - - self.title = jsonDictionary[Key.title] as? String - self.url = jsonDictionary[Key.url] as? String - self.authorName = jsonDictionary[Key.authorName] as? String - - if let contentHTML = jsonDictionary[Key.contentHTML] as? String, !contentHTML.isEmpty { - self.contentHTML = contentHTML - } - else { - self.contentHTML = nil - } - - if let contentDiffHTML = jsonDictionary[Key.contentDiffHTML] as? String, !contentDiffHTML.isEmpty { - self.contentDiffHTML = contentDiffHTML - } - else { - self.contentDiffHTML = nil - } - - if let summary = jsonDictionary[Key.summary] as? String, !summary.isEmpty { - self.summary = summary - } - else { - self.summary = nil - } - - if let datePublishedString = jsonDictionary[Key.datePublished] as? String { - self.datePublished = RSDateWithString(datePublishedString) - } - else { - self.datePublished = nil - } - - if let dateArrivedString = jsonDictionary[Key.dateArrived] as? String { - self.dateArrived = RSDateWithString(dateArrivedString) - } - else { - self.dateArrived = nil - } - } - - static func articles(with array: JSONArray) -> [FeedbinArticle]? { - let articlesArray = array.compactMap { FeedbinArticle(jsonDictionary: $0) } - return articlesArray.isEmpty ? nil : articlesArray - } -} diff --git a/Frameworks/Account/Feedbin/FeedbinArticleIDArray.swift b/Frameworks/Account/Feedbin/FeedbinArticleIDArray.swift deleted file mode 100644 index 91627a881..000000000 --- a/Frameworks/Account/Feedbin/FeedbinArticleIDArray.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// FeedbinArticleIDArray.swift -// Account -// -// Created by Brent Simmons on 10/14/18. -// Copyright © 2018 Ranchero Software, LLC. All rights reserved. -// - -import Foundation - -struct FeedbinArticleIDArray { - - // https://github.com/feedbin/feedbin-api/blob/master/content/unread-entries.md - // - // [4087,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097] - - let articleIDs: [Int] - - init(jsonArray: [Any]) { - self.articleIDs = jsonArray.compactMap { $0 as? Int } - } -} diff --git a/Frameworks/Account/Feedbin/FeedbinEntry.swift b/Frameworks/Account/Feedbin/FeedbinEntry.swift new file mode 100644 index 000000000..240f29064 --- /dev/null +++ b/Frameworks/Account/Feedbin/FeedbinEntry.swift @@ -0,0 +1,39 @@ +// +// FeedbinArticle.swift +// Account +// +// Created by Brent Simmons on 12/11/17. +// Copyright © 2017 Ranchero Software, LLC. All rights reserved. +// + +import Foundation +import RSParser +import RSCore + +struct FeedbinEntry: Codable { + + let articleID: Int + let feedID: Int + let title: String? + let url: String? + let authorName: String? + let contentHTML: String? + let contentDiffHTML: String? + let summary: String? + let datePublished: Date? + let dateArrived: Date? + + enum CodingKeys: String, CodingKey { + case articleID = "id" + case feedID = "feed_id" + case title = "title" + case url = "url" + case authorName = "author" + case contentHTML = "content" + case contentDiffHTML = "content_diff" + case summary = "summary" + case datePublished = "published" + case dateArrived = "created_at" + } + +} diff --git a/Frameworks/Account/Feedbin/FeedbinIcon.swift b/Frameworks/Account/Feedbin/FeedbinIcon.swift new file mode 100644 index 000000000..cfb972641 --- /dev/null +++ b/Frameworks/Account/Feedbin/FeedbinIcon.swift @@ -0,0 +1,21 @@ +// +// FeedbinIcon.swift +// Account +// +// Created by Maurice Parker on 5/6/19. +// Copyright © 2019 Ranchero Software, LLC. All rights reserved. +// + +import Foundation + +struct FeedbinIcon: Codable { + + let host: String + let url: String + + enum CodingKeys: String, CodingKey { + case host + case url + } + +} diff --git a/Frameworks/Account/Feedbin/FeedbinSavedSearch.swift b/Frameworks/Account/Feedbin/FeedbinSavedSearch.swift deleted file mode 100644 index 460c6703c..000000000 --- a/Frameworks/Account/Feedbin/FeedbinSavedSearch.swift +++ /dev/null @@ -1,57 +0,0 @@ -// -// FeedbinSavedSearch.swift -// Account -// -// Created by Brent Simmons on 10/14/18. -// Copyright © 2018 Ranchero Software, LLC. All rights reserved. -// - -import Foundation - -struct FeedbinSavedSearch: Hashable { - - // https://github.com/feedbin/feedbin-api/blob/master/content/saved-searches.md - // - // [ - // { - // "id": 1, - // "name": "JavaScript", - // "query": "javascript is:unread" - // } - // ] - - let uniqueID: Int - let name: String - let query: String - - private struct Key { - static let uniqueID = "id" - static let name = "name" - static let query = "query" - } - - init?(jsonDictionary: [String: Any]) { - guard let uniqueID = jsonDictionary[Key.uniqueID] as? Int else { - return nil - } - guard let name = jsonDictionary[Key.name] as? String else { - return nil - } - guard let query = jsonDictionary[Key.query] as? String else { - return nil - } - self.uniqueID = uniqueID - self.name = name - self.query = query - } - - static func savedSearches(with jsonArray: [Any]) -> Set { - let searches = jsonArray.compactMap { (oneSearch) -> FeedbinSavedSearch? in - if let oneSearch = oneSearch as? [String: Any] { - return FeedbinSavedSearch(jsonDictionary: oneSearch) - } - return nil - } - return Set(searches) - } -} diff --git a/Frameworks/Account/Feedbin/FeedbinFeed.swift b/Frameworks/Account/Feedbin/FeedbinSubscription.swift similarity index 55% rename from Frameworks/Account/Feedbin/FeedbinFeed.swift rename to Frameworks/Account/Feedbin/FeedbinSubscription.swift index 835d296a3..326ac3e76 100644 --- a/Frameworks/Account/Feedbin/FeedbinFeed.swift +++ b/Frameworks/Account/Feedbin/FeedbinSubscription.swift @@ -10,20 +10,10 @@ import Foundation import RSCore import RSParser -struct FeedbinFeed: Codable { - - // https://github.com/feedbin/feedbin-api/blob/master/content/feeds.md - // - // "id": 525, - // "created_at": "2013-03-12T11:30:25.209432Z", - // "feed_id": 47, - // "title": "Daring Fireball", - // "feed_url": "http://daringfireball.net/index.xml", - // "site_url": "http://daringfireball.net/" +struct FeedbinSubscription: Codable { let subscriptionID: Int let feedID: Int - let creationDate: Date? let name: String? let url: String let homePageURL: String? @@ -31,7 +21,6 @@ struct FeedbinFeed: Codable { enum CodingKeys: String, CodingKey { case subscriptionID = "id" case feedID = "feed_id" - case creationDate = "created_at" case name = "title" case url = "feed_url" case homePageURL = "site_url" diff --git a/Frameworks/Account/Feedbin/FeedbinTag.swift b/Frameworks/Account/Feedbin/FeedbinTag.swift index 398228bb1..b7aaa6f58 100644 --- a/Frameworks/Account/Feedbin/FeedbinTag.swift +++ b/Frameworks/Account/Feedbin/FeedbinTag.swift @@ -8,7 +8,7 @@ import Foundation -struct FeedbinTag: Codable, Equatable, Hashable { +struct FeedbinTag: Codable { let tagID: Int let name: String diff --git a/Frameworks/Account/Feedbin/FeedbinTagging.swift b/Frameworks/Account/Feedbin/FeedbinTagging.swift index 66ce2335a..c379ae99f 100644 --- a/Frameworks/Account/Feedbin/FeedbinTagging.swift +++ b/Frameworks/Account/Feedbin/FeedbinTagging.swift @@ -8,7 +8,7 @@ import Foundation -struct FeedbinTagging: Codable, Equatable, Hashable { +struct FeedbinTagging: Codable { let taggingID: Int let feedID: Int diff --git a/Mac/MainWindow/AddFeed/AddFeedController.swift b/Mac/MainWindow/AddFeed/AddFeedController.swift index da0c9d7ca..5626320cd 100644 --- a/Mac/MainWindow/AddFeed/AddFeedController.swift +++ b/Mac/MainWindow/AddFeed/AddFeedController.swift @@ -170,9 +170,7 @@ private extension AddFeedController { return } - guard let feed = account.createFeed(with: titleFromFeed, editedName: userEnteredTitle, url: feedURLString) else { - return - } + let feed = account.createFeed(with: titleFromFeed, editedName: userEnteredTitle, url: feedURLString) if let parsedFeed = parsedFeed { account.update(feed, with: parsedFeed, {}) diff --git a/Mac/Scriptability/Feed+Scriptability.swift b/Mac/Scriptability/Feed+Scriptability.swift index 7e0ce5e71..87c674b0c 100644 --- a/Mac/Scriptability/Feed+Scriptability.swift +++ b/Mac/Scriptability/Feed+Scriptability.swift @@ -114,10 +114,7 @@ class ScriptableFeed: NSObject, UniqueIdScriptingObject, ScriptingObjectContaine if let parsedFeed = parsedFeedOptional { let titleFromFeed = parsedFeed.title - guard let feed = account.createFeed(with: titleFromFeed, editedName: titleFromArgs, url: url) else { - command.resumeExecution(withResult:nil) - return - } + let feed = account.createFeed(with: titleFromFeed, editedName: titleFromArgs, url: url) account.update(feed, with:parsedFeed, {}) // add the feed, putting it in a folder if needed diff --git a/iOS/Add/AddFeedViewController.swift b/iOS/Add/AddFeedViewController.swift index f92116a41..cbb2ddd94 100644 --- a/iOS/Add/AddFeedViewController.swift +++ b/iOS/Add/AddFeedViewController.swift @@ -220,10 +220,7 @@ private extension AddFeedViewController { return } - guard let feed = account.createFeed(with: titleFromFeed, editedName: userEnteredTitle, url: feedURLString) else { - delegate?.processingDidEnd() - return - } + let feed = account.createFeed(with: titleFromFeed, editedName: userEnteredTitle, url: feedURLString) if let parsedFeed = parsedFeed { account.update(feed, with: parsedFeed, {}) diff --git a/submodules/RSWeb b/submodules/RSWeb index d1d5eba95..4cf5b71a2 160000 --- a/submodules/RSWeb +++ b/submodules/RSWeb @@ -1 +1 @@ -Subproject commit d1d5eba957eefec54b9a8c8648024a389c2271f0 +Subproject commit 4cf5b71a292573c71ca212997a453f9158e95db2