Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ed58fe3c6 | ||
|
|
058c79570b | ||
|
|
ec8fbcdf38 | ||
|
|
76673295bf | ||
|
|
084401b9c3 | ||
|
|
49038b10f7 | ||
|
|
45ea26810a | ||
|
|
18c8b2d803 | ||
|
|
f4a7482b3b | ||
|
|
32dff128f4 | ||
|
|
a00b2d6574 | ||
|
|
10c6e7d522 | ||
|
|
df6a256d51 | ||
|
|
fbdb74ee68 | ||
|
|
9ad7250da0 |
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -147,8 +147,8 @@
|
||||
{{ item.desc.title }}
|
||||
</div>
|
||||
<div v-show="bothBucEnabled && item.needBookUpdate" style="font-size: 75%; color: blue;">
|
||||
Размер: {{ item.downloadSize }} → {{ item.bucSize }},
|
||||
{{ item.bucSize - item.downloadSize > 0 ? '+' : '' }}{{ item.bucSize - item.downloadSize }}
|
||||
Размер: {{ item.bucSize - item.downloadSize > 0 ? '+' : '' }}{{ item.bucSize - item.downloadSize }}
|
||||
({{ item.downloadSize }} → {{ 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
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,8 @@ export const versionHistory = [
|
||||
<li>запущен сервер проверки обновлений книг:</li>
|
||||
<ul>
|
||||
<li>проверка обновления той или иной книги настраивается в списке загруженных (чекбокс)</li>
|
||||
<li>в настройках можно указать разницу размеров, при которой необходимо делать уведомление</li>
|
||||
<li>для того, чтобы чекбокс появился у ранее загруженной, необходимо принудительно обновить книгу</li>
|
||||
<li>в настройках можно указать разницу размеров, при которой требуется делать уведомление</li>
|
||||
</ul>
|
||||
</ul>
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user