Compare commits

..

34 Commits

Author SHA1 Message Date
b788f54c23 Merge branch 'main' of git.asv.ovh:asvstudiosapps/rpigroupplay 2026-02-14 07:23:58 +01:00
e0cbb2a8f1 inserito ADV WRD 2026-02-14 07:23:34 +01:00
110bc1a1c3 rimosso le versioni precedenti in parentesi 2026-02-10 21:45:19 +01:00
3872a61ad6 vers. 2.4.2 2026-02-10 21:37:59 +01:00
821c353638 corretta la visualizzazione della barra di navigazione dei player 2026-02-07 01:17:17 +01:00
573eeee5f5 corretto la visualizzazione del player 2026-02-07 01:14:12 +01:00
2cdd1cb29b vers. 2.4.1 2026-02-07 01:06:06 +01:00
5b3e05726b vers. 2.4.0 2026-02-07 00:31:18 +01:00
71af2b9407 corretta la visualizzazione della pagina about 2026-02-06 23:51:01 +01:00
a96edaa2b9 Inserito pulsante per i feedback 2026-02-06 23:25:50 +01:00
07864334d4 aggiunta la pagina "about" 2026-02-06 23:08:31 +01:00
ee44bfb7a4 rimosso l'alert per dispositivi ios 2026-02-06 22:19:59 +01:00
2b0b457166 vers. 2.3.0 2026-02-06 22:13:10 +01:00
ae5a4a8153 Inserito alert per iOS 26.2.1 2026-02-05 22:40:41 +01:00
02872cf616 ultima modifica al css 2026-02-04 01:12:28 +01:00
f7ddcda130 # 2026-02-04 01:10:20 +01:00
0982a45307 disattivati le animazioni sui pulsanti 2026-02-04 01:08:58 +01:00
b987bf9062 Update data/changelog.xml
update changelog
2026-02-04 01:02:31 +01:00
c3bac71ad2 Update css/style.css
correzione css
2026-02-04 01:02:11 +01:00
0d76cd4794 FIX: la navbar e il footer venivano oscurati dal loader 2026-02-04 00:57:11 +01:00
3619ababf2 FIX: correzione visualizzazione del caricamento 2026-02-04 00:52:23 +01:00
f562f5bfde vers. 2.2.0 2026-02-04 00:50:09 +01:00
91ebc5c883 vers. 2.1.4 2026-01-30 00:08:08 +01:00
ff9c5896f0 Fix player HLS v2 2026-01-28 23:21:18 +01:00
ea36956669 vers. 2.1.3 2026-01-28 23:14:52 +01:00
3c350b17ae aggiunto player hls v.2 2026-01-28 23:13:46 +01:00
008df364fe spero ultimo bugfix hls mobile 2026-01-28 23:08:43 +01:00
6f68bf123d secondo bugfix hls mobile 2026-01-28 23:03:48 +01:00
891feaed5d bugfix hls mobile 2026-01-28 22:59:59 +01:00
bb8d88f60a ver. 2.1.2 2026-01-28 22:45:13 +01:00
d7e098140c Aggiornamento index.php 2026-01-28 20:24:10 +01:00
4d9c7fd328 modifica gitignore 2026-01-28 19:40:11 +01:00
0b6a3ffea4 modifica Readme.md 2026-01-28 19:31:16 +01:00
52e40799d6 vers. 2.1.1 2026-01-28 19:05:44 +01:00
37 changed files with 14482 additions and 13358 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
*:Zone.Identifier
*Zone.Identifier
*.old
/api/*
.htaccess

View File

@@ -1,67 +1,69 @@
<?php
// Verifica se è una richiesta AJAX
$is_ajax = !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
// Se è una richiesta AJAX, carica solo il contenuto della pagina
if ($is_ajax) {
switch ($page) {
case 'home':
include './pages/page/home.php';
break;
case 'radio':
include './pages/page/radio.php';
break;
case 'tv':
include './pages/page/tv.php';
break;
case 'play':
$stationId = (int)$param;
$station = getRadioStation($stationId);
if ($station !== null) {
include './pages/page/player.php';
} else {
include './pages/page/404.php';
}
break;
case 'playtv':
$stationId = (int)$param;
$station = getTVStation($stationId);
if ($station !== null) {
include './pages/page/player_tv.php';
} else {
include './pages/page/404.php';
}
break;
case 'page':
switch ($param) {
case 'about':
include './pages/page/about.php';
break;
case 'contact':
include './pages/page/contact.php';
break;
case 'copyright':
include './pages/page/copyright.php';
break;
case 'addradio':
include './pages/page/addradio.php';
break;
case 'termini-condizioni':
include './pages/page/terminicondizioni.php';
break;
case 'policy-privacy':
include './pages/page/policyprivacy.php';
break;
case 'changelog':
include './pages/page/changelog.php';
break;
default:
include './pages/page/404.php';
}
break;
default:
include './pages/page/404.php';
}
exit; // Termina l'esecuzione per le richieste AJAX
<?php
header('Content-Type: text/html; charset=UTF-8');
// Verifica se è una richiesta AJAX
$is_ajax = !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
// Se è una richiesta AJAX, carica solo il contenuto della pagina
if ($is_ajax) {
switch ($page) {
case 'home':
include './pages/page/home.php';
break;
case 'radio':
include './pages/page/radio.php';
break;
case 'tv':
include './pages/page/tv.php';
break;
case 'play':
$stationId = (int)$param;
$station = getRadioStation($stationId);
if ($station !== null) {
include './pages/page/player.php';
} else {
include './pages/page/404.php';
}
break;
case 'playtv':
$stationId = (int)$param;
$station = getTVStation($stationId);
if ($station !== null) {
include './pages/page/player_tv.php';
} else {
include './pages/page/404.php';
}
break;
case 'page':
switch ($param) {
case 'about':
include './pages/page/about.php';
break;
case 'contact':
include './pages/page/contact.php';
break;
case 'copyright':
include './pages/page/copyright.php';
break;
case 'addradio':
include './pages/page/addradio.php';
break;
case 'termini-condizioni':
include './pages/page/terminicondizioni.php';
break;
case 'policy-privacy':
include './pages/page/policyprivacy.php';
break;
case 'changelog':
include './pages/page/changelog.php';
break;
default:
include './pages/page/404.php';
}
break;
default:
include './pages/page/404.php';
}
exit; // Termina l'esecuzione per le richieste AJAX
}

View File

@@ -1,26 +1,29 @@
<?php
// Information App
$title_site = "RPIGroup Play";
$description_site = "Ascolta le radio del gruppo RPIGroup";
$logo_site = "./img/logoapp.png";
include_once './config/getBasePath.inc.php';
include_once './config/getStation.inc.php';
include_once './config/getPage.inc.php';
// Controllo se l'utente è su mobile o desktop
$is_mobile = isMobile();
// Se l'utente è su mobile, mostra l'app direttamente
// Se è su desktop, mostra prima la pagina con il pulsante "Apri l'app"
$show_app = $is_mobile || (isset($_GET['app']) && $_GET['app'] == 'true');
if ($show_app && isset($_GET['redirect']) && !empty($_GET['redirect'])) {
$redirect_parts = explode('/', $_GET['redirect']);
$page = isset($redirect_parts[0]) ? $redirect_parts[0] : 'home';
$param = isset($redirect_parts[1]) ? $redirect_parts[1] : '';
}
// Include AJAX module DOPO aver definito le variabili
<?php
header('Content-Type: text/html; charset=UTF-8');
// Information App
$title_site = "RPIGroup Play";
$description_site = "Ascolta le radio del gruppo RPIGroup";
$logo_site = "./img/logoapp.png";
include_once './config/getBasePath.inc.php';
include_once './config/getStation.inc.php';
include_once './config/getPage.inc.php';
// Controllo se l'utente è su mobile o desktop
$is_mobile = isMobile();
// Se l'utente è su mobile, mostra l'app direttamente
// Se è su desktop, mostra prima la pagina con il pulsante "Apri l'app"
$show_app = $is_mobile || (isset($_GET['app']) && $_GET['app'] == 'true');
if ($show_app && isset($_GET['redirect']) && !empty($_GET['redirect'])) {
$redirect_parts = explode('/', $_GET['redirect']);
$page = isset($redirect_parts[0]) ? $redirect_parts[0] : 'home';
$param = isset($redirect_parts[1]) ? $redirect_parts[1] : '';
}
// Include AJAX module DOPO aver definito le variabili
include_once './config/ajaxModule.inc.php';

View File

@@ -1,7 +1,9 @@
<?php
// Determina il percorso base dell'applicazione
$script_name = $_SERVER['SCRIPT_NAME'];
$script_path = dirname($script_name);
$base_path = rtrim($script_path, '/');
<?php
header('Content-Type: text/html; charset=UTF-8');
// Determina il percorso base dell'applicazione
$script_name = $_SERVER['SCRIPT_NAME'];
$script_path = dirname($script_name);
$base_path = rtrim($script_path, '/');
$base_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$base_path";

View File

@@ -1,31 +1,84 @@
<?php
// Rileva se l'utente sta usando un dispositivo mobile
function isMobile() {
return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
}
// Recupera l'URL richiesto
$request_uri = $_SERVER['REQUEST_URI'];
$path = substr(urldecode($request_uri), strlen($base_path));
$path = parse_url($path, PHP_URL_PATH);
$path = trim($path, '/');
// Rimuovi parametri GET dall'URL se presenti
if (strpos($path, '?') !== false) {
$path = substr($path, 0, strpos($path, '?'));
}
$path_parts = explode('/', $path);
// Rimuovi index.php dall'URL se presente
if (isset($path_parts[0]) && $path_parts[0] == 'index.php') {
array_shift($path_parts);
}
// Determina la pagina da mostrare in base all'URL
$page = isset($path_parts[0]) && !empty($path_parts[0]) ? $path_parts[0] : 'home';
$param = isset($path_parts[1]) && !empty($path_parts[1]) ? $path_parts[1] : '';
// Debug (rimuovi in produzione)
error_log("Page: $page, Param: $param, Path: $path");
<?php
header('Content-Type: text/html; charset=UTF-8');
// File: config/getPage.inc.php
// Whitelist delle pagine valide
$validPages = ['home', 'radio', 'tv', 'play', 'playtv', 'page'];
$validSubPages = ['about', 'contact', 'copyright', 'addradio', 'termini-condizioni', 'policy-privacy', 'changelog'];
// Rileva se l'utente sta usando un dispositivo mobile
function isMobile() {
return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
}
// Funzione per sanitizzare l'input
function sanitizePageInput($input) {
// Rimuovi caratteri pericolosi
$input = preg_replace('/[^a-zA-Z0-9\-_]/', '', $input);
// Previeni path traversal
$input = str_replace(['..', '/', '\\'], '', $input);
return $input;
}
// Recupera l'URL richiesto
$request_uri = $_SERVER['REQUEST_URI'];
$path = substr(urldecode($request_uri), strlen($base_path));
$path = parse_url($path, PHP_URL_PATH);
$path = trim($path, '/');
// Rimuovi parametri GET dall'URL se presenti
if (strpos($path, '?') !== false) {
$path = substr($path, 0, strpos($path, '?'));
}
$path_parts = explode('/', $path);
// Rimuovi index.php dall'URL se presente
if (isset($path_parts[0]) && $path_parts[0] == 'index.php') {
array_shift($path_parts);
}
// Determina la pagina da mostrare in base all'URL con validazione
$page = 'home'; // Default sicuro
$param = '';
if (isset($path_parts[0]) && !empty($path_parts[0])) {
$requestedPage = sanitizePageInput($path_parts[0]);
// Verifica se la pagina è nella whitelist
if (in_array($requestedPage, $validPages)) {
$page = $requestedPage;
} else {
// Pagina non valida, redirect a 404
$page = 'home';
error_log("Tentativo di accesso a pagina non valida: " . $path_parts[0]);
}
}
if (isset($path_parts[1]) && !empty($path_parts[1])) {
$requestedParam = sanitizePageInput($path_parts[1]);
// Validazione specifica per tipo di pagina
if ($page === 'play' || $page === 'playtv') {
// Per play/playtv, il parametro deve essere un numero
if (ctype_digit($requestedParam)) {
$param = $requestedParam;
} else {
error_log("ID stazione non valido: " . $path_parts[1]);
$page = 'home';
}
} elseif ($page === 'page') {
// Per page, il parametro deve essere nella whitelist
if (in_array($requestedParam, $validSubPages)) {
$param = $requestedParam;
} else {
error_log("Sottopagina non valida: " . $path_parts[1]);
$page = 'home';
}
}
}
// Debug (rimuovi in produzione)
error_log("Page: $page, Param: $param, Path: $path");

View File

@@ -1,54 +1,202 @@
<?php
// Funzione per caricare il file XML delle radio
function loadRadioStations() {
$xml = simplexml_load_file('./data/radio.xml');
if ($xml === false) {
error_log("Errore nel caricamento del file XML: data/radio.xml");
return [];
}
return $xml->station;
}
// Funzione per ottenere una singola stazione radio
function getRadioStation($id) {
$xml = simplexml_load_file('./data/radio.xml');
if ($xml === false) {
error_log("Errore nel caricamento del file XML: data/radio.xml");
return null;
}
foreach ($xml->station as $station) {
if ((int)$station->id === $id) {
return $station;
}
}
return null;
}
// Funzione per caricare il file XML delle TV
function loadTVStations() {
$xml = simplexml_load_file('./data/tv.xml');
if ($xml === false) {
error_log("Errore nel caricamento del file XML: data/tv.xml");
return [];
}
return $xml->station;
}
// Funzione per ottenere una singola stazione TV
function getTVStation($id) {
$xml = simplexml_load_file('./data/tv.xml');
if ($xml === false) {
error_log("Errore nel caricamento del file XML: data/tv.xml");
return null;
}
foreach ($xml->station as $station) {
if ((int)$station->id === $id) {
return $station;
}
}
return null;
}
$changelog = simplexml_load_file("./data/changelog.xml") or die("Errore: Impossibile accedere al file CHANGELOG");
$version_app = $changelog->version->number[0];
<?php
/**
* Cache XML in memoria per la durata della richiesta
* Previene caricamenti multipli dello stesso file
*/
class StationCache {
private static $radioXML = null;
private static $tvXML = null;
private static $changelogXML = null;
/**
* Carica e cachea il file XML delle radio
*/
public static function getRadioXML() {
if (self::$radioXML === null) {
$xmlPath = './data/radio.xml';
if (!file_exists($xmlPath)) {
error_log("File XML non trovato: $xmlPath");
return false;
}
if (!is_readable($xmlPath)) {
error_log("File XML non leggibile: $xmlPath");
return false;
}
libxml_use_internal_errors(true);
self::$radioXML = simplexml_load_file($xmlPath);
if (self::$radioXML === false) {
$errors = libxml_get_errors();
foreach ($errors as $error) {
error_log("Errore XML radio.xml: " . trim($error->message) . " (Linea: " . $error->line . ")");
}
libxml_clear_errors();
return false;
}
}
return self::$radioXML;
}
/**
* Carica e cachea il file XML delle TV
*/
public static function getTVXML() {
if (self::$tvXML === null) {
$xmlPath = './data/tv.xml';
if (!file_exists($xmlPath)) {
error_log("File XML non trovato: $xmlPath");
return false;
}
if (!is_readable($xmlPath)) {
error_log("File XML non leggibile: $xmlPath");
return false;
}
libxml_use_internal_errors(true);
self::$tvXML = simplexml_load_file($xmlPath);
if (self::$tvXML === false) {
$errors = libxml_get_errors();
foreach ($errors as $error) {
error_log("Errore XML tv.xml: " . trim($error->message) . " (Linea: " . $error->line . ")");
}
libxml_clear_errors();
return false;
}
}
return self::$tvXML;
}
/**
* Carica e cachea il file XML del changelog
*/
public static function getChangelogXML() {
if (self::$changelogXML === null) {
$xmlPath = './data/changelog.xml';
if (!file_exists($xmlPath)) {
error_log("File XML non trovato: $xmlPath");
return false;
}
if (!is_readable($xmlPath)) {
error_log("File XML non leggibile: $xmlPath");
return false;
}
libxml_use_internal_errors(true);
self::$changelogXML = simplexml_load_file($xmlPath);
if (self::$changelogXML === false) {
$errors = libxml_get_errors();
foreach ($errors as $error) {
error_log("Errore XML changelog.xml: " . trim($error->message) . " (Linea: " . $error->line . ")");
}
libxml_clear_errors();
return false;
}
}
return self::$changelogXML;
}
}
/**
* Funzione per caricare tutte le stazioni radio
* @return array|SimpleXMLElement Array di stazioni o array vuoto in caso di errore
*/
function loadRadioStations() {
$xml = StationCache::getRadioXML();
if ($xml === false || !isset($xml->station)) {
error_log("Impossibile caricare le stazioni radio");
return [];
}
return $xml->station;
}
/**
* Funzione per ottenere una singola stazione radio
* @param int $id ID della stazione
* @return SimpleXMLElement|null Stazione o null se non trovata
*/
function getRadioStation($id) {
$xml = StationCache::getRadioXML();
if ($xml === false) {
error_log("Impossibile caricare XML radio per ID: $id");
return null;
}
if (!isset($xml->station)) {
error_log("Nessuna stazione trovata nel file XML");
return null;
}
foreach ($xml->station as $station) {
if ((int)$station->id === (int)$id) {
return $station;
}
}
error_log("Stazione radio non trovata con ID: $id");
return null;
}
/**
* Funzione per caricare tutte le stazioni TV
* @return array|SimpleXMLElement Array di stazioni o array vuoto in caso di errore
*/
function loadTVStations() {
$xml = StationCache::getTVXML();
if ($xml === false || !isset($xml->station)) {
error_log("Impossibile caricare le stazioni TV");
return [];
}
return $xml->station;
}
/**
* Funzione per ottenere una singola stazione TV
* @param int $id ID della stazione
* @return SimpleXMLElement|null Stazione o null se non trovata
*/
function getTVStation($id) {
$xml = StationCache::getTVXML();
if ($xml === false) {
error_log("Impossibile caricare XML TV per ID: $id");
return null;
}
if (!isset($xml->station)) {
error_log("Nessuna stazione TV trovata nel file XML");
return null;
}
foreach ($xml->station as $station) {
if ((int)$station->id === (int)$id) {
return $station;
}
}
error_log("Stazione TV non trovata con ID: $id");
return null;
}
/**
* Carica il changelog e la versione dell'app
*/
$changelog = StationCache::getChangelogXML();
$version_app = "1.0.0"; // Versione di default
if ($changelog !== false && isset($changelog->version) && isset($changelog->version[0]->number)) {
$version_app = (string)$changelog->version[0]->number;
} else {
error_log("Impossibile leggere la versione dal changelog.xml, uso versione di default: $version_app");
}

View File

@@ -1,260 +1,331 @@
/* ========================================
TRANSIZIONI E ANIMAZIONI
======================================== */
/* Transizione per i link di navigazione */
.navLink,
.nav-link,
.station-link,
.linkBox {
transition: all 0.3s ease;
position: relative;
}
/* Effetto hover sui link */
.navLink:hover,
.nav-link:hover,
.station-link:hover,
.linkBox:hover {
transform: translateY(-2px);
opacity: 0.8;
}
/* Effetto attivo sui link di navigazione del menu */
@keyframes pulseActive {
0%, 100% {
opacity: 1;
transform: translateX(-50%) scale(1);
}
50% {
opacity: 0.6;
transform: translateX(-50%) scale(1.2);
}
}
/* Effetto click/tap */
.navLink:active,
.nav-link:active,
.station-link:active,
.linkBox:active {
transform: scale(0.98);
transition: transform 0.1s ease;
}
/* Transizione per le card delle stazioni */
.station-card {
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.station-card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
}
/* Transizione per i clickBox della home */
.clickBox {
transition: all 0.3s ease;
}
.clickBox:hover {
transform: scale(1.05);
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.2);
}
.clickBox:active {
transform: scale(0.98);
}
/* Spinner di caricamento */
.loading {
display: flex;
justify-content: center;
align-items: center;
min-height: 200px;
opacity: 0;
animation: fadeIn 0.3s ease-in forwards;
}
@keyframes fadeIn {
to {
opacity: 1;
}
}
.spinner {
width: 50px;
height: 50px;
border: 4px solid rgba(255, 255, 255, 0.3);
border-top-color: #fff;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
/* Transizione per elementi che appaiono */
.content-page,
.station-list,
.player-container {
animation: fadeInContent 0.5s ease-out;
}
@keyframes fadeInContent {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
/* Transizione per le immagini */
.station-logo,
.station-logo-large {
transition: transform 0.3s ease, filter 0.3s ease;
}
.station-logo:hover,
.station-logo-large:hover {
transform: scale(1.05);
filter: brightness(1.1);
}
/* Transizione per i pulsanti */
button,
.submit-btn,
.play-pause-btn {
transition: all 0.3s ease;
}
button:hover,
.submit-btn:hover,
.play-pause-btn:hover {
transform: scale(1.05);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}
button:active,
.submit-btn:active,
.play-pause-btn:active {
transform: scale(0.95);
}
/* Transizione smooth per tutti gli elementi interattivi */
a, button, input, textarea, select {
transition: all 0.2s ease;
}
/* RIMOSSO: underline animato per il menu */
/* Non ci sono più after pseudo-elementi per le underline */
/* Transizione per il back-link */
.back-link a {
transition: all 0.3s ease;
display: inline-block;
}
.back-link a:hover {
transform: translateX(-5px);
color: #4a90e2;
}
/* Animazione per le liste */
.stations-container {
display: grid;
gap: 1rem;
}
.station-card {
animation: fadeInScale 0.4s ease-out backwards;
}
.station-card:nth-child(1) { animation-delay: 0.05s; }
.station-card:nth-child(2) { animation-delay: 0.1s; }
.station-card:nth-child(3) { animation-delay: 0.15s; }
.station-card:nth-child(4) { animation-delay: 0.2s; }
.station-card:nth-child(5) { animation-delay: 0.25s; }
@keyframes fadeInScale {
from {
opacity: 0;
transform: scale(0.95);
}
to {
opacity: 1;
transform: scale(1);
}
}
/* Transizione per i form */
.form-group input,
.form-group textarea,
.form-group select {
transition: border-color 0.3s ease, box-shadow 0.3s ease;
}
.form-group input:focus,
.form-group textarea:focus,
.form-group select:focus {
border-color: #4a90e2;
box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.1);
}
/* Animazione per i messaggi di risposta */
.form-response {
animation: slideInDown 0.4s ease-out;
}
@keyframes slideInDown {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Transizione per video e iframe */
video,
iframe {
transition: opacity 0.3s ease;
}
video:hover,
iframe:hover {
opacity: 0.95;
}
/* Performance optimization */
* {
-webkit-tap-highlight-color: transparent;
}
/* Smooth scrolling */
html {
scroll-behavior: smooth;
}
/* Riduzione movimento per chi ha impostato preferenze di accessibilità */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
.navLink.active::before {
animation: none !important;
}
/* ========================================
TRANSIZIONI E ANIMAZIONI
======================================== */
/* ========================================
LOADING OVERLAY
======================================== */
/* Overlay di caricamento a schermo intero */
.loading-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(16, 25, 75, 0.95);
backdrop-filter: blur(8px);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
opacity: 0;
visibility: hidden;
transition: opacity 0.3s ease, visibility 0.3s ease;
}
/* Quando l'overlay è attivo */
.loading-overlay.active {
opacity: 1;
visibility: visible;
}
/* Contenuto dell'overlay */
.loading-content {
text-align: center;
color: white;
}
/* Spinner grande per il loading overlay */
.spinner-large {
width: 60px;
height: 60px;
border: 5px solid rgba(255, 255, 255, 0.2);
border-top-color: #f7b835;
border-radius: 50%;
animation: spin 0.8s linear infinite;
margin: 0 auto 20px;
}
/* Testo di caricamento */
.loading-text {
font-size: 1.1rem;
font-weight: 500;
color: white;
margin: 0;
animation: pulse 1.5s ease-in-out infinite;
}
/* Animazione pulse per il testo */
@keyframes pulse {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.5;
}
}
/* Transizione per i link di navigazione */
/* .navLink,
.nav-link,
.station-link,
.linkBox {
transition: all 0.3s ease;
position: relative;
}
/* Effetto hover sui link */
/* .navLink:hover,
.nav-link:hover,
.station-link:hover,
.linkBox:hover {
transform: translateY(-2px);
opacity: 0.8;
}
/* Effetto attivo sui link di navigazione del menu */
@keyframes pulseActive {
0%,
100% {
opacity: 1;
transform: translateX(-50%) scale(1);
}
50% {
opacity: 0.6;
transform: translateX(-50%) scale(1.2);
}
}
/* Effetto click/tap */
/* .navLink:active,
.nav-link:active,
.station-link:active,
.linkBox:active {
transform: scale(0.98);
transition: transform 0.1s ease;
}
/* Transizione per le card delle stazioni */
/*.station-card {
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.station-card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
}
/* Transizione per i clickBox della home */
/* .clickBox {
transition: all 0.3s ease;
}
.clickBox:hover {
transform: scale(1.05);
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.2);
}
.clickBox:active {
transform: scale(0.98);
}
/* Spinner di caricamento */
.loading {
display: flex;
justify-content: center;
align-items: center;
min-height: 200px;
opacity: 0;
animation: fadeIn 0.3s ease-in forwards;
}
@keyframes fadeIn {
to {
opacity: 1;
}
}
.spinner {
width: 50px;
height: 50px;
border: 4px solid rgba(255, 255, 255, 0.3);
border-top-color: #fff;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
/* Transizione per elementi che appaiono */
/*.content-page,
.station-list,
.player-container {
animation: fadeInContent 0.5s ease-out;
}
@keyframes fadeInContent {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
/* Transizione per le immagini */
/* .station-logo,
.station-logo-large {
transition: transform 0.3s ease, filter 0.3s ease;
}
.station-logo:hover,
.station-logo-large:hover {
transform: scale(1.05);
filter: brightness(1.1);
}
/* Transizione per i pulsanti */
/* button,
.submit-btn,
.play-pause-btn {
transition: all 0.3s ease;
}
button:hover,
.submit-btn:hover,
.play-pause-btn:hover {
transform: scale(1.05);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}
button:active,
.submit-btn:active,
.play-pause-btn:active {
transform: scale(0.95);
}
/* Transizione smooth per tutti gli elementi interattivi */
/* a, button, input, textarea, select {
transition: all 0.2s ease;
}
/* RIMOSSO: underline animato per il menu */
/* Non ci sono più after pseudo-elementi per le underline */
/* Transizione per il back-link */
/* .back-link a {
transition: all 0.3s ease;
display: inline-block;
}
.back-link a:hover {
transform: translateX(-5px);
color: #4a90e2;
}
/* Animazione per le liste */
/* .stations-container {
display: grid;
gap: 1rem;
}
.station-card {
animation: fadeInScale 0.4s ease-out backwards;
}
.station-card:nth-child(1) { animation-delay: 0.05s; }
.station-card:nth-child(2) { animation-delay: 0.1s; }
.station-card:nth-child(3) { animation-delay: 0.15s; }
.station-card:nth-child(4) { animation-delay: 0.2s; }
.station-card:nth-child(5) { animation-delay: 0.25s; }
@keyframes fadeInScale {
from {
opacity: 0;
transform: scale(0.95);
}
to {
opacity: 1;
transform: scale(1);
}
}
/* Transizione per i form */
/* .form-group input,
.form-group textarea,
.form-group select {
transition: border-color 0.3s ease, box-shadow 0.3s ease;
}
.form-group input:focus,
.form-group textarea:focus,
.form-group select:focus {
border-color: #4a90e2;
box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.1);
}
/* Animazione per i messaggi di risposta */
/* .form-response {
animation: slideInDown 0.4s ease-out;
}
@keyframes slideInDown {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Transizione per video e iframe */
/* video,
iframe {
transition: opacity 0.3s ease;
}
video:hover,
iframe:hover {
opacity: 0.95;
}
/* Performance optimization */
/** {
-webkit-tap-highlight-color: transparent;
}
/* Smooth scrolling */
/* html {
scroll-behavior: smooth;
}
/* Riduzione movimento per chi ha impostato preferenze di accessibilità */
/*@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
.navLink.active::before {
animation: none !important;
}
}

22530
css/bootstrap.css vendored

File diff suppressed because it is too large Load Diff

View File

@@ -1,93 +1,93 @@
Copyright 2020 The Poppins Project Authors (https://github.com/itfoundry/Poppins)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://openfontlicense.org
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
Copyright 2020 The Poppins Project Authors (https://github.com/itfoundry/Poppins)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://openfontlicense.org
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

@@ -112,7 +112,7 @@ div.dbox_mobile {
div.dbox_mobile {
width: 90%;
max-width: 450px;
max-width: 750px;
color: white;
border-radius: 10px;
max-height: 475px;
@@ -163,7 +163,7 @@ div.dfooter {
.appBody {
background-color: #10194b;
max-width: 450px;
max-width: 750px;
min-width: 330px;
margin: auto;
display: flex;
@@ -258,7 +258,7 @@ main {
.tec,
.stationList {
padding: 0 13px;
margin: 0 0 7px;
margin: 0 0 10px;
text-align: justify;
hyphens: auto;
}
@@ -289,12 +289,12 @@ main {
margin: 0;
} */
.stationCard.isthematic{
.stationCard.isthematic {
text-align: right;
margin-top: -24px;
}
.stationCard.isthematic:before{
.stationCard.isthematic:before {
content: "Tematica";
position: relative;
background: #f7b835;
@@ -308,42 +308,38 @@ main {
margin: 0;
}
iframe.contentplayer{
position: absolute;
left: 50%;
height: calc(100vh - 312px);
iframe.contentplayer {
height: calc(100vh - 393px);
width: 100%;
max-width: 450px;
transform: translateX(-50%);
max-width: 750px;
}
.footer_player{
.footer_player {
background: #f7b835;
color: #2a377d;
position: fixed;
z-index: 90;
bottom: 70px;
left: 50%;
transform: translateX(-50%);
width: 100%;
max-width: 450px;
max-width: 750px;
height: 100px;
border-top-left-radius: 8px;
border-top-right-radius: 8px;
padding: 20px;
border-top: 1px solid #eee;
flex: 1;
align-content: end;
}
.footer_player > .row > .col-2 > img{
.footer_player>.row>.col-2>img {
border-radius: 5px;
}
button#playPauseBtn{
button#playPauseBtn,
button#formatToggleBtn {
background: none;
border: none;
}
.footer{
z-index: 1;
.footer,
.header {
z-index: 10000;
}
.footer>.menu-section {
@@ -398,3 +394,28 @@ button#playPauseBtn{
}
/* Forza orientamento portrait - nasconde contenuto in landscape */
@media screen and (orientation: landscape) and (max-height: 450px) {
body.appBody::after {
content: "Ruota il dispositivo in verticale";
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: #2a377e;
color: white;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2rem;
font-weight: 600;
z-index: 9999;
text-align: center;
padding: 20px;
}
body.appBody>* {
display: none !important;
}
}

View File

@@ -1,6 +1,90 @@
<?xml version="1.0" encoding="UTF-8"?>
<changelog>
<version>
<number>2.4.2</number>
<logs>
<log>Aggiornata la grandezza della finestra dell'applicazione da desktop.</log>
<log>Inserito il link della repository su ASV Git all'interno della pagina del changelog.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
<version>
<number>2.4.1</number>
<logs>
<log>Aggiornata la pagiana del player audio, per renderla più coerente con le altre pagine dell'applicazione.</log>
<log>Aggiunta la visualizzazione dell'artista e del brano in riproduzione.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
<version>
<number>2.4.0</number>
<logs>
<log>Implementato il player video dedicato per la riproduzione dei canali visivi.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
<version>
<number>2.3.0</number>
<logs>
<log>Ottimizzata la risoluzione dell'applicazione su dispositivi larghi (tablet, iPad e computer).</log>
<log>Implementato lo switch tra il player audio in HLS e il player audio in MP3/AAC.</log>
<log>Rimosso l'avviso per i dispositivi iOS.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
<version>
<number>2.2.0</number>
<logs>
<log>E' stato reintrodotto la schermata di caricamento ad ogni selezione di ogni pagina dell'applicazione.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
<version>
<number>2.1.4</number>
<logs>
<log>Corretto la visione verticale sui dispositivi mobili.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
<version>
<number>2.1.3</number>
<logs>
<log>Implementato il nuovo player audio per la riproduzione dei flussi audio in HLS per il bitrate adattivo.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
<version>
<number>2.1.2</number>
<logs>
<log>Implementazione del sistema di qualità adattiva (ABR) per il player audio.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
<version>
<number>2.1.1</number>
<logs>
<log>Corretti alcuni bug che impedivano l'accesso al player dal link esterno.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
<version>
<number>2.1.0</number>
<logs>
<log>Risoluzione dei problemi minori presenti nel codice, che causava problemi nella navigazione in app.</log>
<log>Risoluzione dei problemi minori presenti nel codice, che causava problemi di riproduzione audio al player.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
<version>
<number>2.0.4</number>
@@ -13,8 +97,8 @@
<version>
<number>2.0.3</number>
<logs>
<log>Corretta la visualizzazione dei contenuti forniti dalle emittenti all'interno del player</log>
<log>Corretta la visualizzazione del player audio</log>
<log>Corretta la visualizzazione dei contenuti forniti dalle emittenti all'interno del player.</log>
<log>Corretta la visualizzazione del player audio.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
@@ -22,7 +106,7 @@
<version>
<number>2.0.2</number>
<logs>
<log>Inserita la pagina statica per le emittenti tematiche</log>
<log>Inserita la pagina statica per le emittenti tematiche.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
@@ -30,7 +114,7 @@
<version>
<number>2.0.1</number>
<logs>
<log>Aggiunta la Visual Radio dell'emittente "Radio Città 105</log>
<log>Aggiunta la Visual Radio dell'emittente "Radio Città 105".</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
@@ -38,7 +122,7 @@
<version>
<number>2.0.0</number>
<logs>
<log>Nuova UI/UX: RPIGroup aggiorna la veste grafica della sua applicazione, rendendola più "fumettosa" e "giocattolosa". Un'estetica completamente diversa da tutte le altre varie app radiofoniche</log>
<log>Nuova UI/UX: RPIGroup aggiorna la veste grafica della sua applicazione, rendendola più "fumettosa" e "giocattolosa". Un'estetica completamente diversa da tutte le altre varie app radiofoniche.</log>
<log>Nuova Engine: Nuovo motore e struttura dell'applicazione. Lato backend è cambiato completamente rispetto alla versione 1.</log>
<log>Nuovo Player Audio/Video: Player più semplice, ma conserva le caratteristiche della precedente versione.</log>
<log>Termini e Condizioni: inserimento per obblighi di legge dei corrispettivi "Termini e Condizioni"</log>
@@ -59,7 +143,7 @@
<version>
<number>1.2.0 Stable</number>
<logs>
<log>Implementato il "Media Sessions" che permette di visualizzare la radio in riproduzione nel centro notifiche su iOS e Android</log>
<log>Implementato il "Media Sessions" che permette di visualizzare la radio in riproduzione nel centro notifiche su iOS e Android.</log>
<log>Preparazione dell'ottimizzazione del software in occasione della terza versione dell'app.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
@@ -77,9 +161,9 @@
<version>
<number>1.1.0 Stable</number>
<logs>
<log>Aggiunta la nuova stazione radio tematica "RDL Revival 70-80-90"</log>
<log>Migliorata la visualizzazione del selettore radio della pagina home</log>
<log>Implementato nel player la visualizzazione della pagina statica per le radio tematiche</log>
<log>Aggiunta la nuova stazione radio tematica "RDL Revival 70-80-90".</log>
<log>Migliorata la visualizzazione del selettore radio della pagina home.</log>
<log>Implementato nel player la visualizzazione della pagina statica per le radio tematiche.</log>
<log>Correzione e bugfix di problematiche varie causate dall'ultima versione "Beta".</log>
</logs>
</version>
@@ -87,10 +171,10 @@
<version>
<number>1.0.0 Stable</number>
<logs>
<log>Passaggio alla versione "Stable" dell'applicazione</log>
<log>Verifica di ulteriori correzioni dal passaggio della versione stabile</log>
<log>Leggerimento dell'applicazione a livello backend</log>
<log>Ulteriori analisi di stabilità dal momento del passaggio alla versione stabile</log>
<log>Passaggio alla versione "Stable" dell'applicazione.</log>
<log>Verifica di ulteriori correzioni dal passaggio della versione stabile.</log>
<log>Leggerimento dell'applicazione a livello backend.</log>
<log>Ulteriori analisi di stabilità dal momento del passaggio alla versione stabile.</log>
<log>Correzione e bugfix di problematiche varie causate dall'ultima versione "Beta".</log>
</logs>
</version>
@@ -127,7 +211,7 @@
<version>
<number>0.23.1 Beta</number>
<logs>
<log>Rimozione del logo al caricamento di ogni singola pagina (tranne all'avvio dell'app)</log>
<log>Rimozione del logo al caricamento di ogni singola pagina (tranne all'avvio dell'app).</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
@@ -135,8 +219,8 @@
<version>
<number>0.23.0 Beta</number>
<logs>
<log>Rilasciato il nuovo player video</log>
<log>Inserimento dell'emittente RC105TV nella lista delle WebTV</log>
<log>Rilasciato il nuovo player video.</log>
<log>Inserimento dell'emittente RC105TV nella lista delle WebTV.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
@@ -144,9 +228,9 @@
<version>
<number>0.22.4 Beta</number>
<logs>
<log>Correzione errori minimi nel sistema</log>
<log>Aggiunta indicatore della versione app nella schermata desktop</log>
<log>Preparazione player video - Correzioni minimi player e aggiunta di pagine mancanti</log>
<log>Correzione errori minimi nel sistema.</log>
<log>Aggiunta indicatore della versione app nella schermata desktop.</log>
<log>Preparazione player video - Correzioni minimi player e aggiunta di pagine mancanti.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
@@ -154,8 +238,8 @@
<version>
<number>0.22.3 Beta</number>
<logs>
<log>Migliorati i tempi di caricamento dei player</log>
<log>Aggiunta nuovi file di Configurazione</log>
<log>Migliorati i tempi di caricamento dei player.</log>
<log>Aggiunta nuovi file di Configurazione.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>
@@ -173,8 +257,8 @@
<version>
<number>0.22.1 Beta</number>
<logs>
<log>Corretto il bug del logo all'interno dell'homepage</log>
<log>Corretto la riproduzione audio dell'emittente Radio Città 105</log>
<log>Corretto il bug del logo all'interno dell'homepage.</log>
<log>Corretto la riproduzione audio dell'emittente Radio Città 105.</log>
<log>Correzione e bugfix di problematiche varie.</log>
</logs>
</version>

View File

@@ -1,60 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<radio>
<station>
<id>1</id>
<name>RDL Radio Diffusione Libera</name>
<slogan>O Sei Fuori, O Sei Dei Nostri</slogan>
<thematic>false</thematic>
<logo>https://i0.wp.com/www.radiodiffusionelibera.com/wp-content/uploads/2017/01/RDL-Facebook.png</logo>
<stream>https://asvradiostream.asvstudios.it/radio/8000/radio.mp3</stream>
<streamhls>https://srvone.radio.asvhosting.com/hls/rdlradio/live.m3u8</streamhls>
<contentplayer>https://www.radiodiffusionelibera.com/contentrpigplay</contentplayer>
</station>
<station>
<id>2</id>
<name>Radio Città 105</name>
<slogan>La Radio Della Tua Città</slogan>
<thematic>false</thematic>
<logo>https://www.radiocitta105.it/wp-content/uploads/2020/06/26168468_1590103344416186_7025872599153073152_n-1.png</logo>
<stream>https://asvradiostream.asvstudios.it/radio/8020/auto.aac</stream>
<streamhls>https://srvone.radio.asvhosting.com/hls/radiocitta105/live.m3u8</streamhls>
<contentplayer>https://www.radiocitta105.it/contentrpigplay</contentplayer>
</station>
<station>
<id>3</id>
<name>RadioAI</name>
<slogan>Solo musica AI - Powered by RDL </slogan>
<thematic>true</thematic>
<logo>https://srvone.radio.asvhosting.com/static/uploads/radioai/album_art.1763568756.png</logo>
<stream>https://srvone.radio.asvhosting.com/listen/radioai/radio.mp3</stream>
<streamhls>https://srvone.radio.asvhosting.com/hls/radioai/live.m3u8</streamhls>
<contentplayer></contentplayer>
</station>
<station>
<id>4</id>
<name>RC105 Christmas - Eboli</name>
<slogan>La musica di Natale, in giro per Eboli</slogan>
<thematic>true</thematic>
<logo>https://www.radiocitta105.it/wp-content/uploads/2020/06/christmaseboli.png</logo>
<stream>https://srvone.radio.asvhosting.com/listen/rc105_christmas/radio.aac</stream>
<streamhls>https://srvone.radio.asvhosting.com/hls/rc105_christmas/live.m3u8</streamhls>
<contentplayer></contentplayer>
</station>
<station>
<id>5</id>
<name>Radio People Italy</name>
<slogan>La radio della Gente</slogan>
<thematic>false</thematic>
<logo>https://www.rpigroup.it/wp-content/uploads/2020/06/radiopeopleitaly_logo_squared-1.png</logo>
<stream></stream>
<streamhls></streamhls>
<contentplayer>https://www.rpigroup.it/radiopeopleitaly_contentrpigroup/</contentplayer>
</station>
<?xml version="1.0" encoding="UTF-8"?>
<radio>
<station>
<id>1</id>
<name>RDL Radio Diffusione Libera</name>
<slogan>O Sei Fuori, O Sei Dei Nostri</slogan>
<thematic>false</thematic>
<logo>https://i0.wp.com/www.radiodiffusionelibera.com/wp-content/uploads/2017/01/RDL-Facebook.png</logo>
<stream>https://asvradiostream.asvstudios.it/radio/8000/radio.aac</stream>
<streamhls>https://srvone.radio.asvhosting.com/hls/rdlradio/live.m3u8</streamhls>
<contentplayer>https://www.radiodiffusionelibera.com/contentrpigplay</contentplayer>
<apiradio>https://srvone.radio.asvhosting.com/api/nowplaying/2</apiradio>
</station>
<station>
<id>2</id>
<name>Radio Città 105</name>
<slogan>La Radio Della Tua Città</slogan>
<thematic>false</thematic>
<logo>https://www.radiocitta105.it/wp-content/uploads/2020/06/26168468_1590103344416186_7025872599153073152_n-1.png</logo>
<stream>https://asvradiostream.asvstudios.it/radio/8020/auto.aac</stream>
<streamhls>https://srvone.radio.asvhosting.com/hls/radiocitta105/live.m3u8</streamhls>
<contentplayer>https://www.radiocitta105.it/contentrpigplay</contentplayer>
<apiradio>https://srvone.radio.asvhosting.com/api/nowplaying/1</apiradio>
</station>
<!-- <station>
<id>3</id>
<name>RadioAI</name>
<slogan>Solo musica AI - Powered by RDL </slogan>
<thematic>true</thematic>
<logo>https://srvone.radio.asvhosting.com/static/uploads/radioai/album_art.1763568756.png</logo>
<stream>https://srvone.radio.asvhosting.com/listen/radioai/radio.mp3</stream>
<streamhls>https://srvone.radio.asvhosting.com/hls/radioai/live.m3u8</streamhls>
<contentplayer></contentplayer>
</station> -->
<!-- <station>
<id>4</id>
<name>RC105 Christmas - Eboli</name>
<slogan>La musica di Natale, in giro per Eboli</slogan>
<thematic>true</thematic>
<logo>https://www.radiocitta105.it/wp-content/uploads/2020/06/christmaseboli.png</logo>
<stream>https://srvone.radio.asvhosting.com/listen/rc105_christmas/radio.aac</stream>
<streamhls>https://srvone.radio.asvhosting.com/hls/rc105_christmas/live.m3u8</streamhls>
<contentplayer></contentplayer>
</station> -->
<!-- <station>
<id>5</id>
<name>Radio People Italy</name>
<slogan>La radio della Gente</slogan>
<thematic>false</thematic>
<logo>https://www.rpigroup.it/wp-content/uploads/2020/06/radiopeopleitaly_logo_squared-1.png</logo>
<stream></stream>
<streamhls></streamhls>
<contentplayer>https://www.rpigroup.it/radiopeopleitaly_contentrpigroup/</contentplayer>
</station> -->
</radio>

View File

@@ -1,21 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<tv>
<!-- <station>
<id>1</id>
<name>RDL TV</name>
<logo>https://i0.wp.com/www.radiodiffusionelibera.com/wp-content/uploads/2017/01/RDL-Facebook.png</logo>
<stream>https://webtv.rpigroup.it/memfs/0a30f923-06b3-461c-8c68-297a66b29485.m3u8</stream>
<poster>https://webtv.rpigroup.it/memfs/0a30f923-06b3-461c-8c68-297a66b29485.jpg</poster>
</station> -->
<station>
<id>1</id>
<name>Rc105 TV</name>
<logo>https://www.radiocitta105.it/wp-content/uploads/2020/06/26168468_1590103344416186_7025872599153073152_n-1.png</logo>
<stream>https://webtv.rpigroup.it/e1e55a4b-abec-4043-8f08-e2105b48b59b.m3u8</stream>
<poster>https://webtv.rpigroup.it/memfs/e1e55a4b-abec-4043-8f08-e2105b48b59b.jpg</poster>
</station>
<?xml version="1.0" encoding="UTF-8"?>
<tv>
<!-- <station>
<id>1</id>
<name>RDL TV</name>
<logo>https://i0.wp.com/www.radiodiffusionelibera.com/wp-content/uploads/2017/01/RDL-Facebook.png</logo>
<stream>https://webtv.rpigroup.it/memfs/0a30f923-06b3-461c-8c68-297a66b29485.m3u8</stream>
<poster>https://webtv.rpigroup.it/memfs/0a30f923-06b3-461c-8c68-297a66b29485.jpg</poster>
</station> -->
<station>
<id>1</id>
<name>Rc105 TV</name>
<logo>https://www.radiocitta105.it/wp-content/uploads/2020/06/26168468_1590103344416186_7025872599153073152_n-1.png</logo>
<stream>https://tv.rpigroup.net/memfs/a9699134-efb3-4932-b8db-5a49ae214031.m3u8</stream>
<poster>https://tv.rpigroup.net/memfs/a9699134-efb3-4932-b8db-5a49ae214031.jpg</poster>
</station>
</tv>

View File

@@ -1,88 +1,88 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="254mm"
height="69mm"
viewBox="0 0 254 69"
version="1.1"
id="svg5"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
sodipodi:docname="RpiGroup Play.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.0381216"
inkscape:cx="481.63913"
inkscape:cy="276.9425"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<rect
x="83.099152"
y="268.36938"
width="1046.9131"
height="292.20932"
id="rect2696" />
</defs>
<g
inkscape:label="Livello 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g115895"
transform="translate(1.131366,1.3862444)">
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-25.410801,-55.802387)"
id="text2694"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:192px;line-height:0;font-family:'Malgun Gothic';-inkscape-font-specification:'Malgun Gothic Bold';letter-spacing:-7px;white-space:pre;shape-inside:url(#rect2696);fill:#2a377e;fill-opacity:1;stroke:none"><tspan
x="83.099609"
y="417.31399"
id="tspan121578"><tspan
style="line-height:1;font-family:'Maiandra GD';-inkscape-font-specification:'Maiandra GD Bold';letter-spacing:-15px"
id="tspan121568">RPI</tspan><tspan
dx="-15"
style="font-size:53.3333px;letter-spacing:0px"
id="tspan121570"> </tspan><tspan
dx="10.000004"
style="font-weight:600;font-size:133.333px;line-height:1;font-family:'Segoe UI';-inkscape-font-specification:'Segoe UI Semi-Bold';letter-spacing:-10px"
id="tspan121572">Group</tspan><tspan
style="font-size:148px"
id="tspan121574"> </tspan><tspan
style="font-family:'Segoe UI';-inkscape-font-specification:'Segoe UI Bold';letter-spacing:-10px;fill:#f7b835"
id="tspan121576">Play</tspan></tspan></text>
<path
style="fill:none;stroke:#f7b835;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 56.217322,11.650982 c 5.939254,0.41143 9.094873,5.4153 8.904918,10.27467"
id="path42806"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#f7b835;stroke-width:2.44688;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 56.481391,6.7067586 c 8.705065,0.601213 13.330204,7.9132434 13.05179,15.0141214"
id="path42806-7"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#f7b835;stroke-width:3.15615;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 56.804607,1.2625936 C 68.853884,2.0652156 75.255859,11.826816 74.870479,21.306526"
id="path42806-7-7"
sodipodi:nodetypes="cc" />
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="254mm"
height="69mm"
viewBox="0 0 254 69"
version="1.1"
id="svg5"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
sodipodi:docname="RpiGroup Play.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.0381216"
inkscape:cx="481.63913"
inkscape:cy="276.9425"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<rect
x="83.099152"
y="268.36938"
width="1046.9131"
height="292.20932"
id="rect2696" />
</defs>
<g
inkscape:label="Livello 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g115895"
transform="translate(1.131366,1.3862444)">
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-25.410801,-55.802387)"
id="text2694"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:192px;line-height:0;font-family:'Malgun Gothic';-inkscape-font-specification:'Malgun Gothic Bold';letter-spacing:-7px;white-space:pre;shape-inside:url(#rect2696);fill:#2a377e;fill-opacity:1;stroke:none"><tspan
x="83.099609"
y="417.31399"
id="tspan121578"><tspan
style="line-height:1;font-family:'Maiandra GD';-inkscape-font-specification:'Maiandra GD Bold';letter-spacing:-15px"
id="tspan121568">RPI</tspan><tspan
dx="-15"
style="font-size:53.3333px;letter-spacing:0px"
id="tspan121570"> </tspan><tspan
dx="10.000004"
style="font-weight:600;font-size:133.333px;line-height:1;font-family:'Segoe UI';-inkscape-font-specification:'Segoe UI Semi-Bold';letter-spacing:-10px"
id="tspan121572">Group</tspan><tspan
style="font-size:148px"
id="tspan121574"> </tspan><tspan
style="font-family:'Segoe UI';-inkscape-font-specification:'Segoe UI Bold';letter-spacing:-10px;fill:#f7b835"
id="tspan121576">Play</tspan></tspan></text>
<path
style="fill:none;stroke:#f7b835;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 56.217322,11.650982 c 5.939254,0.41143 9.094873,5.4153 8.904918,10.27467"
id="path42806"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#f7b835;stroke-width:2.44688;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 56.481391,6.7067586 c 8.705065,0.601213 13.330204,7.9132434 13.05179,15.0141214"
id="path42806-7"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#f7b835;stroke-width:3.15615;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 56.804607,1.2625936 C 68.853884,2.0652156 75.255859,11.826816 74.870479,21.306526"
id="path42806-7-7"
sodipodi:nodetypes="cc" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -1,88 +1,88 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="254mm"
height="69mm"
viewBox="0 0 254 69"
version="1.1"
id="svg5"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
sodipodi:docname="RpiGroup Play WHITE.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.0381216"
inkscape:cx="481.63913"
inkscape:cy="276.9425"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<rect
x="83.099152"
y="268.36938"
width="1046.9131"
height="292.20932"
id="rect2696" />
</defs>
<g
inkscape:label="Livello 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g115895"
transform="translate(1.131366,1.3862444)">
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-25.410801,-55.802387)"
id="text2694"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:192px;line-height:0;font-family:'Malgun Gothic';-inkscape-font-specification:'Malgun Gothic Bold';letter-spacing:-7px;white-space:pre;shape-inside:url(#rect2696);fill:#2a377e;fill-opacity:1;stroke:none"><tspan
x="83.099609"
y="417.31399"
id="tspan123972"><tspan
style="line-height:1;font-family:'Maiandra GD';-inkscape-font-specification:'Maiandra GD Bold';letter-spacing:-15px;fill:#ffffff"
id="tspan123962">RPI</tspan><tspan
dx="-15"
style="font-size:53.3333px;letter-spacing:0px;fill:#ffffff"
id="tspan123964"> </tspan><tspan
dx="10.000004"
style="fill:#ffffff"
id="tspan123966">Group</tspan><tspan
style="font-size:148px"
id="tspan123968"> </tspan><tspan
style="font-family:'Segoe UI';-inkscape-font-specification:'Segoe UI Bold';letter-spacing:-10px;fill:#f7b835"
id="tspan123970">Play</tspan></tspan></text>
<path
style="fill:none;stroke:#f7b835;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 56.217322,11.650982 c 5.939254,0.41143 9.094873,5.4153 8.904918,10.27467"
id="path42806"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#f7b835;stroke-width:2.44688;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 56.481391,6.7067586 c 8.705065,0.601213 13.330204,7.9132434 13.05179,15.0141214"
id="path42806-7"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#f7b835;stroke-width:3.15615;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 56.804607,1.2625936 C 68.853884,2.0652156 75.255859,11.826816 74.870479,21.306526"
id="path42806-7-7"
sodipodi:nodetypes="cc" />
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="254mm"
height="69mm"
viewBox="0 0 254 69"
version="1.1"
id="svg5"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
sodipodi:docname="RpiGroup Play WHITE.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.0381216"
inkscape:cx="481.63913"
inkscape:cy="276.9425"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<rect
x="83.099152"
y="268.36938"
width="1046.9131"
height="292.20932"
id="rect2696" />
</defs>
<g
inkscape:label="Livello 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g115895"
transform="translate(1.131366,1.3862444)">
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-25.410801,-55.802387)"
id="text2694"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:192px;line-height:0;font-family:'Malgun Gothic';-inkscape-font-specification:'Malgun Gothic Bold';letter-spacing:-7px;white-space:pre;shape-inside:url(#rect2696);fill:#2a377e;fill-opacity:1;stroke:none"><tspan
x="83.099609"
y="417.31399"
id="tspan123972"><tspan
style="line-height:1;font-family:'Maiandra GD';-inkscape-font-specification:'Maiandra GD Bold';letter-spacing:-15px;fill:#ffffff"
id="tspan123962">RPI</tspan><tspan
dx="-15"
style="font-size:53.3333px;letter-spacing:0px;fill:#ffffff"
id="tspan123964"> </tspan><tspan
dx="10.000004"
style="fill:#ffffff"
id="tspan123966">Group</tspan><tspan
style="font-size:148px"
id="tspan123968"> </tspan><tspan
style="font-family:'Segoe UI';-inkscape-font-specification:'Segoe UI Bold';letter-spacing:-10px;fill:#f7b835"
id="tspan123970">Play</tspan></tspan></text>
<path
style="fill:none;stroke:#f7b835;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 56.217322,11.650982 c 5.939254,0.41143 9.094873,5.4153 8.904918,10.27467"
id="path42806"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#f7b835;stroke-width:2.44688;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 56.481391,6.7067586 c 8.705065,0.601213 13.330204,7.9132434 13.05179,15.0141214"
id="path42806-7"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#f7b835;stroke-width:3.15615;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 56.804607,1.2625936 C 68.853884,2.0652156 75.255859,11.826816 74.870479,21.306526"
id="path42806-7-7"
sodipodi:nodetypes="cc" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -1,31 +1,36 @@
<?php
/*
# RPIGROUP PLAY - WebApp powered by A.S.V. Studios APPS for RPIGroup
# ---------------------------------------------------------------
# Author: A.S.V. Studios APPS
# Website: https://app.rpigroup.net
# ---------------------------------------------------------------
# All Rights is reserved by A.S.V. Studios APPS.
#
# Version app: VEDERE IN CHANGELOG.XML
*/
# Import config file
include_once './config/config.php';
# Import head file
include_once './static/head.php';
# Load Pages
if(!$show_app):
include_once './pages/desktop.php';
else:
include_once './pages/mobile.php';
endif;
# Import footer file
<?php
/*
# RPIGROUP PLAY - WebApp powered by A.S.V. Studios APPS for RPIGroup
# ---------------------------------------------------------------
# Author: A.S.V. Studios APPS
# Website: https://app.rpigroup.net
# Copyright (c) 2025-202 A.S.V. Studios APPS
# ---------------------------------------------------------------
# Questa app è disponibile all'interno della repository pubblica di RPIGroup Play.
# ---------------------------------------------------------------
# All Rights is reserved by A.S.V. Studios APPS.
#
# Version app: VEDERE IN CHANGELOG.XML
*/
header('Content-Type: text/html; charset=UTF-8');
# Import config file
include_once './config/config.php';
# Import head file
include_once './static/head.php';
# Load Pages
if(!$show_app):
include_once './pages/desktop.php';
else:
include_once './pages/mobile.php';
endif;
# Import footer file
include_once './static/footer.php';

1696
js/app.js

File diff suppressed because it is too large Load Diff

7
js/bootstrap.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,91 +1,94 @@
<div id="proradio-secondary-header" class="proradio-secondaryhead proradio-primary" style="border-bottom: solid 3px #3849a8;">
<style>
.rpigroup-topbar {
background: #2a367b;
padding: 0 40px;
display: flex;
align-items: center;
height: 55px;
font-size: 0.8rem !important;
font-weight: 700;
font-family: 'Poppins';
letter-spacing: 0;
}
.rpigroup-topbar>a>.logo {
margin-right: 20px;
height: 40px;
display: flex;
border-right: solid 2px #3746a1;
padding-right: 20px;
}
.rpigroup-topbar>a {
text-decoration: none;
color: white;
}
.rpigroup-topbar > .nolink {
margin-right: 15px;
font-weight: 600;
}
.rpigroup-topbar>a>.link {
padding: 19px 25px 16px;
}
.rpigroup-topbar>a>.link:hover {
background: #36449c;
border-bottom: 3px solid #36449c;
}
.rpigroup-topbar>a>.active {
background: #00000044;
border-bottom: 3px solid #f7b932;
}
.rpigroup-topbar>a>.active:hover {
background: #36449c;
border-bottom: 3px solid #f7b932;
}
</style>
<div class="rpigroup-topbar">
<a href="https://www.rpigroup.it/" target="_blank">
<img src="https://www.rpigroup.it/wp-content/uploads/2025/01/RpiGroup-Play-WHITE-NEW-e1737078263620.png" alt="logoRPIGroup" class="logo">
</a>
<span class="nolink">Vai al sito di:</span>
<a href="https://www.radiocitta105.it" target="_blank"><span class="link">Radio Città 105</span></a>
<a href="https://www.radiodiffusionelibera.com" target="_blank"><span class="link">Radio DiffusioneLibera</span></a>
<a href="https://www.co-municare.it" target="_blank"><span class="link">Co-Municare.it</span></a>
<a href="https://app.rpigroup.it" target="_blank"><span class="link active">RPIGroup Play</span></a>
</div>
</div>
<div class="dbox dbox-extra">
<img src="<?=$base_path?>/img/RpiGroupPlayWHITE.png" alt="Logo" style="width: 315px;">
<p class="subtitle"><i>Un nuovo modo di ascoltare musica</i></p>
<hr>
<?php
switch ($page){
case 'play':
if (!empty($param)) {
$stationId = (int)$param;
$station = getRadioStation($stationId);
echo 'Ascolta ora <b>' . htmlspecialchars($station->name) . '</b> su RPIGroup Play!';
}else{
echo 'Ascolta ora le tue radio preferite!';
}
break;
default:
echo 'Ascolta le nostre emittenti con la nostra nuova app disegnata per smartphone (e non...)';
}
?>
<hr>
<a class="dbtn" id="openAppBtn" href="<?php echo $base_path . '/?app=true&redirect=' . urlencode($page . ($param ? '/' . $param : '')); ?>">ENTRA SU RPIGRPUP PLAY</a>
</div>
<div class="dfooter">
App powered by A.S.V. Studios APPS • Versione App: <?php echo $version_app; ?>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<div id="proradio-secondary-header" class="proradio-secondaryhead proradio-primary" style="border-bottom: solid 3px #3849a8;">
<style>
.rpigroup-topbar {
background: #2a367b;
padding: 0 40px;
display: flex;
align-items: center;
height: 55px;
font-size: 0.8rem !important;
font-weight: 700;
font-family: 'Poppins';
letter-spacing: 0;
}
.rpigroup-topbar>a>.logo {
margin-right: 20px;
height: 40px;
display: flex;
border-right: solid 2px #3746a1;
padding-right: 20px;
}
.rpigroup-topbar>a {
text-decoration: none;
color: white;
}
.rpigroup-topbar > .nolink {
margin-right: 15px;
font-weight: 600;
}
.rpigroup-topbar>a>.link {
padding: 19px 25px 16px;
}
.rpigroup-topbar>a>.link:hover {
background: #36449c;
border-bottom: 3px solid #36449c;
}
.rpigroup-topbar>a>.active {
background: #00000044;
border-bottom: 3px solid #f7b932;
}
.rpigroup-topbar>a>.active:hover {
background: #36449c;
border-bottom: 3px solid #f7b932;
}
</style>
<div class="rpigroup-topbar">
<a href="https://www.rpigroup.it/" target="_blank">
<img src="https://www.rpigroup.it/wp-content/uploads/2025/01/RpiGroup-Play-WHITE-NEW-e1737078263620.png" alt="logoRPIGroup" class="logo">
</a>
<span class="nolink">Vai al sito di:</span>
<a href="https://www.radiocitta105.it" target="_blank"><span class="link">Radio Città 105</span></a>
<a href="https://www.radiodiffusionelibera.com" target="_blank"><span class="link">Radio DiffusioneLibera</span></a>
<a href="https://www.co-municare.it" target="_blank"><span class="link">Co-Municare.it</span></a>
<a href="https://www.ineboli.it" target="_blank"><span class="link">InEboli</span></a>
<a href="https://app.rpigroup.it" target="_blank"><span class="link active">RPIGroup Play</span></a>
</div>
</div>
<div class="dbox dbox-extra">
<img src="<?=$base_path?>/img/RpiGroupPlayWHITE.png" alt="Logo" style="width: 315px;">
<p class="subtitle"><i>Un nuovo modo di ascoltare musica</i></p>
<hr>
<?php
switch ($page){
case 'play':
if (!empty($param)) {
$stationId = (int)$param;
$station = getRadioStation($stationId);
echo 'Ascolta ora <b>' . htmlspecialchars($station->name) . '</b> su RPIGroup Play!';
}else{
echo 'Ascolta ora le tue radio preferite!';
}
break;
default:
echo 'Ascolta le nostre emittenti con la nostra nuova app disegnata per smartphone (e non...)';
}
?>
<hr>
<a class="dbtn" id="openAppBtn" href="<?php echo $base_path . '/?app=true&redirect=' . urlencode($page . ($param ? '/' . $param : '')); ?>">ENTRA SU RPIGRPUP PLAY</a>
</div>
<div class="dfooter">
App powered by A.S.V. Studios APPS • Versione App: <?php echo $version_app; ?>
</div>

View File

@@ -1,98 +1,111 @@
<div class="header">
<div class="logo-section">
<img src="<?=$base_path?>/img/RpiGroupPlayWHITE.png" alt="Logo">
</div>
<div class="menu-section">
<a href="<?php echo $base_path; ?>/" data-page="home" class="navLink <?php echo $page == 'home' ? 'active' : ''; ?>">Home</a>
<a href="<?php echo $base_path; ?>/radio" data-page="radio" class="navLink <?php echo ($page == 'radio' || $page == 'play') ? 'active' : ''; ?>">Radio</a>
<a href="<?php echo $base_path; ?>/tv" data-page="tv" class="navLink <?php echo ($page == 'tv' || $page == 'playtv') ? 'active' : ''; ?>">TV</a>
<a href="<?php echo $base_path; ?>/page/addradio" data-page="page/addradio" class="navLink <?php echo ($page == 'page' && $param == 'addradio') ? 'active' : ''; ?>">Add Radio</a>
</div>
</div>
<main class="container" id="content">
<?php
// Carica il contenuto iniziale in base all'URL
switch ($page) {
case 'home':
include './pages/page/home.php';
break;
case 'radio':
include './pages/page/radio.php';
break;
case 'tv':
include './pages/page/tv.php';
break;
case 'play':
if (!empty($param)) {
$stationId = (int)$param;
$station = getRadioStation($stationId);
if ($station !== null) {
include './pages/page/player.php';
} else {
include './pages/page/404.php';
}
} else {
// Se non c'è ID, torna alla home
include './pages/page/home.php';
}
break;
case 'playtv':
if (!empty($param)) {
$stationId = (int)$param;
$station = getTVStation($stationId);
if ($station !== null) {
include './pages/page/player_tv.php';
} else {
include './pages/page/404.php';
}
} else {
// Se non c'è ID, torna alla home
include './pages/page/home.php';
}
break;
case 'page':
if (!empty($param)) {
switch ($param) {
case 'about':
include './pages/page/about.php';
break;
case 'copyright':
include './pages/page/copyright.php';
break;
case 'addradio':
include './pages/page/addradio.php';
break;
case 'contact':
include './pages/page/contact.php';
break;
case 'termini-condizioni':
include './pages/page/terminicondizioni.php';
break;
case 'policy-privacy':
include './pages/page/policyprivacy.php';
break;
case 'changelog':
include './pages/page/changelog.php';
break;
default:
include './pages/page/404.php';
}
} else {
include './pages/page/404.php';
}
break;
default:
include './pages/page/home.php';
}
?>
</main>
<div class="footer">
<div class="menu-section">
<a href="<?php echo $base_path; ?>/page/termini-condizioni" data-page="page/termini-condizioni" class="navLink">Termini e Condizioni</a> •
<a href="<?php echo $base_path; ?>/page/policy-privacy" data-page="page/policy-privacy" class="navLink">Policy Privacy</a> •
<a href="<?php echo $base_path; ?>/page/changelog" data-page="page/changelog" class="navLink">Changelog</a>
</div>
<div class="copyright-section" <?php if($is_mobile){ ?> style="padding: 10px 0 25px;" <? } ?>>&copy; 2025 RPIGroup • Versione: <?php echo $version_app; ?></div>
<?php
// Debug: verifica valori delle variabili (rimuovi dopo aver risolto)
// echo "<!-- DEBUG - Page: " . htmlspecialchars($page) . " | Param: " . htmlspecialchars($param) . " -->\n";
?>
<div class="header">
<div class="logo-section">
<img src="<?=$base_path?>/img/RpiGroupPlayWHITE.png" alt="Logo">
</div>
<div class="menu-section">
<a href="<?php echo $base_path; ?>/" data-page="home" class="navLink <?php echo $page == 'home' ? 'active' : ''; ?>">Home</a>
<a href="<?php echo $base_path; ?>/radio" data-page="radio" class="navLink <?php echo ($page == 'radio' || $page == 'play') ? 'active' : ''; ?>">Radio</a>
<a href="<?php echo $base_path; ?>/tv" data-page="tv" class="navLink <?php echo ($page == 'tv' || $page == 'playtv') ? 'active' : ''; ?>">TV</a>
<a href="<?php echo $base_path; ?>/page/addradio" data-page="page/addradio" class="navLink <?php echo ($page == 'page' && $param == 'addradio') ? 'active' : ''; ?>">Add Radio</a>
</div>
</div>
<main class="container-fluid" id="content">
<?php
// Carica il contenuto iniziale in base all'URL
switch ($page) {
case 'home':
include './pages/page/home.php';
break;
case 'radio':
include './pages/page/radio.php';
break;
case 'tv':
include './pages/page/tv.php';
break;
case 'play':
if (!empty($param)) {
$stationId = (int)$param;
$station = getRadioStation($stationId);
if ($station !== null) {
include './pages/page/player.php';
} else {
include './pages/page/404.php';
}
} else {
// Se non c'è ID, torna alla home
include './pages/page/home.php';
}
break;
case 'playtv':
if (!empty($param)) {
$stationId = (int)$param;
$station = getTVStation($stationId);
if ($station !== null) {
include './pages/page/player_tv.php';
} else {
include './pages/page/404.php';
}
} else {
// Se non c'è ID, torna alla home
include './pages/page/home.php';
}
break;
case 'page':
if (!empty($param)) {
switch ($param) {
case 'about':
include './pages/page/about.php';
break;
case 'copyright':
include './pages/page/copyright.php';
break;
case 'addradio':
include './pages/page/addradio.php';
break;
case 'contact':
include './pages/page/contact.php';
break;
case 'termini-condizioni':
include './pages/page/terminicondizioni.php';
break;
case 'policy-privacy':
include './pages/page/policyprivacy.php';
break;
case 'changelog':
include './pages/page/changelog.php';
break;
default:
include './pages/page/404.php';
}
} else {
include './pages/page/404.php';
}
break;
default:
include './pages/page/home.php';
}
?>
</main>
<!-- Loading Overlay -->
<div id="loadingOverlay" class="loading-overlay">
<div class="loading-content">
<div class="spinner-large"></div>
<p class="loading-text">Caricamento...</p>
</div>
</div>
<div class="footer">
<div class="menu-section">
<a href="<?php echo $base_path; ?>/page/termini-condizioni" data-page="page/termini-condizioni" class="navLink">Termini e Condizioni</a> •
<a href="<?php echo $base_path; ?>/page/policy-privacy" data-page="page/policy-privacy" class="navLink">Policy Privacy</a> •
<a href="<?php echo $base_path; ?>/page/changelog" data-page="page/changelog" class="navLink">Changelog</a>
</div>
<div class="copyright-section" <?php if($is_mobile){ ?> style="padding: 10px 0 25px;" <?php } ?>>© 2025 RPIGroup • Versione: <?php echo $version_app; ?></div>
</div>

View File

@@ -1,10 +1,12 @@
<h1 class="titlePage">Pagina non trovata</h1>
<p class="text-center">La pagina che hai provato a cercare non esiste o non è disponibile.</p>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<h1 class="titlePage">Pagina non trovata</h1>
<p class="text-center">La pagina che hai provato a cercare non esiste o non è disponibile.</p>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
</a>

View File

@@ -1,14 +1,38 @@
<h1 class="titlePage">Come funziona RPIGroup Play?</h1>
<hr>
<div class="tec">
<p>La pagina è in fase di realizzazione... Attendi il prossimo aggiornamento per leggere le nostre istruzioni d'uso!</p>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<h1 class="titlePage">Come funziona RPIGroup Play?</h1>
<hr>
<div class="tec">
<p>RPIGroup Play è l'applicazione che permette di ascoltare le radio e le webtv preferite in un unico luogo.</p>
<p>Per utilizzare l'applicazione, basta semplicemente entrare nell'applicazione dal link app.rpigroup.it, selezionare la sezione Radio o TV e scegliere la radio o la webtv che desideri ascoltare.</p>
<br>
<p>
<b>Come installare l'app?</b></br>
Per installare l'applicazione, basta semplicemente entrare nell'applicazione dal link app.rpigroup.it e cliccare sull'icona "Aggiungi all'Home". Oppure, per gli utenti iOS, entrando da safari dal link app.rpigroup.it, cliccare sull'icona "Convididi", scendere alla voce "Aggiungi all'Home" e cliccare su "Aggiungi all'Home".
</p>
<br>
<br><br>
<h2 class="text-center titlePage">F.A.Q.</h2>
<hr>
<p>
<b>Posso scaricarla da Google Play Store e Apple App Store?</b></br>
Non è possibile al momento scaricare l'applicazione da Google Play Store e Apple App Store.
</p>
<p>
<b>Posso utilizzare l'applicazione su un computer?</b></br>
Sì, dal tuo browser preferito, visita la pagina app.rpigroup.it. L'applicazione è anche installabile, cliccando sulla icona dedicata all'installazione della PWA.
</p>
<p>
<b>Posso aggiungere la mia stazione radio preferita?</b></br>
Sì, cliccando sul pulsante "Aggiungi Radio" nella sezione Radio, potrai aggiungere la tua stazione radio preferita compilando il form dedicato.
</p>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
</a>

View File

@@ -1,15 +1,17 @@
<h1 class="titlePage">Aggiungi la tua radio</h1>
<hr>
<div class="tec">
<p>Al momento, il modulo è temporaneamente chiuso</p>
<p>Ti invitiamo a controllare più tardi oppure, attendi l'uscita di un prossimo aggiornamento!</p>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<h1 class="titlePage">Aggiungi la tua radio</h1>
<hr>
<div class="tec">
<p>Al momento, il modulo è temporaneamente chiuso</p>
<p>Ti invitiamo a controllare più tardi oppure, attendi l'uscita di un prossimo aggiornamento!</p>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
</a>

View File

@@ -1,19 +1,38 @@
<h1 class="titlePage">Changelog</h1>
<p class="subtitlePage">Visualizza tutti gli ricevuti</p>
<?php
foreach($changelog->version as $version){
echo "<hr>";
echo "<p class=\"changelogTitle\">Versione ".$version->number."</p>";
foreach($version->logs->log as $log_print){
echo "<p class=\"changelogList\">• ".$log_print."</p>";
}
}
?>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<h1 class="titlePage">Changelog</h1>
<p class="subtitlePage">Visualizza tutti gli aggiornamenti ricevuti</p>
<p class="text-center mb-4" style="font-size: 0.9rem; font-weight: 300;">Codice dell'app visionabile su <a href="https://git.asv.ovh/asvstudiosapps/rpigroupplay" target="_blank" style="font-weight: 500;">ASV Git</a></p>
<?php
// Verifica che $changelog sia stato caricato correttamente in getStation.inc.php
if (isset($changelog) && $changelog !== false && isset($changelog->version)) {
// Itera attraverso le versioni
foreach($changelog->version as $version) {
echo "<hr>";
echo "<p class=\"changelogTitle\">Versione " . htmlspecialchars((string)$version->number) . "</p>";
// Verifica che esistano i log prima di iterare
if (isset($version->logs) && isset($version->logs->log)) {
foreach($version->logs->log as $log_print) {
echo "<p class=\"changelogList\">• " . htmlspecialchars((string)$log_print) . "</p>";
}
} else {
echo "<p class=\"changelogList\" style=\"font-style: italic; color: #999;\">Nessun dettaglio disponibile per questa versione.</p>";
}
}
} else {
// Messaggio di errore se il changelog non è disponibile
echo "<hr>";
echo "<div style=\"padding: 20px; background: #fff3cd; border: 1px solid #ffc107; border-radius: 5px; margin: 20px 0;\">";
echo "<p style=\"margin: 0; color: #856404;\"><strong>Attenzione:</strong> Impossibile caricare il changelog. Il file potrebbe essere mancante o corrotto.</p>";
echo "</div>";
}
?>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
</a>

View File

@@ -1,53 +1,55 @@
<!-- <div class="content-page">
<h2>Contatti</h2>
<div class="content-box">
<p>Hai domande, suggerimenti o riscontri problemi con l'applicazione? Contattaci!</p>
<form class="contact-form" id="contactForm">
<div class="form-group">
<label for="name">Nome:</label>
<input type="text" id="name" name="name" required>
</div>
<div class="form-group">
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
</div>
<div class="form-group">
<label for="subject">Oggetto:</label>
<input type="text" id="subject" name="subject" required>
</div>
<div class="form-group">
<label for="message">Messaggio:</label>
<textarea id="message" name="message" rows="5" required></textarea>
</div>
<button type="submit" class="submit-btn">Invia messaggio</button>
</form>
<div id="formResponse" class="form-response" style="display: none;"></div>
<div class="contact-info">
<h3>Informazioni di contatto</h3>
<p>Email: info@tuoaggregatore.it</p>
<p>Telefono: +39 123 456 7890</p>
</div>
</div>
</div> -->
<h1 class="titlePage">Contatti</h1>
<hr>
<div class="tec">
<p>La pagina è in fase di realizzazione... Attendi il prossimo aggiornamento per leggere le nostre istruzioni d'uso!</p>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<!-- <div class="content-page">
<h2>Contatti</h2>
<div class="content-box">
<p>Hai domande, suggerimenti o riscontri problemi con l'applicazione? Contattaci!</p>
<form class="contact-form" id="contactForm">
<div class="form-group">
<label for="name">Nome:</label>
<input type="text" id="name" name="name" required>
</div>
<div class="form-group">
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
</div>
<div class="form-group">
<label for="subject">Oggetto:</label>
<input type="text" id="subject" name="subject" required>
</div>
<div class="form-group">
<label for="message">Messaggio:</label>
<textarea id="message" name="message" rows="5" required></textarea>
</div>
<button type="submit" class="submit-btn">Invia messaggio</button>
</form>
<div id="formResponse" class="form-response" style="display: none;"></div>
<div class="contact-info">
<h3>Informazioni di contatto</h3>
<p>Email: info@tuoaggregatore.it</p>
<p>Telefono: +39 123 456 7890</p>
</div>
</div>
</div> -->
<h1 class="titlePage">Contatti</h1>
<hr>
<div class="tec">
<p>La pagina è in fase di realizzazione... Attendi il prossimo aggiornamento per leggere le nostre istruzioni d'uso!</p>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
</a>

View File

@@ -1,18 +1,20 @@
<h1 class="titlePage">Diritti d'Autore</h1>
<p class="subtitlePage">Come funziona e chi lo gestisce</p>
<hr>
<div class="tec">
<p>RPIGroup è un player audio e video, che aggrega i flussi audio in streaming di emittenti iscritte all'interno del gruppo RPIGroup.</p>
<p>I flussi presenti all'interno della seguente app non provvengono direttamente da quest'ultima, ma dal sito web dell'emittente stessa.</p>
<p>L'applicazione funge come semplice ripetitore audio. Per tanto, i diritti musicali sono a carico dell'emittente presente nell'app, inserendo all'interno della pagina dedicata alle informazioni sulla trasmissione, i numeri licenze dei diritti d'autore e discografici dei brani trasmessi.</p>
<p>Pertanto, se si ritiene che una delle emittenti non ha le licenze per la diffusione dei brani, invitiamo al segnalante di inoltrare una mail ad <a href="mailto:abuse@asvhosting.com">abuse@asvhosting.com</a> per la rimozione definitiva dell'emittente.</p>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<h1 class="titlePage">Diritti d'Autore</h1>
<p class="subtitlePage">Come funziona e chi lo gestisce</p>
<hr>
<div class="tec">
<p>RPIGroup è un player audio e video, che aggrega i flussi audio in streaming di emittenti iscritte all'interno del gruppo RPIGroup.</p>
<p>I flussi presenti all'interno della seguente app non provvengono direttamente da quest'ultima, ma dal sito web dell'emittente stessa.</p>
<p>L'applicazione funge come semplice ripetitore audio. Per tanto, i diritti musicali sono a carico dell'emittente presente nell'app, inserendo all'interno della pagina dedicata alle informazioni sulla trasmissione, i numeri licenze dei diritti d'autore e discografici dei brani trasmessi.</p>
<p>Pertanto, se si ritiene che una delle emittenti non ha le licenze per la diffusione dei brani, invitiamo al segnalante di inoltrare una mail ad <a href="mailto:abuse@asvhosting.com">abuse@asvhosting.com</a> per la rimozione definitiva dell'emittente.</p>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
</a>

View File

@@ -1,59 +1,103 @@
<h1 class="titlePage">Benvenuto</h1>
<p class="subtitlePage">nella nuova RPIGroup Play</p>
<div class="row g-2 mb-4">
<div class="col-6">
<a href="<?php echo $base_path; ?>/radio" data-page="radio" class="linkBox">
<div class="clickBox Squared">
<img src="<?=$base_path?>/img/radio.png" alt="Radio">
<p class="m-0 p-0">Radio</p>
</div>
</a>
</div>
<div class="col-6">
<a href="<?php echo $base_path; ?>/tv" data-page="tv" class="linkBox">
<div class="clickBox Squared">
<img src="<?=$base_path?>/img/tv.png" alt="tv">
<p class="m-0 p-0">TV</p>
</div>
</a>
</div>
</div>
<div class="row g-2 mb-4">
<div class="col-12">
<a href="https://www.co-municare.it" target="_blank" class="">
<div class="clickBox p-2">
<img src="https://www.co-municare.it/wp-content/uploads/2025/01/newlogo_co-municare-it.png" alt="logo Co-Municare.it">
</div>
</a>
</div>
<div class="col-12">
<a href="<?php echo $base_path; ?>/page/addradio" data-page="page/addradio" class="linkBox">
<div class="clickBox p-2">
Aggiungi la tua radio
</div>
</a>
</div>
<div class="col-4">
<a href="<?php echo $base_path; ?>/page/about" data-page="page/about" class="linkBox">
<div class="clickBox">
Come funziona?
</div>
</a>
</div>
<div class="col-4">
<a href="<?php echo $base_path; ?>/page/copyright" data-page="page/copyright" class="linkBox">
<div class="clickBox">
Diritti<br>d'Autore
</div>
</a>
</div>
<div class="col-4">
<a href="<?php echo $base_path; ?>/page/contact" data-page="page/contact" class="linkBox">
<div class="clickBox">
I nostri<br>Contatti
</div>
</a>
</div>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<h1 class="titlePage">Benvenuto</h1>
<p class="subtitlePage">nella nuova RPIGroup Play</p>
<div class="row g-2 mb-4">
<div class="col-6">
<a href="<?php echo $base_path; ?>/radio" data-page="radio" class="linkBox">
<div class="clickBox Squared">
<img src="<?=$base_path?>/img/radio.png" alt="Radio">
<p class="m-0 p-0">Radio</p>
</div>
</a>
</div>
<div class="col-6">
<a href="<?php echo $base_path; ?>/tv" data-page="tv" class="linkBox">
<div class="clickBox Squared">
<img src="<?=$base_path?>/img/tv.png" alt="tv">
<p class="m-0 p-0">TV</p>
</div>
</a>
</div>
</div>
<style>
.content-adv{
text-align: center;
background: #3849a8;
padding: 20px;
border-radius: 20px;
}
.content-adv:before{
content: "ADV";
position: relative;
background: #f7b835;
padding: 3px 10px;
font-size: 0.8rem;
border-radius: 27px;
font-style: italic;
font-weight: 600;
top: -10px;
margin: 0;
}
.content-adv img{
max-width: 100%;
border-radius: 10px;
margin-top: -20px;
}
</style>
<div class="content-adv mb-4">
<a href="https://www.worldradioday.it" target="_blank" class="">
<img src="https://www.radiodiffusionelibera.com/wp-content/uploads/2026/01/banner300x250.jpg" alt="adv">
</a>
</div>
<div class="row g-2 mb-4">
<div class="col-12">
<a href="https://www.co-municare.it" target="_blank" class="">
<div class="clickBox p-2">
<img src="https://www.co-municare.it/wp-content/uploads/2025/01/newlogo_co-municare-it.png" alt="logo Co-Municare.it">
</div>
</a>
</div>
<div class="col-12">
<a href="<?php echo $base_path; ?>/page/addradio" data-page="page/addradio" class="linkBox">
<div class="clickBox p-2">
Aggiungi la tua radio
</div>
</a>
</div>
<div class="col-4">
<a href="<?php echo $base_path; ?>/page/about" data-page="page/about" class="linkBox">
<div class="clickBox">
Come<br>funziona?
</div>
</a>
</div>
<div class="col-4">
<a href="<?php echo $base_path; ?>/page/copyright" data-page="page/copyright" class="linkBox">
<div class="clickBox">
Diritti<br>d'Autore
</div>
</a>
</div>
<div class="col-4">
<a href="<?php echo $base_path; ?>/page/contact" data-page="page/contact" class="linkBox">
<div class="clickBox">
I nostri<br>Contatti
</div>
</a>
</div>
</div>
<div class="row g-2 mb-4">
<div class="col-12">
<a href="https://drive.asv.ovh/apps/forms/s/Zfk8cJk3oCz2Y2dHyWdEcgL7" target="_blank" class="linkBox">
<div class="clickBox p-2">
Lascia un feedback
</div>
</a>
</div>
</div>

View File

@@ -1,62 +1,102 @@
<?php
if($station->contentplayer == ""){
?>
<style>
.staticpage{
background: linear-gradient(45deg, #3849a8, #f7b835);
padding: 22px 35px 10px 35px;
display: block;
z-index: 1;
position: absolute;
height: calc(100vh - 312px);
color: white;
text-align: center;
width: 100%;
max-width: 450px;
left: 50%;
transform: translateX(-50%);
}
.staticpage > .logo{
width: 200px;
border-radius: 15px;
margin-bottom: 20px;
}
.staticpage > p{
margin: 0;
}
.staticpage > p.titleRadio{
font-weight: 600;
}
</style>
<div class="staticpage">
<img src="<?php echo $station->logo; ?>" class="logo" alt="logo radio">
<p class="titleRadio"><?php echo $station->name; ?></p>
<p class="subtitleRadio"><?php echo $station->slogan; ?></p>
</div>
<?php
}else{
?>
<iframe src="<?php echo $station->contentplayer; ?>" class="contentplayer" frameborder="0"></iframe>
<?php
}
?>
<div class="footer_player" <?php if($is_mobile){ ?> style="bottom: 84px;" <? } ?>>
<div class="row align-items-center">
<div class="col-2" style="width: 70px;">
<img src="<?php echo $station->logo; ?>" alt="<?php echo $station->name; ?>" style="width: 60px;">
</div>
<div class="col">
<div id="artist" style="font-weight: 700; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden;"><?php echo $station->name; ?></div>
<div id="playerStatus" style="text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical ;overflow: hidden;"><?php echo $station->slogan; ?></div>
</div>
<div class="col-2" style="text-align: center; margin-top: 1px; margin-right: 5px; width: 67px;">
<button id="playPauseBtn" data-stream-hls="<?php echo $station->streamhls; ?>" data-stream-fallback="<?php echo $station->stream; ?>" data-station-name="<?php echo htmlspecialchars($station->name); ?>" data-station-logo="<?php echo $station->logo; ?>" data-station-slogan="<?php echo htmlspecialchars($station->slogan); ?>">
<i class="material-icons play-icon" id="play-pause" style="font-size: 35px; border-radius: 10px; border: 2px solid #ffffff; padding: 4px 5px 4px 4px; margin-top: -2px; background: #f7b835; color: #2a377e;">play_arrow</i>
<i class="material-icons pause-icon" id="play-pause" style="display:none; font-size: 35px; border-radius: 10px; border: 2px solid #ffffff; padding: 4px 5px 4px 4px; margin-top: -2px; background: #f7b835; color: #2a377e;">pause</i>
</button>
</div>
</div>
</div>
<?php
$station_id = (string)$station->id;
$station_name = (string)$station->name;
$station_slogan = (string)$station->slogan;
$station_logo = (string)$station->logo;
$station_stream = (string)$station->stream;
$station_streamhls = (string)$station->streamhls;
$station_contentplayer = (string)$station->contentplayer;
$station_apiradio = (string)$station->apiradio;
?>
<div class="radio-player-container" style="background-color: #ffffff;height: calc(100% - <?php if($is_mobile){ echo "232px"; }else{ echo "217px"; } ?>);position: absolute;left: calc(50%);display: flex;flex-direction: column;max-width: 750px;transform: translateX(-50%);width: 100%;">
<div class="radio-header" style="padding: 20px; border-bottom: 1px solid #eee; display: flex; align-items: center; justify-content: space-between;">
<div class="left-controls" style="display: flex; align-items: center;">
<a href="<?php echo $base_path; ?>/radio" data-page="radio" class="linkBox" style="color: #333; display: flex; align-items: center; text-decoration: none;">
<span class="material-icons" style="font-size: 28px;">arrow_back</span>
</a>
<span style="font-size: 18px; font-weight: 600; color: #333; margin-left: 15px;"><?php echo $station_name; ?></span>
</div>
<?php if(!empty($station_logo)): ?>
<div class="right-controls">
<img src="<?php echo $station_logo; ?>" alt="Logo" style="height: 30px; width: auto;">
</div>
<?php endif; ?>
</div>
<?php
if($station->contentplayer == ""){
?>
<style>
.staticpage{
background: linear-gradient(45deg, #3849a8, #f7b835);
padding: 22px 35px 10px 35px;
display: block;
z-index: 1;
height: calc(100vh - 393px);
color: white;
text-align: center;
width: 100%;
max-width: 750px;
}
.staticpage > .logo{
width: 200px;
border-radius: 15px;
margin-bottom: 20px;
}
.staticpage > p{
margin: 0;
}
.staticpage > p.titleRadio{
font-weight: 600;
}
</style>
<div class="staticpage">
<img src="<?php echo $station->logo; ?>" class="logo" alt="logo radio">
<p class="titleRadio"><?php echo $station->name; ?></p>
<p class="subtitleRadio"><?php echo $station->slogan; ?></p>
</div>
<?php
}else{
?>
<iframe src="<?=$station_contentplayer?>" class="contentplayer" frameborder="0"></iframe>
<?php
}
?>
<div class="footer_player">
<div class="row align-items-center">
<div class="col-2" style="width: 70px;">
<img id="albumsong" src="<?php echo $station->logo; ?>" alt="<?php echo $station->name; ?>" style="width: 60px;height: 60px;">
</div>
<div class="col">
<div id="songs" style="font-weight: 700; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden;"><?php echo $station->name; ?></div>
<div id="artist" style="text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical ;overflow: hidden;"><?php echo $station->slogan; ?></div>
</div>
<div class="col-auto" style="text-align: center; margin-top: 1px; padding-right: 0;">
<button id="formatToggleBtn" title="Cambia formato audio">
<span id="formatLabel" style="font-size: 12px;font-weight: 600;border-radius: 6px;border: 2px solid #ffffff;padding: 4px 6px;background: rgba(247, 184, 53, 0.3);color: #2a377e;">HLS</span>
</button>
</div>
<div class="col-2" style="text-align: center; margin-top: 1px; margin-right: 5px; width: 67px;">
<button id="playPauseBtn"
data-stream-hls="<?php echo $station->streamhls; ?>"
data-stream-fallback="<?php echo $station->stream; ?>"
data-station-name="<?php echo htmlspecialchars($station->name); ?>"
data-station-logo="<?php echo $station->logo; ?>"
data-station-slogan="<?php echo htmlspecialchars($station->slogan); ?>"
data-api-url="<?php echo $station_apiradio; ?>">
<i class="material-icons play-icon" id="play-pause" style="font-size: 35px; border-radius: 10px; border: 2px solid #ffffff; padding: 4px 5px 4px 4px; margin-top: -2px; background: #f7b835; color: #2a377e;">play_arrow</i>
<i class="material-icons pause-icon" id="play-pause" style="display:none; font-size: 35px; border-radius: 10px; border: 2px solid #ffffff; padding: 4px 5px 4px 4px; margin-top: -2px; background: #f7b835; color: #2a377e;">pause</i>
</button>
</div>
</div>
</div>
</div>
<audio id="hlsAudioPlayer" preload="none"></audio>

View File

@@ -0,0 +1,50 @@
<?php
// Assicurati che $station sia definito (dovrebbe essere passato da mobile.php)
if (!isset($station) || empty($station)) {
echo '<div class="alert alert-danger">Errore: Stazione TV non trovata.</div>';
return;
}
$station_id = (string)$station->id;
$station_name = (string)$station->name;
$station_logo = (string)$station->logo;
$station_stream = (string)$station->stream;
$station_poster = isset($station->poster) ? (string)$station->poster : '';
?>
<!-- Container player con sfondo bianco -->
<div class="tv-player-container" style="background-color: #ffffff;height: calc(100% - <?php if($is_mobile){ echo "232px"; }else{ echo "217px"; } ?>);position: absolute;left: calc(50%);display: flex;flex-direction: column;max-width: 750px;transform: translateX(-50%);width: 100%;">
<!-- Header semplice con pulsante indietro e nome -->
<div class="tv-header" style="padding: 20px; border-bottom: 1px solid #eee; display: flex; align-items: center; justify-content: space-between;">
<div class="left-controls" style="display: flex; align-items: center;">
<a href="<?php echo $base_path; ?>/tv" data-page="tv" class="linkBox" style="color: #333; display: flex; align-items: center; text-decoration: none;">
<span class="material-icons" style="font-size: 28px;">arrow_back</span>
</a>
<span style="font-size: 18px; font-weight: 600; color: #333; margin-left: 15px;"><?php echo $station_name; ?></span>
</div>
<?php if(!empty($station_logo)): ?>
<div class="right-controls">
<img src="<?php echo $station_logo; ?>" alt="Logo" style="height: 30px; width: auto;">
</div>
<?php endif; ?>
</div>
<!-- Area Video -->
<div class="video-wrapper" style="flex: 1; display: flex; align-items: center; justify-content: center; background-color: #000;">
<video id="tvVideoPlayer"
class="video-js"
controls
playsinline
data-src="<?php echo $station_stream; ?>"
poster="<?php echo $station_poster; ?>"
style="width: 100%; max-width: 100%; max-height: 100vh; aspect-ratio: 16/9;">
<p class="vjs-no-js">
To view this video please enable JavaScript, and consider upgrading to a web browser that
<a href="https://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
</p>
</video>
</div>
</div>

View File

@@ -1,58 +1,60 @@
<h1 class="titlePage">Policy Privacy</h1>
<p class="subtitlePage">Ultimo aggiornamento: 17/11/2025</p>
<hr>
<div class="tec">
<p><b>Titolare del Trattamento</b><br>Il Titolare del trattamento dei dati personali è A.S.V. Studios APPS, con sede legale in Italia, contattabile allindirizzo e-mail <a href="mailto:pp.app@rpigroup.net">pp.app@rpigroup.net</a>. Per ulteriori informazioni o per esercitare i diritti previsti dalla normativa sulla protezione dei dati personali, è possibile inviare una richiesta scritta allindirizzo sopra indicato.</p>
<p>
<b>Dati Raccolti</b><br>
Raccogliamo i seguenti dati personali, alcuni dei quali forniti volontariamente dallUtente e altri raccolti automaticamente durante lutilizzo dei moduli di contatto all'interno dell'Applicazione:<br>
Dati di contatto (ad esempio: nome, indirizzo e-mail) forniti direttamente dallUtente al momento della scritta dei moduli di contatto
</p>
<p>
<b>Finalità del Trattamento</b><br>
I dati personali sono trattati per le seguenti finalità:<br>
Risposta alla e-mail tramite modulo di contatto<br>
Gli Utenti possono esercitare in qualsiasi momento i diritti previsti dalla normativa vigente sulla protezione dei dati personali, come laccesso, la rettifica o la cancellazione dei propri dati.
</p>
<p>
<b>Base Giuridica del Trattamento</b><br>
Il trattamento dei dati personali si basa su diverse basi giuridiche, che vengono applicate nella pratica come segue:<br>
Esecuzione di un contratto: trattiamo i dati personali per fornire il servizio richiesto dallutente, ad esempio offrire assistenza sull'uso dell'Applicativo o inserimento della propria emittente all'interno dell'Applicativo.<br>
Rispetto delle leggi: trattiamo i dati quando siamo obbligati dalla legge, ad esempio per conservare alcune informazioni per finalità fiscali o per rispondere a richieste delle autorità.
</p>
<p><b>Modalità di Trattamento e Conservazione</b><br>I dati vengono archiviati tramite applicativi proprietari di posta elettronica. I dati sono conservati per il tempo strettamente necessario al raggiungimento delle finalità indicate, salvo diversi obblighi di legge.</p>
<p>
<b>Comunicazione dei Dati a Terzi</b><br>
I dati personali non verranno diffusi, ma potranno essere comunicati a soggetti terzi specifici, quali:<br>
Fornitori di servizi di Hosting, come aziende che gestiscono infrastrutture cloud, incaricate della manutenzione e gestione dei server;<br>
Partner tecnologici, ad esempio fornitori di software, servizi informatici o piattaforme di pagamento, necessari per lerogazione di particolari funzionalità;<br>
Autorità giudiziarie o amministrative, in caso di richieste formali o obblighi di legge.<br>
La comunicazione dei dati ai soggetti terzi avverrà esclusivamente per le finalità indicate e nel rispetto delle misure di sicurezza previste dalla normativa vigente sulla protezione dei dati personali, garantendo così la tutela della privacy dellutente.
</p>
<p><b>Trattamento dei dati Extra-UE</b><br>Secondo il Regolamento Generale sulla Protezione dei Dati (GDPR), il trattamento dei dati personali non può avvenire in paesi extra-UE senza adeguate garanzie. Il trattamento dei dati non può avvenire in paesi extra-UE, salvo il rispetto delle condizioni previste dalla normativa vigente (ad esempio, decisioni di adeguatezza o garanzie appropriate ai sensi del GDPR).</p>
<p>
<b>Diritti dellUtente</b><br>
In qualità di interessato, lUtente gode dei seguenti diritti, in conformità con il GDPR:<br>
Diritto di accesso: puoi richiedere conferma che i tuoi dati siano trattati e riceverne una copia (ad esempio, inviando una e-mail per sapere quali dati personali sono stati raccolti e utilizzati).<br>
Diritto di rettifica: hai la possibilità di correggere dati personali inesatti o aggiornare informazioni non più attuali (per esempio, chiedendo la modifica dellindirizzo e-mail se è cambiato).<br>
Diritto alla cancellazione (diritto alloblio): puoi ottenere la cancellazione dei tuoi dati personali (ad esempio, domandando la rimozione del tuo profilo dal servizio).<br>
Diritto di limitazione: puoi richiedere che il trattamento dei tuoi dati sia limitato in determinate circostanze (ad esempio, se hai contestato lesattezza dei dati e vuoi che vengano sospesi fino alla verifica).<br>
Diritto di opposizione: puoi opporti al trattamento dei tuoi dati per finalità di marketing (per esempio, chiedendo di non ricevere più comunicazioni promozionali).<br>
Diritto di reclamo: puoi presentare un reclamo allAutorità Garante per la Protezione dei Dati Personali se ritieni che i tuoi diritti non siano stati rispettati (ad esempio, compilando lapposito modulo sul sito del Garante).
</p>
<p>
<b>Contatti</b><br>
Per esercitare i diritti sopra elencati o per qualsiasi domanda, è possibile contattare il Titolare del trattamento tramite i seguenti canali:<br>
E-mail: <a href="mailto:pp.app@rpigroup.net">pp.app@rpigroup.net</a><br>
Si prega di indicare nelloggetto delle-mail il diritto che si intende esercitare e di fornire i propri dati identificativi per facilitare la gestione della richiesta.
</p>
<p><b>Modifiche a questa Informativa</b><br>La presente informativa può essere soggetta a modifiche e aggiornamenti. La versione più recente sarà sempre disponibile allinterno del Servizio. Gli utenti saranno informati delle modifiche rilevanti tramite una notifica allinterno del Servizio, così da garantire massima trasparenza e permettere a tutti di essere sempre aggiornati.</p>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<h1 class="titlePage">Policy Privacy</h1>
<p class="subtitlePage">Ultimo aggiornamento: 17/11/2025</p>
<hr>
<div class="tec">
<p><b>Titolare del Trattamento</b><br>Il Titolare del trattamento dei dati personali è A.S.V. Studios APPS, con sede legale in Italia, contattabile allindirizzo e-mail <a href="mailto:pp.app@rpigroup.net">pp.app@rpigroup.net</a>. Per ulteriori informazioni o per esercitare i diritti previsti dalla normativa sulla protezione dei dati personali, è possibile inviare una richiesta scritta allindirizzo sopra indicato.</p>
<p>
<b>Dati Raccolti</b><br>
Raccogliamo i seguenti dati personali, alcuni dei quali forniti volontariamente dallUtente e altri raccolti automaticamente durante lutilizzo dei moduli di contatto all'interno dell'Applicazione:<br>
• Dati di contatto (ad esempio: nome, indirizzo e-mail) forniti direttamente dallUtente al momento della scritta dei moduli di contatto
</p>
<p>
<b>Finalità del Trattamento</b><br>
I dati personali sono trattati per le seguenti finalità:<br>
• Risposta alla e-mail tramite modulo di contatto<br>
Gli Utenti possono esercitare in qualsiasi momento i diritti previsti dalla normativa vigente sulla protezione dei dati personali, come laccesso, la rettifica o la cancellazione dei propri dati.
</p>
<p>
<b>Base Giuridica del Trattamento</b><br>
Il trattamento dei dati personali si basa su diverse basi giuridiche, che vengono applicate nella pratica come segue:<br>
• Esecuzione di un contratto: trattiamo i dati personali per fornire il servizio richiesto dallutente, ad esempio offrire assistenza sull'uso dell'Applicativo o inserimento della propria emittente all'interno dell'Applicativo.<br>
• Rispetto delle leggi: trattiamo i dati quando siamo obbligati dalla legge, ad esempio per conservare alcune informazioni per finalità fiscali o per rispondere a richieste delle autorità.
</p>
<p><b>Modalità di Trattamento e Conservazione</b><br>I dati vengono archiviati tramite applicativi proprietari di posta elettronica. I dati sono conservati per il tempo strettamente necessario al raggiungimento delle finalità indicate, salvo diversi obblighi di legge.</p>
<p>
<b>Comunicazione dei Dati a Terzi</b><br>
I dati personali non verranno diffusi, ma potranno essere comunicati a soggetti terzi specifici, quali:<br>
• Fornitori di servizi di Hosting, come aziende che gestiscono infrastrutture cloud, incaricate della manutenzione e gestione dei server;<br>
• Partner tecnologici, ad esempio fornitori di software, servizi informatici o piattaforme di pagamento, necessari per lerogazione di particolari funzionalità;<br>
• Autorità giudiziarie o amministrative, in caso di richieste formali o obblighi di legge.<br>
La comunicazione dei dati ai soggetti terzi avverrà esclusivamente per le finalità indicate e nel rispetto delle misure di sicurezza previste dalla normativa vigente sulla protezione dei dati personali, garantendo così la tutela della privacy dellutente.
</p>
<p><b>Trattamento dei dati Extra-UE</b><br>Secondo il Regolamento Generale sulla Protezione dei Dati (GDPR), il trattamento dei dati personali non può avvenire in paesi extra-UE senza adeguate garanzie. Il trattamento dei dati non può avvenire in paesi extra-UE, salvo il rispetto delle condizioni previste dalla normativa vigente (ad esempio, decisioni di adeguatezza o garanzie appropriate ai sensi del GDPR).</p>
<p>
<b>Diritti dellUtente</b><br>
In qualità di interessato, lUtente gode dei seguenti diritti, in conformità con il GDPR:<br>
Diritto di accesso: puoi richiedere conferma che i tuoi dati siano trattati e riceverne una copia (ad esempio, inviando una e-mail per sapere quali dati personali sono stati raccolti e utilizzati).<br>
Diritto di rettifica: hai la possibilità di correggere dati personali inesatti o aggiornare informazioni non più attuali (per esempio, chiedendo la modifica dellindirizzo e-mail se è cambiato).<br>
Diritto alla cancellazione (diritto alloblio): puoi ottenere la cancellazione dei tuoi dati personali (ad esempio, domandando la rimozione del tuo profilo dal servizio).<br>
Diritto di limitazione: puoi richiedere che il trattamento dei tuoi dati sia limitato in determinate circostanze (ad esempio, se hai contestato lesattezza dei dati e vuoi che vengano sospesi fino alla verifica).<br>
• Diritto di opposizione: puoi opporti al trattamento dei tuoi dati per finalità di marketing (per esempio, chiedendo di non ricevere più comunicazioni promozionali).<br>
• Diritto di reclamo: puoi presentare un reclamo allAutorità Garante per la Protezione dei Dati Personali se ritieni che i tuoi diritti non siano stati rispettati (ad esempio, compilando lapposito modulo sul sito del Garante).
</p>
<p>
<b>Contatti</b><br>
Per esercitare i diritti sopra elencati o per qualsiasi domanda, è possibile contattare il Titolare del trattamento tramite i seguenti canali:<br>
• E-mail: <a href="mailto:pp.app@rpigroup.net">pp.app@rpigroup.net</a><br>
Si prega di indicare nelloggetto delle-mail il diritto che si intende esercitare e di fornire i propri dati identificativi per facilitare la gestione della richiesta.
</p>
<p><b>Modifiche a questa Informativa</b><br>La presente informativa può essere soggetta a modifiche e aggiornamenti. La versione più recente sarà sempre disponibile allinterno del Servizio. Gli utenti saranno informati delle modifiche rilevanti tramite una notifica allinterno del Servizio, così da garantire massima trasparenza e permettere a tutti di essere sempre aggiornati.</p>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
</a>

View File

@@ -1,30 +1,32 @@
<?php
// views/home.php - Vista della pagina principale
$stations = loadRadioStations();
?>
<h1 class="titlePage">Radio</h1>
<p class="subtitlePage">Seleziona la tua radio che vuoi ascoltare</p>
<hr>
<div class="stationList">
<div class="row g-2">
<?php foreach ($stations as $station): ?>
<div class="col-6">
<div class="stationCard <?php if((string)$station->thematic === 'true'){echo "isthematic";} ?>" data-id="<?php echo $station->id; ?>">
<a href="<?php echo $base_path; ?>/play/<?php echo $station->id; ?>" data-page="play/<?php echo $station->id; ?>" class="nav-link stationLink">
<img src="<?php echo $station->logo; ?>" alt="<?php echo $station->name; ?>" class="stationLogo">
</a>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<?php
// views/home.php - Vista della pagina principale
$stations = loadRadioStations();
?>
<h1 class="titlePage">Radio</h1>
<p class="subtitlePage">Seleziona la tua radio che vuoi ascoltare</p>
<hr>
<div class="stationList">
<div class="row g-2">
<?php foreach ($stations as $station): ?>
<div class="col-6">
<div class="stationCard <?php if((string)$station->thematic === 'true'){echo "isthematic";} ?>" data-id="<?php echo $station->id; ?>">
<a href="<?php echo $base_path; ?>/play/<?php echo $station->id; ?>" data-page="play/<?php echo $station->id; ?>" class="nav-link stationLink">
<img src="<?php echo $station->logo; ?>" alt="<?php echo $station->name; ?>" class="stationLogo">
</a>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
</a>

View File

@@ -1,36 +1,38 @@
<h1 class="titlePage">Termini & Condizioni</h1>
<p class="subtitlePage">Ultimo aggiornamento: 17/11/2025</p>
<hr>
<div class="tec">
<p><b>Introduzione</b><br> RPIGroup Play vi il benvenuto. I presenti Termini e Condizioni (di seguito “T&amp;C”) regolamentano laccesso e luso dellapplicazione “RPIGroup Play” (di seguito “Portale”, “Servizio”, “Applicazione” e “Sito”) e tutti i servizi correlati. Accedendo e utilizzando il Portale, lutente (di seguito “Utente”) accetta i presenti T&amp;C al primo accesso, condizione necessaria per poter utilizzare il Servizio. Lutente potrà in qualsiasi momento declinare i seguenti T&amp;C, sapendo che non potrà più accedere allApplicazione offerta.</p>
<p><b>Titolarità e Gestione</b><br>RPIGroup Play è fornito da A.S.V. Studios APPS (di seguito “Gestore”, anche indicato come “Proprietario” e “Sviluppatore”), unico titolare del presente Servizio.</p>
<p><b>Descrizione del Servizio</b><br>LApplicazione consente di ascoltare in streaming le emittenti iscritte all'interno del gruppo RPIGroup, sia in formato audio e video (ove previsto).</p>
<p><b>Account e Registrazione</b><br>Per utilizzare il Servizio, l'utente non deve effettuare nessun tipo di registrazione o accesso.</p>
<!-- <p>
<b>Obblighi dell'Utente</b><br>
LUtente si impegna a utilizzare il Servizio in modo lecito e corretto, rispettando i presenti T&amp;C e i termini duso. In particolare, lUtente si impegna a:<br>
• Non violare i diritti di proprietà intellettuale del Gestore e di terzi;<br>
• Non utilizzare lApplicazione per scopi illegali o non autorizzati;<br>
• Non distribuire contenuti dannosi, quali software malevoli (malware), spam, materiale diffamatorio, offensivo, illecito o comunque inappropriato;<br>
• Non tentare di accedere, modificare o compromettere il funzionamento del Servizio o i dati di altri utenti;<br>
• Non utilizzare strumenti esterni, quali software automatizzati (ad esempio bot, spider o altri strumenti che simulano lattività umana), per interagire con lApplicazione.<br>
La violazione di questi termini può comportare la sospensione o la cancellazione dellaccount e, nei casi più gravi, leventuale segnalazione alle autorità competenti.
</p> -->
<p><b>Proprietà Intellettuale</b><br>Tutti i diritti di proprietà intellettuale relativi al Servizio, compresi design, marchi, loghi e contenuti scaricabili, sono di proprietà esclusiva del Gestore, dell'Associazione Culturale Comunicare e di tutte le emittenti iscritte all'interno del portale.</p>
<p><b>Contenuti Generati DallUtente</b><br>Il servizio non consente agli utenti di creare e caricare contenuti</p>
<p><b>Prezzi e Pagamenti</b><br>L'Applicazione è disponibile gratuitamente per tutti gli utilizzatori, ed è disponibile in formato gratuito per computer e smartphone.</p>
<p><b>Limitazioni di Responsabilità</b><br>Il Gestore non sarà responsabile per alcun danno, inclusi ma non limitati a danni diretti, indiretti, incidentali, speciali, consequenziali o punitivi, quali perdita di dati, perdita di profitti, interruzione dellattività, danni reputazionali o altri danni economici, derivanti dallutilizzo del Servizio o dallimpossibilità di utilizzarlo, sia che tali danni si verifichino durante il normale utilizzo, sia in seguito a malfunzionamenti, errori, sospensioni, interruzioni, cancellazioni, o altre circostanze connesse al Servizio. Questa esclusione di responsabilità si applica indipendentemente dal fatto che i danni siano prevedibili o che il Gestore sia stato informato della possibilità di tali danni. LApplicazione è fornita “così comè” e senza garanzie di alcun tipo, esplicite o implicite.</p>
<p><b>Modifiche e Interruzioni del Servizio</b><br>Il Gestore si riserva il diritto di modificare, sospendere o interrompere il Servizio in qualsiasi momento, con o senza preavviso, qualora si renda necessario effettuare interventi di manutenzione, aggiornamenti tecnici, o per garantire la sicurezza del sistema e degli utenti. In caso di interruzione definitiva del Servizio, gli utenti saranno informati tramite comunicazione via e-mail e avranno la possibilità di richiedere un rimborso proporzionale ai servizi già pagati ma non usufruiti. Eventuali alternative o modalità di accesso ai dati saranno comunicate contestualmente allavviso di interruzione.</p>
<!-- <p><b>Criteri per lInterruzione e la Cessazione</b><br>Il Gestore può, a sua esclusiva discrezione, sospendere o chiudere laccount dellUtente in caso di violazione dei presenti T&amp;C. Tali violazioni includono, a titolo esemplificativo ma non esaustivo, comportamenti fraudolenti, uso improprio della piattaforma o mancato rispetto delle regole di condotta. Prima che venga presa una decisione definitiva sulla sospensione o chiusura dellaccount, lUtente avrà la possibilità di presentare le proprie osservazioni o contestare la decisione.</p> -->
<p><b>Leggi Applicabile e Foro di Competente</b><br>Questi Termini e Condizioni sono regolati dalla legge italiana. In caso di controversie riguardanti linterpretazione o lapplicazione dei Termini e Condizioni, la competenza sarà attribuita esclusivamente al Tribunale di Milano, salvo diversa indicazione prevista dalla legge per lUtente, come nei casi in cui la normativa vigente, ad esempio il Codice del Consumo, preveda il foro di residenza o domicilio del consumatore.</p>
<p><b>Accettazione dei Termini e Condizioni</b><br>L'Utente accetta automaticamente i seguenti termini e condizioni tramite l'accesso all'interno dell'Applicazione.</p>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<h1 class="titlePage">Termini & Condizioni</h1>
<p class="subtitlePage">Ultimo aggiornamento: 17/11/2025</p>
<hr>
<div class="tec">
<p><b>Introduzione</b><br> RPIGroup Play vi dà il benvenuto. I presenti Termini e Condizioni (di seguito “T&amp;C”) regolamentano laccesso e luso dellapplicazione “RPIGroup Play” (di seguito “Portale”, “Servizio”, “Applicazione” e “Sito”) e tutti i servizi correlati. Accedendo e utilizzando il Portale, lutente (di seguito “Utente”) accetta i presenti T&amp;C al primo accesso, condizione necessaria per poter utilizzare il Servizio. Lutente potrà in qualsiasi momento declinare i seguenti T&amp;C, sapendo che non potrà più accedere allApplicazione offerta.</p>
<p><b>Titolarità e Gestione</b><br>RPIGroup Play è fornito da A.S.V. Studios APPS (di seguito “Gestore”, anche indicato come “Proprietario” e “Sviluppatore”), unico titolare del presente Servizio.</p>
<p><b>Descrizione del Servizio</b><br>LApplicazione consente di ascoltare in streaming le emittenti iscritte all'interno del gruppo RPIGroup, sia in formato audio e video (ove previsto).</p>
<p><b>Account e Registrazione</b><br>Per utilizzare il Servizio, l'utente non deve effettuare nessun tipo di registrazione o accesso.</p>
<!-- <p>
<b>Obblighi dell'Utente</b><br>
LUtente si impegna a utilizzare il Servizio in modo lecito e corretto, rispettando i presenti T&amp;C e i termini duso. In particolare, lUtente si impegna a:<br>
• Non violare i diritti di proprietà intellettuale del Gestore e di terzi;<br>
• Non utilizzare lApplicazione per scopi illegali o non autorizzati;<br>
• Non distribuire contenuti dannosi, quali software malevoli (malware), spam, materiale diffamatorio, offensivo, illecito o comunque inappropriato;<br>
• Non tentare di accedere, modificare o compromettere il funzionamento del Servizio o i dati di altri utenti;<br>
• Non utilizzare strumenti esterni, quali software automatizzati (ad esempio bot, spider o altri strumenti che simulano lattività umana), per interagire con lApplicazione.<br>
La violazione di questi termini può comportare la sospensione o la cancellazione dellaccount e, nei casi più gravi, leventuale segnalazione alle autorità competenti.
</p> -->
<p><b>Proprietà Intellettuale</b><br>Tutti i diritti di proprietà intellettuale relativi al Servizio, compresi design, marchi, loghi e contenuti scaricabili, sono di proprietà esclusiva del Gestore, dell'Associazione Culturale Comunicare e di tutte le emittenti iscritte all'interno del portale.</p>
<p><b>Contenuti Generati DallUtente</b><br>Il servizio non consente agli utenti di creare e caricare contenuti</p>
<p><b>Prezzi e Pagamenti</b><br>L'Applicazione è disponibile gratuitamente per tutti gli utilizzatori, ed è disponibile in formato gratuito per computer e smartphone.</p>
<p><b>Limitazioni di Responsabilità</b><br>Il Gestore non sarà responsabile per alcun danno, inclusi ma non limitati a danni diretti, indiretti, incidentali, speciali, consequenziali o punitivi, quali perdita di dati, perdita di profitti, interruzione dellattività, danni reputazionali o altri danni economici, derivanti dallutilizzo del Servizio o dallimpossibilità di utilizzarlo, sia che tali danni si verifichino durante il normale utilizzo, sia in seguito a malfunzionamenti, errori, sospensioni, interruzioni, cancellazioni, o altre circostanze connesse al Servizio. Questa esclusione di responsabilità si applica indipendentemente dal fatto che i danni siano prevedibili o che il Gestore sia stato informato della possibilità di tali danni. LApplicazione è fornita “così comè” e senza garanzie di alcun tipo, esplicite o implicite.</p>
<p><b>Modifiche e Interruzioni del Servizio</b><br>Il Gestore si riserva il diritto di modificare, sospendere o interrompere il Servizio in qualsiasi momento, con o senza preavviso, qualora si renda necessario effettuare interventi di manutenzione, aggiornamenti tecnici, o per garantire la sicurezza del sistema e degli utenti. In caso di interruzione definitiva del Servizio, gli utenti saranno informati tramite comunicazione via e-mail e avranno la possibilità di richiedere un rimborso proporzionale ai servizi già pagati ma non usufruiti. Eventuali alternative o modalità di accesso ai dati saranno comunicate contestualmente allavviso di interruzione.</p>
<!-- <p><b>Criteri per lInterruzione e la Cessazione</b><br>Il Gestore può, a sua esclusiva discrezione, sospendere o chiudere laccount dellUtente in caso di violazione dei presenti T&amp;C. Tali violazioni includono, a titolo esemplificativo ma non esaustivo, comportamenti fraudolenti, uso improprio della piattaforma o mancato rispetto delle regole di condotta. Prima che venga presa una decisione definitiva sulla sospensione o chiusura dellaccount, lUtente avrà la possibilità di presentare le proprie osservazioni o contestare la decisione.</p> -->
<p><b>Leggi Applicabile e Foro di Competente</b><br>Questi Termini e Condizioni sono regolati dalla legge italiana. In caso di controversie riguardanti linterpretazione o lapplicazione dei Termini e Condizioni, la competenza sarà attribuita esclusivamente al Tribunale di Milano, salvo diversa indicazione prevista dalla legge per lUtente, come nei casi in cui la normativa vigente, ad esempio il Codice del Consumo, preveda il foro di residenza o domicilio del consumatore.</p>
<p><b>Accettazione dei Termini e Condizioni</b><br>L'Utente accetta automaticamente i seguenti termini e condizioni tramite l'accesso all'interno dell'Applicazione.</p>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
</a>

View File

@@ -1,15 +1,32 @@
<h1 class="titlePage">TV</h1>
<p class="subtitlePage">Guarda in streaming <b>RC105 TV</b></p>
<hr>
<div class="tec">
<iframe src="https://tv.rpigroup.net/a9699134-efb3-4932-b8db-5a49ae214031.html" style="width:100%; height: 225px;" frameborder="no" scrolling="no" allowfullscreen="true"></iframe>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<?php
// views/home.php - Vista della pagina principale
$stations = loadTvStations();
?>
<h1 class="titlePage">TV</h1>
<p class="subtitlePage">Seleziona la webtv che vuoi guardare</p>
<hr>
<div class="stationList">
<div class="row g-2">
<?php foreach ($stations as $station): ?>
<div class="col-6">
<div class="stationCard <?php if((string)$station->thematic === 'true'){echo "isthematic";} ?>" data-id="<?php echo $station->id; ?>">
<a href="<?php echo $base_path; ?>/playtv/<?php echo $station->id; ?>" data-page="playtv/<?php echo $station->id; ?>" class="nav-link stationLink">
<img src="<?php echo $station->logo; ?>" alt="<?php echo $station->name; ?>" class="stationLogo">
</a>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<a href="<?php echo $base_path; ?>/home" data-page="home" class="linkBox mt-3">
<div class="clickBox mt-5 mb-4">
<svg class="w-6 h-6 text-gray-800 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12l4-4m-4 4 4 4"/></svg>
Torna alla Home
</div>
</a>

6
readme.md Normal file
View File

@@ -0,0 +1,6 @@
# RPIGroup Play
Il player ufficiale del gruppo RPIGroup
---
Questa repository è connessa al dominio APP.RPIGROUP.IT, ed è modificabile solo dagli utenti autorizzati

View File

@@ -1,3 +1,3 @@
# hestiacp autogenerated robots.txt
User-agent: *
Crawl-delay: 10
# hestiacp autogenerated robots.txt
User-agent: *
Crawl-delay: 10

View File

@@ -1,7 +1,4 @@
<div style="display:none">
<p><a href="https://www.jennymcnieceflowers.com/">777slot</a></p>
</div>
<script src="<?php echo $base_path; ?>/js/app.js?v=<?=time()?>"></script>
</body>
</html>
<script src="<?php echo $base_path; ?>/js/app.js?v=<?=time()?>"></script>
</body>
</html>

View File

@@ -1,37 +1,71 @@
<!DOCTYPE html>
<html lang="it">
<head>
<title><?php echo $title_site; ?></title>
<meta name="description" content="<?php echo $description_site; ?>">
<meta name="application-name" content="<?php echo $title_site; ?>">
<link rel="icon" type="image/png" href="<?php echo $logo_site; ?>">
<meta charset="utf-8">
<meta name="msapplication-tap-highlight" content="no">
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320"/>
<meta name="viewport" content="minimal-ui, width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="robots" content="index, follow">
<meta name="mobile-web-app-capable" content="yes">
<meta name="application-name" content="<?php echo $title_site; ?>">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="<?php echo $title_site; ?>">
<meta name="theme-color" content="#2a377e">
<meta name="apple-mobile-web-app-status-bar-style" content="#2a377e">
<meta name="screen-orientation" content="portrait">
<meta name="x5-orientation" content="portrait">
<meta name="x5-fullscreen" content="true">
<meta name="browsermode" content="application">
<link rel="manifest" href="<?=$base_path?>/manifest.json?v=<?=$version_app?>">
<link rel="stylesheet" href="<?=$base_path?>/css/bootstrap.css">
<link rel="stylesheet" href="<?=$base_path?>/css/style.css?v=<?=$version_app?>">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<!-- <link rel="stylesheet" href="<?=$base_path?>/css/animation.css?v=<?=$version_app?>">
<script src="https://code.jquery.com/jquery-2.2.4.js"></script>
<script src="<?=$base_path?>/js/bootstrap.js"></script> -->
<script>
// Passa il percorso base a JavaScript
var BASE_PATH = "<?=$base_path?>";
</script>
</head>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<?php
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: SAMEORIGIN');
header('X-XSS-Protection: 1; mode=block');
header('Referrer-Policy: strict-origin-when-cross-origin');
?>
<!DOCTYPE html>
<html lang="it">
<head>
<title><?php echo $title_site; ?></title>
<meta name="description" content="<?php echo $description_site; ?>">
<meta name="application-name" content="<?php echo $title_site; ?>">
<link rel="icon" type="image/png" href="<?php echo $logo_site; ?>">
<meta charset="utf-8">
<meta name="msapplication-tap-highlight" content="no">
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320"/>
<meta name="viewport" content="minimal-ui, width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="robots" content="index, follow">
<meta name="mobile-web-app-capable" content="yes">
<meta name="application-name" content="<?php echo $title_site; ?>">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="<?php echo $title_site; ?>">
<meta name="theme-color" content="#2a377e">
<meta name="apple-mobile-web-app-status-bar-style" content="#2a377e">
<meta name="screen-orientation" content="portrait">
<meta name="x5-orientation" content="portrait">
<meta name="x5-fullscreen" content="true">
<meta name="apple-mobile-web-app-orientations" content="portrait">
<meta name="browsermode" content="application">
<link rel="manifest" href="<?=$base_path?>/manifest.json?v=<?=$version_app?>">
<link rel="stylesheet" href="<?=$base_path?>/css/bootstrap.css">
<link rel="stylesheet" href="<?=$base_path?>/css/style.css?v=<?=$version_app?>">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="<?=$base_path?>/css/animation.css?v=<?=$version_app?>">
<script src="https://code.jquery.com/jquery-2.2.4.js?v=<?=$version_app?>"></script>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script src="<?=$base_path?>/js/bootstrap.js?v=<?=$version_app?>"></script>
<script>
// Passa il percorso base a JavaScript
var BASE_PATH = "<?=$base_path?>";
// Forza l'orientamento portrait
if (window.screen && window.screen.orientation) {
// Tenta di bloccare l'orientamento in portrait
window.addEventListener('load', function() {
if (screen.orientation && screen.orientation.lock) {
screen.orientation.lock('portrait').catch(function(error) {
console.log('Orientation lock not supported or failed:', error);
});
}
});
}
// Fallback per dispositivi che non supportano l'API
// Mostra un avviso se l'utente ruota il dispositivo
window.addEventListener('orientationchange', function() {
if (window.orientation !== 0 && window.orientation !== 180) {
// Il dispositivo è in landscape, ma non possiamo forzarlo
console.log('Si prega di tenere il dispositivo in posizione verticale');
}
});
</script>
</head>
<body class="<?php echo $show_app ? 'appBody' : 'desktopBody'; ?>">