/** * Frontend Script for Last Played Track Logger */ jQuery(document).ready(function($) { /** * Auto refresh Now Playing */ function initAutoRefresh() { var widget = $('#lptl-player-widget'); var refreshEnabled = widget.data('auto-refresh') === 'true'; if (!refreshEnabled) return; // Refresh every 10 seconds setInterval(function() { refreshNowPlaying(); }, 10000); } /** * Refresh Now Playing via AJAX */ function refreshNowPlaying() { var display = $('#lptl-current-track-display'); if (!display.length) return; $.ajax({ url: lptl_frontend.ajax_url, method: 'POST', data: { action: 'lptl_get_current_track', nonce: lptl_frontend.nonce }, success: function(response) { if (response.success && response.data.track) { var track = response.data.track; var title = track; var artist = ''; // Parse artist - title if (track.indexOf(' - ') !== -1) { var parts = track.split(' - '); artist = parts[0]; title = parts[1] || parts[0]; } display.text(title); // Update artist if exists var artistEl = $('.lptl-now-playing-artist'); if (artistEl.length) { artistEl.text(artist); } } }, error: function() { // Silent fail } }); } /** * Refresh History via AJAX */ function refreshHistory(limit) { var historyList = $('.lptl-history-list'); if (!historyList.length) return; $.ajax({ url: lptl_frontend.ajax_url, method: 'POST', data: { action: 'lptl_get_history', limit: limit || 5, nonce: lptl_frontend.nonce }, success: function(response) { if (response.success && response.data.logs) { var logs = response.data.logs; var html = ''; $.each(logs, function(index, log) { var track = log.track || ''; var artist = ''; var title = track; if (track.indexOf(' - ') !== -1) { var parts = track.split(' - '); artist = parts[0]; title = parts[1] || parts[0]; } var isCurrent = index === 0 ? ' lptl-history-item-current' : ''; var sourceBadge = log.source === 'cron' ? ' 🤖' : ''; html += '
'; html += '#' + (index + 1) + ''; html += '
'; html += '' + escapeHtml(title) + ''; if (artist) { html += ' - ' + escapeHtml(artist) + ''; } html += '
'; html += '
'; html += escapeHtml(log.time || ''); html += sourceBadge; html += '
'; html += '
'; }); historyList.html(html); // Update count var countEl = $('.lptl-history-count'); if (countEl.length) { countEl.text(logs.length + ' lagu terakhir'); } } }, error: function() { // Silent fail } }); } /** * Escape HTML */ function escapeHtml(str) { if (!str) return ''; return str .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } /** * Update clock */ function updateClock() { var now = new Date(); var timeStr = now.getHours().toString().padStart(2, '0') + ':' + now.getMinutes().toString().padStart(2, '0') + ':' + now.getSeconds().toString().padStart(2, '0'); $('.lptl-time').each(function() { if (!$(this).closest('.lptl-now-playing').length) return; $(this).text(timeStr + ' WIB'); }); } // Initialize initAutoRefresh(); updateClock(); setInterval(updateClock, 1000); });