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