mirror of
https://git.friendi.ca/friendica/friendica-addons.git
synced 2025-07-09 18:08:49 +00:00
jappixmini: include jappix source
This commit is contained in:
parent
61eb1f0d18
commit
302b2820d1
231 changed files with 96082 additions and 2 deletions
259
jappixmini/jappix/js/music.js
Normal file
259
jappixmini/jappix/js/music.js
Normal file
|
@ -0,0 +1,259 @@
|
|||
/*
|
||||
|
||||
Jappix - An open social platform
|
||||
These are the music JS scripts for Jappix
|
||||
|
||||
-------------------------------------------------
|
||||
|
||||
License: AGPL
|
||||
Author: Vanaryon
|
||||
Last revision: 25/04/11
|
||||
|
||||
*/
|
||||
|
||||
// Opens the music bubble
|
||||
function openMusic() {
|
||||
var path = '.music-content';
|
||||
|
||||
// Show the music bubble
|
||||
showBubble(path);
|
||||
|
||||
$(document).oneTime(10, function() {
|
||||
$(path + ' input').focus();
|
||||
});
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Parses the music search XML
|
||||
function parseMusic(xml, type) {
|
||||
var path = '.music-content ';
|
||||
var content = path + '.list';
|
||||
var path_type = content + ' .' + type;
|
||||
|
||||
// Create the result container
|
||||
if(!exists(path_type)) {
|
||||
var code = '<div class="' + type + '"></div>';
|
||||
|
||||
if(type == 'local')
|
||||
$(content).prepend(code);
|
||||
else
|
||||
$(content).append(code);
|
||||
}
|
||||
|
||||
// Fill the results
|
||||
$(xml).find('track').each(function() {
|
||||
// Parse the XML
|
||||
var id = $(this).find('id').text();
|
||||
var title = $(this).find('name').text();
|
||||
var artist = $(this).find('artist').text();
|
||||
var source = $(this).find('source').text();
|
||||
var duration = $(this).find('duration').text();
|
||||
var uri = $(this).find('url').text();
|
||||
var mime = $(this).find('type').text();
|
||||
|
||||
// No ID?
|
||||
if(!id)
|
||||
id = hex_md5(uri);
|
||||
|
||||
// No MIME?
|
||||
if(!mime)
|
||||
mime = 'audio/ogg';
|
||||
|
||||
// Local URL?
|
||||
if(type == 'local')
|
||||
uri = generateURL(uri);
|
||||
|
||||
// Append the HTML code
|
||||
$(path_type).append('<a href="#" class="song" data-id="' + id + '">' + title + '</a>');
|
||||
|
||||
// Current playing song?
|
||||
var current_song = $(path_type + ' a[data-id=' + id + ']');
|
||||
|
||||
if(exists('.music-audio[data-id=' + id + ']'))
|
||||
current_song.addClass('playing');
|
||||
|
||||
// Click event
|
||||
current_song.click(function() {
|
||||
return addMusic(id, title, artist, source, duration, uri, mime, type);
|
||||
});
|
||||
});
|
||||
|
||||
// The search is finished
|
||||
if(exists(content + ' .jamendo') && exists(content + ' .local')) {
|
||||
// Get the result values
|
||||
var jamendo = $(content + ' .jamendo').text();
|
||||
var local = $(content + ' .local').text();
|
||||
|
||||
// Enable the input
|
||||
$(path + 'input').val('').removeAttr('disabled');
|
||||
|
||||
// No result
|
||||
if(!jamendo && !local)
|
||||
$(path + '.no-results').show();
|
||||
|
||||
// We must put a separator between the categories
|
||||
if(jamendo && local)
|
||||
$(content + ' .local').addClass('special');
|
||||
}
|
||||
}
|
||||
|
||||
// Sends the music search requests
|
||||
function searchMusic() {
|
||||
var path = '.music-content ';
|
||||
|
||||
// We get the input string
|
||||
var string = $(path + 'input').val();
|
||||
|
||||
// We lock the search input
|
||||
$(path + 'input').attr('disabled', true);
|
||||
|
||||
// We reset the results
|
||||
$(path + '.list div').remove();
|
||||
$(path + '.no-results').hide();
|
||||
|
||||
// Get the Jamendo results
|
||||
$.get('./php/music-search.php', {searchquery: string, location: 'jamendo'}, function(data) {
|
||||
parseMusic(data, 'jamendo');
|
||||
});
|
||||
|
||||
// Get the local results
|
||||
$.get('./php/music-search.php', {searchquery: string, location: JAPPIX_LOCATION}, function(data) {
|
||||
parseMusic(data, 'local');
|
||||
});
|
||||
}
|
||||
|
||||
// Performs an action on the music player
|
||||
function actionMusic(action) {
|
||||
try {
|
||||
// Initialize
|
||||
var playThis = document.getElementById('top-content').getElementsByTagName('audio')[0];
|
||||
|
||||
// Nothing to play, exit
|
||||
if(!playThis)
|
||||
return false;
|
||||
|
||||
var stopButton = $('#top-content a.stop');
|
||||
|
||||
// User play a song
|
||||
if(action == 'play') {
|
||||
stopButton.show();
|
||||
playThis.load();
|
||||
playThis.play();
|
||||
playThis.addEventListener('ended', function() {
|
||||
actionMusic('stop');
|
||||
}, true);
|
||||
|
||||
logThis('Music is now playing.');
|
||||
}
|
||||
|
||||
// User stop the song or the song came to its end
|
||||
else if(action == 'stop') {
|
||||
stopButton.hide();
|
||||
playThis.pause();
|
||||
$('#top-content .music').removeClass('actived');
|
||||
$('.music-content .list a').removeClass('playing');
|
||||
$('.music-audio').remove();
|
||||
publishMusic();
|
||||
|
||||
logThis('Music is now stopped.');
|
||||
}
|
||||
}
|
||||
|
||||
catch(e) {}
|
||||
|
||||
finally {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Publishes the current title over PEP
|
||||
function publishMusic(title, artist, source, duration, uri) {
|
||||
// We share the tune on PEP if enabled
|
||||
if(enabledPEP()) {
|
||||
/* REF: http://xmpp.org/extensions/xep-0118.html */
|
||||
|
||||
var iq = new JSJaCIQ();
|
||||
iq.setType('set');
|
||||
|
||||
// Create the main PubSub nodes
|
||||
var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
|
||||
var publish = pubsub.appendChild(iq.buildNode('publish', {'node': NS_TUNE, 'xmlns': NS_PUBSUB}));
|
||||
var item = publish.appendChild(iq.buildNode('item', {'xmlns': NS_PUBSUB}));
|
||||
var tune = item.appendChild(iq.buildNode('tune', {'xmlns': NS_TUNE}));
|
||||
|
||||
// Enough data?
|
||||
if(title || artist || source || uri) {
|
||||
// Data array
|
||||
var nodes = new Array(
|
||||
'title',
|
||||
'artist',
|
||||
'source',
|
||||
'length',
|
||||
'uri'
|
||||
);
|
||||
|
||||
var values = new Array(
|
||||
title,
|
||||
artist,
|
||||
source,
|
||||
length,
|
||||
uri
|
||||
);
|
||||
|
||||
// Create the children nodes
|
||||
for(i in nodes) {
|
||||
if(values[i])
|
||||
tune.appendChild(iq.buildNode(nodes[i], {'xmlns': NS_TUNE}, values[i]));
|
||||
}
|
||||
}
|
||||
|
||||
con.send(iq);
|
||||
|
||||
logThis('New tune sent: ' + title, 3);
|
||||
}
|
||||
}
|
||||
|
||||
// Adds a music title to the results
|
||||
function addMusic(id, title, artist, source, duration, uri, mime, type) {
|
||||
var path = '.music-content ';
|
||||
|
||||
// We remove & create a new audio tag
|
||||
$('.music-audio').remove();
|
||||
$(path + '.player').prepend('<audio class="music-audio" type="' + mime + '" data-id="' + id + '" />');
|
||||
|
||||
// We apply the new source to the player
|
||||
if(type == 'jamendo')
|
||||
$('.music-audio').attr('src', 'http://api.jamendo.com/get2/stream/track/redirect/?id=' + id + '&streamencoding=ogg2');
|
||||
else
|
||||
$('.music-audio').attr('src', uri);
|
||||
|
||||
// We play the target sound
|
||||
actionMusic('play');
|
||||
|
||||
// We set the actived class
|
||||
$('#top-content .music').addClass('actived');
|
||||
|
||||
// We set a current played track indicator
|
||||
$(path + '.list a').removeClass('playing');
|
||||
$(path + 'a[data-id=' + id + ']').addClass('playing');
|
||||
|
||||
// We publish what we listen
|
||||
publishMusic(title, artist, source, duration, uri);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Plugin launcher
|
||||
function launchMusic() {
|
||||
// When music search string submitted
|
||||
$('.music-content input').keyup(function(e) {
|
||||
// Enter : send
|
||||
if(e.keyCode == 13 && $(this).val())
|
||||
searchMusic();
|
||||
|
||||
// Escape : quit
|
||||
if(e.keyCode == 27)
|
||||
closeBubbles();
|
||||
});
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue