{"id":26254231,"url":"https://github.com/friendsofredaxo/asset_import","last_synced_at":"2025-04-27T06:50:38.496Z","repository":{"id":270371836,"uuid":"910122280","full_name":"FriendsOfREDAXO/asset_import","owner":"FriendsOfREDAXO","description":"Ein AddOn zum Importieren von Medien aus verschiedenen Quellen (Pixabay, Pexels etc.) direkt in den REDAXO Medienpool.","archived":false,"fork":false,"pushed_at":"2025-01-22T21:25:06.000Z","size":1522,"stargazers_count":9,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-30T08:31:25.151Z","etag":null,"topics":["media","pexels-api","pixabay-api","redaxo","redaxo-addon"],"latest_commit_sha":null,"homepage":"https://github.com/FriendsOfREDAXO/asset_import","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FriendsOfREDAXO.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-12-30T14:48:58.000Z","updated_at":"2025-01-22T21:22:13.000Z","dependencies_parsed_at":null,"dependency_job_id":"3efd5fb4-8972-4f06-936c-7412d9d54141","html_url":"https://github.com/FriendsOfREDAXO/asset_import","commit_stats":null,"previous_names":["friendsofredaxo/asset_import"],"tags_count":6,"template":false,"template_full_name":"FriendsOfREDAXO/rex_repo_template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FriendsOfREDAXO%2Fasset_import","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FriendsOfREDAXO%2Fasset_import/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FriendsOfREDAXO%2Fasset_import/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FriendsOfREDAXO%2Fasset_import/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FriendsOfREDAXO","download_url":"https://codeload.github.com/FriendsOfREDAXO/asset_import/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251099734,"owners_count":21536153,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["media","pexels-api","pixabay-api","redaxo","redaxo-addon"],"created_at":"2025-03-13T18:19:56.756Z","updated_at":"2025-04-27T06:50:38.475Z","avatar_url":"https://github.com/FriendsOfREDAXO.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Asset Import für REDAXO\n\nEin AddOn zum Importieren von Medien aus verschiedenen Quellen (Pixabay, Pexels etc.) direkt in den REDAXO Medienpool.\n\n![Screenshot](https://github.com/FriendsOfREDAXO/asset_import/blob/assets/screen.png?raw=true)\n\n## Features\n\n- Bildsuche über verschiedene Provider\n- Video-Suche (abhängig vom Provider)\n- Vorschau der Assets\n- Direkter Import in den Medienpool\n- Kategoriezuweisung\n- 24h API-Cache für bessere Performance\n- Erweiterbar durch weitere Provider\n\n## Installation\n\n1. Im REDAXO Installer das AddOn `asset_import` herunterladen\n2. Installation durchführen\n3. Provider konfigurieren unter \"Asset Import \u003e Einstellungen\"\n\n## Provider registrieren\n\nProvider können in der boot.php eines anderen AddOns registriert werden:\n\n```php\n// Provider-Klasse implementieren\nnamespace MyAddon\\Provider;\n\nclass MyProvider extends \\FriendsOfRedaxo\\AssetImport\\Asset\\AbstractProvider \n{\n    // Provider Implementation\n}\n\n// Provider im Asset Import registrieren\nif (\\rex_addon::get('asset_import')-\u003eisAvailable()) {\n    \\FriendsOfRedaxo\\AssetImport\\AssetImporter::registerProvider(MyProvider::class);\n}\n```\n\n## Provider implementieren\n\nEin Provider muss das ProviderInterface implementieren:\n\n```php\npublic function getName(): string;        // Eindeutiger Name\npublic function getTitle(): string;       // Anzeigename\npublic function getIcon(): string;        // FontAwesome Icon\npublic function isConfigured(): bool;     // Prüft Konfiguration\npublic function getConfigFields(): array; // Konfigurationsfelder\npublic function search(): array;          // Suchmethode\npublic function import(): bool;           // Import Methode\npublic function getDefaultOptions(): array; // Standard-Optionen\n```\n\nDie abstrakte Klasse `AbstractProvider` bietet bereits:\n- API Caching (24h)\n- Medienpool Import\n- Konfigurationsverwaltung\n\n\n## Beispiel Provider für File import aus lokalem Ordner\n\n### Was macht der Provider?\n\nDer FTP Upload Provider ermöglicht es, Dateien aus einem definierten Upload-Verzeichnis in den REDAXO Medienpool zu importieren. Er ist ein gutes Beispiel dafür, wie ein eigener Provider für das Asset Import AddOn implementiert werden kann.\n\n### Features\n\n- Durchsucht das `ftpupload`-Verzeichnis im REDAXO-Root rekursiv\n- Unterstützt Bilder (jpg, jpeg, png, gif, webp) und Videos (mp4, webm)\n- Sortiert Dateien nach Änderungsdatum (neueste zuerst)\n- Bietet Suche nach Dateinamen\n- Paginierte Ergebnisse (20 pro Seite)\n\n### Installation\n\n1. Erstelle Provider-Klasse in deinem AddOn:\n\n```php\n// in /redaxo/src/addons/project/lib/Provider/FtpUploadProvider.php\n\n\u003c?php\nnamespace Project\\Provider;\n\nuse FriendsOfRedaxo\\AssetImport\\Asset\\AbstractProvider;\nuse rex_path;\nuse rex_url;\n\nclass FtpUploadProvider extends AbstractProvider\n{\n    public function getName(): string \n    {\n        return 'ftpupload';\n    }\n\n    public function getTitle(): string \n    {\n        return 'FTP Upload';\n    }\n\n    public function getIcon(): string \n    {\n        return 'fa-upload';\n    }\n\n    public function isConfigured(): bool \n    {\n        return true;\n    }\n\n    public function getConfigFields(): array \n    {\n        return [];\n    }\n\n    public function getDefaultOptions(): array \n    {\n        return [\n            'type' =\u003e 'image'\n        ];\n    }\n\n    protected function searchApi(string $query, int $page = 1, array $options = []): array \n    {\n        $items = [];\n        $type = $options['type'] ?? 'image';\n        $uploadPath = rex_path::base('ftpupload');\n        \n        if (is_dir($uploadPath)) {\n            $files = new \\RecursiveIteratorIterator(\n                new \\RecursiveDirectoryIterator($uploadPath, \\RecursiveDirectoryIterator::SKIP_DOTS),\n                \\RecursiveIteratorIterator::SELF_FIRST\n            );\n\n            foreach ($files as $file) {\n                if ($file-\u003eisFile()) {\n                    $fileType = $this-\u003egetFileType($file-\u003egetFilename());\n                    \n                    // Nur Bilder und Videos berücksichtigen\n                    if ($fileType \u0026\u0026 ($type === 'all' || $type === $fileType)) {\n                        if (empty($query) || stripos($file-\u003egetFilename(), $query) !== false) {\n                            $relativePath = str_replace($uploadPath, '', $file-\u003egetPathname());\n                            $relativePath = ltrim($relativePath, '/\\\\');\n                            $filename = $file-\u003egetFilename();\n                            \n                            $items[] = [\n                                'id' =\u003e md5($relativePath),\n                                'preview_url' =\u003e rex_url::base('ftpupload/' . $relativePath),\n                                'title' =\u003e $filename,\n                                'author' =\u003e 'FTP Upload',\n                                'type' =\u003e $fileType,\n                                'size' =\u003e [\n                                    'original' =\u003e ['url' =\u003e rex_url::base('ftpupload/' . $relativePath)]\n                                ]\n                            ];\n                        }\n                    }\n                }\n            }\n\n            // Sortiere nach Datum absteigend\n            usort($items, function($a, $b) use ($uploadPath) {\n                $timeA = filemtime($uploadPath . '/' . $a['title']);\n                $timeB = filemtime($uploadPath . '/' . $b['title']);\n                return $timeB - $timeA;\n            });\n\n            // Paginierung\n            $itemsPerPage = 20;\n            $offset = ($page - 1) * $itemsPerPage;\n            $items = array_slice($items, $offset, $itemsPerPage);\n        }\n\n        $total = count($items);\n\n        return [\n            'items' =\u003e $items,\n            'total' =\u003e $total,\n            'page' =\u003e $page,\n            'total_pages' =\u003e ceil($total / 20)\n        ];\n    }\n\n    private function getFileType(string $filename): ?string \n    {\n        $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));\n        \n        $types = [\n            'image' =\u003e ['jpg', 'jpeg', 'png', 'gif', 'webp'],\n            'video' =\u003e ['mp4', 'webm']\n        ];\n        \n        foreach ($types as $type =\u003e $extensions) {\n            if (in_array($ext, $extensions)) {\n                return $type;\n            }\n        }\n        \n        return null;\n    }\n}\n```\n\n2. Provider in deinem AddOn registrieren:\n\n```php\n// in /redaxo/src/addons/project/boot.php\n\nif (\\rex_addon::get('asset_import')-\u003eisAvailable()) {\n    \\FriendsOfRedaxo\\AssetImport\\AssetImporter::registerProvider(\\Project\\Provider\\FtpUploadProvider::class);\n}\n```\n\n3. `ftpupload`-Verzeichnis im REDAXO-Root erstellen und Schreibrechte setzen\n\n### Verzeichnisstruktur\n\n```\nredaxo/\n├── src/\n│   └── addons/\n│       └── project/\n│           ├── lib/\n│           │   └── Provider/\n│           │       └── FtpUploadProvider.php\n│           └── boot.php\n└── ftpupload/\n    ├── bilder/\n    └── videos/\n```\n\n### Funktionsweise\n\n1. **Verzeichnis-Scan:**\n   - Durchsucht das `ftpupload`-Verzeichnis rekursiv\n   - Filtert nach unterstützten Dateitypen\n   - Berücksichtigt nur Bilder und Videos\n\n2. **Suche:**\n   - Filtert Dateien nach Suchbegriff im Dateinamen\n   - Typ-Filter für Bilder oder Videos\n\n3. **Sortierung \u0026 Paginierung:**\n   - Sortiert nach Änderungsdatum (neueste zuerst)\n   - 20 Einträge pro Seite\n   - Unterstützt Blättern durch die Ergebnisse\n\n4. **Import:**\n   - Nutzt den Standard-Import des AbstractProvider\n   - Importiert direkt in den Medienpool\n\n## API Referenz\n\n### AbstractProvider\n\nDie Basisklasse, von der alle Provider erben müssen. Stellt grundlegende Funktionalitäten und Schnittstellen bereit.\n\n#### Hauptmethoden\n\n```php\npublic function getName(): string\n```\nGibt einen eindeutigen Bezeichner für den Provider zurück.\n\n```php\npublic function getTitle(): string\n```\nGibt den Anzeigenamen zurück, der in der Benutzeroberfläche angezeigt wird.\n\n```php\npublic function getIcon(): string\n```\nGibt einen FontAwesome-Icon-Bezeichner zurück (z.B. 'fa-cloud').\n\n```php\npublic function isConfigured(): bool\n```\nPrüft, ob der Provider alle erforderlichen Konfigurationseinstellungen hat.\n\n```php\npublic function getConfigFields(): array\n```\nGibt Konfigurationsfelder für die Provider-Einstellungsseite zurück. Jedes Feld sollte ein Array mit folgenden Elementen sein:\n- `name`: Feldbezeichner\n- `type`: Eingabetyp ('text', 'password', 'select')\n- `label`: Übersetzungsschlüssel für das Label\n- `notice`: Optionaler Übersetzungsschlüssel für Hilfetext\n- `options`: Array von Optionen für Select-Felder\n\n```php\npublic function search(string $query, int $page = 1, array $options = []): array\n```\nFührt die Suche durch und gibt Ergebnisse in folgendem Format zurück:\n```php\n[\n    'items' =\u003e [\n        [\n            'id' =\u003e string,            // Eindeutige ID\n            'preview_url' =\u003e string,   // Vorschaubild-URL\n            'title' =\u003e string,         // Asset-Titel\n            'author' =\u003e string,        // Ersteller/Autor\n            'type' =\u003e string,          // 'image' oder 'video'\n            'size' =\u003e [               // Verfügbare Größen\n                'tiny' =\u003e ['url' =\u003e string],\n                'small' =\u003e ['url' =\u003e string],\n                'medium' =\u003e ['url' =\u003e string],\n                'large' =\u003e ['url' =\u003e string],\n                'original' =\u003e ['url' =\u003e string]\n            ]\n        ]\n    ],\n    'total' =\u003e int,          // Gesamtanzahl der Ergebnisse\n    'page' =\u003e int,           // Aktuelle Seitennummer\n    'total_pages' =\u003e int     // Gesamtanzahl der Seiten\n]\n```\n\n```php\npublic function import(string $url, string $filename): bool\n```\nImportiert ein Asset in den REDAXO-Medienpool. Gibt bei Erfolg true zurück.\n\n#### Geschützte Methoden\n\n```php\nprotected function searchApi(string $query, int $page = 1, array $options = []): array\n```\nImplementierung der eigentlichen API-Suche. Muss von Provider-Klassen implementiert werden.\n\n```php\nprotected function getCacheLifetime(): int\n```\nGibt die Cache-Lebensdauer in Sekunden zurück. Standard: 86400 (24 Stunden)\n\n```php\nprotected function getDefaultOptions(): array\n```\nGibt Standard-Suchoptionen zurück. Standard: `['type' =\u003e 'all']`\n\n### AssetImporter\n\nStatische Klasse zur Verwaltung von Providern.\n\n```php\npublic static function registerProvider(string $providerClass): void\n```\nRegistriert eine neue Provider-Klasse.\n\n```php\npublic static function getProviders(): array\n```\nGibt alle registrierten Provider-Klassen zurück.\n\n```php\npublic static function getProvider(string $name): ?AbstractProvider\n```\nGibt Provider-Instanz anhand des Namens zurück oder null, wenn nicht gefunden.\n\n### Cache\n\nDas AddOn verwendet das eingebaute Caching-System von REDAXO, um API-Antworten zu speichern. Cache-Einträge werden in der Tabelle `rex_asset_import_cache` gespeichert mit:\n\n- `provider`: Provider-Bezeichner\n- `cache_key`: MD5-Hash der Abfrageparameter\n- `response`: JSON-kodierte API-Antwort\n- `created`: Erstellungszeitpunkt\n- `valid_until`: Ablaufzeitpunkt\n\nDie Standard-Cache-Lebensdauer beträgt 24 Stunden und kann pro Provider durch Überschreiben von `getCacheLifetime()` angepasst werden.\n\n### Lizenz\n\nMIT\n\n\n## Lizenz\n\nMIT Lizenz, siehe [LICENSE](LICENSE)\n\n## Autoren\n\n**Friends Of REDAXO**\n\n* http://www.redaxo.org\n* https://github.com/FriendsOfREDAXO\n\n\n**Project Lead**\n\n[Thomas Skerbis](https://github.com/skerbis)  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffriendsofredaxo%2Fasset_import","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffriendsofredaxo%2Fasset_import","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffriendsofredaxo%2Fasset_import/lists"}