MagicMirror² v2.13.0 is available! For more information about this release, check out this topic.

MM-concert-calendar



  • Hello,
    I am trying to install the MM-concert-calendar module.
    after runing query: https://api.songkick.com/api/3.0/search/locations.json?query=YOUR_CITY_HERE&apikey=YOUR_SONGKICK_API
    i have this:

    {"resultsPage": {"status": "ok", "results": {"location": [{"city": {"lat": 49.1833, "lng": - 0.35, "country": 
    {"displayName ":" France "}," displayName ":" Caen "}," metroArea ": {" lat ": 49.1833," lng ": - 0.35," country ": 
    {" displayName ":" France "}," uri ":" http://www.songkick.com/metro_areas/28855-france-caen?
    utm_source=59898&utm_medium=partner "," displayName ":" Caen "," id ": 28855}}]}," perPage ": 50, "page": 1, "totalEntries": 1}}
    

    i open open concertcalendar.js but i don’t find the property named in the concertcalendar.js
    :

    /* Magic Mirror
     * Module: ConcertCalendar
     *
     * By Marc Pratllusà https://github.com/muilpp
     * based on a Script from Benjamin Angst http://www.beny.ch
     * MIT Licensed.
     */
    
    Module.register("concertcalendar",{
    
    	// Define module defaults
    	defaults: {
    		maximumArtist: 150, // Number of bands to check if they are on tour
    		concertsPerPage: 8,
    		updateInterval: 60 * 60 * 24 * 1000, // Once a day.
    		paginationInterval: 20 * 1000, // Every twenty seconds.
    		animationSpeed: 2000,
    		fade: true,
    		fadePoint: 0.25, // Start on 1/4th of the list.
    		initialLoadDelay: 0, // start delay seconds.
    
    		apiBase: 'http://localhost:8282/concerts',
    		area: "28714", //your songkick area here (Barcelona, Spain by default)
    		user: "",.     //your lastfm username here
    
    		titleReplace: {
    			"Upcoming Concerts Calendar ": ""
    		},
    	},
    
    	// Define required scripts.
    	getStyles: function() {
    		return ["concertcalendar.css", "font-awesome.css"];
    	},
    
    	// Define required scripts.
    	getScripts: function() {
    		return ["moment.js"];
    	},
    
    	// Define start sequence.
    	start: function() {
    		Log.info("Starting module: " + this.name);
    
    		// Set locale.
    		moment.locale(config.language);
    
    		this.concerts = [];
    		this.visibleConcerts = [];
    		this.loaded = false;
    		this.paginationTimer = null;
    		this.paginationIndex = 0;
    
    		this.scheduleUpdate(this.config.initialLoadDelay);
    		this.paginationUpdate();
    
    		this.updateTimer = null;
    
    	},
    
    	// Override dom generator.
    	getDom: function() {
    		var wrapper = document.createElement("div");
    		var table = document.createElement("table");
    		table.className = "small";
    
    		for (var t in this.visibleConcerts) {
    			var concert = this.visibleConcerts[t];
    
    			var row = document.createElement("tr");
    			table.appendChild(row);
    
    			var concertArtistCell = document.createElement("td");
    			concertArtistCell.className = "from";
    			concertArtistCell.innerHTML = concert.artist;
    			row.appendChild(concertArtistCell);
    
    			var concertCityCell = document.createElement("td");
    			concertCityCell.innerHTML = " - " + concert.city.trim()+", ";
    			concertCityCell.className = "align-right trainto";
    			row.appendChild(concertCityCell);
    
    			var concertDate = document.createElement("td");
    			concertDate.innerHTML = concert.concertDate;
    			concertDate.className = "align-right trainto";
    			row.appendChild(concertDate);
    		}
    
    		return table;
    	},
    
    	/* updateTimetable()
    	 * Calls processConcerts on succesfull response.
    	 */
    	updateTimetable: function() {
    		var url = this.config.apiBase + this.getParams();
    		var self = this;
    		var retry = true;
    
    		var concertRequest = new XMLHttpRequest();
    		concertRequest.open("GET", url, true);
    		concertRequest.onreadystatechange = function() {
    			if (this.readyState === 4) {
    				if (this.status === 200) {
    					self.processConcerts(JSON.parse(this.response));
    				} else if (this.status === 401) {
    					self.config.id = "";
    					self.updateDom(self.config.animationSpeed);
    
    					Log.error(self.name + ": Incorrect, 401 reponse...");
    					retry = false;
    				} else {
    					Log.error(self.name + ": Could not load concerts.");
    				}
    
    				if (retry) {
    					self.scheduleUpdate((self.loaded) ? -1 : self.config.retryDelay);
    				}
    			}
    		};
    		concertRequest.send();
    	},
    
    	/* getParams(compliments)
    	 * Generates an url with api parameters based on the config.
    	 *
    	 * return String - URL params.
    	 */
    	getParams: function() {
    		var params = "/";
                    params += this.config.area;
                    params += "/" + this.config.user;
                    params += "?limit=" + this.config.maximumArtist;
    
    		return params;
    	},
    
    	/* processConcerts(data)
    	 * Uses the received data to set the various values.
    	 *
    	 * argument data object - Weather information received form openweather.org.
    	 */
    	processConcerts: function(data) {
    
    		this.concerts = [];
    
    		data.forEach((concert) => {
    			var city = concert.City.split(",");
    
    			if (city.length > 0) {
    				cityToAdd = city[0];
    				if (city[0].length > 9)
    					cityToAdd = city[0].substring(0,9)+"..";
    
    				artistToAdd = concert.Artist;
    				if (artistToAdd.length > 10)
    					artistToAdd = artistToAdd.substring(0,10)+"..";
    
    				var date = new Date(concert.Date);
    				this.concerts.push({
    					artist: artistToAdd.trim(),
    					city: cityToAdd.trim(),
    					concertDate: date.getDate()+"/"+(date.getMonth()+1)
    				});
    			}
    		});
    
    		this.loaded = true;
    		concertsToShow = this.concerts.slice(0,this.config.concertsPerPage);
    		this.visibleConcerts = this.visibleConcerts.concat(concertsToShow);
    		this.updateDom(this.config.animationSpeed);
    	},
    
    	paginate: function() { 
    		this.paginationIndex = this.paginationIndex + this.config.concertsPerPage;
    
    		if (this.concerts.length > this.paginationIndex) {
    			this.visibleConcerts = this.concerts.slice(this.paginationIndex, this.paginationIndex+this.config.concertsPerPage);
    		} else {
    			this.visibleConcerts = this.concerts.slice(0,this.config.concertsPerPage);
    			this.paginationIndex = 0;
    		}
    
    		this.updateDom(this.config.animationSpeed);
    	},
    		/* scheduleUpdate()
    	 * Schedule next update.
    	 *
    	 * argument delay number - Milliseconds before next update. If empty, this.config.updateInterval is used.
    	 */
    	scheduleUpdate: function(delay) {
    		var nextLoad = this.config.updateInterval;
    		if (typeof delay !== "undefined" && delay >= 0) {
    			nextLoad = delay;
    		}
    
    		var self = this;
    		clearTimeout(this.updateTimer);
    		this.updateTimer = setTimeout(function() {
    			self.updateTimetable();
    		}, nextLoad);
    	},
    
    	paginationUpdate: function() {
    		var self = this;
    		setInterval(function() {
    			self.paginate();
    		}, this.config.paginationInterval);
    	},
    
    });
    
    

    and add my username in the property right below it.

    If not, is there a simpler module to have concerts close to home in France?
    I tried with MMM-Events but my city, Caen in France (city of more than 100,000 inhabitants), is too small for the eventful API: on the eventfull website concerts are displayed but with the API concerts are not are not found, by contacting eventful I understood that I would have to buy an API which I do not want and moreover Eventful forgets a lot of concerts for my city.
    Thank you for your help.


Log in to reply