Applicazione Shiny per generare pacchetti SCORM da video ospitati su SharePoint, con autenticazione Microsoft integrata.
✅ Autenticazione OAuth Microsoft - Accesso sicuro al tuo account Microsoft
✅ Navigazione SharePoint - Sfoglia siti, document libraries e cartelle
✅ Selezione Batch - Seleziona più video contemporaneamente
✅ Assegnazione Titoli - Assegna titoli personalizzati a ogni video
✅ Generazione SCORM - Crea pacchetti SCORM compatibili SCORM 1.2
✅ Upload Automatico - Carica i SCORM direttamente su SharePoint
✅ Progress Tracking - Monitoraggio in tempo reale delle operazioni
L'applicazione segue un'architettura modulare con separazione delle responsabilità:
app.R # Orchestratore principale
├── R/
│ ├── mod_auth.R # Modulo autenticazione OAuth
│ ├── mod_sharepoint_nav.R # Modulo navigazione SharePoint
│ ├── mod_video_selector.R # Modulo selezione video e titoli
│ ├── mod_scorm_generator.R # Modulo generazione SCORM batch
│ ├── fct_scorm.R # Funzioni SCORM
│ ├── fct_microsoft.R # Funzioni Microsoft365R
│ ├── fct_validation.R # Validazioni input
│ └── utils_ui.R # Helper UI
├── config.yml # Configurazione ambiente
├── scorm_template/ # Template SCORM predefinito
└── .Renviron # Variabili d'ambiente (non committare!)
- R 4.1+
- Registrazione applicazione su Azure AD
- Accesso a SharePoint Online
- Installa le dipendenze:
renv::restore()-
Configura Azure AD:
- Registra l'app su Azure Portal
- Abilita le API: Microsoft Graph, SharePoint
- Crea un secret client
- Aggiungi redirect URI:
http://localhost:3838(sviluppo) o il tuo URL production
-
Copia il file
.Renviron.examplee popola le credenziali:
cp .Renviron.example .Renviron
# Modifica .Renviron con le tue credenzialiContenuto minimo di .Renviron:
SHINY_CLIENT_SECRET=<your-client-secret>
- Aggiorna
config.ymlcon i tuoi valori:
default:
tenant: "your-tenant-id"
app: "your-app-id"
redirect: "http://localhost:3838"library(shiny)
runApp()L'applicazione si apre su http://localhost:3838
- Accedi con il tuo account Microsoft
- Seleziona SharePoint - Scegli il sito e il document library
- Naviga le cartelle - Esplora le cartelle e seleziona i video
- Assegna titoli - Dai un titolo personalizzato a ogni video
- Genera SCORM - Crea i pacchetti SCORM (generazione batch)
- Carica - Upload automatico su SharePoint (opzionale)
Modifica il tema Bootstrap 5 in app.R:
theme <- bs_theme(
version = 5,
preset = "bootstrap",
primary = "#0d6efd",
success = "#198754"
)In config.yml:
connect_cloud:
redirect: "https://your-domain.share.connect.posit.cloud"I log sono salvati in scorm_builder.log. Modifica il percorso in app.R:
log <- logger(appenders = file_appender("logs/app.log"))Ogni modulo contiene una coppia UI + Server:
mod_auth_ui()/mod_auth_server()- Gestione token Azuremod_sharepoint_nav_ui()/mod_sharepoint_nav_server()- Navigazione SharePointmod_video_selector_ui()/mod_video_selector_server()- Selezione e titolimod_scorm_generator_ui()/mod_scorm_generator_server()- Generazione batch
fct_scorm.R-make_scorm(),make_scorm_batch()fct_microsoft.R- Wrapper Microsoft365Rfct_validation.R- Validazione inpututils_ui.R- Helper per UI
- Verifica che il client secret sia corretto
- Controlla che le API siano abilitate in Azure AD
- Assicurati che l'app abbia i permessi su SharePoint
- Verifica che la cartella contenga file
.mp4 - Controlla i permessi di accesso su SharePoint
- Dai un'occhiata ai log (
scorm_builder.log)
- Verifica che il template SCORM sia intatto
- Controlla che il titolo non contenga caratteri speciali
- Assicurati che il video sia in formato MP4 valido
# Test delle funzioni fct_*
source("R/fct_validation.R")
validate_title("Mio Corso")
# Test con dati di esempio
devtools::load_all()Per generare un SCORM di test:
source("R/fct_scorm.R")
make_scorm(
video_path = "test_video.mp4",
title = "Mio Corso di Test",
scorm_name = "test-course",
output_dir = getwd()
)Proprietario - Unione Provinciale Istituzioni per l'Assistenza
Per supporto: [inserire email di contatto]
- 🎉 Release iniziale
- ✅ Autenticazione Microsoft
- ✅ Navigazione SharePoint
- ✅ Generazione SCORM batch
- ✅ Upload automatico