1
0
mirror of https://github.com/bpatrik/pigallery2.git synced 2024-12-27 02:09:16 +02:00
This commit is contained in:
Patrik J. Braun 2019-12-07 18:21:18 +01:00
commit ca1ce61adc
15 changed files with 2809 additions and 2 deletions

View File

@ -3,6 +3,8 @@ language: node_js
node_js:
- '10'
- '11'
- '12'
- '13'
env:
- MYSQL_HOST='localhost' MYSQL_PASSWORD='' MYSQL_USERNAME='root' MYSQL_DATABASE='pigallery2_test'
services:

View File

@ -57,6 +57,39 @@ export class DiskMangerWorker {
return path.basename(name);
}
public static excludeDir(name: string,relativeDirectoryName: string, absoluteDirectoryName: string) {
const absoluteName=path.normalize(path.join(absoluteDirectoryName,name));
const relativeName=path.normalize(path.join(relativeDirectoryName,name));
for (let j = 0; j < Config.Server.indexing.excludeFolderList.length; j++) {
const exclude=Config.Server.indexing.excludeFolderList[j];
if (exclude.startsWith('/')) {
if (exclude==absoluteName) {
return true;
}
} else if (exclude.includes('/')) {
if (path.normalize(exclude)==relativeName) {
return true;
}
} else {
if (exclude==name) {
return true;
}
}
}
for (let j = 0; j < Config.Server.indexing.excludeFileList.length; j++) {
const exclude=Config.Server.indexing.excludeFileList[j];
if (fs.existsSync(path.join(absoluteName,exclude))) {
return true;
}
}
return false;
}
public static scanDirectory(relativeDirectoryName: string, maxPhotos: number = null, photosOnly: boolean = false): Promise<DirectoryDTO> {
return new Promise<DirectoryDTO>((resolve, reject) => {
relativeDirectoryName = this.normalizeDirPath(relativeDirectoryName);
@ -90,6 +123,9 @@ export class DiskMangerWorker {
if (photosOnly === true) {
continue;
}
if (DiskMangerWorker.excludeDir(file,relativeDirectoryName,absoluteDirectoryName)) {
continue;
}
const d = await DiskMangerWorker.scanDirectory(path.join(relativeDirectoryName, file),
Config.Server.indexing.folderPreviewSize, true
);

304
benchmark/Benchmarks.js Normal file
View File

@ -0,0 +1,304 @@
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var SQLConnection_1 = require("../backend/model/sql/SQLConnection");
var Config_1 = require("../common/config/private/Config");
var IPrivateConfig_1 = require("../common/config/private/IPrivateConfig");
var ObjectManagers_1 = require("../backend/model/ObjectManagers");
var DiskMangerWorker_1 = require("../backend/model/threading/DiskMangerWorker");
var IndexingManager_1 = require("../backend/model/sql/IndexingManager");
var SearchManager_1 = require("../backend/model/sql/SearchManager");
var fs = require("fs");
var AutoCompleteItem_1 = require("../common/entities/AutoCompleteItem");
var Utils_1 = require("../common/Utils");
var GalleryManager_1 = require("../backend/model/sql/GalleryManager");
var BMIndexingManager = /** @class */ (function (_super) {
__extends(BMIndexingManager, _super);
function BMIndexingManager() {
return _super !== null && _super.apply(this, arguments) || this;
}
BMIndexingManager.prototype.saveToDB = function (scannedDirectory) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, _super.prototype.saveToDB.call(this, scannedDirectory)];
});
});
};
return BMIndexingManager;
}(IndexingManager_1.IndexingManager));
exports.BMIndexingManager = BMIndexingManager;
var Benchmarks = /** @class */ (function () {
function Benchmarks(RUNS, dbPath) {
var _this = this;
this.RUNS = RUNS;
this.dbPath = dbPath;
this.resetDB = function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, SQLConnection_1.SQLConnection.close()];
case 1:
_a.sent();
if (fs.existsSync(this.dbPath)) {
fs.unlinkSync(this.dbPath);
}
Config_1.Config.Server.database.type = IPrivateConfig_1.DatabaseType.sqlite;
Config_1.Config.Server.database.sqlite.storage = this.dbPath;
return [4 /*yield*/, ObjectManagers_1.ObjectManagers.InitSQLManagers()];
case 2:
_a.sent();
return [2 /*return*/];
}
});
}); };
}
Benchmarks.prototype.bmSaveDirectory = function () {
return __awaiter(this, void 0, void 0, function () {
var dir, im;
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.resetDB()];
case 1:
_a.sent();
return [4 /*yield*/, DiskMangerWorker_1.DiskMangerWorker.scanDirectory('./')];
case 2:
dir = _a.sent();
im = new BMIndexingManager();
return [4 /*yield*/, this.benchmark(function () { return im.saveToDB(dir); }, function () { return _this.resetDB(); })];
case 3: return [2 /*return*/, _a.sent()];
}
});
});
};
Benchmarks.prototype.bmScanDirectory = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.benchmark(function () { return DiskMangerWorker_1.DiskMangerWorker.scanDirectory('./'); })];
case 1: return [2 /*return*/, _a.sent()];
}
});
});
};
Benchmarks.prototype.bmListDirectory = function () {
return __awaiter(this, void 0, void 0, function () {
var gm;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
gm = new GalleryManager_1.GalleryManager();
return [4 /*yield*/, this.setupDB()];
case 1:
_a.sent();
Config_1.Config.Server.indexing.reIndexingSensitivity = IPrivateConfig_1.ReIndexingSensitivity.low;
return [4 /*yield*/, this.benchmark(function () { return gm.listDirectory('./'); })];
case 2: return [2 /*return*/, _a.sent()];
}
});
});
};
Benchmarks.prototype.bmAllSearch = function (text) {
return __awaiter(this, void 0, void 0, function () {
var types, results, sm, _loop_1, this_1, i;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.setupDB()];
case 1:
_a.sent();
types = Utils_1.Utils.enumToArray(AutoCompleteItem_1.SearchTypes).map(function (a) { return a.key; }).concat([null]);
results = [];
sm = new SearchManager_1.SearchManager();
_loop_1 = function (i) {
var _a, _b, _c;
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_b = (_a = results).push;
_c = {};
return [4 /*yield*/, this_1.benchmark(function () { return sm.search(text, types[i]); })];
case 1:
_b.apply(_a, [(_c.result = _d.sent(), _c.searchType = types[i], _c)]);
return [2 /*return*/];
}
});
};
this_1 = this;
i = 0;
_a.label = 2;
case 2:
if (!(i < types.length)) return [3 /*break*/, 5];
return [5 /*yield**/, _loop_1(i)];
case 3:
_a.sent();
_a.label = 4;
case 4:
i++;
return [3 /*break*/, 2];
case 5: return [2 /*return*/, results];
}
});
});
};
Benchmarks.prototype.bmInstantSearch = function (text) {
return __awaiter(this, void 0, void 0, function () {
var sm;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.setupDB()];
case 1:
_a.sent();
sm = new SearchManager_1.SearchManager();
return [4 /*yield*/, this.benchmark(function () { return sm.instantSearch(text); })];
case 2: return [2 /*return*/, _a.sent()];
}
});
});
};
Benchmarks.prototype.bmAutocomplete = function (text) {
return __awaiter(this, void 0, void 0, function () {
var sm;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.setupDB()];
case 1:
_a.sent();
sm = new SearchManager_1.SearchManager();
return [4 /*yield*/, this.benchmark(function () { return sm.autocomplete(text); })];
case 2: return [2 /*return*/, _a.sent()];
}
});
});
};
Benchmarks.prototype.benchmark = function (fn, beforeEach, afterEach) {
if (beforeEach === void 0) { beforeEach = null; }
if (afterEach === void 0) { afterEach = null; }
return __awaiter(this, void 0, void 0, function () {
var scanned, start, skip, i, startSkip, endSkip, startSkip, endSkip, end, duration;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, fn()];
case 1:
scanned = _a.sent();
start = process.hrtime();
skip = 0;
i = 0;
_a.label = 2;
case 2:
if (!(i < this.RUNS)) return [3 /*break*/, 8];
if (!beforeEach) return [3 /*break*/, 4];
startSkip = process.hrtime();
return [4 /*yield*/, beforeEach()];
case 3:
_a.sent();
endSkip = process.hrtime(startSkip);
skip += (endSkip[0] * 1000 + endSkip[1] / 1000000);
_a.label = 4;
case 4: return [4 /*yield*/, fn()];
case 5:
_a.sent();
if (!afterEach) return [3 /*break*/, 7];
startSkip = process.hrtime();
return [4 /*yield*/, afterEach()];
case 6:
_a.sent();
endSkip = process.hrtime(startSkip);
skip += (endSkip[0] * 1000 + endSkip[1] / 1000000);
_a.label = 7;
case 7:
i++;
return [3 /*break*/, 2];
case 8:
end = process.hrtime(start);
duration = (end[0] * 1000 + end[1] / 1000000) / this.RUNS;
if (!scanned) {
return [2 /*return*/, {
duration: duration
}];
}
if (Array.isArray(scanned)) {
return [2 /*return*/, {
duration: duration,
items: scanned.length
}];
}
return [2 /*return*/, {
duration: duration,
media: scanned.media.length,
directories: scanned.directories.length
}];
}
});
});
};
Benchmarks.prototype.setupDB = function () {
return __awaiter(this, void 0, void 0, function () {
var im, dir;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
im = new BMIndexingManager();
return [4 /*yield*/, this.resetDB()];
case 1:
_a.sent();
return [4 /*yield*/, DiskMangerWorker_1.DiskMangerWorker.scanDirectory('./')];
case 2:
dir = _a.sent();
return [4 /*yield*/, im.saveToDB(dir)];
case 3:
_a.sent();
return [2 /*return*/];
}
});
});
};
return Benchmarks;
}());
exports.Benchmarks = Benchmarks;
//# sourceMappingURL=Benchmarks.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"Benchmarks.js","sourceRoot":"","sources":["Benchmarks.ts"],"names":[],"mappings":"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"}

145
benchmark/index.js Normal file
View File

@ -0,0 +1,145 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var _this = this;
Object.defineProperty(exports, "__esModule", { value: true });
var Config_1 = require("../common/config/private/Config");
var path = require("path");
var ProjectPath_1 = require("../backend/ProjectPath");
var Benchmarks_1 = require("./Benchmarks");
var AutoCompleteItem_1 = require("../common/entities/AutoCompleteItem");
var Utils_1 = require("../common/Utils");
var DiskMangerWorker_1 = require("../backend/model/threading/DiskMangerWorker");
var config = require(path.join(__dirname, 'config.json'));
Config_1.Config.Server.imagesFolder = config.path;
var dbPath = path.join(__dirname, 'test.db');
ProjectPath_1.ProjectPath.reset();
var RUNS = 50;
var resultsText = '';
var printLine = function (text) {
resultsText += text + '\n';
};
var printHeader = function () { return __awaiter(_this, void 0, void 0, function () {
var dt, dir;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
dt = new Date();
printLine('## PiGallery2 v' + require('./../package.json').version +
', ' + Utils_1.Utils.zeroPrefix(dt.getDate(), 2) +
'.' + Utils_1.Utils.zeroPrefix(dt.getMonth() + 1, 2) +
'.' + dt.getFullYear());
printLine('**System**: ' + config.system);
return [4 /*yield*/, DiskMangerWorker_1.DiskMangerWorker.scanDirectory('./')];
case 1:
dir = _a.sent();
printLine('**Gallery**: directories: ' +
dir.directories.length +
' media: ' + dir.media.length +
// @ts-ignore
', faces: ' + dir.media.reduce(function (p, c) { return p + (c.metadata.faces || []).length; }, 0));
return [2 /*return*/];
}
});
}); };
var printTableHeader = function () {
printLine('| action | action details | average time | details |');
printLine('|:------:|:--------------:|:------------:|:-------:|');
};
var printResult = function (result, action, actionDetails) {
if (actionDetails === void 0) { actionDetails = ''; }
console.log('benchmarked: ' + action);
var details = '-';
if (result.items) {
details = 'items: ' + result.items;
}
if (result.media) {
details = 'media: ' + result.media + ', directories:' + result.directories;
}
printLine('| ' + action + ' | ' + actionDetails +
' | ' + (result.duration).toFixed(1) + 'ms | ' + details + ' |');
};
var run = function () { return __awaiter(_this, void 0, void 0, function () {
var start, bm, _a, _b, _c, _d, _e;
return __generator(this, function (_f) {
switch (_f.label) {
case 0:
start = Date.now();
bm = new Benchmarks_1.Benchmarks(RUNS, dbPath);
// header
return [4 /*yield*/, printHeader()];
case 1:
// header
_f.sent();
printTableHeader();
_a = printResult;
return [4 /*yield*/, bm.bmScanDirectory()];
case 2:
_a.apply(void 0, [_f.sent(), 'Scanning directory']);
_b = printResult;
return [4 /*yield*/, bm.bmSaveDirectory()];
case 3:
_b.apply(void 0, [_f.sent(), 'Saving directory']);
_c = printResult;
return [4 /*yield*/, bm.bmListDirectory()];
case 4:
_c.apply(void 0, [_f.sent(), 'Listing Directory']);
return [4 /*yield*/, bm.bmAllSearch('a')];
case 5:
(_f.sent()).forEach(function (res) {
if (res.searchType !== null) {
printResult(res.result, 'searching', '`a` as `' + AutoCompleteItem_1.SearchTypes[res.searchType] + '`');
}
else {
printResult(res.result, 'searching', '`a` as `any`');
}
});
_d = printResult;
return [4 /*yield*/, bm.bmInstantSearch('a')];
case 6:
_d.apply(void 0, [_f.sent(), 'instant search', '`a`']);
_e = printResult;
return [4 /*yield*/, bm.bmAutocomplete('a')];
case 7:
_e.apply(void 0, [_f.sent(), 'auto complete', '`a`']);
console.log(resultsText);
console.log('run for : ' + ((Date.now() - start)).toFixed(1) + 'ms');
return [2 /*return*/];
}
});
}); };
run();
//# sourceMappingURL=index.js.map

1
benchmark/index.js.map Normal file
View File

@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}

View File

@ -55,6 +55,8 @@ export interface IndexingConfig {
folderPreviewSize: number;
cachedFolderTimeout: number; // Do not rescans the folder if seems ok
reIndexingSensitivity: ReIndexingSensitivity;
excludeFolderList: string[]
excludeFileList: string[]
}
export interface ThreadingConfig {

View File

@ -59,7 +59,9 @@ export class PrivateConfigClass extends PublicConfigClass implements IPrivateCon
indexing: {
folderPreviewSize: 2,
cachedFolderTimeout: 1000 * 60 * 60,
reIndexingSensitivity: ReIndexingSensitivity.low
reIndexingSensitivity: ReIndexingSensitivity.low,
excludeFolderList: [],
excludeFileList: []
},
duplicates: {
listingLimit: 1000

25
docker/alpine/Dockerfile Normal file
View File

@ -0,0 +1,25 @@
FROM node:alpine
RUN apk add python build-base
COPY . /build
WORKDIR /build
RUN set -x && npm install --unsafe-perm && npm run build-release && \
cd /build/release && npm install --unsafe-perm
RUN mkdir -p /build/release/data/config && \
mkdir -p /build/release/data/db && \
mkdir -p /build/release/data/image && \
mkdir -p /build/release/data/TEMP && \
cd /build/release && node backend/server.js && \
sed -i 's/demo/data/g' config.json && sed -i 's@sqlite\.db@data/db/sqlite\.db@' config.json && \
mv /build/release/config.json /build/release/data/config/config.json
FROM node:alpine
WORKDIR /app
ENTRYPOINT ["npm", "start"]
EXPOSE 80
ENV NODE_ENV=production
COPY --from=0 /build/release /app
RUN ln -s /app/data/config/config.json config.json
VOLUME ["/app/data/config", "/app/data/db", "/app/data/images", "/app/data/TEMP"]
HEALTHCHECK --interval=15s --timeout=5s --retries=4 --start-period=30s \
CMD wget --quiet --tries=1 --no-check-certificate --spider \
http://localhost:80 || exit 1

View File

@ -49,6 +49,36 @@
</div>
</div>
<div class="form-group row">
<label class="col-md-2 control-label" for="excludeFolderList" i18n>Exclude Folder List</label>
<div class="col-md-10">
<input type="text" class="form-control" placeholder=""
id="excludeFolderList"
[(ngModel)]="excludeFolderList"
name="excludeFolderList" required>
<small class="form-text text-muted">
<ng-container i18n>Folders to exclude from indexing</ng-container><br/>
<ng-container
i18n>';' separated strings. If an entry starts with '/' it is treated as an absolute path. If it doesn't start with '/' but contains a '/', the path is relative to the image directory. If it doesn't contain a '/', any folder with this name will be excluded.</ng-container>
</small>
</div>
</div>
<div class="form-group row">
<label class="col-md-2 control-label" for="excludeFileList" i18n>Exclude File List</label>
<div class="col-md-10">
<input type="text" class="form-control" placeholder=""
id="excludeFileList"
[(ngModel)]="excludeFileList"
name="excludeFileList" required>
<small class="form-text text-muted">
<ng-container i18n>FFiles that mark a folder to be excluded from indexing</ng-container><br/>
<ng-container
i18n>';' separated strings. Any folder that contains a file with this name will be excluded from indexing.</ng-container>
</small>
</div>
</div>
<button class="btn btn-success float-right"
[disabled]="!settingsForm.form.valid || !changed || inProgress"

View File

@ -64,6 +64,22 @@ export class IndexingSettingsComponent extends SettingsComponent<IndexingConfig,
this.tasksService.unsubscribeFromProgress();
}
get excludeFolderList(): string {
return this.settings.excludeFolderList.join(';');
}
set excludeFolderList(value: string) {
this.settings.excludeFolderList = value.split(';');
}
get excludeFileList(): string {
return this.settings.excludeFileList.join(';');
}
set excludeFileList(value: string) {
this.settings.excludeFileList = value.split(';');
}
async ngOnInit() {
super.ngOnInit();
this.tasksService.subscribeToProgress();

View File

@ -109,7 +109,9 @@ export class SettingsService {
indexing: {
cachedFolderTimeout: 0,
folderPreviewSize: 0,
reIndexingSensitivity: ReIndexingSensitivity.medium
reIndexingSensitivity: ReIndexingSensitivity.medium,
excludeFolderList: [],
excludeFileList: []
},
photoMetadataSize: 512 * 1024,
duplicates: {

File diff suppressed because it is too large Load Diff

165
gulpfile.js Normal file
View File

@ -0,0 +1,165 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var gulp = require("gulp");
var fs = require("fs");
var zip = require("gulp-zip");
var ts = require("gulp-typescript");
// @ts-ignore
var jsonModify = require("gulp-json-modify");
var exec = require('child_process').exec;
var translationFolder = 'translate';
var tsBackendProject = ts.createProject('tsconfig.json');
gulp.task('build-backend', function () {
return gulp.src([
'common/**/*.ts',
'backend/**/*.ts'
], { base: '.' })
.pipe(tsBackendProject())
.js
.pipe(gulp.dest('./release'));
});
var handleError = function (cb) {
return function (err, stdout, stderr) {
console.log(stdout);
console.log(stderr);
cb(err);
};
};
var createFrontendTask = function (type, script) {
gulp.task(type, function (cb) {
exec(script, handleError(cb));
});
};
var getLanguages = function () {
if (!fs.existsSync('./frontend/' + translationFolder)) {
return [];
}
var dirCont = fs.readdirSync('./frontend/' + translationFolder);
var files = dirCont.filter(function (elm) {
return elm.match(/.*\.[a-zA-Z]+\.(xlf)/ig);
});
return files.map(function (f) {
return f.split('.')[1];
});
};
gulp.task('build-frontend', (function () {
var languages = getLanguages().filter(function (l) {
return l !== 'en';
});
var tasks = [];
createFrontendTask('build-frontend-release default', 'ng build --aot --prod --output-path=./release/dist --no-progress --i18n-locale=en' +
' --i18n-format xlf --i18n-file frontend/' + translationFolder + '/messages.en.xlf' +
' --i18n-missing-translation warning');
tasks.push('build-frontend-release default');
for (var i = 0; i < languages.length; i++) {
createFrontendTask('build-frontend-release ' + languages[i], 'ng build --aot --prod --output-path=./release/dist/' + languages[i] +
' --no-progress --i18n-locale=' + languages[i] +
' --i18n-format xlf --i18n-file frontend/' + translationFolder + '/messages.' + languages[i] + '.xlf' +
' --i18n-missing-translation warning');
tasks.push('build-frontend-release ' + languages[i]);
}
return gulp.series.apply(gulp, tasks);
})());
gulp.task('copy-static', function () {
return gulp.src([
'backend/model/diagnostics/blank.jpg',
'README.md',
'LICENSE'
], { base: '.' })
.pipe(gulp.dest('./release'));
});
gulp.task('copy-package', function () {
return gulp.src([
'package.json'
], { base: '.' })
.pipe(jsonModify({
key: 'devDependencies',
value: {}
}))
.pipe(jsonModify({
key: 'scripts',
value: { 'start': 'node ./backend/index.js' }
}))
.pipe(gulp.dest('./release'));
});
gulp.task('zip-release', function () {
return gulp.src(['release/**/*'], { base: './release' })
.pipe(zip('pigallery2.zip'))
.pipe(gulp.dest('.'));
});
gulp.task('build-release', gulp.series('build-frontend', 'build-backend', 'copy-static', 'copy-package', 'zip-release'));
var simpleBuild = function (isProd) {
var languages = getLanguages().filter(function (l) {
return l !== 'en';
});
var tasks = [];
var cmd = 'ng build --aot ';
if (isProd) {
cmd += ' --prod --no-extract-licenses ';
}
createFrontendTask('build-frontend default', cmd + '--output-path=./dist --no-progress --no-progress --i18n-locale en' +
' --i18n-format=xlf --i18n-file=frontend/' + translationFolder + '/messages.en.xlf' + ' --i18n-missing-translation warning');
tasks.push('build-frontend default');
if (!process.env.CI) { // don't build languages if running in CI
for (var i = 0; i < languages.length; i++) {
createFrontendTask('build-frontend ' + languages[i], cmd +
'--output-path=./dist/' + languages[i] +
' --no-progress --i18n-locale ' + languages[i] +
' --i18n-format=xlf --i18n-file=frontend/' + translationFolder +
'/messages.' + languages[i] + '.xlf' + ' --i18n-missing-translation warning');
tasks.push('build-frontend ' + languages[i]);
}
}
return gulp.series.apply(gulp, tasks);
};
gulp.task('extract-locale', function (cb) {
console.log('creating source translation file: locale.source.xlf');
exec('ng xi18n --out-file=./../locale.source.xlf --i18n-format=xlf --i18n-locale=en', { maxBuffer: 1024 * 1024 }, function (error, stdOut, stdErr) {
console.log(stdOut);
console.log(stdErr);
if (error) {
return cb(error);
}
exec('ngx-extractor -i frontend/**/*.ts -f xlf --out-file locale.source.xlf', handleError(cb));
});
});
var translate = function (list, cb) {
var localsStr = '"[\\"' + list.join('\\",\\"') + '\\"]"';
exec('xlf-google-translate --source-lang="en" --source-file="./locale.source.xlf" --destination-folder="./frontend/"' +
translationFolder + ' --destination-languages=' + localsStr, handleError(cb));
};
var merge = function (list, cb) {
var localsStr = '"[\\"' + list.join('\\",\\"') + '\\"]"';
exec('xlf-google-translate --method="extend-only" --source-lang="en" --source-file="./locale.source.xlf" --destination-folder="./frontend/"' +
translationFolder + ' --destination-languages=' + localsStr, handleError(cb));
};
gulp.task('update-translation-only', function (cb) {
translate(getLanguages(), cb);
});
gulp.task('merge-translation-only', function (cb) {
merge(getLanguages(), cb);
});
gulp.task('update-translation', gulp.series('extract-locale', 'update-translation-only'));
gulp.task('merge-new-translation', gulp.series('extract-locale', 'merge-translation-only'));
gulp.task('add-translation-only', function (cb) {
var languages = getLanguages();
var lng = null;
for (var i = 0; i < process.argv.length - 1; i++) {
if (process.argv[i] === 'add-translation') {
lng = process.argv[i + 1].replace('--', '');
}
}
if (lng == null) {
console.error('Error: set language with \'--\' e.g: npm run add-translation -- --en');
return cb();
}
if (languages.indexOf(lng) !== -1) {
console.error('Error: language already exists, can\'t add. These language(s) already exist(s): ' + languages);
return cb();
}
translate([lng], cb);
});
gulp.task('add-translation', gulp.series('extract-locale', 'add-translation-only'));
gulp.task('build-dev', simpleBuild(false));
gulp.task('build-prod', simpleBuild(true));
//# sourceMappingURL=gulpfile.js.map

1
gulpfile.js.map Normal file

File diff suppressed because one or more lines are too long