Skip to content
This repository has been archived by the owner on Jul 17, 2023. It is now read-only.

Commit

Permalink
Merge branch 'release/1.1.5'
Browse files Browse the repository at this point in the history
  • Loading branch information
cawa-93 committed Sep 13, 2019
2 parents 697494b + 7116b2f commit d200400
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 3 deletions.
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@
Все заметные изменения в этом проекте будут документированы в этом файле


## [1.1.5] — 13.09.2019
В этой версии я продолжил работу над внутренним хранилищем. В этой версии изменения коснулись процесса загрузки списка серий и их названий.

Я реализовал временный кэш для списка серий. Теперь список серий для онгоингов кэшируется на сутки. А для уже вышедших аниме на более долгий срок.

Кроме того, в кэше хранится не более 5 последних аниме. Таким образом объем потребляемой памяти остаётся низким.

Благодаря этому нововведению время между началом загрузки страницы и инициализацией видео-плеера уменьшилось на 25-30%.

## [1.1.3] — 11.09.2019
Кто-то знает, а кто-то нет, но расширение умеет предугадывать в каком переводе вы бы предпочли смотреть аниме. Как это работает. Расширение запоминает историю ваших просмотров и то какой перевод (озвучка/субтитры) и от какой релиз-группы вы выбираете. На основе этой модели строиться ваш персонализированный "Профиль предпочтений".И чем больше аниме вы смотрите, тем умнее и точнее работает прогноз.

Expand Down Expand Up @@ -100,6 +109,7 @@
- **Приоритетная** помощь в решении проблем


[1.1.5]: https://github.com/cawa-93/play-shikimori-online/compare/v1.1.4...v1.1.5
[1.1.3]: https://github.com/cawa-93/play-shikimori-online/compare/v1.1.2...v1.1.3
[1.1.2]: https://github.com/cawa-93/play-shikimori-online/compare/v1.1.1...v1.1.2
[1.1.1]: https://github.com/cawa-93/play-shikimori-online/compare/v1.1.0...v1.1.1
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"description": "Расширение позволяет смотреть аниме онлайн и синхронизировать его с вашим списком на Шикимори (shikimori.org и shikimori.one)",
"name": "play-shiki-online",
"version": "1.1.4",
"version": "1.1.5",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
Expand Down
5 changes: 5 additions & 0 deletions src/UI/index.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<link href="//shikimori.one" rel="preconnect">
<link href="//smotret-anime-365.ru" rel="preconnect">
<link href="//api.jikan.moe" rel="preconnect">
<link href="//www.googletagmanager.com" rel="preconnect">

<meta charset="utf-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width,initial-scale=1.0" name="viewport">
Expand Down
26 changes: 25 additions & 1 deletion src/UI/store/player/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import {findEpisode} from '@/helpers/find-episode';
import router from '@/UI/router';
import store, {worker} from '@/UI/store';
import shikimoriStore from '@/UI/store/shikimori';
// @ts-ignore
import storage from 'kv-storage-polyfill';
import Vue from 'vue';
import {Action, getModule, Module, Mutation, VuexModule} from 'vuex-module-decorators';
import {SelectedTranslation, WatchingHistoryItem} from '../../../../types/UI';
Expand Down Expand Up @@ -312,13 +314,24 @@ export class Player extends VuexModule {
*/
@Action
public async loadEpisodesTitle() {
if (!this.currentEpisode) {
if (!this.currentEpisode || !this.currentEpisode.myAnimelist) {
return;
}
const myAnimelist = this.currentEpisode.myAnimelist;
let cache: Map<number, { maxAge: number, episodes: myanimelist.Episode[] }>
= await storage.get('EpisodeTitlesCache') || new Map();

if (cache.has(myAnimelist)) {
const cached = cache.get(myAnimelist);
if (cached && cached.maxAge && cached.maxAge > Date.now()) {
return this.setEpisodesTitle(cached.episodes);
}
}

let promise: Promise<myanimelist.api.EpisodeCollection>;
let currentPage = 1;
let episodesToCommit: myanimelist.Episode[] = [];
const episodesToCache: myanimelist.Episode[] = [];


try {
Expand All @@ -330,6 +343,7 @@ export class Player extends VuexModule {

if (episodesToCommit.length) {
this.setEpisodesTitle(episodesToCommit);
episodesToCache.push(...episodesToCommit);
episodesToCommit = [];
}

Expand All @@ -354,7 +368,17 @@ export class Player extends VuexModule {

if (episodesToCommit.length) {
this.setEpisodesTitle(episodesToCommit);
episodesToCache.push(...episodesToCommit);
}

if (episodesToCache.length) {
cache.set(myAnimelist, {episodes: episodesToCache, maxAge: Date.now() + 345600000}); // кэшируем на 4 суток
}

if (cache.size > 5) {
cache = new Map([...cache.entries()].splice(-5));
}
storage.set('EpisodeTitlesCache', cache);

}

Expand Down
91 changes: 91 additions & 0 deletions src/helpers/API/Anime365Provider.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,100 @@
import {RequestProvider} from '@/helpers/API/RequestProvider';
// @ts-ignore
import storage from 'kv-storage-polyfill';

declare interface CachedSeries {
resp: anime365.api.SeriesCollection;
maxAge: number;
}

const DAY = 1000 * 60 * 60 * 24;


export class Anime365Provider extends RequestProvider {
public static baseURL = 'https://smotret-anime-365.ru/api';
public static cachePrefix = 'anime-365-cache-v';
public static cacheVersion = 1;
public static cachedSeries: Map<string, CachedSeries> = new Map();

public static cachedSeriesReady: Promise<void> = storage.get('cachedSeries')
.then((storeData?: Map<string, CachedSeries>) => {
if (storeData) {
Anime365Provider.cachedSeries = storeData;
}
});


public static async request<T>(
url: string,
options: RequestInit & { errorMessage: string },
): Promise<T> {
const isSeriesRequest = /\/api\/series\//.test(url);
if (isSeriesRequest) {
await this.cachedSeriesReady;
}

if (isSeriesRequest && this.cachedSeries.has(url)) {
const cache = this.cachedSeries.get(url);
if (cache && cache.maxAge && cache.maxAge > Date.now()) {
// @ts-ignore
return cache.resp as T;
}
}

try {
const resp = await super.request<T>(url, options);

/**
* Если текущий запрос — это запрос к списку серий
* Запустить процесс кэширования
*/
if (isSeriesRequest) {
// @ts-ignore
const SeriesCollection = resp as anime365.api.SeriesCollection;

/**
* Если список серий не пуст
*/
if (SeriesCollection
&& SeriesCollection.data[0]
&& SeriesCollection.data[0].episodes
&& SeriesCollection.data[0].episodes.length > 0
) {
// По умолчанию кэшируем ответ на 24 часа
let maxAge = Date.now() + DAY;

// Определяем дату последней добавленной серии
const newestEpisodeDateTime = Math.max(
...SeriesCollection.data[0].episodes.map((e) => new Date(e.firstUploadedDateTime).getTime()),
);

// Если последняя серия была добавлена более двух недель назад
// увеличить срок кэширования до 7 дней
if (newestEpisodeDateTime && newestEpisodeDateTime < (Date.now() - DAY * 14)) {
maxAge = Date.now() + DAY * 7;
}

// Если последняя серия была добавлена более 30 дней назад
// увеличить срок кэширования до 30 дней
if (newestEpisodeDateTime && newestEpisodeDateTime < (Date.now() - DAY * 30)) {
maxAge = Date.now() + DAY * 30;
}

this.cachedSeries.set(url, {resp: SeriesCollection, maxAge});
if (this.cachedSeries.size > 5) {
this.cachedSeries = new Map([...this.cachedSeries.entries()].splice(-5));
}
storage.set('cachedSeries', this.cachedSeries);
}

}

return resp;
} catch (e) {
throw e;
}
}

}

Anime365Provider.clearLegacyCaches();

0 comments on commit d200400

Please sign in to comment.