diff --git a/apireference b/apireference index 270a6517..7db21950 100644 --- a/apireference +++ b/apireference @@ -5,10 +5,36 @@ http://localhost:8181 + HTTP_ROOT + /api?apikey=$apikey&cmd=$command Data returned in json format Commands: -&getIndex (fetch data from index page. Returns: ArtistName, ArtistSortName, ArtistID, Status, DateAdded, +getIndex (fetch data from index page. Returns: ArtistName, ArtistSortName, ArtistID, Status, DateAdded, [LatestAlbum, ReleaseDate, AlbumID], HaveTracks, TotalTracks, IncludeExtras) -&getArtist&id=$artistid (fetch artist data. returns the artist object (see above) and album info: Status, AlbumASIN, DateAdded, AlbumTitle, ArtistName, ReleaseDate, AlbumID, ArtistID, Type) -&getAlbum&id=$albumid (fetch data from album page. Returns the album object, a description object and a tracks object. Tracks contain: AlbumASIN, AlbumTitle, TrackID, Format, TrackDuration (ms), ArtistName, TrackTitle, AlbumID, ArtistID, Location, TrackNumber, CleanName (stripped of punctuation /styling), BitRate) -&findArtist&name=$artistname[&limit=$limit] (perform artist query on musicbrainz. Returns: url, score, name, uniquename (contains disambiguation info), id) -&findAlbum&name=$albumname[&limit=$limit] (perform album query on musicbrainz. Returns: title, url (artist), id (artist), albumurl, albumid, score, uniquename (artist - with disambiguation) \ No newline at end of file + +getArtist&id=$artistid (fetch artist data. returns the artist object (see above) and album info: Status, AlbumASIN, DateAdded, AlbumTitle, ArtistName, ReleaseDate, AlbumID, ArtistID, Type) + +getAlbum&id=$albumid (fetch data from album page. Returns the album object, a description object and a tracks object. Tracks contain: AlbumASIN, AlbumTitle, TrackID, Format, TrackDuration (ms), ArtistName, TrackTitle, AlbumID, ArtistID, Location, TrackNumber, CleanName (stripped of punctuation /styling), BitRate) + +getUpcoming (Returns: Status, AlbumASIN, DateAdded, AlbumTitle, ArtistName, ReleaseDate, AlbumID, ArtistID, Type) + +getWanted (Returns: Status, AlbumASIN, DateAdded, AlbumTitle, ArtistName, ReleaseDate, AlbumID, ArtistID, Type) + +getSimilar (Returns similar artists with a higher "Count" being more likely to be similar. Returns: Count, ArtistName, ArtistID) + +getHistory (Returns: Status, DateAdded, Title, URL (nzb), FolderName, AlbumID, Size (bytes)) + +getLogs (not working yet) + +findArtist&name=$artistname[&limit=$limit] (perform artist query on musicbrainz. Returns: url, score, name, uniquename (contains disambiguation info), id) + +findAlbum&name=$albumname[&limit=$limit] (perform album query on musicbrainz. Returns: title, url (artist), id (artist), albumurl, albumid, score, uniquename (artist - with disambiguation) + +addArtist&id=$artistid (add an artist to the db by artistid) + +delArtist&id=$artistid (delete artist from db by artistid) + +pauseArtist&id=$artistid (pause an artist in db) +resumeArtist&id=$artistid (resume an artist in db) + +refreshArtist&id=$artistid (refresh info for artist in db from musicbrainz) + +queueAlbum&id=$albumid[&new=True&lossless=True] (Mark an album as wanted and start the searcher. Optional paramters: 'new' looks for new versions, 'lossless' looks only for lossless versions) +unqueueAlbum&id=$albumid (Unmark album as wanted / i.e. mark as skipped) diff --git a/headphones/api.py b/headphones/api.py index a386fc64..ceca7f9a 100644 --- a/headphones/api.py +++ b/headphones/api.py @@ -1,12 +1,13 @@ import headphones -from headphones import db, mb, logger +from headphones import db, mb, importer, searcher, logger import lib.simplejson as simplejson from xml.dom.minidom import Document import copy -cmd_list = [ 'getIndex', 'getArtist', 'getAlbum', 'findArtist', 'findAlbum'] +cmd_list = [ 'getIndex', 'getArtist', 'getAlbum', 'getUpcoming', 'getWanted', 'getSimilar', 'getHistory', 'getLogs', + 'findArtist', 'findAlbum', 'addArtist', 'delArtist', 'pauseArtist', 'resumeArtist', 'refreshArtist'] class Api(object): @@ -61,7 +62,10 @@ class Api(object): methodToCall = getattr(self, "_" + self.cmd) result = methodToCall(**self.kwargs) - return simplejson.dumps(self.data) + if type(self.data) == type(''): + return self.data + else: + return simplejson.dumps(self.data) else: return self.data @@ -114,6 +118,25 @@ class Api(object): self.data = { 'album' : album, 'tracks' : tracks, 'description' : description } return + + def _getHistory(self): + self.data = self._dic_from_query('SELECT * from snatched order by DateAdded DESC') + return + + def _getUpcoming(self): + self.data = self._dic_from_query("SELECT * from albums WHERE ReleaseDate > date('now') order by ReleaseDate DESC") + return + + def _getWanted(self): + self.data = self._dic_from_query("SELECT * from albums WHERE Status='Wanted'") + return + + def _getSimilar(self): + self.data = self._dic_from_query('SELECT * from lastfmcloud') + return + + def _getLogs(self): + pass def _findArtist(self, **kwargs): if 'name' not in kwargs: @@ -136,4 +159,107 @@ class Api(object): limit=50 self.data = mb.findRelease(kwargs['name'], limit) - \ No newline at end of file + + def _addArtist(self, **kwargs): + if 'id' not in kwargs: + self.data = 'Missing parameter: id' + return + else: + self.id = kwargs['id'] + + try: + importer.addArtisttoDB(self.id) + except Exception, e: + self.data = e + + return + + def _delArtist(self, **kwargs): + if 'id' not in kwargs: + self.data = 'Missing parameter: id' + return + else: + self.id = kwargs['id'] + + myDB = db.DBConnection() + myDB.action('DELETE from artists WHERE ArtistID="' + self.id + '"') + myDB.action('DELETE from albums WHERE ArtistID="' + self.id + '"') + myDB.action('DELETE from tracks WHERE ArtistID="' + self.id + '"') + + def _pauseArtist(self, **kwargs): + if 'id' not in kwargs: + self.data = 'Missing parameter: id' + return + else: + self.id = kwargs['id'] + + myDB = db.DBConnection() + controlValueDict = {'ArtistID': ArtistID} + newValueDict = {'Status': 'Paused'} + myDB.upsert("artists", newValueDict, controlValueDict) + + def _resumeArtist(self, **kwargs): + if 'id' not in kwargs: + self.data = 'Missing parameter: id' + return + else: + self.id = kwargs['id'] + + myDB = db.DBConnection() + controlValueDict = {'ArtistID': ArtistID} + newValueDict = {'Status': 'Active'} + myDB.upsert("artists", newValueDict, controlValueDict) + + def _refreshArtist(self, **kwargs): + if 'id' not in kwargs: + self.data = 'Missing parameter: id' + return + else: + self.id = kwargs['id'] + + try: + importer.addArtisttoDB(self.id) + except Exception, e: + self.data = e + + return + + def _queueAlbum(self, **kwargs): + + if 'id' not in kwargs: + self.data = 'Missing parameter: id' + return + else: + self.id = kwargs['id'] + + if 'new' in kwargs: + new = kwargs['new'] + else: + new = False + + if 'lossless' in kwargs: + lossless = kwargs['lossless'] + else: + lossless = False + + myDB = db.DBConnection() + controlValueDict = {'AlbumID': self.id} + if lossless: + newValueDict = {'Status': 'Wanted Lossless'} + else: + newValueDict = {'Status': 'Wanted'} + myDB.upsert("albums", newValueDict, controlValueDict) + searcher.searchforalbum(AlbumID, new) + + def _unqueueAlbum(self, **kwargs): + + if 'id' not in kwargs: + self.data = 'Missing parameter: id' + return + else: + self.id = kwargs['id'] + + myDB = db.DBConnection() + controlValueDict = {'AlbumID': self.id} + newValueDict = {'Status': 'Skipped'} + myDB.upsert("albums", newValueDict, controlValueDict) \ No newline at end of file