2024-10-28 04:56:11 -04:00
|
|
|
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
const tslib_1 = require("tslib");
|
2024-10-29 05:31:40 -04:00
|
|
|
const types_1 = require("./types");
|
2024-10-29 14:22:18 -04:00
|
|
|
const dayjs_1 = tslib_1.__importDefault(require("dayjs"));
|
2024-10-30 09:43:26 -04:00
|
|
|
const index_1 = require("./index");
|
2024-10-28 04:56:11 -04:00
|
|
|
class Immich {
|
2024-10-29 10:07:54 -04:00
|
|
|
/**
|
|
|
|
* Make a request to Immich API. We're not using the SDK to limit
|
|
|
|
* the possible attack surface of this app.
|
|
|
|
*/
|
2024-10-29 05:31:40 -04:00
|
|
|
request(endpoint) {
|
|
|
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
2024-10-28 04:56:11 -04:00
|
|
|
const res = yield fetch(process.env.IMMICH_URL + '/api' + endpoint, {
|
|
|
|
headers: {
|
|
|
|
'x-api-key': process.env.API_KEY || ''
|
|
|
|
}
|
|
|
|
});
|
2024-10-29 05:31:40 -04:00
|
|
|
if (res.status === 200) {
|
|
|
|
const contentType = res.headers.get('Content-Type') || '';
|
|
|
|
if (contentType.includes('application/json')) {
|
|
|
|
return res.json();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return res;
|
|
|
|
}
|
2024-10-28 04:56:11 -04:00
|
|
|
}
|
2024-10-30 12:59:14 -04:00
|
|
|
else {
|
|
|
|
(0, index_1.log)('Immich API status ' + res.status);
|
|
|
|
console.log(yield res.text());
|
|
|
|
}
|
2024-10-28 04:56:11 -04:00
|
|
|
});
|
|
|
|
}
|
2024-10-29 10:07:54 -04:00
|
|
|
/**
|
|
|
|
* Query Immich for the SharedLink metadata for a given key.
|
|
|
|
* The key is what is returned in the URL when you create a share in Immich.
|
2024-10-30 09:28:29 -04:00
|
|
|
*
|
2024-10-29 10:07:54 -04:00
|
|
|
* Immich doesn't have a method to query by key, so this method gets all
|
|
|
|
* known shared links, and returns the link which matches the provided key.
|
|
|
|
*/
|
2024-10-28 04:56:11 -04:00
|
|
|
getShareByKey(key) {
|
|
|
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
2024-10-30 14:53:09 -04:00
|
|
|
var _a;
|
2024-10-29 05:31:40 -04:00
|
|
|
const res = ((yield this.request('/shared-links')) || []);
|
2024-10-29 14:22:18 -04:00
|
|
|
const link = res.find(x => x.key === key);
|
|
|
|
if (link) {
|
|
|
|
if (link.expiresAt && (0, dayjs_1.default)(link.expiresAt) < (0, dayjs_1.default)()) {
|
|
|
|
// This link has expired
|
2024-10-30 09:43:26 -04:00
|
|
|
(0, index_1.log)('Expired link ' + key);
|
2024-10-29 14:22:18 -04:00
|
|
|
}
|
|
|
|
else {
|
2024-10-30 14:53:09 -04:00
|
|
|
if (link.type === 'ALBUM') {
|
|
|
|
// Fetch the assets from the album and populate the SharedLink assets array
|
|
|
|
const albumId = (_a = link.album) === null || _a === void 0 ? void 0 : _a.id;
|
|
|
|
if (albumId) {
|
|
|
|
const album = (yield this.request('/albums/' + encodeURIComponent(albumId)));
|
|
|
|
link.assets = album.assets || [];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Filter assets to exclude trashed assets
|
|
|
|
link.assets = link.assets.filter(x => !x.isTrashed);
|
2024-10-29 14:22:18 -04:00
|
|
|
return link;
|
|
|
|
}
|
|
|
|
}
|
2024-10-29 05:31:40 -04:00
|
|
|
});
|
|
|
|
}
|
2024-10-29 10:07:54 -04:00
|
|
|
/**
|
|
|
|
* Stream asset buffer data from Immich.
|
2024-10-30 09:28:29 -04:00
|
|
|
*
|
2024-10-29 10:07:54 -04:00
|
|
|
* For photos, you can request 'thumbnail' or 'original' size.
|
|
|
|
* For videos, it is Immich's streaming quality, not the original quality.
|
|
|
|
*/
|
2024-10-29 05:31:40 -04:00
|
|
|
getAssetBuffer(asset, size) {
|
|
|
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
|
|
switch (asset.type) {
|
|
|
|
case types_1.AssetType.image:
|
|
|
|
size = size === types_1.ImageSize.thumbnail ? types_1.ImageSize.thumbnail : types_1.ImageSize.original;
|
2024-10-29 15:44:46 -04:00
|
|
|
return this.request('/assets/' + encodeURIComponent(asset.id) + '/' + size);
|
2024-10-29 05:31:40 -04:00
|
|
|
case types_1.AssetType.video:
|
2024-10-29 15:44:46 -04:00
|
|
|
return this.request('/assets/' + encodeURIComponent(asset.id) + '/video/playback');
|
2024-10-29 05:31:40 -04:00
|
|
|
}
|
2024-10-28 04:56:11 -04:00
|
|
|
});
|
|
|
|
}
|
2024-10-29 10:07:54 -04:00
|
|
|
/**
|
|
|
|
* Get the content-type of an Immich asset
|
|
|
|
*/
|
2024-10-29 05:31:40 -04:00
|
|
|
getContentType(asset) {
|
|
|
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
|
|
const assetBuffer = yield this.getAssetBuffer(asset);
|
|
|
|
return assetBuffer.headers.get('Content-Type');
|
2024-10-28 04:56:11 -04:00
|
|
|
});
|
|
|
|
}
|
2024-10-29 10:07:54 -04:00
|
|
|
/**
|
|
|
|
* Return the image data URL for a photo
|
|
|
|
*/
|
|
|
|
photoUrl(key, id, size) {
|
2024-10-29 14:57:44 -04:00
|
|
|
return `/photo/${key}/${id}` + (size ? `?size=${size}` : '');
|
2024-10-29 05:31:40 -04:00
|
|
|
}
|
2024-10-29 10:07:54 -04:00
|
|
|
/**
|
|
|
|
* Return the video data URL for a video
|
|
|
|
*/
|
|
|
|
videoUrl(key, id) {
|
2024-10-29 14:57:44 -04:00
|
|
|
return `/video/${key}/${id}`;
|
2024-10-29 05:31:40 -04:00
|
|
|
}
|
2024-10-29 10:07:54 -04:00
|
|
|
/**
|
|
|
|
* Check if a provided ID matches the Immich ID format
|
|
|
|
*/
|
2024-10-29 05:31:40 -04:00
|
|
|
isId(id) {
|
|
|
|
return !!id.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
|
|
|
|
}
|
2024-10-29 10:07:54 -04:00
|
|
|
/**
|
|
|
|
* Check if a provided key matches the Immich shared-link key format
|
|
|
|
*/
|
|
|
|
isKey(key) {
|
|
|
|
return !!key.match(/^[\w-]+$/);
|
|
|
|
}
|
2024-10-28 04:56:11 -04:00
|
|
|
}
|
2024-10-29 05:31:40 -04:00
|
|
|
const immich = new Immich();
|
|
|
|
exports.default = immich;
|
2024-10-30 14:53:09 -04:00
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1taWNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ltbWljaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBd0U7QUFDeEUsMERBQXlCO0FBQ3pCLG1DQUE2QjtBQUU3QixNQUFNLE1BQU07SUFDVjs7O09BR0c7SUFDRyxPQUFPLENBQUUsUUFBZ0I7O1lBQzdCLE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLE1BQU0sR0FBRyxRQUFRLEVBQUU7Z0JBQ2xFLE9BQU8sRUFBRTtvQkFDUCxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRTtpQkFDdkM7YUFDRixDQUFDLENBQUE7WUFDRixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtnQkFDekQsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztvQkFDN0MsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUE7Z0JBQ25CLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLEdBQUcsQ0FBQTtnQkFDWixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUEsV0FBRyxFQUFDLG9CQUFvQixHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1lBQy9CLENBQUM7UUFDSCxDQUFDO0tBQUE7SUFFRDs7Ozs7O09BTUc7SUFDRyxhQUFhLENBQUUsR0FBVzs7O1lBQzlCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUksRUFBRSxDQUFpQixDQUFBO1lBQ3ZFLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFBO1lBQ3pDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUEsZUFBSyxFQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFBLGVBQUssR0FBRSxFQUFFLENBQUM7b0JBQ3RELHdCQUF3QjtvQkFDeEIsSUFBQSxXQUFHLEVBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQyxDQUFBO2dCQUM1QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO3dCQUMxQiwyRUFBMkU7d0JBQzNFLE1BQU0sT0FBTyxHQUFHLE1BQUEsSUFBSSxDQUFDLEtBQUssMENBQUUsRUFBRSxDQUFBO3dCQUM5QixJQUFJLE9BQU8sRUFBRSxDQUFDOzRCQUNaLE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFVLENBQUE7NEJBQ3JGLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUE7d0JBQ2xDLENBQUM7b0JBQ0gsQ0FBQztvQkFDRCwwQ0FBMEM7b0JBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtvQkFDbkQsT0FBTyxJQUFJLENBQUE7Z0JBQ2IsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0tBQUE7SUFFRDs7Ozs7T0FLRztJQUNHLGNBQWMsQ0FBRSxLQUFZLEVBQUUsSUFBZ0I7O1lBQ2xELFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQixLQUFLLGlCQUFTLENBQUMsS0FBSztvQkFDbEIsSUFBSSxHQUFHLElBQUksS0FBSyxpQkFBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGlCQUFTLENBQUMsUUFBUSxDQUFBO29CQUM5RSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUE7Z0JBQzdFLEtBQUssaUJBQVMsQ0FBQyxLQUFLO29CQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFBO1lBQ3RGLENBQUM7UUFDSCxDQUFDO0tBQUE7SUFFRDs7T0FFRztJQUNHLGNBQWMsQ0FBRSxLQUFZOztZQUNoQyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDcEQsT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNoRCxDQUFDO0tBQUE7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBRSxHQUFXLEVBQUUsRUFBVSxFQUFFLElBQWdCO1FBQ2pELE9BQU8sVUFBVSxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBRSxHQUFXLEVBQUUsRUFBVTtRQUMvQixPQUFPLFVBQVUsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFBO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksQ0FBRSxFQUFVO1FBQ2QsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFBO0lBQ3JGLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBRSxHQUFXO1FBQ2hCLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDaEMsQ0FBQztDQUNGO0FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQTtBQUUzQixrQkFBZSxNQUFNLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbGJ1bSwgQXNzZXQsIEFzc2V0VHlwZSwgSW1hZ2VTaXplLCBTaGFyZWRMaW5rIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcydcbmltcG9ydCB7IGxvZ
|