move stuff to models
This commit is contained in:
parent
81bfb90a31
commit
28c769dfae
2 changed files with 338 additions and 286 deletions
287
js/services.js
287
js/services.js
|
@ -1,292 +1,7 @@
|
|||
'use strict';
|
||||
|
||||
/* Services */
|
||||
angular.module('podcasts.services', ['podcasts.utilities', 'podcasts.queueList'])
|
||||
.value('queueList', {
|
||||
queue: [],
|
||||
scope: null,
|
||||
init: function(scope) {
|
||||
this.scope = scope;
|
||||
scope.queue = this.queue = [];
|
||||
|
||||
},
|
||||
addToQueue: function(item) {
|
||||
this.queue.push(item);
|
||||
if (typeof this.scope !== "undefined") {
|
||||
this.scope.$apply();
|
||||
}
|
||||
}
|
||||
})
|
||||
.service('feedItems', ['dbNew', 'db', '$q', function(db, oldDb, $q) {
|
||||
return {
|
||||
get: function(id, onSuccess, onFailure) {
|
||||
db.getOne("feedItem", id)
|
||||
.then(function(value) {
|
||||
onSuccess(value);
|
||||
}, function() {
|
||||
onFailure();
|
||||
});
|
||||
},
|
||||
getFeedItemFromXml: function(xml) {
|
||||
var newFeedItem = {},
|
||||
searchableXml = angular.element(xml);
|
||||
|
||||
newFeedItem.guid = searchableXml.find('guid').text();
|
||||
newFeedItem.title = searchableXml.find('title').text();
|
||||
newFeedItem.link = searchableXml.find('link').text();
|
||||
newFeedItem.date = Date.parse(searchableXml.find('pubDate').text());
|
||||
newFeedItem.description = searchableXml.find('description').text();
|
||||
newFeedItem.audioUrl = searchableXml.find('enclosure').attr('url');
|
||||
|
||||
return newFeedItem;
|
||||
},
|
||||
delete: function(id) {
|
||||
oldDb.delete("feedItem", id);
|
||||
},
|
||||
deleteByFeedId: function(feedId) {
|
||||
oldDb.getCursor("feedItem", function(ixDbCursorReq) {
|
||||
if (typeof ixDbCursorReq !== "undefined") {
|
||||
ixDbCursorReq.onsuccess = function(e) {
|
||||
var cursor = ixDbCursorReq.result || e.result;
|
||||
if (cursor) {
|
||||
this.delete(cursor.value.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}, null, IDBKeyRange.only(feedId), null, 'ixFeedId');
|
||||
},
|
||||
add: function(object) {
|
||||
var deferred = $q.defer(),
|
||||
newFeedItem = {
|
||||
guid: object.guid,
|
||||
feedId: object.feedId,
|
||||
title: object.title,
|
||||
link: object.link,
|
||||
date: object.date,
|
||||
description: object.description,
|
||||
audioUrl: object.audioUrl,
|
||||
queued: object.queued
|
||||
};
|
||||
|
||||
oldDb.put("feedItem", newFeedItem, undefined, function() {
|
||||
deferred.resolve(newFeedItem);
|
||||
});
|
||||
|
||||
return deferred.promise;
|
||||
},
|
||||
getNextInQueue: function(feedItem) {
|
||||
var tempQueueList = { queue: [], addToQueue: function(item) { this.queue.push(item); } };
|
||||
var nextFeedItem = null;
|
||||
this.listQueue(tempQueueList, function() {
|
||||
var returnNextValue = false;
|
||||
angular.forEach(tempQueueList.queue, function(key, value) {
|
||||
if (returnNextValue) {
|
||||
nextFeedItem = value;
|
||||
returnNextValue = false;
|
||||
}
|
||||
if (feedItem.id === value.id) {
|
||||
returnNextValue = true;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return nextFeedItem;
|
||||
},
|
||||
listQueue: function(queueList, done) {
|
||||
oldDb.getCursor("feedItem", function(ixDbCursorReq)
|
||||
{
|
||||
if(typeof ixDbCursorReq !== "undefined") {
|
||||
ixDbCursorReq.onsuccess = function (e) {
|
||||
var cursor = ixDbCursorReq.result || e.result;
|
||||
if (cursor) {
|
||||
// This additional check is necessary, since the index doesn't seem to always catch correctly
|
||||
if (cursor.value.queued) {
|
||||
queueList.addToQueue(cursor.value);
|
||||
}
|
||||
|
||||
cursor.continue();
|
||||
} else {
|
||||
if (typeof done === 'function') {
|
||||
done();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}, undefined, IDBKeyRange.only(1), false, 'ixQueued');
|
||||
}
|
||||
}
|
||||
}])
|
||||
.service('feeds', ['$log', '$q', 'dbNew', 'db', 'downloaderBackend', 'xmlParser', 'feedItems', 'utilities', '$rootScope', function($log, $q, db, dbOld, downloaderBackend, xmlParser, feedItems, utilities, $rootScope) {
|
||||
return {
|
||||
feeds: [],
|
||||
add: function(url) {
|
||||
var feedService = this;
|
||||
var finishSave = function(newFeed) {
|
||||
dbOld.put("feed", newFeed, undefined, function(key) {
|
||||
newFeed.id = key;
|
||||
|
||||
feedService.feeds.push(newFeed);
|
||||
feedService.downloadItems(newFeed);
|
||||
});
|
||||
};
|
||||
|
||||
var cleanedUrl = utilities.clean_url(url);
|
||||
|
||||
var promise = downloaderBackend.downloadXml(cleanedUrl);
|
||||
promise.then(function(xml) {
|
||||
var channelChildren = xml.find('channel').children(),
|
||||
newFeed = {},
|
||||
imageUrl;
|
||||
|
||||
newFeed.url = cleanedUrl;
|
||||
newFeed.title = xml.find('title').text();
|
||||
newFeed.summary = xml.find('description').text();
|
||||
newFeed.nrQueueItems = 1;
|
||||
|
||||
angular.forEach(channelChildren, function(value, key) {
|
||||
if ('itunes:image' === angular.element(value)[0].nodeName.toLowerCase()) {
|
||||
imageUrl = angular.element(value).attr('href');
|
||||
}
|
||||
|
||||
if ('itunes:author' === angular.element(value)[0].nodeName.toLowerCase()) {
|
||||
newFeed.author = angular.element(value).text();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
var file = downloaderBackend.downloadFile(imageUrl);
|
||||
file.then(function(fileBlob) {
|
||||
newFeed.image = fileBlob;
|
||||
finishSave(newFeed);
|
||||
}, function() {
|
||||
finishSave(newFeed);
|
||||
});
|
||||
}, function() {
|
||||
console.warn('Could not fetch XML for feed, adding just URL for now');
|
||||
var newFeed = {};
|
||||
newFeed.url = cleanedUrl;
|
||||
|
||||
finishSave(newFeed);
|
||||
});
|
||||
},
|
||||
get: function(id) {
|
||||
id = parseInt(id, 10);
|
||||
var deferred = $q.defer();
|
||||
|
||||
db.getOne("feed", id)
|
||||
.then(function(feed) {
|
||||
if (typeof feed.image === 'string') {
|
||||
feed.image = new Blob([feed.image]);
|
||||
}
|
||||
|
||||
dbOld.getCursor("feedItem", function(ixDbCursorReq)
|
||||
{
|
||||
feed.items = [];
|
||||
if(typeof ixDbCursorReq !== "undefined") {
|
||||
ixDbCursorReq.onsuccess = function (e) {
|
||||
var cursor = ixDbCursorReq.result || e.result;
|
||||
if (cursor) {
|
||||
feed.items.push(cursor.value);
|
||||
|
||||
cursor.continue();
|
||||
} else {
|
||||
$rootScope.$apply(deferred.resolve(feed));
|
||||
}
|
||||
}
|
||||
}
|
||||
}, null, IDBKeyRange.only(feed.id), undefined, 'ixFeedId');
|
||||
}, function(value) {
|
||||
deferred.reject();
|
||||
});
|
||||
|
||||
return deferred.promise;
|
||||
},
|
||||
list: function($scope) {
|
||||
var feeds = this.feeds;
|
||||
dbOld.getCursor("feed", function(ixDbCursorReq)
|
||||
{
|
||||
if(typeof ixDbCursorReq !== "undefined") {
|
||||
ixDbCursorReq.onsuccess = function (e) {
|
||||
var cursor = ixDbCursorReq.result || e.result;
|
||||
if (cursor) {
|
||||
if (typeof cursor.value.image === 'string') {
|
||||
cursor.value.image = new Blob(
|
||||
[cursor.value.image],
|
||||
{type: 'application/octet-stream'}
|
||||
);
|
||||
}
|
||||
feeds.push(cursor.value);
|
||||
$scope.$apply();
|
||||
|
||||
cursor.continue();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
delete: function(id) {
|
||||
$log.info('Deleting feed with ID ' + id);
|
||||
feedItems.deleteByFeedId(id);
|
||||
dbOld.delete("feed", id);
|
||||
},
|
||||
/**
|
||||
*
|
||||
* @param feedItems
|
||||
* @param updateStatus function that gets called for each item it goes through
|
||||
* Takes the feedItem as the argument
|
||||
*/
|
||||
downloadAllItems: function(feedItems, updateStatus) {
|
||||
var feedService = this;
|
||||
dbOld.getCursor("feed", function(ixDbCursorReq)
|
||||
{
|
||||
if(typeof ixDbCursorReq !== "undefined") {
|
||||
ixDbCursorReq.onsuccess = function (e) {
|
||||
var cursor = ixDbCursorReq.result || e.result;
|
||||
|
||||
if (cursor) {
|
||||
feedService.downloadItems(cursor.value, updateStatus);
|
||||
|
||||
cursor.continue();
|
||||
} else {
|
||||
updateStatus();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
downloadItems: function(feedItem, updateStatus) {
|
||||
var promise = downloaderBackend.downloadXml(feedItem.url),
|
||||
feedObjects = [];
|
||||
|
||||
promise.then(function(data) {
|
||||
angular.forEach(
|
||||
data.find('item'),
|
||||
function(element, index) {
|
||||
if (index < 3) { // TODO: this should be a global setting and/or a per-feed setting
|
||||
feedObjects.push(feedItems.getFeedItemFromXml(element))
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
angular.forEach(feedObjects, function(feedObject, index) {
|
||||
feedObject.feedId = feedItem.id;
|
||||
if (0 === index) {
|
||||
feedObject.queued = 1;
|
||||
} else {
|
||||
feedObject.queued = 0;
|
||||
}
|
||||
|
||||
feedItems.add(feedObject)
|
||||
.then(function(item) {
|
||||
if (typeof updateStatus === 'function') {
|
||||
updateStatus(item, feedItem);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}])
|
||||
angular.module('podcasts.services', ['podcasts.utilities', 'podcasts.queueList', 'podcasts.models'])
|
||||
.service('url', ['$window', function($window) {
|
||||
return {
|
||||
url: $window.URL || $window.webkitURL,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue