Trying to generate a badge
parent
fefc65fb23
commit
a4b0c37e68
|
@ -0,0 +1,170 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
audioBasePath = audioDir // percorso base dei file audio
|
||||
imageBasePath = coversDir // percorso base delle immagini
|
||||
badgeBasePath = "/badge/" // percorso per i badge
|
||||
siteURL = baseURL
|
||||
defaultImage = podLogo
|
||||
)
|
||||
|
||||
func badgeHandler(w http.ResponseWriter, r *http.Request) {
|
||||
// Estrai il nome dell'episodio dall'URL
|
||||
episode := strings.TrimPrefix(r.URL.Path, badgeBasePath)
|
||||
if episode == "" {
|
||||
http.Error(w, "Episode name required", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
// Costruisci i percorsi dei file
|
||||
mp3Path := filepath.Join(audioBasePath, episode+".mp3")
|
||||
imgPath := filepath.Join(imageBasePath, episode+".jpg")
|
||||
|
||||
// Verifica se il file MP3 esiste
|
||||
if _, err := os.Stat("." + mp3Path); os.IsNotExist(err) {
|
||||
http.Error(w, "Episode not found", http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
|
||||
// Costruisci gli URL completi
|
||||
audioURL := siteURL + mp3Path
|
||||
imageURL := siteURL + imgPath
|
||||
|
||||
// Verifica se l'immagine esiste, altrimenti usa quella di default
|
||||
if _, err := os.Stat("." + imgPath); os.IsNotExist(err) {
|
||||
imageURL = defaultImage
|
||||
}
|
||||
|
||||
// Genera l'HTML completo del player
|
||||
playerHTML := fmt.Sprintf(`
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<style>
|
||||
.podcast-badge {
|
||||
width: 300px;
|
||||
font-family: Arial, sans-serif;
|
||||
background: #f5f5f5;
|
||||
border-radius: 8px;
|
||||
padding: 12px;
|
||||
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||
}
|
||||
.podcast-cover {
|
||||
width: 100%%;
|
||||
border-radius: 5px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.podcast-title {
|
||||
font-weight: bold;
|
||||
margin: 5px 0;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.podcast-controls {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
.play-button {
|
||||
background: #4CAF50;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 50%%;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
font-size: 16px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.progress-container {
|
||||
flex-grow: 1;
|
||||
height: 4px;
|
||||
background: #ddd;
|
||||
border-radius: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.progress-bar {
|
||||
height: 100%%;
|
||||
background: #4CAF50;
|
||||
width: 0%%;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.time-display {
|
||||
font-size: 12px;
|
||||
color: #666;
|
||||
min-width: 50px;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="podcast-badge">
|
||||
<img src="%s" alt="Cover" class="podcast-cover">
|
||||
<div class="podcast-title">%s</div>
|
||||
<div class="podcast-controls">
|
||||
<button class="play-button" onclick="togglePlay()">▶</button>
|
||||
<div class="progress-container" onclick="seek(event)">
|
||||
<div class="progress-bar" id="progressBar"></div>
|
||||
</div>
|
||||
<div class="time-display" id="timeDisplay">0:00</div>
|
||||
</div>
|
||||
<audio id="audioPlayer" src="%s"></audio>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const player = document.getElementById('audioPlayer');
|
||||
const progressBar = document.getElementById('progressBar');
|
||||
const timeDisplay = document.getElementById('timeDisplay');
|
||||
let isPlaying = false;
|
||||
|
||||
function togglePlay() {
|
||||
if (isPlaying) {
|
||||
player.pause();
|
||||
} else {
|
||||
player.play();
|
||||
}
|
||||
isPlaying = !isPlaying;
|
||||
updateButton();
|
||||
}
|
||||
|
||||
function updateButton() {
|
||||
const button = document.querySelector('.play-button');
|
||||
button.textContent = isPlaying ? '❚❚' : '▶';
|
||||
}
|
||||
|
||||
function seek(e) {
|
||||
const percent = e.offsetX / e.target.offsetWidth;
|
||||
player.currentTime = percent * player.duration;
|
||||
}
|
||||
|
||||
player.addEventListener('timeupdate', function() {
|
||||
// Aggiorna la barra di progresso
|
||||
const progress = (player.currentTime / player.duration) * 100;
|
||||
progressBar.style.width = progress + '%%';
|
||||
|
||||
// Aggiorna il tempo
|
||||
const minutes = Math.floor(player.currentTime / 60);
|
||||
const seconds = Math.floor(player.currentTime %% 60);
|
||||
timeDisplay.textContent = minutes + ':' + (seconds < 10 ? '0' : '') + seconds;
|
||||
});
|
||||
|
||||
player.addEventListener('ended', function() {
|
||||
isPlaying = false;
|
||||
updateButton();
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>`, imageURL, episode, audioURL)
|
||||
|
||||
w.Header().Set("Content-Type", "text/html")
|
||||
w.Write([]byte(playerHTML))
|
||||
}
|
Loading…
Reference in New Issue