diff options
Diffstat (limited to 'js-old/service/OPMLImporter.js')
-rw-r--r-- | js-old/service/OPMLImporter.js | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/js-old/service/OPMLImporter.js b/js-old/service/OPMLImporter.js new file mode 100644 index 000000000..b2b52bc4c --- /dev/null +++ b/js-old/service/OPMLImporter.js @@ -0,0 +1,111 @@ +/** + * Nextcloud - News + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Bernhard Posselt <dev@bernhard-posselt.com> + * @copyright Bernhard Posselt 2014 + */ +app.service('OPMLImporter', function (FeedResource, FolderResource, Publisher, $q) { + 'use strict'; + var startFeedJob = function (queue) { + var deferred = $q.defer(); + try { + if (queue.length > 0) { + var feed = queue.pop(); + var url = feed.url; + var title = feed.title; + var folderId = 0; + var folderName = feed.folderName; + + if (folderName !== undefined && + FolderResource.get(folderName) !== undefined) { + var folder = FolderResource.get(folderName); + folder.opened = true; + folderId = folder.id; + + // display folder while adding the feed + folder.getsFeed = true; + folder.getsFeedCounter = folder.getsFeedCounter || 0; + folder.getsFeedCounter += 1; + } + + // make sure to not add already existing feeds + if (url !== undefined && FeedResource.get(url) === undefined) { + FeedResource.create(url, folderId, title) + .then(function (data) { + Publisher.publishAll(data); + }) + .finally(function () { + if (folderId !== 0) { + folder.getsFeedCounter -= 1; + + if (folder.getsFeedCounter === 0) { + folder.getsFeed = false; + } + } + startFeedJob(queue); + }); + } + } else { + deferred.resolve(); + } + } catch (e) { + console.error(e); + deferred.resolve(); + } + + return deferred.promise; + }; + + this.importFolders = function (content) { + // assumption: folders are fast to create and we dont need a queue for + // them + var feedQueue = []; + var folderPromises = []; + content.folders.forEach(function (folder) { + if (folder.name !== undefined) { + // skip already created folders + if (FolderResource.get(folder.name) === undefined) { + var promise = FolderResource.create(folder.name) + .then(function (data) { + Publisher.publishAll(data); + }); + folderPromises.push(promise); + } + + folder.feeds.forEach(function (feed) { + feed.folderName = folder.name; + feedQueue.push(feed); + }); + } + }); + feedQueue = feedQueue.concat(content.feeds); + + var deferred = $q.defer(); + + $q.all(folderPromises).finally(function () { + deferred.resolve(feedQueue); + }); + + return deferred.promise; + }; + + this.importFeedQueue = function (feedQueue, jobSize) { + // queue feeds to prevent server slowdown + var deferred = $q.defer(); + + var jobPromises = []; + for (var i = 0; i < jobSize; i += 1) { + jobPromises.push(startFeedJob(feedQueue)); + } + + $q.all(jobPromises).then(function () { + deferred.resolve(); + }); + + return deferred.promise; + }; + +});
\ No newline at end of file |