diff --git a/TODO.md b/TODO.md index cb40aa5..ac9a8bc 100644 --- a/TODO.md +++ b/TODO.md @@ -242,6 +242,12 @@ - [x] Add `storage/tmp/filepond/*` to .gitignore + rsync exclude, with .gitkeep - [ ] Deploy: `just deploy` to sync vendor JS files + updated CSP + .gitkeep to server +## Export: LINK.txt for PeerTube files +- [x] Add `getPeerTubeInstanceUrl()` helper to ExportController +- [x] In `createExportZip()`: collect PeerTube files, generate LINK.txt per thesis directory +- [x] Augment manifest.json with `peertube_links` array per thesis +- [x] Update docs/export.md with LINK.txt and peertube_links documentation + # improvements_postlaunch — Année verrouillable dans partage + correction ID ## Implémentation diff --git a/app/src/Controllers/ExportController.php b/app/src/Controllers/ExportController.php index 822f9b3..10a510c 100644 --- a/app/src/Controllers/ExportController.php +++ b/app/src/Controllers/ExportController.php @@ -53,6 +53,16 @@ class ExportController return $this->db->getAllThesisFilesForExport($thesisIds); } + /** + * Get the configured PeerTube instance URL, or empty string if not configured. + */ + private function getPeerTubeInstanceUrl(): string + { + require_once APP_ROOT . '/src/PeerTubeService.php'; + $settings = PeerTubeService::getSettings($this->db); + return $settings['instance_url']; + } + /** * Build a JSON manifest describing every thesis and its files. * @@ -153,17 +163,72 @@ class ExportController // Add every thesis file under files/ $addedCount = 0; $skippedCount = 0; + $peertubeLinks = []; // thesisId => [{uuid, watchUrl, fileType, label}] + $ptInstanceUrl = ''; foreach ($files as $f) { - $fullPath = $storageRoot . '/' . $f['file_path']; + $filePath = $f['file_path']; + + // Collect PeerTube links per-thesis + if (str_starts_with($filePath, 'peertube_ids:')) { + $uuid = substr($filePath, strlen('peertube_ids:')); + if ($ptInstanceUrl === '') { + $ptInstanceUrl = $this->getPeerTubeInstanceUrl(); + } + $tid = (int) $f['thesis_id']; + $peertubeLinks[$tid] = $peertubeLinks[$tid] ?? ['dirname' => '', 'links' => []]; + $peertubeLinks[$tid]['links'][] = [ + 'uuid' => $uuid, + 'url' => $ptInstanceUrl !== '' ? rtrim($ptInstanceUrl, '/') . '/videos/watch/' . $uuid : '', + 'type' => $f['file_type'], + 'label' => $f['display_label'] ?? '', + 'name' => $f['file_name'], + ]; + $skippedCount++; // not a real file on disk + continue; + } + + // Track the directory for each thesis (for LINK.txt placement) + $tid = (int) $f['thesis_id']; + if (isset($peertubeLinks[$tid]) && $peertubeLinks[$tid]['dirname'] === '') { + $peertubeLinks[$tid]['dirname'] = dirname($filePath); + } + + $fullPath = $storageRoot . '/' . $filePath; if (!is_file($fullPath) || !is_readable($fullPath)) { $skippedCount++; continue; } - $zipPath = $baseDir . '/' . $f['file_path']; + $zipPath = $baseDir . '/' . $filePath; $zip->addFile($fullPath, $zipPath); $addedCount++; } + // Add LINK.txt in each thesis directory that has PeerTube files + foreach ($peertubeLinks as $info) { + if ($info['dirname'] === '') { + continue; + } + $txt = "Liens PeerTube pour ce TFE\n" + . str_repeat('=', 40) . "\n\n"; + foreach ($info['links'] as $link) { + $label = $link['label'] !== '' ? $link['label'] : $link['name']; + $txt .= ($label !== '' ? $label . "\n" : ''); + $txt .= ($link['url'] !== '' ? $link['url'] . "\n" : '(instance PeerTube non configurée)' . "\n"); + $txt .= "\n"; + } + $txtPath = $baseDir . '/' . $info['dirname'] . '/LINK.txt'; + $zip->addFromString($txtPath, $txt); + } + + // Augment manifest with PeerTube link info per thesis + foreach ($manifest['theses'] as &$entry) { + $tid = $entry['id']; + if (isset($peertubeLinks[$tid])) { + $entry['peertube_links'] = $peertubeLinks[$tid]['links']; + } + } + unset($entry); + $zip->addFromString( 'manifest.json', json_encode(array_merge($manifest, [ diff --git a/docs/export.md b/docs/export.md index 2805403..12de40e 100644 --- a/docs/export.md +++ b/docs/export.md @@ -36,7 +36,8 @@ xamxam-files-2026-05-07.zip │ ├── 2025_LILA_DUBOIS_KARIM_NASSAR/ │ │ ├── nixing_the_fix_report_final.pdf │ │ ├── bbb_sunflower_1080p_30fps_normal_mp4.zip - │ │ └── carte_loire_a_velo_france.pdf + │ │ ├── carte_loire_a_velo_france.pdf + │ │ └── LINK.txt ← si vidéos PeerTube présentes │ └── … └── 2026/ └── … @@ -69,6 +70,15 @@ xamxam-files-2026-05-07.zip "label": "Mémoire principal", "sort_order": 1 } + ], + "peertube_links": [ + { + "uuid": "abc123def", + "url": "https://videos.erg.be/videos/watch/abc123def", + "type": "video", + "label": "Vidéo de présentation", + "name": "presentation.mp4" + } ] } }