diff --git a/CHANGELOG.md b/CHANGELOG.md
index 57831d6..df54cd3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,12 @@
-## 0.6.4 – 2018-XX
+## 0.6.5 - 2019-05
+### Added
+- Smooth audio fade-in/out when changing stations
+ [#80](https://git.project-insanity.org/onny/nextcloud-app-radio/issues/80) @onny
+### Fixed
+- Prevent list from jumping back to top when adding station to favorites
+ [#85](https://git.project-insanity.org/onny/nextcloud-app-radio/issues/85) @onny
+
+## 0.6.4 – 2019-01
### Added
- Support for Nextcloud 15
[#82](https://git.project-insanity.org/onny/nextcloud-app-radio/issues/82) @onny
diff --git a/js/main.js b/js/main.js
index dcefef0..0f1ff00 100644
--- a/js/main.js
+++ b/js/main.js
@@ -1,9 +1,12 @@
var MODULE = (function (radio) {
- var version = "0.6.3"
-
$(document).ready(function () {
+ var version = "0.6.5";
+ var current_stationid = "";
+ var searchTimeout = null;
+ var scheduled = false;
+
// Scroll event handler
$(window).scroll(function(){
var station_list = $("#app-content-files");
@@ -30,49 +33,15 @@ var MODULE = (function (radio) {
});
- searchTimeout = null;
- var scheduled;
- /* ==============
- // EVENTS //
- /===============*/
-
- /* Click on a radio station (table entry) and play it */
- $('body').on('click', '.filename', function(e) {
- e.preventDefault();
- $('#playbutton').attr("class", "buffering");
- var stationid = $(this).parent().attr('data-id');
- var stationname = $(this).parent().find('.nametext').text();
- radio.action_play(stationid);
- $('#player').attr('data-id',stationid);
- $("#station_metadata").html("Playing: "+stationname);
-
- /* dirty fix missing background color for first td */
- $('tbody tr').css("background-color", "white");
- $(this).parent().css("background-color", "#f8f8f8");
-
- var element = document.getElementById('station_metadata');
- if (radio.isElementOverflowing(element)) {
- radio.wrapContentsInMarquee(element);
- };
- if (!scheduled){
- radio.schedule_get_metadata(stationid);
- };
- });
-
- /* Save station to favorites */
- $('body').on('click', '.favorite', function() {
- var stationid = $(this).parent().parent().attr('data-id');
- radio.action_favorite(stationid);
- });
/* ==============
// ACTIONS //
/===============*/
radio.schedule_get_metadata = function(stationid){
- scheduled = true;
- var stationid = $('#player').attr('data-id');
+ radio.scheduled = true;
+ var stationid = radio.current_stationid;
req = $.get('https://onny.project-insanity.org/getmetadata/'+stationid, function(data) {
if (data.hasOwnProperty('metadata')) {
var metadata = data['metadata'].toString();
@@ -85,34 +54,30 @@ var MODULE = (function (radio) {
};
setTimeout(function(){radio.schedule_get_metadata(stationid);}, 10000);
} else {
- scheduled = false;
+ radio.scheduled = false;
};
}).fail(function(){
- scheduled = false;
+ radio.scheduled = false;
});
};
radio.action_favorite = function(stationid){
-
- var removed = false;
- var stations = [];
+ var exists = false;
var baseUrl = OC.generateUrl('/apps/radio');
-
$.get(baseUrl + '/stations', function ( data ) {
for (var station in data) {
if (data[station]["stationid"] == stationid){
- removed = true;
- $.ajax({
- url: baseUrl + '/stations/' + data[station]["id"],
- method: 'DELETE'
- }).done(function(){
- $( "tr[data-id='" + stationid + "']" ).find('.icon-stationfav').removeClass('starred');
- });
+ exists = true;
};
};
-
- if (removed == true) {
- return true;
+ if (exists == true) {
+ $.ajax({
+ url: baseUrl + '/stations/' + data[station]["id"],
+ method: 'DELETE'
+ }).done(function(){
+ console.log("delete ", stationid);
+ $( "tr[data-src='#station/"+stationid+"']").find('.icon-stationfav').removeClass('starred');
+ });
} else {
var station = {
"stationid": stationid
@@ -123,13 +88,13 @@ var MODULE = (function (radio) {
contentType: 'application/json',
data: JSON.stringify(station)
}).done(function(){
- $( "tr[data-id='"+stationid+"']" ).find('.icon-stationfav').addClass('starred');
+ $( "tr[data-src='#station/"+stationid+"']" ).find('.icon-stationfav').addClass('starred');
});
};
});
};
- radio.render_results = function(data){
+ radio.parse_results = function(data){
var baseUrl = OC.generateUrl('/apps/radio');
$.get(baseUrl + '/stations', function ( fav_stations ) {
@@ -147,32 +112,14 @@ var MODULE = (function (radio) {
};
$.each(data, function(i, station) {
-
- var isstarred = ""
-
+ var isstarred = false;
for (var fav_station in fav_stations) {
if (fav_stations[fav_station]["stationid"] == station['id']) {
- isstarred = "starred";
+ isstarred = true;
break;
}
};
-
- $('tbody').append('
\
- \
- \
- \
- Favorite\
- \
- | \
- \
- \
- \
- '+station['name']+'\
- \
- | \
-
');
+ radio.render_entry("station", isstarred, '#station/'+station['id'], station['favicon'], station['name']);
});
});
@@ -203,7 +150,7 @@ var MODULE = (function (radio) {
station_ids.forEach(function (station_id, idx) {
var url = "https://www.radio-browser.info/webservice/json/stations/byid/"+station_ids[idx];
- $.getJSON( url , {"User-Agent": "Nextcloud Radio/"+version }, function( data ) {
+ $.getJSON( url , {"User-Agent": "Nextcloud Radio/"+radio.version }, function( data ) {
if (data.length === 0) {
station_array = station_array.concat([{'id': station_id, 'name': 'Broken radio station entry :(', 'favicon': '', 'url': ''}])
@@ -222,7 +169,7 @@ var MODULE = (function (radio) {
});
});
- radio.render_results(station_array_new);
+ radio.parse_results(station_array_new);
};
});
@@ -230,31 +177,48 @@ var MODULE = (function (radio) {
};
- radio.radio_query = function(type, query){
+ radio.radio_query = function(hashurl){
+ console.log(hashurl);
var offset = $('tbody > tr').length;
- switch (type) {
- case 0:
- var url = "https://www.radio-browser.info/webservice/json/stations/search";
+ var query = "";
+ var api_baseurl = "https://www.radio-browser.info/webservice/json/";
+ switch (hashurl) {
+ case "#top":
+ var query_url = "stations/topclick";
break;
- case 1:
- var url = "https://www.radio-browser.info/webservice/json/stations/topclick";
+ case "#recent":
+ var query_url = "stations/lastchange";
break;
- case 2:
- var url = "https://www.radio-browser.info/webservice/json/stations/lastchange";
+ case "#categories/countries":
+ var query_url = "countries";
+ break;
+ case "#categories/states":
+ var query_url = "states";
+ break;
+ case "#categories/languages":
+ var query_url = "languages";
+ break;
+ case "#categories/tags":
+ var query_url = "tags";
+ break;
+ case (hashurl.match(/^#search/) || {}).input:
+ var query_url = "stations/search";
+ var query = hashurl.substring(8);
break;
};
+ console.log(api_baseurl + query_url, query);
$.ajax({
method: "POST",
- url: url,
+ url: api_baseurl + query_url,
data: {
name: query,
limit: 20,
- "User-Agent": "Nextcloud Radio/"+version,
+ "User-Agent": "Nextcloud Radio/"+radio.version,
offset: offset
},
dataType: 'json',
}).success( function(data){
- radio.render_results(data);
+ radio.parse_results(data);
});
};
@@ -262,80 +226,68 @@ var MODULE = (function (radio) {
new OCA.Search(function (query) {
$('#app-navigation').find('li').removeClass("active");
$("tbody > tr").remove();
- radio.radio_query(0, query);
+ radio.radio_query("#search/"+query);
}, function (arg) {
radio.switch_menu(0);
});
- radio.action_load_categories = function (){
- $('#emptycontent').addClass('hidden');
- $('#filestable').show();
- $('.nofilterresults').addClass('hidden');
- $('.loading').addClass('hidden');
- $('tbody').append('\
+ radio.render_entry = function(entry_type, starred, hashurl, iconurl, title){
+ if (entry_type == "folder") {
+ var icon_class = "icon-stationfav-disabled";
+ var icon = "icon-filetype-folder";
+ } else {
+ var icon_class = "icon-stationfav";
+ var icon = '" style="background-image:url('+iconurl+'); background-size: 32px;';
+ }
+ if (starred) {
+ var starred = "starred";
+ } else {
+ var starred = "";
+ }
+ $('tbody').append('
\
\
\
- \
+ \
Favorite\
\
| \
\
\
\
- Countries\
+ '+title+'\
\
| \
-
\
- \
- \
- \
- \
- Favorite\
- \
- | \
- \
- \
- \
- States\
- \
- | \
-
\
- \
- \
- \
- \
- Favorite\
- \
- | \
- \
- \
- \
- Languages\
- \
- | \
-
\
- \
- \
- \
- Favorite\
- \
- | \
- \
- \
- \
- Tags\
- \
- | \
- ');
- };
+ ')
+ }
+
+ radio.action_load_categories = function (){
+
+ $('#emptycontent').addClass('hidden');
+ $('#filestable').show();
+ $('.nofilterresults').addClass('hidden');
+ $('.loading').addClass('hidden');
+
+ var categories = [{
+ 'hashurl': '#categories/countries',
+ 'name': 'Countires'
+ },{
+ 'hashurl': '#categories/states',
+ 'name': 'States'
+ },{
+ 'hashurl': '#categories/languages',
+ 'name': 'Languages'
+ },{
+ 'hashurl': '#categories/tags',
+ 'name': 'Tags'
+ }];
+
+ categories.forEach(function(category_entry) {
+ radio.render_entry("folder", false, category_entry["hashurl"], false, category_entry["name"]);
+ })
+
+ }
return radio;
}(MODULE || {}));
diff --git a/js/navigation.js b/js/navigation.js
index 9734570..575c30d 100644
--- a/js/navigation.js
+++ b/js/navigation.js
@@ -1,42 +1,47 @@
var MODULE = (function (radio) {
/* Click on menus */
- $('a.nav-icon-files').click(function(e) {
+ $('#app-navigation ul a').click(function(e) {
e.preventDefault();
- radio.switch_menu(0);
+ radio.action_navigate($(this).attr('href'));
});
- $('a.nav-icon-recent').click(function(e) {
+ /* Click on a radio station (table entry) and play it */
+ $('body').on('click', '.filename', function(e) {
e.preventDefault();
- radio.switch_menu(1);
+ var entry_src = $(this).parent().attr('data-src');
+ if (entry_src.substring(0,9) == "#station/") {
+ var stationid = entry_src.substring(9);
+ var stationname = $(this).parent().find('.nametext').text();
+ radio.action_play(stationid, stationname);
+ } else {
+ radio.action_navigate(entry_src);
+ }
});
- $('a.nav-icon-favorites').click(function(e) {
+ /* Save station to favorites */
+ $('body').on('click', '.favorite', function(e) {
e.preventDefault();
- radio.switch_menu(2);
+ var entry_src = $(this).parent().parent().attr('data-src');
+ var stationid = entry_src.substring(9);
+ radio.action_favorite(stationid);
});
- $('a.nav-icon-systemtagsfilter').click(function(e) {
- e.preventDefault();
- radio.switch_menu(3);
- });
-
- radio.load_menu_state = function() {
- var menu_state = 0;
+ radio.action_load_menu_state = function() {
var baseUrl = OC.generateUrl('/apps/radio/getMenuState');
$.get(baseUrl, function ( data ) {
if ("menu_state" in data) {
- menu_state = data["menu_state"];
+ var hashurl = data["menu_state"];
}
- radio.switch_menu(menu_state);
+ radio.action_navigate(hashurl);
return true;
});
}
- radio.save_menu_state = function(menu_state) {
+ radio.action_save_menu_state = function(hashurl) {
var baseUrl = OC.generateUrl('/apps/radio/saveMenuState');
var settings = {
- "menu_state": menu_state
+ "menu_state": hashurl
};
$.ajax({
url: baseUrl,
@@ -48,67 +53,50 @@ var MODULE = (function (radio) {
});
}
- radio.switch_menu = function(type) {
-
- var state = Number(type);
-
+ radio.action_navigate = function(hashurl) {
$('#filestable').hide();
$('#emptycontent').addClass('hidden');
$('.nofilterresults').addClass('hidden');
$('.loading').removeClass('hidden');
+ $('#app-navigation').find('li').removeClass("active");
+ $("tbody > tr").remove();
- clearTimeout(searchTimeout);
- searchTimeout = setTimeout(function(){
- $('#app-navigation').find('li').removeClass("active");
- $("tbody > tr").remove();
- radio.save_menu_state(state)
- switch (state) {
- case 0:
- history.pushState("", "", "#top");
+ history.pushState("", "", hashurl);
+ radio.action_save_menu_state(hashurl)
+
+ clearTimeout(radio.searchTimeout);
+ radio.searchTimeout = setTimeout(function(){
+ switch (hashurl) {
+ case "#top":
$('li.nav-files').addClass('active');
- radio.radio_query(1);
+ radio.radio_query(hashurl);
break;
- case 1:
- history.pushState("", "", "#recent");
+ case "#recent":
$('li.nav-recent').addClass('active');
- radio.radio_query(2);
+ radio.radio_query(hashurl);
break;
- case 2:
- history.pushState("", "", "#favorites");
+ case "#favorites":
$('li.nav-favorites').addClass('active');
radio.action_load_favorites();
break;
- case 3:
- history.pushState("", "", "#categories");
+ case "#categories":
$('li.nav-categories').addClass('active');
radio.action_load_categories();
break;
+ case (hashurl.match(/^#categories/) || {}).input:
+ $('li.nav-categories').addClass('active');
+ radio.radio_query(hashurl);
+ break;
}
}, 500);
};
// On app start, load top list
if(window.location.hash) {
- var hash = String(window.location.hash.replace('#',''));
- switch(hash) {
- case "top":
- radio.switch_menu(0);
- break;
- case "recent":
- radio.switch_menu(1);
- break;
- case "favorites":
- radio.switch_menu(2);
- break;
- case "categories":
- radio.switch_menu(3);
- break;
- default:
- radio.switch_menu(0);
- break;
- }
+ var hashurl = window.location.hash;
+ radio.action_navigate(hashurl);
} else {
- radio.load_menu_state();
+ radio.action_load_menu_state();
};
return radio;
diff --git a/js/player.js b/js/player.js
index 8ad3143..4fc10ed 100644
--- a/js/player.js
+++ b/js/player.js
@@ -35,7 +35,21 @@ var MODULE = (function (radio) {
};
});
- radio.action_play = function(stationid){
+ radio.action_play = function(stationid, stationname){
+ $('#playbutton').attr("class", "buffering");
+ $('#player').attr('data-id',stationid);
+ $("#station_metadata").html("Playing: "+stationname);
+ /* dirty fix missing background color for first td */
+ $('tbody tr').css("background-color", "white");
+ $(this).parent().css("background-color", "#f8f8f8");
+
+ var element = document.getElementById('station_metadata');
+ if (radio.isElementOverflowing(element)) {
+ radio.wrapContentsInMarquee(element);
+ };
+ if (!radio.scheduled){
+ radio.schedule_get_metadata(stationid);
+ };
if (typeof radio.sound !== "undefined") {
var volume_state = $('#volumeslider').slider('value');
radio.sound.fade(volume_state, 0, 500);
diff --git a/templates/main.php b/templates/main.php
index 3cc2aff..4c85cef 100755
--- a/templates/main.php
+++ b/templates/main.php
@@ -31,7 +31,6 @@