Compare commits

...

15 Commits

Author SHA1 Message Date
Book Pauk
7ed58fe3c6 Merge branch 'release/0.12.0-2' 2022-08-03 15:58:42 +07:00
Book Pauk
058c79570b Поправки багов 2022-08-03 15:52:48 +07:00
Book Pauk
ec8fbcdf38 Исправление багов 2022-08-03 15:34:24 +07:00
Book Pauk
76673295bf Добавлена автоотмена проверки обновлений книг по истечении заданного количества дней 2022-08-03 14:57:01 +07:00
Book Pauk
084401b9c3 Мелкие поправки 2022-08-03 14:53:58 +07:00
Book Pauk
49038b10f7 Улучшение обработки ошибок 2022-07-29 17:45:33 +07:00
Book Pauk
45ea26810a Улучшение fillCheckQueue 2022-07-28 20:22:38 +07:00
Book Pauk
18c8b2d803 Мелкие поправки 2022-07-28 18:50:56 +07:00
Book Pauk
f4a7482b3b Улучшение парсинга head-запроса 2022-07-28 18:38:49 +07:00
Book Pauk
32dff128f4 Улучшение парсинга head-запроса 2022-07-28 18:04:47 +07:00
Book Pauk
a00b2d6574 Исправлен баг 2022-07-27 23:29:52 +07:00
Book Pauk
10c6e7d522 Merge tag '0.12.0-1' into develop
0.12.0-1
2022-07-27 21:33:56 +07:00
Book Pauk
df6a256d51 Merge branch 'release/0.12.0-1' 2022-07-27 21:33:49 +07:00
Book Pauk
fbdb74ee68 Поправка текста 2022-07-27 21:33:22 +07:00
Book Pauk
9ad7250da0 Merge tag '0.12.0' into develop
0.12.0
2022-07-27 21:10:04 +07:00
8 changed files with 132 additions and 34 deletions

View File

@@ -476,7 +476,10 @@ class Reader {
this.dualPageMode = settings.dualPageMode;
this.userWallpapers = settings.userWallpapers;
this.bucEnabled = settings.bucEnabled;
this.bucSizeDiff = settings.bucSizeDiff;
this.bucSetOnNew = settings.bucSetOnNew;
this.bucCancelEnabled = settings.bucCancelEnabled;
this.bucCancelDays = settings.bucCancelDays;
this.readerActionByKeyCode = utils.userHotKeysObjectSwap(settings.userHotKeys);
this.$root.readerActionByKeyEvent = (event) => {
@@ -604,13 +607,50 @@ class Reader {
await utils.sleep(1000);//чтобы не ддосить сервер
}
const checkSetTime = {};
//проставим новые размеры у книг
for (const book of sorted) {
if (book.deleted)
continue;
//размер 0 считаем отсутствующим
if (book.url && bucSize[book.url] && bucSize[book.url] !== book.bucSize) {
book.bucSize = bucSize[book.url];
await bookManager.recentSetItem(book);
}
//подготовка к следующему шагу, ищем книгу по url с максимальной датой установки checkBucTime/loadTime
//от этой даты будем потом отсчитывать bucCancelDays
if (updateUrls.has(book.url)) {
let rec = checkSetTime[book.url] || {time: 0, loadTime: 0};
const time = (book.checkBucTime ? book.checkBucTime : (rec.loadTime || 0));
if (time > rec.time || (time == rec.time && (book.loadTime > rec.loadTime)))
rec = {time, loadTime: book.loadTime, key: book.key};
checkSetTime[book.url] = rec;
}
}
//bucCancelEnabled и bucCancelDays
//снимем флаг checkBuc у необновлявшихся bucCancelDays
if (this.bucCancelEnabled) {
for (const rec of Object.values(checkSetTime)) {
if (rec.time && Date.now() - rec.time > this.bucCancelDays*24*3600*1000) {
const book = await bookManager.getRecentBook({key: rec.key});
const needBookUpdate =
book.checkBuc
&& book.bucSize
&& utils.hasProp(book, 'downloadSize')
&& book.bucSize !== book.downloadSize
&& (book.bucSize - book.downloadSize >= this.bucSizeDiff)
;
if (book && !needBookUpdate) {
await bookManager.setCheckBuc(book, undefined);//!!!
}
}
}
}
await this.$refs.recentBooksPage.updateTableData();
@@ -1251,6 +1291,7 @@ class Reader {
this.checkBookPosPercent();
this.activateClickMapPage();//no await
this.$refs.recentBooksPage.updateTableData();//no await
return;
}

View File

@@ -147,8 +147,8 @@
{{ item.desc.title }}
</div>
<div v-show="bothBucEnabled && item.needBookUpdate" style="font-size: 75%; color: blue;">
Размер: {{ item.downloadSize }} &rarr; {{ item.bucSize }},
{{ item.bucSize - item.downloadSize > 0 ? '+' : '' }}{{ item.bucSize - item.downloadSize }}
Размер: {{ item.bucSize - item.downloadSize > 0 ? '+' : '' }}{{ item.bucSize - item.downloadSize }}
({{ item.downloadSize }} &rarr; {{ item.bucSize }})
</div>
</div>
@@ -231,7 +231,12 @@
@update:model-value="checkBucChange(item)"
>
<q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
Проверять обновления
<div v-if="item.checkBuc === undefined">
Проверка обновлений отключена автоматически<br>т.к. книга не обновлялась {{ bucCancelDays }} дней
</div>
<div v-else>
{{ (item.checkBuc ? 'Проверка обновлений книги включена' : 'Проверка обновлений книги отключена') }}
</div>
</q-tooltip>
</q-checkbox>
</div>
@@ -289,6 +294,7 @@ class RecentBooksPage {
bucEnabled = false;
bucSizeDiff = 0;
bucSetOnNew = false;
bucCancelDays = 0;
needBookUpdateCount = 0;
showArchive = false;
@@ -332,6 +338,7 @@ class RecentBooksPage {
this.bucEnabled = settings.bucEnabled;
this.bucSizeDiff = settings.bucSizeDiff;
this.bucSetOnNew = settings.bucSetOnNew;
this.bucCancelDays = settings.bucCancelDays;
}
get settings() {
@@ -403,8 +410,8 @@ class RecentBooksPage {
inGroup: false,
coverPageUrl: book.coverPageUrl,
showCheckBuc: !this.showArchive && utils.hasProp(book, 'downloadSize'),
checkBuc: !!book.checkBuc,
showCheckBuc: !this.showArchive && utils.hasProp(book, 'downloadSize') && book.url.indexOf('disk://') !== 0,
checkBuc: book.checkBuc,
needBookUpdate: (
!this.showArchive
&& book.checkBuc

View File

@@ -27,17 +27,7 @@
<div v-show="configBucEnabled && bucEnabled" class="item row">
<div class="label-6"></div>
<q-checkbox size="xs" v-model="bucSetOnNew">
Автопроверка для вновь загружаемых
<q-tooltip :delay="1000" anchor="top middle" self="bottom middle" content-style="font-size: 80%">
Автоматически устанавливать флаг проверки<br>
обновлений для всех вновь загружаемых книг
</q-tooltip>
</q-checkbox>
</div>
<div v-show="configBucEnabled && bucEnabled" class="item row">
<div class="label-6">Разница размеров</div>
<div class="col-5 column justify-center items-end q-pr-xs">Разница размеров</div>
<div class="col row">
<NumInput class="col-left" v-model="bucSizeDiff" />
@@ -48,3 +38,39 @@
</q-tooltip>
</div>
</div>
<div v-show="configBucEnabled && bucEnabled" class="item row">
<div class="label-6"></div>
<q-checkbox size="xs" v-model="bucSetOnNew">
Автопроверка для вновь загружаемых
<q-tooltip :delay="1000" anchor="top middle" self="bottom middle" content-style="font-size: 80%">
Автоматически устанавливать флаг проверки<br>
обновлений для всех вновь загружаемых книг
</q-tooltip>
</q-checkbox>
</div>
<div v-show="configBucEnabled && bucEnabled" class="item row">
<div class="label-6"></div>
<q-checkbox size="xs" v-model="bucCancelEnabled">
Отменять проверку через {{ bucCancelDays }} дней{{ (bucCancelEnabled ? ':' : '') }}
<q-tooltip :delay="1000" anchor="top middle" self="bottom middle" content-style="font-size: 80%">
Снимать флаг проверки с книги, если не было<br>
обновлений в течение {{ bucCancelDays }} дней
</q-tooltip>
</q-checkbox>
</div>
<div v-show="configBucEnabled && bucEnabled && bucCancelEnabled" class="item row">
<div class="label-6"></div>
<div class="col-5"></div>
<div class="col row">
<NumInput class="col-left" v-model="bucCancelDays" :min="1" :max="10000"/>
<q-tooltip :delay="1000" anchor="top middle" self="bottom middle" content-style="font-size: 80%">
Снимать флаг проверки с книги, если не было<br>
обновлений в течение {{ bucCancelDays }} дней
</q-tooltip>
</div>
</div>

View File

@@ -487,7 +487,7 @@ class BookManager {
await this.recentSetItem(item);
}
async setCheckBuc(value, checkBuc = true) {
async setCheckBuc(value, checkBuc) {
const item = this.recent[value.key];
const updateItems = [];
@@ -495,7 +495,7 @@ class BookManager {
if (item.sameBookKey !== undefined) {
const sorted = this.getSortedRecent();
for (const book of sorted) {
if (book.sameBookKey === item.sameBookKey)
if (!book.deleted && book.sameBookKey === item.sameBookKey)
updateItems.push(book);
}
} else {
@@ -503,8 +503,11 @@ class BookManager {
}
}
const now = Date.now();
for (const book of updateItems) {
book.checkBuc = checkBuc;
if (checkBuc)
book.checkBucTime = now;
await this.recentSetItem(book);
}
}

View File

@@ -9,7 +9,8 @@ export const versionHistory = [
<li>запущен сервер проверки обновлений книг:</li>
<ul>
<li>проверка обновления той или иной книги настраивается в списке загруженных (чекбокс)</li>
<li>в настройках можно указать разницу размеров, при которой необходимо делать уведомление</li>
<li>для того, чтобы чекбокс появился у ранее загруженной, необходимо принудительно обновить книгу</li>
<li>в настройках можно указать разницу размеров, при которой требуется делать уведомление</li>
</ul>
</ul>

View File

@@ -185,7 +185,7 @@ const settingDefaults = {
fontShifts: {},
showToolButton: {},
toolBarHideOnScroll: true,
toolBarHideOnScroll: false,
userHotKeys: {},
userWallpapers: [],
@@ -196,6 +196,8 @@ const settingDefaults = {
bucEnabled: true, // общее включение/выключение проверки обновлений
bucSizeDiff: 1, // разница в размерах файла, при которой показывать наличие обновления
bucSetOnNew: true, // автоматически включать проверку обновлений для вновь загружаемых файлов
bucCancelEnabled: true, // вкл/выкл отмену проверки книг через bucCancelDays
bucCancelDays: 90, // количество дней, через которое отменяется проверка книги, при условии отсутствия обновлений за это время
//для SettingsPage
needUpdateSettingsView: 0,

View File

@@ -249,7 +249,7 @@ class BUCClient {
this.periodicSendBookUrls();//no await
this.periodicSync();//no await
log(`BUC Client started`);
log(`BUC Client Worker started`);
} catch (e) {
log(LM_FATAL, e.stack);
ayncExit.exit(1);

View File

@@ -26,8 +26,8 @@ class BUCServer {
this.periodicCheckWait = 500;//пауза, если нечего делать
this.cleanQueryInterval = 300*dayMs;//интервал очистки устаревших
this.oldQueryInterval = 30*dayMs;//интервал устаревания запроса на обновление
this.checkingInterval = 3*hourMs;//интервал проверки обновления одного и того же файла
this.oldQueryInterval = 14*dayMs;//интервал устаревания запроса на обновление
this.checkingInterval = 5*hourMs;//интервал проверки обновления одного и того же файла
this.sameHostCheckInterval = 1000;//интервал проверки файла на том же сайте, не менее
} else {
this.maxCheckQueueLength = 10;//максимальная длина checkQueue
@@ -134,6 +134,7 @@ class BUCServer {
id,
queryTime: now,
checkTime: 0, // 0 - never checked
etag: '',
modTime: '',
size: 0,
checkSum: '', //sha256
@@ -184,7 +185,7 @@ class BUCServer {
}
rows = await db.select({table: 'buc', count: true});
log(LM_WARN, `'buc' table length: ${rows[0].count}`);
log(LM_WARN, `'buc' table size: ${rows[0].count}`);
now = Date.now();
//выборка кандидатов
@@ -199,24 +200,30 @@ class BUCServer {
`
});
//console.log(rows);
//формирование checkQueue
if (rows.length) {
const ids = [];
const rowsToPush = [];
//сначала выберем сколько надо
for (const row of rows) {
if (this.checkQueue.length >= this.maxCheckQueueLength)
if (this.checkQueue.length + rowsToPush.length >= this.maxCheckQueueLength)
break;
rowsToPush.push(row);
ids.push(row.id);
this.checkQueue.push(row);
}
//установим у них флаг "в обработке"
await db.update({
table: 'buc',
mod: `(r) => r.state = 1`,
where: `@@id(${db.esc(ids)})`
});
//пушим в очередь, после этого их обработает periodicCheck
for (const row of rowsToPush)
this.checkQueue.push(row);
log(LM_WARN, `checkQueue: added ${ids.length} recs, total ${this.checkQueue.length}`);
}
@@ -249,13 +256,21 @@ class BUCServer {
try {
let unchanged = true;
let size = 0;
let hash = '';
const headers = await this.down.head(row.id);
const modTime = headers['last-modified']
if (!modTime || !row.modTime || (modTime !== row.modTime)) {
const etag = headers['etag'] || '';
const modTime = headers['last-modified'] || '';
let size = parseInt(headers['content-length'], 10) || 0;
//log(row.id);
//log(`etag: ${etag}, modTime: ${modTime}, size: ${size}`)
if ((!etag || !row.etag || (etag !== row.etag))
&& (!modTime || !row.modTime || (modTime !== row.modTime))
&& (!size || !row.size || (size !== row.size))
) {
const downdata = await this.down.load(row.id);
size = downdata.length;
@@ -267,6 +282,7 @@ class BUCServer {
table: 'buc',
mod: `(r) => {
r.checkTime = ${db.esc(Date.now())};
r.etag = ${(unchanged ? 'r.etag' : db.esc(etag))};
r.modTime = ${(unchanged ? 'r.modTime' : db.esc(modTime))};
r.size = ${(unchanged ? 'r.size' : db.esc(size))};
r.checkSum = ${(unchanged ? 'r.checkSum' : db.esc(hash))};
@@ -291,6 +307,8 @@ class BUCServer {
}`,
where: `@@id(${db.esc(row.id)})`
});
log(LM_ERR, `error ${row.id} > ${e.stack ? e.stack : e.message}`);
} finally {
(async() => {
await utils.sleep(this.sameHostCheckInterval);
@@ -319,9 +337,9 @@ class BUCServer {
for (let i = 0; i < 10; i++)
this.periodicCheck();//no await
log(`------------------`);
log(`BUC Server started`);
log(`------------------`);
log(`-------------------------`);
log(`BUC Server Worker started`);
log(`-------------------------`);
} catch (e) {
log(LM_FATAL, e.stack);
ayncExit.exit(1);