Skip to content

Commit

Permalink
chore: enhance common episodes merging
Browse files Browse the repository at this point in the history
  • Loading branch information
AXeL-dev committed Sep 14, 2021
1 parent 55084fd commit 7041b58
Showing 1 changed file with 45 additions and 31 deletions.
76 changes: 45 additions & 31 deletions src/app/modules/popup/main/main.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,37 +97,7 @@ export class MainComponent implements OnInit, OnDestroy {
}
// Merge common episodes
if (this.settings.mergeCommonEpisodes) {
const results: (Episode|EpisodeRange)[] = [];
const treatedEpisodes: {[key: string]: number[]} = {}; // key == anime title, value == episodes number
let index: number = 0;
for (let episode of this.episodes as Episode[]) {
const treatedEpisodesTitles = Object.keys(treatedEpisodes);
const foundTitle = treatedEpisodesTitles.find((title: string) => isSimilar(title, episode.anime.title, this.settings.episodeSimilarityDegree, true));
if (foundTitle && treatedEpisodes[foundTitle].indexOf(episode.number) !== -1) { // if episode already treated
continue; // go to next episode
}
const remainingEpisodes = (this.episodes as Episode[]).slice(index);
const range: Episode[] = remainingEpisodes.filter((e: Episode) => {
return isSimilar(e.anime.title, episode.anime.title, this.settings.episodeSimilarityDegree, true) &&
(!this.settings.displayEpisodesDayByDay || sameDates(e.releaseDate, episode.releaseDate, today()));
}).sort((a: Episode, b: Episode) => a.number - b.number);
if (range.length > 1) {
const episodeRange = new EpisodeRange(range, episode.releaseDate);
results.push(episodeRange);
treatedEpisodes[episode.anime.title] = [
...(treatedEpisodes[episode.anime.title] || []), // keep old numbers
...range.map((e: Episode) => e.number) // add new range numbers
];
// Update selected episode range
if (this.selectedEpisodeRange?.first.anime.title === episodeRange.first.anime.title) {
this.selectedEpisodeRange = episodeRange;
}
} else {
results.push(episode);
}
index++;
}
this.episodes = results;
this.episodes = this.mergeCommonEpisodes(this.episodes as Episode[]);
}
// Filter by days
if (this.settings.displayEpisodesDayByDay) {
Expand All @@ -143,6 +113,50 @@ export class MainComponent implements OnInit, OnDestroy {
}
}

private mergeCommonEpisodes(episodes: Episode[]) {
const results: (Episode|EpisodeRange)[] = [];
const treatedEpisodes: {[key: string]: number[]} = {}; // key == anime title, value == episodes number
let remainingEpisodes: Episode[] = episodes.slice();
// Loop over all episodes
for (let episode of episodes) {
const treatedEpisodesTitles = Object.keys(treatedEpisodes);
const foundTitle = treatedEpisodesTitles.find((title: string) =>
isSimilar(title, episode.anime.title, this.settings.episodeSimilarityDegree, true)
);
if (foundTitle && treatedEpisodes[foundTitle].indexOf(episode.number) !== -1) { // if episode already treated
continue; // go to next episode
}
// Try merging common episodes
const range: Episode[] = remainingEpisodes.filter((e: Episode) => {
return isSimilar(e.anime.title, episode.anime.title, this.settings.episodeSimilarityDegree, true) &&
(!this.settings.displayEpisodesDayByDay || sameDates(e.releaseDate, episode.releaseDate, today()));
});
// Update treated & remaining episodes
treatedEpisodes[episode.anime.title] = [
...(treatedEpisodes[episode.anime.title] || []), // keep old numbers
...range.map((e: Episode) => e.number) // add new range numbers
];
remainingEpisodes = remainingEpisodes.filter((re: Episode) =>
range.findIndex((e: Episode) => e.anime.title === re.anime.title && e.number === re.number) === -1
);
// Save results
if (range.length > 1) {
const episodeRange = new EpisodeRange(
range.sort((a: Episode, b: Episode) => a.number - b.number),
episode.releaseDate
);
results.push(episodeRange);
// Update selected episode range
if (this.selectedEpisodeRange?.first.anime.title === episodeRange.first.anime.title) {
this.selectedEpisodeRange = episodeRange;
}
} else {
results.push(episode);
}
}
return results;
}

openStreamLinksDialog(episode: Episode|EpisodeRange) {
if (episode instanceof EpisodeRange) {
this.selectedEpisodeRange = episode as EpisodeRange;
Expand Down

0 comments on commit 7041b58

Please sign in to comment.