This commit is contained in:
2026-09-24 11:47:48 +02:00
parent a39780b3fb
commit 60975c88ab
7 changed files with 145 additions and 48 deletions
+11 -4
View File
@@ -238,7 +238,10 @@ async function listFolder(relPath) {
return items;
}
async function searchMedia(offset) {
// order: 'taken' = Aufnahmedatum aus den Metadaten (Nextcloud 28+),
// 'mtime' = Änderungs-/Upload-Datum der Datei
async function searchMedia(offset, order = 'taken') {
const orderProp = order === 'taken' ? '<nc:metadata-photos-original_date_time/>' : '<d:getlastmodified/>';
const body = `<?xml version="1.0" encoding="UTF-8"?>
<d:searchrequest ${NS} xmlns:ns="https://github.com/icewind1991/SearchDAV/ns">
<d:basicsearch>
@@ -250,7 +253,7 @@ async function searchMedia(offset) {
<d:like><d:prop><d:getcontenttype/></d:prop><d:literal>video/%</d:literal></d:like>
</d:or>
</d:where>
<d:orderby><d:order><d:prop><d:getlastmodified/></d:prop><d:descending/></d:order></d:orderby>
<d:orderby><d:order><d:prop>${orderProp}</d:prop><d:descending/></d:order></d:orderby>
<d:limit><d:nresults>${PAGE_SIZE}</d:nresults><ns:firstresult>${Number(offset) || 0}</ns:firstresult></d:limit>
</d:basicsearch>
</d:searchrequest>`;
@@ -259,7 +262,11 @@ async function searchMedia(offset) {
headers: { 'Content-Type': 'text/xml; charset=utf-8' },
body,
});
if (res.status !== 207) throw new Error(`Die Suche nach Fotos ist fehlgeschlagen (Status ${res.status}).`);
if (res.status !== 207) {
// Ältere Server kennen das Aufnahmedatum nicht und lehnen die Sortierung ab
if (order === 'taken') return { unsupported: true, items: [], done: false };
throw new Error(`Die Suche nach Fotos ist fehlgeschlagen (Status ${res.status}).`);
}
const items = parseMultistatus(await res.text()).map(toItem).filter((i) => !i.isDir);
return { items, done: items.length < PAGE_SIZE };
}
@@ -396,7 +403,7 @@ handle('logout', () => {
});
handle('folder', (p) => listFolder(p));
handle('timeline', (offset) => searchMedia(offset));
handle('timeline', (offset, order) => searchMedia(offset, order));
handle('albums', () => listAlbums());
handle('album', (href) => listAlbum(href));