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.dualPageMode = settings.dualPageMode;
this.userWallpapers = settings.userWallpapers; this.userWallpapers = settings.userWallpapers;
this.bucEnabled = settings.bucEnabled; this.bucEnabled = settings.bucEnabled;
this.bucSizeDiff = settings.bucSizeDiff;
this.bucSetOnNew = settings.bucSetOnNew; this.bucSetOnNew = settings.bucSetOnNew;
this.bucCancelEnabled = settings.bucCancelEnabled;
this.bucCancelDays = settings.bucCancelDays;
this.readerActionByKeyCode = utils.userHotKeysObjectSwap(settings.userHotKeys); this.readerActionByKeyCode = utils.userHotKeysObjectSwap(settings.userHotKeys);
this.$root.readerActionByKeyEvent = (event) => { this.$root.readerActionByKeyEvent = (event) => {
@@ -604,13 +607,50 @@ class Reader {
await utils.sleep(1000);//чтобы не ддосить сервер await utils.sleep(1000);//чтобы не ддосить сервер
} }
const checkSetTime = {};
//проставим новые размеры у книг //проставим новые размеры у книг
for (const book of sorted) { for (const book of sorted) {
if (book.deleted)
continue;
//размер 0 считаем отсутствующим //размер 0 считаем отсутствующим
if (book.url && bucSize[book.url] && bucSize[book.url] !== book.bucSize) { if (book.url && bucSize[book.url] && bucSize[book.url] !== book.bucSize) {
book.bucSize = bucSize[book.url]; book.bucSize = bucSize[book.url];
await bookManager.recentSetItem(book); 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(); await this.$refs.recentBooksPage.updateTableData();
@@ -1251,6 +1291,7 @@ class Reader {
this.checkBookPosPercent(); this.checkBookPosPercent();
this.activateClickMapPage();//no await this.activateClickMapPage();//no await
this.$refs.recentBooksPage.updateTableData();//no await
return; return;
} }

View File

@@ -147,8 +147,8 @@
{{ item.desc.title }} {{ item.desc.title }}
</div> </div>
<div v-show="bothBucEnabled && item.needBookUpdate" style="font-size: 75%; color: blue;"> <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>
</div> </div>
@@ -231,7 +231,12 @@
@update:model-value="checkBucChange(item)" @update:model-value="checkBucChange(item)"
> >
<q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%"> <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-tooltip>
</q-checkbox> </q-checkbox>
</div> </div>
@@ -289,6 +294,7 @@ class RecentBooksPage {
bucEnabled = false; bucEnabled = false;
bucSizeDiff = 0; bucSizeDiff = 0;
bucSetOnNew = false; bucSetOnNew = false;
bucCancelDays = 0;
needBookUpdateCount = 0; needBookUpdateCount = 0;
showArchive = false; showArchive = false;
@@ -332,6 +338,7 @@ class RecentBooksPage {
this.bucEnabled = settings.bucEnabled; this.bucEnabled = settings.bucEnabled;
this.bucSizeDiff = settings.bucSizeDiff; this.bucSizeDiff = settings.bucSizeDiff;
this.bucSetOnNew = settings.bucSetOnNew; this.bucSetOnNew = settings.bucSetOnNew;
this.bucCancelDays = settings.bucCancelDays;
} }
get settings() { get settings() {
@@ -403,8 +410,8 @@ class RecentBooksPage {
inGroup: false, inGroup: false,
coverPageUrl: book.coverPageUrl, coverPageUrl: book.coverPageUrl,
showCheckBuc: !this.showArchive && utils.hasProp(book, 'downloadSize'), showCheckBuc: !this.showArchive && utils.hasProp(book, 'downloadSize') && book.url.indexOf('disk://') !== 0,
checkBuc: !!book.checkBuc, checkBuc: book.checkBuc,
needBookUpdate: ( needBookUpdate: (
!this.showArchive !this.showArchive
&& book.checkBuc && book.checkBuc

View File

@@ -27,17 +27,7 @@
<div v-show="configBucEnabled && bucEnabled" class="item row"> <div v-show="configBucEnabled && bucEnabled" class="item row">
<div class="label-6"></div> <div class="label-6"></div>
<q-checkbox size="xs" v-model="bucSetOnNew"> <div class="col-5 column justify-center items-end q-pr-xs">Разница размеров</div>
Автопроверка для вновь загружаемых
<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 row"> <div class="col row">
<NumInput class="col-left" v-model="bucSizeDiff" /> <NumInput class="col-left" v-model="bucSizeDiff" />
@@ -48,3 +38,39 @@
</q-tooltip> </q-tooltip>
</div> </div>
</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); await this.recentSetItem(item);
} }
async setCheckBuc(value, checkBuc = true) { async setCheckBuc(value, checkBuc) {
const item = this.recent[value.key]; const item = this.recent[value.key];
const updateItems = []; const updateItems = [];
@@ -495,7 +495,7 @@ class BookManager {
if (item.sameBookKey !== undefined) { if (item.sameBookKey !== undefined) {
const sorted = this.getSortedRecent(); const sorted = this.getSortedRecent();
for (const book of sorted) { for (const book of sorted) {
if (book.sameBookKey === item.sameBookKey) if (!book.deleted && book.sameBookKey === item.sameBookKey)
updateItems.push(book); updateItems.push(book);
} }
} else { } else {
@@ -503,8 +503,11 @@ class BookManager {
} }
} }
const now = Date.now();
for (const book of updateItems) { for (const book of updateItems) {
book.checkBuc = checkBuc; book.checkBuc = checkBuc;
if (checkBuc)
book.checkBucTime = now;
await this.recentSetItem(book); await this.recentSetItem(book);
} }
} }

View File

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

View File

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

View File

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

View File

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