diff options
| author | 2024-10-23 21:55:52 +0200 | |
|---|---|---|
| committer | 2024-10-23 21:55:52 +0200 | |
| commit | 7a5ce0fe20d63746b7f5b435ba5eef0a9b7db2d6 (patch) | |
| tree | 090cff8c9852ecc4636feaa1c5a75304c23fad27 /app | |
| parent | 60dd22d3b3916f5113954fc1472b1658c3c4245f (diff) | |
Web export SQLite (#6931)
* Web export SQLite
https://github.com/FreshRSS/FreshRSS/discussions/6930
* Implement download
* Fix operator precedence
* Set Last-Modified
* Sort by time, newest first
* Fix Last-Modified
* Use DateTimeInterface::RFC7231
* Add not_applicable message
Diffstat (limited to 'app')
52 files changed, 204 insertions, 29 deletions
diff --git a/app/Controllers/importExportController.php b/app/Controllers/importExportController.php index 50c2037fe..53617ced7 100644 --- a/app/Controllers/importExportController.php +++ b/app/Controllers/importExportController.php @@ -31,6 +31,7 @@ class FreshRSS_importExport_Controller extends FreshRSS_ActionController { public function indexAction(): void { $this->view->feeds = $this->feedDAO->listFeeds(); FreshRSS_View::prependTitle(_t('sub.import_export.title') . ' · '); + $this->listSqliteArchives(); } private static function megabytes(string $size_str): float|int|string { @@ -694,4 +695,41 @@ class FreshRSS_importExport_Controller extends FreshRSS_ActionController { return 'application/octet-stream'; } } + + private const REGEX_SQLITE_FILENAME = '/^(?![.-])[0-9a-zA-Z_.@ #&()~\-]{1,128}\.sqlite$/'; + + private function listSqliteArchives(): void { + $this->view->sqliteArchives = []; + $files = glob(USERS_PATH . '/' . Minz_User::name() . '/*.sqlite', GLOB_NOSORT) ?: []; + foreach ($files as $file) { + $archive = [ + 'name' => basename($file), + 'size' => @filesize($file), + 'mtime' => @filemtime($file), + ]; + if ($archive['size'] != false && $archive['mtime'] != false && preg_match(self::REGEX_SQLITE_FILENAME, $archive['name'])) { + $this->view->sqliteArchives[] = $archive; + } + } + // Sort by time, newest first: + usort($this->view->sqliteArchives, static fn(array $a, array $b): int => $b['mtime'] <=> $a['mtime']); + } + + public function sqliteAction(): void { + if (!Minz_Request::isPost()) { + Minz_Request::forward(['c' => 'importExport', 'a' => 'index'], true); + } + $sqlite = Minz_Request::paramString('sqlite'); + if (!preg_match(self::REGEX_SQLITE_FILENAME, $sqlite)) { + Minz_Error::error(404); + return; + } + $path = USERS_PATH . '/' . Minz_User::name() . '/' . $sqlite; + if (!file_exists($path) || @filesize($path) == false || @filemtime($path) == false) { + Minz_Error::error(404); + return; + } + $this->view->sqlitePath = $path; + $this->view->_layout(null); + } } diff --git a/app/Models/View.php b/app/Models/View.php index 244379505..3c3b3a2e0 100644 --- a/app/Models/View.php +++ b/app/Models/View.php @@ -82,6 +82,9 @@ class FreshRSS_View extends Minz_View { public string $list_title; public int $queryId; public string $type; + /** @var null|array<array{name:string,size:int,mtime:int}> */ + public ?array $sqliteArchives = null; + public string $sqlitePath; // Form login public int $cookie_days; diff --git a/app/i18n/cs/gen.php b/app/i18n/cs/gen.php index aab07bd1b..0276ce6c9 100644 --- a/app/i18n/cs/gen.php +++ b/app/i18n/cs/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Odstranění ztlumených zdrojů', 'demote' => 'Snížit úroveň', 'disable' => 'Zakázat', + 'download' => 'Download', // TODO 'empty' => 'Vyprázdnit', 'enable' => 'Povolit', 'export' => 'Exportovat', diff --git a/app/i18n/cs/sub.php b/app/i18n/cs/sub.php index 6546a38af..3dd9af87a 100644 --- a/app/i18n/cs/sub.php +++ b/app/i18n/cs/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Okamžité oznámení s WebSub', ), 'import_export' => array( - 'export' => 'Exportovat', + 'export' => array( + '_' => 'Exportovat', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Exportovat články s vašimi popisky', 'export_opml' => 'Exportovat seznam kanálů (OPML)', 'export_starred' => 'Exportovat vaše oblíbené', diff --git a/app/i18n/de/gen.php b/app/i18n/de/gen.php index 548c60a20..e20d9dda3 100644 --- a/app/i18n/de/gen.php +++ b/app/i18n/de/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Lösche stumm gestellte Feeds', 'demote' => 'Zurückstufen', 'disable' => 'Deaktivieren', + 'download' => 'Download', // TODO 'empty' => 'Leeren', 'enable' => 'Aktivieren', 'export' => 'Exportieren', diff --git a/app/i18n/de/sub.php b/app/i18n/de/sub.php index 30f77b398..507113210 100644 --- a/app/i18n/de/sub.php +++ b/app/i18n/de/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Sofortbenachrichtigung mit WebSub', ), 'import_export' => array( - 'export' => 'Exportieren', + 'export' => array( + '_' => 'Exportieren', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Artikel mit Labeln exportieren', 'export_opml' => 'Liste der Feeds exportieren (OPML)', 'export_starred' => 'Ihre Favoriten exportieren', diff --git a/app/i18n/el/gen.php b/app/i18n/el/gen.php index 973856c12..41005b41b 100644 --- a/app/i18n/el/gen.php +++ b/app/i18n/el/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Delete muted feeds', // TODO 'demote' => 'Demote', // TODO 'disable' => 'Disable', // TODO + 'download' => 'Download', // TODO 'empty' => 'Empty', // TODO 'enable' => 'Enable', // TODO 'export' => 'Export', // TODO diff --git a/app/i18n/el/sub.php b/app/i18n/el/sub.php index 02821ea6d..89da23a88 100644 --- a/app/i18n/el/sub.php +++ b/app/i18n/el/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Instant notifications with WebSub', // TODO ), 'import_export' => array( - 'export' => 'Export', // TODO + 'export' => array( + '_' => 'Export', // TODO + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Export your labelled articles', // TODO 'export_opml' => 'Export list of feeds (OPML)', // TODO 'export_starred' => 'Export your favourites', // TODO diff --git a/app/i18n/en-us/gen.php b/app/i18n/en-us/gen.php index 3b8e0cfd9..0f733f7eb 100644 --- a/app/i18n/en-us/gen.php +++ b/app/i18n/en-us/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Delete muted feeds', // IGNORE 'demote' => 'Demote', // IGNORE 'disable' => 'Disable', // IGNORE + 'download' => 'Download', // IGNORE 'empty' => 'Empty', // IGNORE 'enable' => 'Enable', // IGNORE 'export' => 'Export', // IGNORE diff --git a/app/i18n/en-us/sub.php b/app/i18n/en-us/sub.php index ef7931681..4a579a6cc 100644 --- a/app/i18n/en-us/sub.php +++ b/app/i18n/en-us/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Instant notifications with WebSub', // IGNORE ), 'import_export' => array( - 'export' => 'Export', // IGNORE + 'export' => array( + '_' => 'Export', // IGNORE + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Export your labeled articles', 'export_opml' => 'Export list of feeds (OPML)', // IGNORE 'export_starred' => 'Export your favorites', diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php index e8d276349..bcf4baff6 100644 --- a/app/i18n/en/gen.php +++ b/app/i18n/en/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Delete muted feeds', 'demote' => 'Demote', 'disable' => 'Disable', + 'download' => 'Download', 'empty' => 'Empty', 'enable' => 'Enable', 'export' => 'Export', @@ -33,9 +34,9 @@ return array( 'open' => 'Open menu', ), 'nav_buttons' => array( - 'next' => 'Next article', // TODO - 'prev' => 'Previous article', // TODO - 'up' => 'Go up', // TODO + 'next' => 'Next article', + 'prev' => 'Previous article', + 'up' => 'Go up', ), 'open_url' => 'Open URL', 'promote' => 'Promote', @@ -183,7 +184,7 @@ return array( 'display' => 'Display', 'extensions' => 'Extensions', 'logs' => 'Logs', - 'privacy' => 'Privacy', // TODO + 'privacy' => 'Privacy', 'queries' => 'User queries', 'reading' => 'Reading', 'search' => 'Search words or #tags', diff --git a/app/i18n/en/sub.php b/app/i18n/en/sub.php index 0a6385428..3b41318e5 100644 --- a/app/i18n/en/sub.php +++ b/app/i18n/en/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Instant notifications with WebSub', ), 'import_export' => array( - 'export' => 'Export', + 'export' => array( + '_' => 'Export', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Export your labelled articles', 'export_opml' => 'Export list of feeds (OPML)', 'export_starred' => 'Export your favourites', diff --git a/app/i18n/es/gen.php b/app/i18n/es/gen.php index e05a23235..89aff901c 100644 --- a/app/i18n/es/gen.php +++ b/app/i18n/es/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Eliminar fuentes silenciadas', 'demote' => 'Degradar', 'disable' => 'Desactivar', + 'download' => 'Download', // TODO 'empty' => 'Vaciar', 'enable' => 'Activar', 'export' => 'Exportar', diff --git a/app/i18n/es/sub.php b/app/i18n/es/sub.php index 8012fdc16..01780788f 100644 --- a/app/i18n/es/sub.php +++ b/app/i18n/es/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Notificación inmediata con WebSub', ), 'import_export' => array( - 'export' => 'Exportar', + 'export' => array( + '_' => 'Exportar', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Exporta tus artículos etiquetados', 'export_opml' => 'Exportar la lista de fuentes (OPML)', 'export_starred' => 'Exportar tus favoritos', diff --git a/app/i18n/fa/gen.php b/app/i18n/fa/gen.php index 460934d87..64d3b0316 100644 --- a/app/i18n/fa/gen.php +++ b/app/i18n/fa/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => ' فیدهای خاموش را حذف کنید', 'demote' => ' تنزل دادن', 'disable' => ' غیر فعال کردن', + 'download' => 'Download', // TODO 'empty' => ' خالی', 'enable' => ' فعال کنید', 'export' => ' صادرات', diff --git a/app/i18n/fa/sub.php b/app/i18n/fa/sub.php index 93ff0f205..abd885a04 100644 --- a/app/i18n/fa/sub.php +++ b/app/i18n/fa/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => ' اطلاع رسانی فوری با WebSub', ), 'import_export' => array( - 'export' => ' صادرات', + 'export' => array( + '_' => ' صادرات', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => ' مقالات برچسب دار خود را صادر کنید', 'export_opml' => ' لیست صادرات فیدها (OPML)', 'export_starred' => ' موارد دلخواه خود را صادر کنید', diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php index f62c73a5e..3f226f474 100644 --- a/app/i18n/fr/gen.php +++ b/app/i18n/fr/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Supprimer les flux désactivés', 'demote' => 'Rétrograder', 'disable' => 'Désactiver', + 'download' => 'Télécharger', 'empty' => 'Vider', 'enable' => 'Activer', 'export' => 'Exporter', diff --git a/app/i18n/fr/sub.php b/app/i18n/fr/sub.php index 24678f377..5ddaea0c2 100644 --- a/app/i18n/fr/sub.php +++ b/app/i18n/fr/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Notifications instantanée par WebSub', ), 'import_export' => array( - 'export' => 'Exporter', + 'export' => array( + '_' => 'Exporter', + 'sqlite' => 'Télécharger la base de donnée de l’utilisateur au format SQLite', + ), 'export_labelled' => 'Exporter les articles étiquetés', 'export_opml' => 'Exporter la liste des flux (OPML)', 'export_starred' => 'Exporter les favoris', diff --git a/app/i18n/he/gen.php b/app/i18n/he/gen.php index 853e614f0..f2a8ce1af 100644 --- a/app/i18n/he/gen.php +++ b/app/i18n/he/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Delete muted feeds', // TODO 'demote' => 'Demote', // TODO 'disable' => 'Disable', // TODO + 'download' => 'Download', // TODO 'empty' => 'Empty', // TODO 'enable' => 'Enable', // TODO 'export' => 'ייצוא', diff --git a/app/i18n/he/sub.php b/app/i18n/he/sub.php index eb4df468c..44dc74dbe 100644 --- a/app/i18n/he/sub.php +++ b/app/i18n/he/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Instant notifications with WebSub', // TODO ), 'import_export' => array( - 'export' => 'ייצוא', + 'export' => array( + '_' => 'ייצוא', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Export your labelled articles', // TODO 'export_opml' => 'ייצוא רשימת הזנות (OPML)', 'export_starred' => 'ייצוא מועדפים', diff --git a/app/i18n/hu/gen.php b/app/i18n/hu/gen.php index 95e56c480..a9c2ea4b7 100644 --- a/app/i18n/hu/gen.php +++ b/app/i18n/hu/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Némított hírforrások törlése', 'demote' => 'Lefokoz', 'disable' => 'Kikapcsol', + 'download' => 'Download', // TODO 'empty' => 'Üres', 'enable' => 'Bekapcsol', 'export' => 'Export', // IGNORE diff --git a/app/i18n/hu/sub.php b/app/i18n/hu/sub.php index 397907f0f..76290f5c3 100644 --- a/app/i18n/hu/sub.php +++ b/app/i18n/hu/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Azonnali értesítés WebSub-al', ), 'import_export' => array( - 'export' => 'Exportálás', + 'export' => array( + '_' => 'Exportálás', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Címkézett cikkek exportálása', 'export_opml' => 'Hírforrások listájának exportálása (OPML)', 'export_starred' => 'Kedvencek exportálása', diff --git a/app/i18n/id/gen.php b/app/i18n/id/gen.php index c012a445f..5ae564c66 100644 --- a/app/i18n/id/gen.php +++ b/app/i18n/id/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Delete muted feeds', // TODO 'demote' => 'Demote', // TODO 'disable' => 'Disable', // TODO + 'download' => 'Download', // TODO 'empty' => 'Empty', // TODO 'enable' => 'Enable', // TODO 'export' => 'Export', // TODO diff --git a/app/i18n/id/sub.php b/app/i18n/id/sub.php index f192dacec..de1b171c7 100644 --- a/app/i18n/id/sub.php +++ b/app/i18n/id/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Instant notifications with WebSub', // TODO ), 'import_export' => array( - 'export' => 'Export', // TODO + 'export' => array( + '_' => 'Export', // TODO + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Export your labeled articles', 'export_opml' => 'Export list of feeds (OPML)', // TODO 'export_starred' => 'Export your favorites', diff --git a/app/i18n/it/gen.php b/app/i18n/it/gen.php index fa04ecae0..8c49942c9 100644 --- a/app/i18n/it/gen.php +++ b/app/i18n/it/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Cancella i feed mutati', 'demote' => 'Retrocedi', 'disable' => 'Disabilita', + 'download' => 'Download', // TODO 'empty' => 'Vuoto', 'enable' => 'Abilita', 'export' => 'Esporta', diff --git a/app/i18n/it/sub.php b/app/i18n/it/sub.php index 35b8fab60..0803e11bb 100644 --- a/app/i18n/it/sub.php +++ b/app/i18n/it/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Notifica istantanea con WebSub', ), 'import_export' => array( - 'export' => 'Esporta', + 'export' => array( + '_' => 'Esporta', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Esporta gli articoli etichettati', 'export_opml' => 'Esporta tutta la lista dei feed (OPML)', 'export_starred' => 'Esporta i tuoi preferiti', diff --git a/app/i18n/ja/gen.php b/app/i18n/ja/gen.php index 9bcce07ba..f69efc69d 100644 --- a/app/i18n/ja/gen.php +++ b/app/i18n/ja/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'ミュートにしているフィードを削除する', 'demote' => '寄付', 'disable' => '無効', + 'download' => 'Download', // TODO 'empty' => '空', 'enable' => '有効', 'export' => 'エクスポート', diff --git a/app/i18n/ja/sub.php b/app/i18n/ja/sub.php index a1a02d2a9..c6038a79f 100644 --- a/app/i18n/ja/sub.php +++ b/app/i18n/ja/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'WebSubとの即時通知', ), 'import_export' => array( - 'export' => 'エクスポート', + 'export' => array( + '_' => 'エクスポート', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'ラベル付けされた記事をエクスポートする', 'export_opml' => 'フィードリストをエクスポートする (OPML)', 'export_starred' => 'お気に入りをエクスポートする', diff --git a/app/i18n/ko/gen.php b/app/i18n/ko/gen.php index ffd3f8db1..709ee0e93 100644 --- a/app/i18n/ko/gen.php +++ b/app/i18n/ko/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => '음소거된 피드 삭제', 'demote' => '목록 수준 내리기', 'disable' => '비활성화', + 'download' => 'Download', // TODO 'empty' => '비우기', 'enable' => '활성화', 'export' => '내보내기', diff --git a/app/i18n/ko/sub.php b/app/i18n/ko/sub.php index 917d71b68..6438143d5 100644 --- a/app/i18n/ko/sub.php +++ b/app/i18n/ko/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'WebSub을 사용한 즉시 알림', ), 'import_export' => array( - 'export' => '내보내기', + 'export' => array( + '_' => '내보내기', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => '라벨이 표시된 글들 내보내기', 'export_opml' => '피드 목록 내보내기 (OPML)', 'export_starred' => '즐겨찾기 내보내기', diff --git a/app/i18n/lv/gen.php b/app/i18n/lv/gen.php index c4f78962d..bd4ed1fee 100644 --- a/app/i18n/lv/gen.php +++ b/app/i18n/lv/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Izdzēst izslēgtās barotnes', 'demote' => 'Pazemināt amatu', 'disable' => 'Izslēgt', + 'download' => 'Download', // TODO 'empty' => 'Iztukšot', 'enable' => 'Ieslēgt', 'export' => 'Eksportēt', diff --git a/app/i18n/lv/sub.php b/app/i18n/lv/sub.php index ea67d3005..6e0621e12 100644 --- a/app/i18n/lv/sub.php +++ b/app/i18n/lv/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Tūlītēji paziņojumi ar WebSub', ), 'import_export' => array( - 'export' => 'Eksportēt', + 'export' => array( + '_' => 'Eksportēt', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Eksportēt ar birku marķētus rakstus', 'export_opml' => 'Eksportēt barotņu sarakstu (OPML)', 'export_starred' => 'Eksportēt mīļākos', diff --git a/app/i18n/nl/gen.php b/app/i18n/nl/gen.php index df106c866..b092b79ea 100644 --- a/app/i18n/nl/gen.php +++ b/app/i18n/nl/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Gedempte feeds verwijderen', 'demote' => 'Degraderen', 'disable' => 'Uitzetten', + 'download' => 'Download', // TODO 'empty' => 'Leeg', 'enable' => 'Aanzetten', 'export' => 'Exporteren', diff --git a/app/i18n/nl/sub.php b/app/i18n/nl/sub.php index ae0b47391..6d1b55b08 100644 --- a/app/i18n/nl/sub.php +++ b/app/i18n/nl/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Directe notificaties met WebSub', ), 'import_export' => array( - 'export' => 'Exporteer', + 'export' => array( + '_' => 'Exporteer', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Exporteer gelabelde artikels', 'export_opml' => 'Exporteer lijst van feeds (OPML)', 'export_starred' => 'Exporteer je favorieten', diff --git a/app/i18n/oc/gen.php b/app/i18n/oc/gen.php index 29468c587..f5b6901ab 100644 --- a/app/i18n/oc/gen.php +++ b/app/i18n/oc/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Suprimir los flux muts', 'demote' => 'Retrogradar', 'disable' => 'Desactivar', + 'download' => 'Download', // TODO 'empty' => 'Voidar', 'enable' => 'Activar', 'export' => 'Exportar', diff --git a/app/i18n/oc/sub.php b/app/i18n/oc/sub.php index c0f0ae245..421fca5fa 100644 --- a/app/i18n/oc/sub.php +++ b/app/i18n/oc/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Notificacions instantanèas amb WebSub', ), 'import_export' => array( - 'export' => 'Exportar', + 'export' => array( + '_' => 'Exportar', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Exportar los articles etiquetats', 'export_opml' => 'Exportar la lista de fluxes (OPML)', 'export_starred' => 'Exportar los favorits', diff --git a/app/i18n/pl/gen.php b/app/i18n/pl/gen.php index bdd0d172f..8762a04ae 100644 --- a/app/i18n/pl/gen.php +++ b/app/i18n/pl/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Usuń wyciszone kanały', 'demote' => 'Zdegraduj', 'disable' => 'Wyłącz', + 'download' => 'Download', // TODO 'empty' => 'Opróżnij', 'enable' => 'Włącz', 'export' => 'Eksportuj', diff --git a/app/i18n/pl/sub.php b/app/i18n/pl/sub.php index 30cd09a50..ca20c4d4b 100644 --- a/app/i18n/pl/sub.php +++ b/app/i18n/pl/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Natychmiastowe powiadomienia protokołu WebSub', ), 'import_export' => array( - 'export' => 'Eksport', + 'export' => array( + '_' => 'Eksport', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Eksportuj wiadomości z etykietami', 'export_opml' => 'Eksportuj listę kanałów (format OPML)', 'export_starred' => 'Eksportuj ulubione wiadomości', diff --git a/app/i18n/pt-br/gen.php b/app/i18n/pt-br/gen.php index d2abe1351..74f1d0422 100644 --- a/app/i18n/pt-br/gen.php +++ b/app/i18n/pt-br/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Excluir feeds silenciados', 'demote' => 'Despromover', 'disable' => 'Desabilitar', + 'download' => 'Download', // TODO 'empty' => 'Vazio', 'enable' => 'Habilitar', 'export' => 'Exportar', diff --git a/app/i18n/pt-br/sub.php b/app/i18n/pt-br/sub.php index 4d6f074e7..ac68dae6e 100644 --- a/app/i18n/pt-br/sub.php +++ b/app/i18n/pt-br/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Notificação instantânea com WebSub', ), 'import_export' => array( - 'export' => 'Exportar', + 'export' => array( + '_' => 'Exportar', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Exportar seus artigos etiquetados', 'export_opml' => 'Exporta a lista dos feeds (OPML)', 'export_starred' => 'Exportar seus favoritos', diff --git a/app/i18n/ru/gen.php b/app/i18n/ru/gen.php index f3ab54dbe..0240f4a49 100644 --- a/app/i18n/ru/gen.php +++ b/app/i18n/ru/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Удалить заглушенные ленты', 'demote' => 'Понизить', 'disable' => 'Отключить', + 'download' => 'Download', // TODO 'empty' => 'Опустошить', 'enable' => 'Включить', 'export' => 'Экспортировать', diff --git a/app/i18n/ru/sub.php b/app/i18n/ru/sub.php index 569e9202d..ec568a241 100644 --- a/app/i18n/ru/sub.php +++ b/app/i18n/ru/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Моментальные оповещения посредством WebSub', ), 'import_export' => array( - 'export' => 'Экспорт', + 'export' => array( + '_' => 'Экспорт', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Экспортировать ваши помеченные статьи', 'export_opml' => 'Экспортировать список лент (OPML)', 'export_starred' => 'Экспортировать ваше избранное', diff --git a/app/i18n/sk/gen.php b/app/i18n/sk/gen.php index a6f84ed3f..5e941978d 100644 --- a/app/i18n/sk/gen.php +++ b/app/i18n/sk/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Vymazať stíšené kanály', 'demote' => 'Degradovať', 'disable' => 'Zakázať', + 'download' => 'Download', // TODO 'empty' => 'Vyprázdniť', 'enable' => 'Povoliť', 'export' => 'Exportovať', diff --git a/app/i18n/sk/sub.php b/app/i18n/sk/sub.php index ef4060352..88900d14b 100644 --- a/app/i18n/sk/sub.php +++ b/app/i18n/sk/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'Okamžité oznámenia cez WebSub', ), 'import_export' => array( - 'export' => 'Exportovať', + 'export' => array( + '_' => 'Exportovať', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Exportovať vaše označené články', 'export_opml' => 'Exportovať zoznam kanálov (OPML)', 'export_starred' => 'Exportovať vaše obľúbené', diff --git a/app/i18n/tr/gen.php b/app/i18n/tr/gen.php index e430f6376..47a3bebb4 100644 --- a/app/i18n/tr/gen.php +++ b/app/i18n/tr/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => 'Sessize alınmış akışları sil', 'demote' => 'Yöneticilikten al', 'disable' => 'Pasif', + 'download' => 'Download', // TODO 'empty' => 'Boş', 'enable' => 'Aktif', 'export' => 'Dışa Aktar', diff --git a/app/i18n/tr/sub.php b/app/i18n/tr/sub.php index 293a33c1e..b5bc90f2d 100644 --- a/app/i18n/tr/sub.php +++ b/app/i18n/tr/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'WebSub ile anlık bildirim', ), 'import_export' => array( - 'export' => 'Dışa aktar', + 'export' => array( + '_' => 'Dışa aktar', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => 'Etiketli makaleleri dışarı aktar', 'export_opml' => 'Akış listesini dışarı aktar (OPML)', 'export_starred' => 'Favorileri dışarı aktar', diff --git a/app/i18n/zh-cn/gen.php b/app/i18n/zh-cn/gen.php index 7b9d5a27d..9a425f177 100644 --- a/app/i18n/zh-cn/gen.php +++ b/app/i18n/zh-cn/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => '删除已暂停的订阅源', 'demote' => '撤销管理员', 'disable' => '禁用', + 'download' => 'Download', // TODO 'empty' => '清空', 'enable' => '启用', 'export' => '导出', diff --git a/app/i18n/zh-cn/sub.php b/app/i18n/zh-cn/sub.php index 8731d2ec2..73373d04a 100644 --- a/app/i18n/zh-cn/sub.php +++ b/app/i18n/zh-cn/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'WebSub 即时通知', ), 'import_export' => array( - 'export' => '导出', + 'export' => array( + '_' => '导出', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => '导出有标签的文章', 'export_opml' => '导出订阅源列表(OPML)', 'export_starred' => '导出你的收藏', diff --git a/app/i18n/zh-tw/gen.php b/app/i18n/zh-tw/gen.php index b2b1fc67e..4843dce88 100644 --- a/app/i18n/zh-tw/gen.php +++ b/app/i18n/zh-tw/gen.php @@ -21,6 +21,7 @@ return array( 'delete_muted_feeds' => '刪除已暫停的訂閱源', 'demote' => '撤銷管理員', 'disable' => '禁用', + 'download' => 'Download', // TODO 'empty' => '清空', 'enable' => '啟用', 'export' => '導出', diff --git a/app/i18n/zh-tw/sub.php b/app/i18n/zh-tw/sub.php index 4934b5e66..26f0acfbd 100644 --- a/app/i18n/zh-tw/sub.php +++ b/app/i18n/zh-tw/sub.php @@ -246,7 +246,10 @@ return array( 'websub' => 'WebSub 即時通知', ), 'import_export' => array( - 'export' => '導出', + 'export' => array( + '_' => '導出', + 'sqlite' => 'Download user database as SQLite', // TODO + ), 'export_labelled' => '導出有標籤的文章', 'export_opml' => '導出訂閱源列表(OPML)', 'export_starred' => '導出你的收藏', diff --git a/app/views/importExport/index.phtml b/app/views/importExport/index.phtml index dfcdc8404..1f32acfcb 100644 --- a/app/views/importExport/index.phtml +++ b/app/views/importExport/index.phtml @@ -65,7 +65,7 @@ $select_args = ' size="' . min(10, count($this->feeds)) . '" multiple="multiple"'; } ?> - <select name="export_feeds[]"<?= $select_args ?> size="10"> + <select name="export_feeds[]"<?= $select_args ?>> <?= extension_loaded('zip') ? '' : '<option></option>' ?> <?php foreach ($this->feeds as $feed) { ?> <option value="<?= $feed->id() ?>"><?= $feed->name() ?></option> @@ -81,4 +81,33 @@ </div> </form> <?php } ?> + + <h2><?= _t('sub.import_export.export.sqlite') ?></h2> + <?php if (count($this->sqliteArchives ?? []) === 0): ?> + <p class="alert alert-warn"> + <?= _t('gen.short.not_applicable') ?> + </p> + <?php else: ?> + <form method="post" action="<?= _url('importExport', 'sqlite') ?>"> + <input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" /> + <div class="form-group"> + <div class="group-controls"> + <select name="sqlite"> + <?php foreach ($this->sqliteArchives ?? [] as $sqliteArchive): ?> + <option value="<?= htmlspecialchars($sqliteArchive['name'], ENT_COMPAT, 'UTF-8') ?>"> + <?= htmlspecialchars($sqliteArchive['name'], ENT_NOQUOTES, 'UTF-8') ?> + <small>(<?= format_bytes($sqliteArchive['size']) ?> · <?= date('c', $sqliteArchive['mtime']) ?>)</small> + </option> + <?php endforeach; ?> + </select> + </div> + </div> + + <div class="form-group form-actions"> + <div class="group-controls"> + <button type="submit" class="btn btn-important"><?= _t('gen.action.download') ?></button> + </div> + </div> + </form> + <?php endif; ?> </main> diff --git a/app/views/importExport/sqlite.phtml b/app/views/importExport/sqlite.phtml new file mode 100644 index 000000000..8c9adcab1 --- /dev/null +++ b/app/views/importExport/sqlite.phtml @@ -0,0 +1,9 @@ +<?php +declare(strict_types=1); +/** @var FreshRSS_View $this */ +header('Content-Type: application/vnd.sqlite3'); +header('Content-Disposition: attachment; filename="' . basename($this->sqlitePath) . '"'); +header('Cache-Control: private, no-store, max-age=0'); +header('Last-Modified: ' . gmdate(DateTimeInterface::RFC7231, @filemtime($this->sqlitePath) ?: 0)); +header('Content-Length: ' . (@filesize($this->sqlitePath) ?: 0)); +readfile($this->sqlitePath); |
