In this edition of the GARR Workshop 2024, we provide updates on the state of the new GARR-T network, enhanced by the European TeRABIT and ICSC projects. Attendees learn about the latest GARR services and the innovative use of fibre infrastructure for no-data services, including time-frequency signal transmission, sensing, and quantum communication. We also focus on security, especially on NIS2, digital identities, cloud technology, and the many applications and services supporting researchers in Italy and across Europe.
The GARR Workshop has long been a crucial gathering for networking experts from the university, education, and research sectors, offering a valuable platform for discussion, exchange, and professional development on the latest technological trends.
Additionally, on 4th November, we will host an event dedicated to training opportunities, featuring in-person courses tailored for GARR user community.
-
Interviews
-
Videos of the sessions
-
Slide
-
Photo Gallery
-
Event website
GARR Workshop 2024
Biblioteca Nazionale Centrale di Roma
5-7 NOVEMBER 2024, ROME
Interviews
/* Stili della galleria (prefisso garr- per non collidere con la pagina ospite) */
.garr-video-facade {
position: relative;
display: block;
width: 100%;
padding: 0;
border: 0;
aspect-ratio: 16 / 9;
background-color: #000;
background-size: cover;
background-position: center;
cursor: pointer;
overflow: hidden;
}
.garr-play-icon {
position: absolute;
top: 50%;
left: 50%;
width: 68px;
height: 48px;
transform: translate(-50%, -50%);
background: rgba(0, 0, 0, 0.6);
border-radius: 12px;
transition: background 0.2s ease;
}
.garr-play-icon::before {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-40%, -50%);
border-style: solid;
border-width: 11px 0 11px 19px;
border-color: transparent transparent transparent #fff;
}
.garr-video-facade:hover .garr-play-icon,
.garr-video-facade:focus .garr-play-icon {
background: #c00;
}
.garr-video-frame {
display: block;
width: 100%;
aspect-ratio: 16 / 9;
height: auto;
border: 0;
}
// Configurazione
// MAX_VIDEOS: numero intero positivo per limitare i video mostrati.
// Lascia null / undefined / -1 (o qualunque valore non intero-positivo)
// per mostrare TUTTI i video disponibili con il tag.
const MAX_VIDEOS = null;
const TAG_FILTER = 'interviste-ws24';
const API_BASE_URL = 'https://garr.tv/api/v1/videos';
const SITE_BASE_URL = 'https://garr.tv';
const PAGE_SIZE = 100; // massimo consentito dall'API PeerTube per singola richiesta
// True se MAX_VIDEOS non rappresenta un limite valido => mostra tutti i video
function shouldFetchAll() {
return !(Number.isInteger(MAX_VIDEOS) && MAX_VIDEOS > 0);
}
// Escape dei caratteri speciali HTML (testo e attributi)
function escapeHtml(value) {
return String(value == null ? '' : value)
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(//g, '>');
}
// Funzione per recuperare i video (gestisce limite e paginazione)
async function fetchRecentVideos() {
const limit = shouldFetchAll() ? Infinity : MAX_VIDEOS;
const collected = [];
let start = 0;
let total = Infinity;
try {
while (collected.length < limit && start < total) {
const pageCount = Math.min(PAGE_SIZE, limit - collected.length);
const apiUrl = API_BASE_URL +
'?tagsOneOf=' + encodeURIComponent(TAG_FILTER) +
'&sort=-publishedAt' +
'&start=' + start +
'&count=' + pageCount;
const response = await fetch(apiUrl);
if (!response.ok) {
throw new Error('Request failed with status: ' + response.status);
}
const data = await response.json();
total = data.total || 0;
const pageVideos = data.data || [];
if (pageVideos.length === 0) {
break;
}
collected.push.apply(collected, pageVideos);
start += pageVideos.length;
}
return processVideoData(collected);
} catch (error) {
console.error('Error fetching videos:', error);
return [];
}
}
// Funzione per processare i dati dei video
function processVideoData(videoList) {
return videoList.map(function (video) {
// Usa embedPath / previewPath forniti dall'API (più robusti di un URL costruito a mano)
const embedUrl = video.embedPath
? SITE_BASE_URL + video.embedPath
: SITE_BASE_URL + '/videos/embed/' + video.uuid;
const thumbnailPath = video.previewPath || video.thumbnailPath || '';
const thumbnailUrl = thumbnailPath ? SITE_BASE_URL + thumbnailPath : '';
return {
title: video.name || '',
videoSrc: embedUrl,
thumbnailUrl: thumbnailUrl,
publishedAt: video.originallyPublishedAt || video.publishedAt
};
});
}
// Funzione per creare una card video (facade: anteprima + tasto play, l'iframe si carica al click)
function createVideoCard(video) {
const safeTitle = escapeHtml(video.title);
const safeEmbed = escapeHtml(video.videoSrc);
const safeThumb = escapeHtml(video.thumbnailUrl);
const thumbStyle = safeThumb
? ' style="background-image:url(\'' + safeThumb + '\');"'
: '';
return '
' +
'
' +
'
' + safeTitle + '
' +
'
' +
'' +
'' +
'' +
'
' +
'
' +
'
';
}
// Sostituisce la facade cliccata con l'iframe del player (carica un solo player, su gesto utente)
function handleFacadeClick(event) {
const facade = event.target.closest('.garr-video-facade');
if (!facade) {
return;
}
const embedUrl = facade.getAttribute('data-embed');
const title = facade.getAttribute('data-title') || '';
const iframe = document.createElement('iframe');
iframe.className = 'garr-video-frame';
iframe.setAttribute('title', title);
iframe.setAttribute('src', embedUrl + (embedUrl.indexOf('?') === -1 ? '?' : '&') + 'autoplay=1');
iframe.setAttribute('allow', 'autoplay; fullscreen');
iframe.setAttribute('allowfullscreen', '');
iframe.setAttribute('frameborder', '0');
iframe.setAttribute('sandbox', 'allow-same-origin allow-scripts allow-popups allow-forms');
facade.replaceWith(iframe);
}
// Funzione per renderizzare i video
function renderVideos(videos) {
const container = document.getElementById('garr-videos-container');
if (videos.length === 0) {
container.innerHTML = '
Nessun video trovato.
';
return;
}
const videosHTML = videos.map(createVideoCard).join('');
container.innerHTML = '
' +
videosHTML +
'
';
// Delego il click sul container: il player parte solo quando l'utente clicca
container.addEventListener('click', handleFacadeClick);
}
// Funzione principale
async function initVideoGallery() {
const container = document.getElementById('garr-videos-container');
container.innerHTML = '
Caricamento video...
';
const videos = await fetchRecentVideos();
renderVideos(videos);
}
// Avvia l'applicazione quando il DOM è pronto
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initVideoGallery);
} else {
initVideoGallery();
}
Videos of the sessions
Click on the menu at the top left of the player to browse the playlist
Slide
Photogallery
Would you like to learn more about GARR events?
Contact us