diff --git a/.gitignore b/.gitignore index dff251e..548aed9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ cache/sitemap.xml cache/timer.yaml +media/tmp/.gitkeep system/vendor cypress data/navigation diff --git a/cache/timer.yaml b/cache/timer.yaml index 9d86c44..66f4e85 100644 --- a/cache/timer.yaml +++ b/cache/timer.yaml @@ -1 +1 @@ -licenseupdate: 1745608151 +licenseupdate: 1745867608 diff --git a/media/live/web-optimized-1200x800-97kb.webp b/media/live/web-optimized-1200x800-97kb.webp new file mode 100644 index 0000000..dca48d1 Binary files /dev/null and b/media/live/web-optimized-1200x800-97kb.webp differ diff --git a/media/original/web-optimized-1200x800-97kb.webp b/media/original/web-optimized-1200x800-97kb.webp new file mode 100644 index 0000000..f8630f5 Binary files /dev/null and b/media/original/web-optimized-1200x800-97kb.webp differ diff --git a/media/thumbs/web-optimized-1200x800-97kb.webp b/media/thumbs/web-optimized-1200x800-97kb.webp new file mode 100644 index 0000000..5e80061 Binary files /dev/null and b/media/thumbs/web-optimized-1200x800-97kb.webp differ diff --git a/media/tmp/.gitkeep b/media/tmp/.gitkeep index e69de29..45adbb2 100644 --- a/media/tmp/.gitkeep +++ b/media/tmp/.gitkeep @@ -0,0 +1 @@ +.gitkeep \ No newline at end of file diff --git a/system/typemill/Controllers/ControllerApiImage.php b/system/typemill/Controllers/ControllerApiImage.php index 4dfae6e..f98cd6a 100644 --- a/system/typemill/Controllers/ControllerApiImage.php +++ b/system/typemill/Controllers/ControllerApiImage.php @@ -6,17 +6,13 @@ use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; use Typemill\Models\Media; use Typemill\Models\StorageWrapper; +use Typemill\Models\Navigation; +use Typemill\Models\User; use Typemill\Extensions\ParsedownExtension; use Typemill\Static\Translations; class ControllerApiImage extends Controller { - - # MISSING - # - # return error messages and display in image component - # check if resized is bigger than original, then use original - public function getPagemedia(Request $request, Response $response, $args) { $url = $request->getQueryParams()['url'] ?? false; @@ -61,6 +57,145 @@ class ControllerApiImage extends Controller return $response->withHeader('Content-Type', 'application/json'); } + public function getUnusedMedia(Request $request, Response $response, $args) + { + $storage = new StorageWrapper('\Typemill\Models\Storage'); + + # load all images + $imagelist = $storage->getImageList(); + + # load all files + $filelist = $storage->getFileList(); + + # get navigation + $urlinfo = $this->c->get('urlinfo'); + $langattr = $this->settings['langattr']; + $navigation = new Navigation(); + $draftNavigation = $navigation->getFullDraftNavigation($urlinfo, $langattr); + + $fullNavigation = $navigation->getHomepageItem($urlinfo['baseurl']); + $fullNavigation->folderContent = $draftNavigation; + + $usedmediaList = $this->getMediaFromPages([$fullNavigation], $storage, $media = []); + + # get media from users + $userModel = new User(); + $userList = $userModel->getAllUsers(); + $usedmediaList = $this->getMediaFromUsers($storage, $usedmediaList, $userList); + + # get media from settings + $settingsfile = $storage->getFile('settingsFolder', '', 'settings.yaml'); + $settingsmedia = $this->findMediaInText($settingsfile); + if(isset($settingsmedia[2]) && !empty($settingsmedia[2])) + { + $usedmediaList = array_merge($usedmediaList, $settingsmedia[2]); + } + + + if(empty($usedmediaList)) + { + + } + + $usedMedia = []; + foreach($usedmediaList as $name) + { + $usedMedia[$name] = true; + } + + $unusedMedia = []; + foreach($imagelist as $key => $item) + { + if(!isset($usedMedia[$item['name']])) + { + $unusedMedia[] = $item; + } + } + + foreach($filelist as $key => $item) + { + if(!isset($usedMedia[$item['name']])) + { + $unusedMedia[] = $item; + } + } + + $response->getBody()->write(json_encode([ + 'used' => $usedMedia, + 'unused' => $unusedMedia + ])); + + return $response->withHeader('Content-Type', 'application/json'); + } + + protected function getMediaFromUsers($storage, $usedmediaList, $userList) + { + foreach($userList as $username) + { + $userfile = $storage->getFile('settingsFolder', 'users', $username . '.yaml'); + $usermedia = $this->findMediaInText($userfile); + if(isset($usermedia[2]) && !empty($usermedia[2])) + { + $usedmediaList = array_merge($usedmediaList, $usermedia[2]); + } + } + + return $usedmediaList; + } + + protected function getMediaFromPages($navigation, $storage, $usedMedia) + { + foreach($navigation as $item) + { + $pagemedia = []; + $path = $item->pathWithoutType; + $draftmd = $storage->getFile('contentFolder', '', $path . '.txt'); + if($draftmd) + { + $markdownArray = json_decode($draftmd); + $parsedown = new ParsedownExtension(); + $markdown = $parsedown->arrayBlocksToMarkdown($markdownArray); + $draftmedia = $this->findMediaInText($markdown); + if(isset($draftmedia[2]) && !empty($draftmedia[2])) + { + $pagemedia = array_merge($pagemedia, $draftmedia[2]); + } + } + + $livemd = $storage->getFile('contentFolder', '', $path . '.md'); + if($livemd) + { + $livemedia = $this->findMediaInText($livemd); + if(isset($livemedia[2]) && !empty($livemedia[2])) + { + $pagemedia = array_merge($pagemedia, $livemedia[2]); + } + } + + $meta = $storage->getFile('contentFolder', '', $path . '.yaml'); + if($meta) + { + $metamedia = $this->findMediaInText($meta); + if(isset($metamedia[2]) && !empty($metamedia[2])) + { + $pagemedia = array_merge($pagemedia, $metamedia[2]); + } + } + + if(!empty($pagemedia)) + { + $usedMedia = array_merge($usedMedia, $pagemedia); + } + + if($item->elementType == 'folder' && !empty($item->folderContent)) + { + $usedMedia = $this->getMediaFromPages($item->folderContent, $storage, $usedMedia); + } + } + + return $usedMedia; + } + protected function findMediaInText($text) { preg_match_all('/media\/(live|files)\/(.+?\.[a-zA-Z]{2,4})/', $text, $matches); diff --git a/system/typemill/author/js/vue-medialib.js b/system/typemill/author/js/vue-medialib.js index f29621d..0b4561e 100644 --- a/system/typemill/author/js/vue-medialib.js +++ b/system/typemill/author/js/vue-medialib.js @@ -41,22 +41,31 @@ const medialib = {