diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..603fd73 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/bower_components +/.idea/ +/.codekit-cache/ +/config.codekit +/node_modules \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..fde2fad --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,33 @@ +module.exports = function(grunt) { + + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + uglify: { + js: { + files : { + 'dist/angular-bandsintown-api-factory.min.js' : ['src/angular-bandsintown-api-factory.js'] + } + }, + options: { + banner: '\n/*! <%= pkg.name %> v<%= pkg.version %> (<%= grunt.template.today("dd-mm-yyyy") %>) by <%= pkg.author %> */\n', + } + }, + watch: { + minifiyJs: { + files: [ + 'src/angular-bandsintown-api-factory.js' + ], + tasks: ['uglify'], + options: { + spawn: true, + }, + }, + }, + }); + + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-watch'); + + grunt.registerTask('default', ['watch']); + +}; diff --git a/README.md b/README.md index fdaed56..f6abfb0 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,94 @@ -# angular-bandsintown-api-factory -AngularJS factory for Bandsintown JSON REST API requests +**angular-bandsintown-api-factory** is an angularjs module with a bandsintown v2 api factory. + +Author: Jonathan Hornung ([JohnnyTheTank](https://github.com/JohnnyTheTank)) + +## Usage +1. Install via [bower](http://bower.io/) : + 1. `bower install --save angular-bandsintown-api-factory` +2. Add `jtt_bandsintown` to your application's module dependencies. +3. Include dependencies in your HTML. + 1. When using bower: + + ```html + + + ``` + +4. Use the factory `bandsintownFactory` + + +### factory methods + +#### getArtist +Get all parameters [here](http://bandsintown.com/api/requests#artists-get) +```js +// all parameters: http://bandsintown.com/api/requests#artists-get +bandsintownFactory.getArtist({ + artist:"", // ? and / characters must be double escaped. Artists such as "AC/DC" will end up as "AC%252FDC" + artist_id:"", // (optional) fallback: mbid_ (MusicBrainz ID), fbid_ (Facebook Page ID) + app_id:"", //The application ID can be anything, but should be a word that describes your application or company. +}).success(function (_data) { + //on success +}).error(function (_data) { + //on error +}); +``` + +#### getEvents +Get all parameters [here](http://bandsintown.com/api/requests#artists-events) +```js +// all parameters: http://bandsintown.com/api/requests#artists-events +bandsintownFactory.getEventsFromArtist({ + artist:"", // ? and / characters must be double escaped. Artists such as "AC/DC" will end up as "AC%252FDC" + artist_id:"", // (optional) fallback: mbid_ (MusicBrainz ID), fbid_ (Facebook Page ID) + date:"", // (optional) (default: upcoming) yyyy-mm-dd || yyyy-mm-dd,yyyy-mm-dd (inclusive range) || upcoming || all + app_id:"", //The application ID can be anything, but should be a word that describes your application or company. +}).success(function (_data) { + //on success +}).error(function (_data) { + //on error +}); +``` + +Get all parameters [here](http://bandsintown.com/api/requests#artists-event-search) +```js +// all parameters: http://bandsintown.com/api/requests#artists-event-search +bandsintownFactory.getEventsFromArtistByLocation({ + artist:"", // ? and / characters must be double escaped. Artists such as "AC/DC" will end up as "AC%252FDC" + artist_id:"", // (optional) fallback: mbid_ (MusicBrainz ID), fbid_ (Facebook Page ID) + date:"", // (optional) (default: upcoming) yyyy-mm-dd || yyyy-mm-dd,yyyy-mm-dd (inclusive range) || upcoming || all + location:"", // city,state (US or CA) || city,country || lat,lon || ip address + radius:", // (optional) (default: 25) in miles. valid values: 0-150 + app_id:"", //The application ID can be anything, but should be a word that describes your application or company. +}).success(function (_data) { + //on success +}).error(function (_data) { + //on error +}); +``` + +Get all parameters [here](http://bandsintown.com/api/requests#artists-recommended-events) +```js +// all parameters: http://bandsintown.com/api/requests#artists-recommended-events +bandsintownFactory.getRecommendedEventsFromArtistByLocation({ + artist:"", // ? and / characters must be double escaped. Artists such as "AC/DC" will end up as "AC%252FDC" + artist_id:"", // (optional) fallback: mbid_ (MusicBrainz ID), fbid_ (Facebook Page ID) + date:"", // (optional) (default: upcoming) yyyy-mm-dd || yyyy-mm-dd,yyyy-mm-dd (inclusive range) || upcoming || all + location:"", // city,state (US or CA) || city,country || lat,lon || ip address + radius:", // (optional) (default: 25) in miles. valid values: 0-150 + only_recs:"", // (optional) (default: false) if true, the response will only include matching events for artists similar to the specified artist. if false, the response may also include matching events for the specified artist. + app_id:"", //The application ID can be anything, but should be a word that describes your application or company. +}).success(function (_data) { + //on success +}).error(function (_data) { + //on error +}); +``` + +## Bandsintown V2 JSON API +Docs: http://bandsintown.com/api/requests + + +## License + +MIT \ No newline at end of file diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..b3b9aa0 --- /dev/null +++ b/bower.json @@ -0,0 +1,31 @@ +{ + "name": "angular-bandsintown-api-factory", + "description": "angularjs factory for bandsintown json rest api requests", + "version": "0.1.0", + "main": "Gruntfile.js", + "authors": [ + "Jonathan Hornung" + ], + "license": "MIT", + "keywords": [ + "angularjs", + "angular", + "bandsintown", + "api", + "factory" + ], + "homepage": "https://github.com/JohnnyTheTank/angular-bandsintown-api-factory", + "moduleType": [ + "globals" + ], + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ], + "dependencies": { + "angular": "*" + } +} diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 0000000..b186795 --- /dev/null +++ b/demo/index.html @@ -0,0 +1,18 @@ + + + + + angular-bandsintown-api-factory + + + + + + + +
+ Look in your console +
+ + + \ No newline at end of file diff --git a/demo/js/app.js b/demo/js/app.js new file mode 100644 index 0000000..10c4c97 --- /dev/null +++ b/demo/js/app.js @@ -0,0 +1,39 @@ +var app = angular.module("app", ['jtt_bandsintown']); +app.controller('controller', ['$scope', 'bandsintownFactory', function($scope, bandsintownFactory) { + + var _app_id = 'angular-bandsintown-api-factory-sample'; + + bandsintownFactory.getArtist({ + artist:"Prinz Pi", + app_id:_app_id, + }).success(function(_data){ + console.log("artist", _data); + }); + + bandsintownFactory.getEventsFromArtist({ + artist:"Prinz Pi", + app_id:_app_id, + }).success(function(_data){ + console.log("events from artist", _data); + }); + + bandsintownFactory.getEventsFromArtistByLocation({ + artist:"Prinz Pi", + location:'munich, germany', + date:'all', + app_id:_app_id, + }).success(function(_data){ + console.log("events from artist by location", _data); + }); + + bandsintownFactory.getRecommendedEventsFromArtistByLocation({ + artist:"Prinz Pi", + location:'munich, germany', + date:'all', + only_recs: true, + app_id:_app_id, + }).success(function(_data){ + console.log("recommended events from artist by location", _data); + }); + +}]); diff --git a/dist/angular-bandsintown-api-factory.min.js b/dist/angular-bandsintown-api-factory.min.js new file mode 100644 index 0000000..251d6dd --- /dev/null +++ b/dist/angular-bandsintown-api-factory.min.js @@ -0,0 +1,3 @@ + +/*! angular-bandsintown-api-factory v0.1.0 (30-12-2015) by Jonathan Hornung */ +"use strict";angular.module("jtt_bandsintown",[]).factory("bandsintownFactory",["$http","bandsintownSearchDataService",function(a,b){var c={};return c.getArtist=function(c){var d=b.getNew("artist",c);return a.jsonp(d.url,{method:"GET",params:d.object})},c.getEventsFromArtist=function(c){var d=b.getNew("eventsFromArtist",c);return a.jsonp(d.url,{method:"GET",params:d.object})},c.getEventsFromArtistByLocation=function(c){var d=b.getNew("eventsFromArtistByLocation",c);return a.jsonp(d.url,{method:"GET",params:d.object})},c.getRecommendedEventsFromArtistByLocation=function(c){var d=b.getNew("recommendedEventsFromArtistByLocation",c);return a.jsonp(d.url,{method:"GET",params:d.object})},c}]).service("bandsintownSearchDataService",function(){this.getApiBaseUrl=function(a){return"http://api.bandsintown.com/"},this.fillDataInObjectByList=function(a,b,c){return angular.forEach(c,function(c,d){"undefined"!=typeof b[c]&&(a.object[c]=b[c])}),a},this.getNew=function(a,b){var c={object:{format:"json",api_version:"2.0",app_id:b.app_id||"angular-bandsintown-api-factory",callback:"JSON_CALLBACK"},url:""};switch("undefined"!=typeof b.limit&&(c.object.limit=b.limit),a){case"artist":c=this.fillDataInObjectByList(c,b,["artist_id"]),c.url=this.getApiBaseUrl()+"artists/"+b.artist+".json";break;case"eventsFromArtist":c=this.fillDataInObjectByList(c,b,["date","artist_id"]),c.url=this.getApiBaseUrl()+"artists/"+b.artist+"/events.json";break;case"eventsFromArtistByLocation":c=this.fillDataInObjectByList(c,b,["date","artist_id","location","radius"]),c.url=this.getApiBaseUrl()+"artists/"+b.artist+"/events/search.json";break;case"recommendedEventsFromArtistByLocation":c=this.fillDataInObjectByList(c,b,["date","artist_id","location","radius","only_recs"]),c.url=this.getApiBaseUrl()+"artists/"+b.artist+"/events/recommended"}return c}}); \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..429ab7d --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "angular-bandsintown-api-factory", + "version": "0.1.0", + "description": "angularjs factory for bandsintown json rest api requests", + "main": "Gruntfile.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/JohnnyTheTank/angular-bandsintown-api-factory.git" + }, + "keywords": [ + "angularjs", + "angular", + "bandsintown", + "api", + "factory" + ], + "author": "Jonathan Hornung", + "license": "MIT", + "bugs": { + "url": "https://github.com/JohnnyTheTank/angular-bandsintown-api-factory/issues" + }, + "homepage": "https://github.com/JohnnyTheTank/angular-bandsintown-api-factory#readme", + "devDependencies": { + "grunt": "^0.4.5", + "grunt-contrib-uglify": "^0.11.0", + "grunt-contrib-watch": "^0.6.1" + } +} diff --git a/src/angular-bandsintown-api-factory.js b/src/angular-bandsintown-api-factory.js new file mode 100644 index 0000000..eb75b53 --- /dev/null +++ b/src/angular-bandsintown-api-factory.js @@ -0,0 +1,134 @@ +"use strict"; + +/** + @author Jonathan Hornung (https://github.com/JohnnyTheTank) + @url https://github.com/JohnnyTheTank/angular-bandsintown-api-factory + @licence MIT + */ + +angular.module("jtt_bandsintown", []) + .factory('bandsintownFactory', ['$http', 'bandsintownSearchDataService', function ($http, bandsintownSearchDataService) { + + var bandsintownFactory = {}; + + bandsintownFactory.getArtist = function (_params) { + var bandsintownSearchData = bandsintownSearchDataService.getNew("artist", _params); + + return $http.jsonp( + bandsintownSearchData.url, + { + method: 'GET', + params: bandsintownSearchData.object, + } + ); + }; + + bandsintownFactory.getEventsFromArtist = function (_params) { + var bandsintownSearchData = bandsintownSearchDataService.getNew("eventsFromArtist", _params); + + return $http.jsonp( + bandsintownSearchData.url, + { + method: 'GET', + params: bandsintownSearchData.object, + } + ); + }; + + bandsintownFactory.getEventsFromArtistByLocation = function (_params) { + var bandsintownSearchData = bandsintownSearchDataService.getNew("eventsFromArtistByLocation", _params); + + return $http.jsonp( + bandsintownSearchData.url, + { + method: 'GET', + params: bandsintownSearchData.object, + } + ); + }; + + bandsintownFactory.getRecommendedEventsFromArtistByLocation = function (_params) { + var bandsintownSearchData = bandsintownSearchDataService.getNew("recommendedEventsFromArtistByLocation", _params); + + return $http.jsonp( + bandsintownSearchData.url, + { + method: 'GET', + params: bandsintownSearchData.object, + } + ); + }; + + return bandsintownFactory; + }]) + .service('bandsintownSearchDataService', function () { + this.getApiBaseUrl = function (_params) { + return 'http://api.bandsintown.com/'; + }; + + this.fillDataInObjectByList = function(_object, _params, _list) { + + angular.forEach(_list, function (value, key) { + if(typeof _params[value] !== "undefined") { + _object.object[value] = _params[value]; + } + }); + + return _object; + }; + + this.getNew = function (_type, _params) { + + var bandsintownSearchData = { + object: { + format:"json", + api_version: "2.0", + app_id:_params.app_id || "angular-bandsintown-api-factory", + callback: "JSON_CALLBACK", + }, + url: "", + }; + + if (typeof _params.limit !== "undefined") { + bandsintownSearchData.object.limit = _params.limit; + } + + switch (_type) { + + case "artist": + bandsintownSearchData = this.fillDataInObjectByList(bandsintownSearchData, _params, [ + 'artist_id' + ]); + + + bandsintownSearchData.url = this.getApiBaseUrl()+"artists/"+_params.artist+".json"; + break; + + case "eventsFromArtist": + bandsintownSearchData = this.fillDataInObjectByList(bandsintownSearchData, _params, [ + 'date', 'artist_id' + ]); + + bandsintownSearchData.url = this.getApiBaseUrl()+"artists/"+_params.artist+"/events.json"; + break; + + case "eventsFromArtistByLocation": + bandsintownSearchData = this.fillDataInObjectByList(bandsintownSearchData, _params, [ + 'date', 'artist_id', 'location', 'radius' + ]); + + bandsintownSearchData.url = this.getApiBaseUrl()+"artists/"+_params.artist+"/events/search.json"; + break; + + case "recommendedEventsFromArtistByLocation": + bandsintownSearchData = this.fillDataInObjectByList(bandsintownSearchData, _params, [ + 'date', 'artist_id', 'location', 'radius', 'only_recs' + ]); + + bandsintownSearchData.url = this.getApiBaseUrl()+"artists/"+_params.artist+"/events/recommended"; + break; + } + + return bandsintownSearchData; + }; + }); \ No newline at end of file