Skip to content

Commit

Permalink
feat(#28): chapter volume mapping
Browse files Browse the repository at this point in the history
  • Loading branch information
infanf committed Mar 18, 2023
1 parent 7d8ccef commit 705de87
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 15 deletions.
26 changes: 21 additions & 5 deletions frontend/src/app/manga/bookshelf/bookshelf.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { ListManga, MyMangaUpdate } from '@models/manga';
import { DialogueService } from '@services/dialogue.service';
import { GlobalService } from '@services/global.service';
import { MangaService } from '@services/manga/manga.service';
import { MangadexService } from '@services/manga/mangadex.service';
import { SettingsService } from '@services/settings.service';

@Component({
Expand Down Expand Up @@ -55,6 +56,7 @@ export class BookshelfComponent {

constructor(
private mangaservice: MangaService,
private mangadex: MangadexService,
private settings: SettingsService,
private glob: GlobalService,
private dialogue: DialogueService,
Expand All @@ -66,11 +68,19 @@ export class BookshelfComponent {
if (!manga || manga.busy) return;
manga.busy = true;
const currentVolume = manga.list_status?.num_volumes_read || 0;
const currentChapter = manga.list_status?.num_chapters_read || 0;
const data = {
num_volumes_read: currentVolume + 1,
} as Partial<MyMangaUpdate>;
let completed = false;
if (manga.node.num_chapters && manga.node.num_volumes) {
const mdId = manga.my_extension?.mdId;
data.num_volumes_read = currentVolume + 1;
if (mdId) {
const chapters = await this.mangadex.getChapter(mdId, currentVolume + 1);
if (chapters?.last) {
data.num_chapters_read = Math.max(chapters.last, currentChapter);
}
}
if (manga.node.num_chapters && manga.node.num_volumes && !data.num_chapters_read) {
data.num_chapters_read = Math.max(
manga.list_status?.num_chapters_read || 0,
Math.floor(((currentVolume + 1) / manga.node.num_volumes) * manga.node.num_chapters),
Expand All @@ -82,7 +92,6 @@ export class BookshelfComponent {
const { DateTime } = require('luxon') as typeof import('luxon');
data.finish_date = DateTime.local().toISODate();
if (manga.node.num_chapters) data.num_chapters_read = manga.node.num_chapters;
completed = true;
if (!manga.list_status?.score) {
const myScore = await this.dialogue.rating(manga.node.title);
if (myScore > 0 && myScore <= 10) data.score = myScore;
Expand Down Expand Up @@ -110,17 +119,24 @@ export class BookshelfComponent {
if (!manga || manga.busy) return;
manga.busy = true;
const currentChapter = manga.list_status?.num_chapters_read || 0;
const currentVolume = manga.list_status?.num_volumes_read || 0;
const data = {
num_chapters_read: currentChapter + 1,
} as Partial<MyMangaUpdate>;
let completed = false;
const mdId = manga.my_extension?.mdId;
data.num_chapters_read = currentChapter + 1;
if (mdId) {
const volume = await this.mangadex.getVolume(mdId, currentChapter + 1);
if (volume?.last) {
data.num_volumes_read = Math.max(volume.volume, currentVolume);
}
}
if (currentChapter + 1 === manga.node.num_chapters) {
this.glob.busy();
data.status = 'completed';
const { DateTime } = require('luxon') as typeof import('luxon');
data.finish_date = DateTime.local().toISODate();
if (manga.node.num_volumes) data.num_volumes_read = manga.node.num_volumes;
completed = true;
if (!manga.list_status?.score) {
const myScore = await this.dialogue.rating(manga.node.title);
if (myScore > 0 && myScore <= 10) data.score = myScore;
Expand Down
22 changes: 19 additions & 3 deletions frontend/src/app/manga/details/details.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -404,13 +404,30 @@ export class MangaDetailsComponent implements OnInit {
const currentChapter = this.manga.my_list_status?.num_chapters_read || 0;
const currentVolume = this.manga.my_list_status?.num_volumes_read || 0;
const data = {} as Partial<MyMangaUpdate>;
const mdId = this.manga.my_extension?.mdId;
if (type === 'volume') {
data.num_volumes_read = currentVolume + 1;
if (mdId) {
const chapters = await this.mangadex.getChapter(mdId, currentVolume + 1);
if (chapters?.last) {
data.num_chapters_read = Math.max(chapters.last, currentChapter);
}
}
} else {
data.num_chapters_read = currentChapter + 1;
if (mdId) {
const volume = await this.mangadex.getVolume(mdId, currentChapter + 1);
if (volume?.last) {
data.num_volumes_read = Math.max(volume.volume, currentVolume);
}
}
}
let completed = false;
if (type === 'volume' && this.manga.num_chapters && this.manga.num_volumes) {
if (
type === 'volume' &&
this.manga.num_chapters &&
this.manga.num_volumes &&
!data.num_chapters_read
) {
data.num_chapters_read = Math.max(
this.manga.my_list_status?.num_chapters_read || 0,
Math.floor(((currentVolume + 1) / this.manga.num_volumes) * this.manga.num_chapters),
Expand All @@ -429,7 +446,6 @@ export class MangaDetailsComponent implements OnInit {
}
if (this.manga.num_chapters) data.num_chapters_read = this.manga.num_chapters;
if (this.manga.num_volumes) data.num_volumes_read = this.manga.num_volumes;
completed = true;
if (!this.manga.my_list_status?.score) {
const myScore = await this.dialogue.rating(this.manga.title);
if (myScore > 0 && myScore <= 10) data.score = myScore;
Expand Down
57 changes: 50 additions & 7 deletions frontend/src/app/services/manga/mangadex.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,41 @@ export class MangadexService {
return statistics;
}

// async getMangaChapters(mangaId?: UUID) {
// if (!mangaId) return;
// const { data: chapters } = await this.cache.fetch<{ data: {} }>(
// `${this.baseUrl}/manga/${mangaId}/aggregate`,
// );
// return chapters;
// }
async getMangaVolumes(mangaId?: UUID) {
if (!mangaId) return;
const { volumes } = await this.cache.fetch<{ volumes: { [volume: string]: Volume } }>(
`${this.baseUrl}/manga/${mangaId}/aggregate`,
);
return volumes;
}

async getVolume(mangaId: UUID, chapter: number) {
const volumes = await this.getMangaVolumes(mangaId);
const data = { volume: 0, last: false };
for (const volumeNo in volumes) {
if (!volumes.hasOwnProperty(volumeNo)) continue;
const volume = volumes[volumeNo];
if (!(String(chapter) in volume.chapters)) continue;
data.volume = Number(volumeNo);
const chapterNos = Object.keys(volume.chapters).map(Number);
data.last = Math.max(...chapterNos) === chapter;
return data;
}
return;
}

async getChapter(mangaId: UUID, volume: number) {
const volumes = await this.getMangaVolumes(mangaId);
const chapters = { first: 0, last: 0 };
if (!volumes) return;
if (!(String(volume) in volumes)) return;
for (const chapterNo in volumes[String(volume)].chapters) {
if (!volumes[String(volume)].chapters.hasOwnProperty(chapterNo)) continue;
chapters.first = Math.min(chapters.first, Number(chapterNo));
chapters.last = Math.max(chapters.last, Number(chapterNo));
}
return chapters;
}
}

interface Manga {
Expand Down Expand Up @@ -139,3 +167,18 @@ interface Statistics {
follows: number;
};
}

interface Volume {
volume: string;
count: number;
chapters: {
[chapterNo: string]: Chapter;
};
}

interface Chapter {
id: UUID;
chapter: '156';
others: UUID[];
count: number;
}

0 comments on commit 705de87

Please sign in to comment.