Skip to content

Commit

Permalink
chore: Update compatible version to 0.2.5
Browse files Browse the repository at this point in the history
  • Loading branch information
nepsyn committed Jan 5, 2025
1 parent d282aef commit 1defdfb
Show file tree
Hide file tree
Showing 4 changed files with 466 additions and 466 deletions.
111 changes: 45 additions & 66 deletions mikan.parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,20 @@ import {
ApiPaginationResultDto,
Episode,
File,
getMinaPlayPluginParserMetadata,
MinaPlayPluginHooks,
MinaPlayPluginParser,
MinaPlayPluginSource,
MinaPlayPluginSourceCalendarDay,
MinaPlayPluginSourceEpisode,
MinaPlayPluginSourceSeries,
PluginService,
PluginSourceParser,
Rule,
RuleEntryValidatorContext,
RuleFileDescriberContext,
RuleFileDescriptor,
} from '@minaplay/server';
import { JSDOM } from 'jsdom';
import { BgmEpisode, BgmSubject } from './bangumi.interface.js';
import aniep from 'aniep';
import { InjectRepository } from '@nestjs/typeorm';
import { Like, Repository } from 'typeorm';
import { FeedEntry } from '@extractus/feed-extractor';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
Expand All @@ -27,9 +24,12 @@ import fetch from 'node-fetch';
import { HttpsProxyAgent } from 'https-proxy-agent';
import { ConfigService } from '@nestjs/config';
import process from 'node:process';
import { Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';

@MinaPlayPluginParser()
export class MikanParser implements PluginSourceParser, MinaPlayPluginHooks {
private cache = new Map<string | number, Set<string>>();
agent?: HttpsProxyAgent<string>;

public static CONFIG_PATH = path.join(path.dirname(fileURLToPath(import.meta.url)), 'mikan.json');
Expand Down Expand Up @@ -68,20 +68,6 @@ export class MikanParser implements PluginSourceParser, MinaPlayPluginHooks {
this.imageProxy = config.imageProxy;
}
} catch {}

const rules = await this.ruleRepository.findBy({
parserMeta: Like(`mikan-${MikanParser.name}-%`),
});
const tasks = rules.map((rule) =>
(async () => {
const id = rule.parserMeta.match(/(\d+)/g)?.[0];
if (id) {
const series = await this.getSeriesById(id);
this.initDelegateForSeries(series);
}
})(),
);
await Promise.allSettled(tasks);
}

private getImageUrl(target: string) {
Expand All @@ -91,9 +77,7 @@ export class MikanParser implements PluginSourceParser, MinaPlayPluginHooks {
}

constructor(
@InjectRepository(Episode) private episodeRepository: Repository<Episode>,
@InjectRepository(Rule) private ruleRepository: Repository<Rule>,
private pluginService: PluginService,
@InjectRepository(Episode) private episodeRepo: Repository<Episode>,
configService: ConfigService,
) {
const proxy = configService.get('APP_HTTP_PROXY') || process.env.HTTP_PROXY;
Expand Down Expand Up @@ -249,53 +233,48 @@ export class MikanParser implements PluginSourceParser, MinaPlayPluginHooks {
};
}

private initDelegateForSeries(series: MinaPlayPluginSourceSeries) {
const repo = this.episodeRepository;

@MinaPlayPluginParser({
name: `bangumi-${series.id}`,
})
class MikanParserDelegate implements PluginSourceParser {
private cache: string[] = [];

async validateFeedEntry(entry: FeedEntry): Promise<boolean> {
let no = aniep(entry.title);
no = Array.isArray(no) ? undefined : String(no).padStart(2, '0');
if (typeof no === 'string' && !this.cache.includes(no)) {
this.cache.push(no);
const episode = await repo.findOneBy({
no,
series: { name: series.name, season: series.season },
});
return !episode;
}
return false;
}
async buildRuleCodeOfSeries(series: MinaPlayPluginSourceSeries): Promise<string> {
return (
`export default {` +
` validate: 'mikan:${MikanParser.name}',` +
` describe: 'mikan:${MikanParser.name}',` +
` meta: { name: ${JSON.stringify(series.name)}, session: ${JSON.stringify(series.season)}, id: ${JSON.stringify(series.id)} } }`
);
}

describeDownloadItem(entry: FeedEntry, file: File, _: File[]): RuleFileDescriptor {
return {
series: {
name: series.name,
season: series.season,
},
episode: {
title: file.name,
no: String(aniep(entry.title)),
pubAt: entry.published && new Date(entry.published),
},
overwriteEpisode: true,
};
}
async validateFeedEntry(entry: FeedEntry, ctx: RuleEntryValidatorContext): Promise<boolean> {
let no = aniep(entry.title);
no = Array.isArray(no) ? undefined : String(no).padStart(2, '0');
const id: string | number = ctx.meta['id'];
if (!id || !ctx.meta['name']) {
return false;
}

this.pluginService.getControlById('mikan').parserMap.set(`bangumi-${series.id}`, {
...getMinaPlayPluginParserMetadata(MikanParserDelegate),
service: new MikanParserDelegate(),
});
if (!this.cache.has(id)) {
this.cache.set(id, new Set());
}
if (typeof no === 'string' && !this.cache.get(id).has(no)) {
this.cache.get(id).add(no);
const episode = await this.episodeRepo.findOneBy({
no,
series: { name: ctx.meta['name'], ...(ctx.meta['session'] ? { session: ctx.meta['session'] } : undefined) },
});
return !episode;
}
return false;
}

async buildRuleCodeOfSeries(series: MinaPlayPluginSourceSeries): Promise<string> {
this.initDelegateForSeries(series);
return `export default { validate: 'mikan:bangumi-${series.id}', describe: 'mikan:bangumi-${series.id}' }`;
describeDownloadItem(entry: FeedEntry, file: File, ctx: RuleFileDescriberContext): RuleFileDescriptor {
return {
series: {
name: ctx.meta['name'],
season: ctx.meta['session'],
},
episode: {
title: file.name,
no: String(aniep(entry.title)),
pubAt: entry.published && new Date(entry.published),
},
overwriteEpisode: true,
};
}
}
6 changes: 3 additions & 3 deletions mikan.plugin.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Episode, MinaPlayPlugin, Rule } from '@minaplay/server';
import { Episode, MinaPlayPlugin } from '@minaplay/server';
import { MikanCommand } from './mikan.command.js';
import { MikanParser } from './mikan.parser.js';
import { TypeOrmModule } from '@nestjs/typeorm';
Expand All @@ -10,12 +10,12 @@ const icon =
id: 'mikan',
icon,
version: '1.0.1',
supportVersion: '^0.2.2',
supportVersion: '^0.2.5',
description: 'Mikan support in MinaPlay',
author: 'MinaPlay',
repo: 'https://github.com/nepsyn/minaplay-plugin-mikan',
license: 'AGPL-3.0',
imports: [TypeOrmModule.forFeature([Episode, Rule])],
imports: [TypeOrmModule.forFeature([Episode])],
providers: [MikanCommand, MikanParser],
})
export class MikanPlugin {}
Loading

0 comments on commit 1defdfb

Please sign in to comment.