Files
seanime-docker/seanime-2.9.10/internal/hook/hooks.go
2025-09-20 14:08:38 +01:00

1120 lines
38 KiB
Go

package hook
import (
"seanime/internal/hook_resolver"
"seanime/internal/util"
"github.com/rs/zerolog"
)
// Manager manages all hooks in the application
type Manager interface {
// AniList events
OnGetAnime() *Hook[hook_resolver.Resolver]
OnGetAnimeDetails() *Hook[hook_resolver.Resolver]
OnGetManga() *Hook[hook_resolver.Resolver]
OnGetMangaDetails() *Hook[hook_resolver.Resolver]
OnGetAnimeCollection() *Hook[hook_resolver.Resolver]
OnGetMangaCollection() *Hook[hook_resolver.Resolver]
OnGetCachedAnimeCollection() *Hook[hook_resolver.Resolver]
OnGetCachedMangaCollection() *Hook[hook_resolver.Resolver]
OnGetRawAnimeCollection() *Hook[hook_resolver.Resolver]
OnGetRawMangaCollection() *Hook[hook_resolver.Resolver]
OnGetCachedRawAnimeCollection() *Hook[hook_resolver.Resolver]
OnGetCachedRawMangaCollection() *Hook[hook_resolver.Resolver]
OnGetStudioDetails() *Hook[hook_resolver.Resolver]
OnPreUpdateEntry() *Hook[hook_resolver.Resolver]
OnPostUpdateEntry() *Hook[hook_resolver.Resolver]
OnPreUpdateEntryProgress() *Hook[hook_resolver.Resolver]
OnPostUpdateEntryProgress() *Hook[hook_resolver.Resolver]
OnPreUpdateEntryRepeat() *Hook[hook_resolver.Resolver]
OnPostUpdateEntryRepeat() *Hook[hook_resolver.Resolver]
// Anime library events
OnAnimeEntryRequested() *Hook[hook_resolver.Resolver]
OnAnimeEntry() *Hook[hook_resolver.Resolver]
OnAnimeEntryFillerHydration() *Hook[hook_resolver.Resolver]
OnAnimeEntryLibraryDataRequested() *Hook[hook_resolver.Resolver]
OnAnimeEntryLibraryData() *Hook[hook_resolver.Resolver]
OnAnimeEntryManualMatchBeforeSave() *Hook[hook_resolver.Resolver]
OnMissingEpisodesRequested() *Hook[hook_resolver.Resolver]
OnMissingEpisodes() *Hook[hook_resolver.Resolver]
OnAnimeEntryDownloadInfoRequested() *Hook[hook_resolver.Resolver]
OnAnimeEntryDownloadInfo() *Hook[hook_resolver.Resolver]
OnAnimEpisodeCollectionRequested() *Hook[hook_resolver.Resolver]
OnAnimeEpisodeCollection() *Hook[hook_resolver.Resolver]
// Anime library collection events
OnAnimeLibraryCollectionRequested() *Hook[hook_resolver.Resolver]
OnAnimeLibraryCollection() *Hook[hook_resolver.Resolver]
OnAnimeLibraryStreamCollectionRequested() *Hook[hook_resolver.Resolver]
OnAnimeLibraryStreamCollection() *Hook[hook_resolver.Resolver]
OnAnimeScheduleItems() *Hook[hook_resolver.Resolver]
// Auto Downloader events
OnAutoDownloaderRunStarted() *Hook[hook_resolver.Resolver]
OnAutoDownloaderMatchVerified() *Hook[hook_resolver.Resolver]
OnAutoDownloaderSettingsUpdated() *Hook[hook_resolver.Resolver]
OnAutoDownloaderTorrentsFetched() *Hook[hook_resolver.Resolver]
OnAutoDownloaderBeforeDownloadTorrent() *Hook[hook_resolver.Resolver]
OnAutoDownloaderAfterDownloadTorrent() *Hook[hook_resolver.Resolver]
// Scanner events
OnScanStarted() *Hook[hook_resolver.Resolver]
OnScanFilePathsRetrieved() *Hook[hook_resolver.Resolver]
OnScanLocalFilesParsed() *Hook[hook_resolver.Resolver]
OnScanCompleted() *Hook[hook_resolver.Resolver]
OnScanMediaFetcherStarted() *Hook[hook_resolver.Resolver]
OnScanMediaFetcherCompleted() *Hook[hook_resolver.Resolver]
OnScanMatchingStarted() *Hook[hook_resolver.Resolver]
OnScanLocalFileMatched() *Hook[hook_resolver.Resolver]
OnScanMatchingCompleted() *Hook[hook_resolver.Resolver]
OnScanHydrationStarted() *Hook[hook_resolver.Resolver]
OnScanLocalFileHydrationStarted() *Hook[hook_resolver.Resolver]
OnScanLocalFileHydrated() *Hook[hook_resolver.Resolver]
// Anime metadata events
OnAnimeMetadataRequested() *Hook[hook_resolver.Resolver]
OnAnimeMetadata() *Hook[hook_resolver.Resolver]
OnAnimeEpisodeMetadataRequested() *Hook[hook_resolver.Resolver]
OnAnimeEpisodeMetadata() *Hook[hook_resolver.Resolver]
// Manga events
OnMangaEntryRequested() *Hook[hook_resolver.Resolver]
OnMangaEntry() *Hook[hook_resolver.Resolver]
OnMangaLibraryCollectionRequested() *Hook[hook_resolver.Resolver]
OnMangaLibraryCollection() *Hook[hook_resolver.Resolver]
OnMangaDownloadedChapterContainersRequested() *Hook[hook_resolver.Resolver]
OnMangaDownloadedChapterContainers() *Hook[hook_resolver.Resolver]
OnMangaLatestChapterNumbersMap() *Hook[hook_resolver.Resolver]
OnMangaDownloadMap() *Hook[hook_resolver.Resolver]
OnMangaChapterContainerRequested() *Hook[hook_resolver.Resolver]
OnMangaChapterContainer() *Hook[hook_resolver.Resolver]
// Playback events
OnLocalFilePlaybackRequested() *Hook[hook_resolver.Resolver]
OnPlaybackBeforeTracking() *Hook[hook_resolver.Resolver]
OnStreamPlaybackRequested() *Hook[hook_resolver.Resolver]
OnPlaybackLocalFileDetailsRequested() *Hook[hook_resolver.Resolver]
OnPlaybackStreamDetailsRequested() *Hook[hook_resolver.Resolver]
// Media player events
OnMediaPlayerLocalFileTrackingRequested() *Hook[hook_resolver.Resolver]
OnMediaPlayerStreamTrackingRequested() *Hook[hook_resolver.Resolver]
// Debrid events
OnDebridAutoSelectTorrentsFetched() *Hook[hook_resolver.Resolver]
OnDebridSendStreamToMediaPlayer() *Hook[hook_resolver.Resolver]
OnDebridLocalDownloadRequested() *Hook[hook_resolver.Resolver]
OnDebridSkipStreamCheck() *Hook[hook_resolver.Resolver]
// Torrent stream events
OnTorrentStreamAutoSelectTorrentsFetched() *Hook[hook_resolver.Resolver]
OnTorrentStreamSendStreamToMediaPlayer() *Hook[hook_resolver.Resolver]
// Continuity events
OnWatchHistoryItemRequested() *Hook[hook_resolver.Resolver]
OnWatchHistoryItemUpdated() *Hook[hook_resolver.Resolver]
OnWatchHistoryLocalFileEpisodeItemRequested() *Hook[hook_resolver.Resolver]
OnWatchHistoryStreamEpisodeItemRequested() *Hook[hook_resolver.Resolver]
// Discord RPC events
OnDiscordPresenceAnimeActivityRequested() *Hook[hook_resolver.Resolver]
OnDiscordPresenceMangaActivityRequested() *Hook[hook_resolver.Resolver]
OnDiscordPresenceClientClosed() *Hook[hook_resolver.Resolver]
// Anilist events
OnListMissedSequelsRequested() *Hook[hook_resolver.Resolver]
OnListMissedSequels() *Hook[hook_resolver.Resolver]
// Anizip events
OnAnizipMediaRequested() *Hook[hook_resolver.Resolver]
OnAnizipMedia() *Hook[hook_resolver.Resolver]
// Animap events
OnAnimapMediaRequested() *Hook[hook_resolver.Resolver]
OnAnimapMedia() *Hook[hook_resolver.Resolver]
// Filler manager
OnHydrateFillerDataRequested() *Hook[hook_resolver.Resolver]
OnHydrateOnlinestreamFillerDataRequested() *Hook[hook_resolver.Resolver]
OnHydrateEpisodeFillerDataRequested() *Hook[hook_resolver.Resolver]
}
type ManagerImpl struct {
logger *zerolog.Logger
// AniList events
onGetAnime *Hook[hook_resolver.Resolver]
onGetAnimeDetails *Hook[hook_resolver.Resolver]
onGetManga *Hook[hook_resolver.Resolver]
onGetMangaDetails *Hook[hook_resolver.Resolver]
onGetAnimeCollection *Hook[hook_resolver.Resolver]
onGetMangaCollection *Hook[hook_resolver.Resolver]
onGetCachedAnimeCollection *Hook[hook_resolver.Resolver]
onGetCachedMangaCollection *Hook[hook_resolver.Resolver]
onGetRawAnimeCollection *Hook[hook_resolver.Resolver]
onGetRawMangaCollection *Hook[hook_resolver.Resolver]
onGetCachedRawAnimeCollection *Hook[hook_resolver.Resolver]
onGetCachedRawMangaCollection *Hook[hook_resolver.Resolver]
onGetStudioDetails *Hook[hook_resolver.Resolver]
onPreUpdateEntry *Hook[hook_resolver.Resolver]
onPostUpdateEntry *Hook[hook_resolver.Resolver]
onPreUpdateEntryProgress *Hook[hook_resolver.Resolver]
onPostUpdateEntryProgress *Hook[hook_resolver.Resolver]
onPreUpdateEntryRepeat *Hook[hook_resolver.Resolver]
onPostUpdateEntryRepeat *Hook[hook_resolver.Resolver]
// Anime library events
onAnimeEntryRequested *Hook[hook_resolver.Resolver]
onAnimeEntry *Hook[hook_resolver.Resolver]
onAnimeEntryFillerHydration *Hook[hook_resolver.Resolver]
onAnimeEntryLibraryDataRequested *Hook[hook_resolver.Resolver]
onAnimeEntryLibraryData *Hook[hook_resolver.Resolver]
onAnimeEntryManualMatchBeforeSave *Hook[hook_resolver.Resolver]
onMissingEpisodesRequested *Hook[hook_resolver.Resolver]
onMissingEpisodes *Hook[hook_resolver.Resolver]
onAnimeEntryDownloadInfoRequested *Hook[hook_resolver.Resolver]
onAnimeEntryDownloadInfo *Hook[hook_resolver.Resolver]
onAnimeEpisodeCollectionRequested *Hook[hook_resolver.Resolver]
onAnimeEpisodeCollection *Hook[hook_resolver.Resolver]
// Anime library collection events
onAnimeLibraryCollectionRequested *Hook[hook_resolver.Resolver]
onAnimeLibraryCollection *Hook[hook_resolver.Resolver]
onAnimeLibraryStreamCollectionRequested *Hook[hook_resolver.Resolver]
onAnimeLibraryStreamCollection *Hook[hook_resolver.Resolver]
onAnimeScheduleItems *Hook[hook_resolver.Resolver]
// Auto Downloader events
onAutoDownloaderMatchVerified *Hook[hook_resolver.Resolver]
onAutoDownloaderRunStarted *Hook[hook_resolver.Resolver]
onAutoDownloaderRunCompleted *Hook[hook_resolver.Resolver]
onAutoDownloaderSettingsUpdated *Hook[hook_resolver.Resolver]
onAutoDownloaderTorrentsFetched *Hook[hook_resolver.Resolver]
onAutoDownloaderBeforeDownloadTorrent *Hook[hook_resolver.Resolver]
onAutoDownloaderAfterDownloadTorrent *Hook[hook_resolver.Resolver]
// Scanner events
onScanStarted *Hook[hook_resolver.Resolver]
onScanFilePathsRetrieved *Hook[hook_resolver.Resolver]
onScanLocalFilesParsed *Hook[hook_resolver.Resolver]
onScanCompleted *Hook[hook_resolver.Resolver]
onScanMediaFetcherStarted *Hook[hook_resolver.Resolver]
onScanMediaFetcherCompleted *Hook[hook_resolver.Resolver]
onScanMatchingStarted *Hook[hook_resolver.Resolver]
onScanLocalFileMatched *Hook[hook_resolver.Resolver]
onScanMatchingCompleted *Hook[hook_resolver.Resolver]
onScanHydrationStarted *Hook[hook_resolver.Resolver]
onScanLocalFileHydrationStarted *Hook[hook_resolver.Resolver]
onScanLocalFileHydrated *Hook[hook_resolver.Resolver]
// Anime metadata events
onAnimeMetadataRequested *Hook[hook_resolver.Resolver]
onAnimeMetadata *Hook[hook_resolver.Resolver]
onAnimeEpisodeMetadataRequested *Hook[hook_resolver.Resolver]
onAnimeEpisodeMetadata *Hook[hook_resolver.Resolver]
// Manga events
onMangaEntryRequested *Hook[hook_resolver.Resolver]
onMangaEntry *Hook[hook_resolver.Resolver]
onMangaLibraryCollectionRequested *Hook[hook_resolver.Resolver]
onMangaLibraryCollection *Hook[hook_resolver.Resolver]
onMangaDownloadedChapterContainersRequested *Hook[hook_resolver.Resolver]
onMangaDownloadedChapterContainers *Hook[hook_resolver.Resolver]
onMangaLatestChapterNumbersMap *Hook[hook_resolver.Resolver]
onMangaDownloadMap *Hook[hook_resolver.Resolver]
onMangaChapterContainerRequested *Hook[hook_resolver.Resolver]
onMangaChapterContainer *Hook[hook_resolver.Resolver]
// Playback events
onLocalFilePlaybackRequested *Hook[hook_resolver.Resolver]
onPlaybackBeforeTracking *Hook[hook_resolver.Resolver]
onStreamPlaybackRequested *Hook[hook_resolver.Resolver]
onPlaybackLocalFileDetailsRequested *Hook[hook_resolver.Resolver]
onPlaybackStreamDetailsRequested *Hook[hook_resolver.Resolver]
// Media player events
onMediaPlayerLocalFileTrackingRequested *Hook[hook_resolver.Resolver]
onMediaPlayerStreamTrackingRequested *Hook[hook_resolver.Resolver]
// Debrid events
onDebridAutoSelectTorrentsFetched *Hook[hook_resolver.Resolver]
onDebridSendStreamToMediaPlayer *Hook[hook_resolver.Resolver]
onDebridLocalDownloadRequested *Hook[hook_resolver.Resolver]
onDebridSkipStreamCheck *Hook[hook_resolver.Resolver]
// Torrent stream events
onTorrentStreamAutoSelectTorrentsFetched *Hook[hook_resolver.Resolver]
onTorrentStreamSendStreamToMediaPlayer *Hook[hook_resolver.Resolver]
// Continuity events
onWatchHistoryItemRequested *Hook[hook_resolver.Resolver]
onWatchHistoryItemUpdated *Hook[hook_resolver.Resolver]
onWatchHistoryLocalFileEpisodeItemRequested *Hook[hook_resolver.Resolver]
onWatchHistoryStreamEpisodeItemRequested *Hook[hook_resolver.Resolver]
// Discord RPC events
onDiscordPresenceAnimeActivityRequested *Hook[hook_resolver.Resolver]
onDiscordPresenceMangaActivityRequested *Hook[hook_resolver.Resolver]
onDiscordPresenceClientClosed *Hook[hook_resolver.Resolver]
// Anilist events
onListMissedSequelsRequested *Hook[hook_resolver.Resolver]
onListMissedSequels *Hook[hook_resolver.Resolver]
// Anizip events
onAnizipMediaRequested *Hook[hook_resolver.Resolver]
onAnizipMedia *Hook[hook_resolver.Resolver]
// Animap events
onAnimapMediaRequested *Hook[hook_resolver.Resolver]
onAnimapMedia *Hook[hook_resolver.Resolver]
// Filler manager events
onHydrateFillerDataRequested *Hook[hook_resolver.Resolver]
onHydrateOnlinestreamFillerDataRequested *Hook[hook_resolver.Resolver]
onHydrateEpisodeFillerDataRequested *Hook[hook_resolver.Resolver]
}
type NewHookManagerOptions struct {
Logger *zerolog.Logger
}
var GlobalHookManager = NewHookManager(NewHookManagerOptions{
Logger: util.NewLogger(),
})
func SetGlobalHookManager(manager Manager) {
GlobalHookManager = manager
}
func NewHookManager(opts NewHookManagerOptions) Manager {
ret := &ManagerImpl{
logger: opts.Logger,
}
ret.initHooks()
return ret
}
func (m *ManagerImpl) initHooks() {
// AniList events
m.onGetAnime = &Hook[hook_resolver.Resolver]{}
m.onGetAnimeDetails = &Hook[hook_resolver.Resolver]{}
m.onGetManga = &Hook[hook_resolver.Resolver]{}
m.onGetMangaDetails = &Hook[hook_resolver.Resolver]{}
m.onGetAnimeCollection = &Hook[hook_resolver.Resolver]{}
m.onGetMangaCollection = &Hook[hook_resolver.Resolver]{}
m.onGetCachedAnimeCollection = &Hook[hook_resolver.Resolver]{}
m.onGetCachedMangaCollection = &Hook[hook_resolver.Resolver]{}
m.onGetRawAnimeCollection = &Hook[hook_resolver.Resolver]{}
m.onGetRawMangaCollection = &Hook[hook_resolver.Resolver]{}
m.onGetCachedRawAnimeCollection = &Hook[hook_resolver.Resolver]{}
m.onGetCachedRawMangaCollection = &Hook[hook_resolver.Resolver]{}
m.onGetStudioDetails = &Hook[hook_resolver.Resolver]{}
m.onPreUpdateEntry = &Hook[hook_resolver.Resolver]{}
m.onPostUpdateEntry = &Hook[hook_resolver.Resolver]{}
m.onPreUpdateEntryProgress = &Hook[hook_resolver.Resolver]{}
m.onPostUpdateEntryProgress = &Hook[hook_resolver.Resolver]{}
m.onPreUpdateEntryRepeat = &Hook[hook_resolver.Resolver]{}
m.onPostUpdateEntryRepeat = &Hook[hook_resolver.Resolver]{}
// Anime library events
m.onAnimeEntryRequested = &Hook[hook_resolver.Resolver]{}
m.onAnimeEntry = &Hook[hook_resolver.Resolver]{}
m.onAnimeEntryFillerHydration = &Hook[hook_resolver.Resolver]{}
m.onAnimeEntryLibraryDataRequested = &Hook[hook_resolver.Resolver]{}
m.onAnimeEntryLibraryData = &Hook[hook_resolver.Resolver]{}
m.onAnimeEntryManualMatchBeforeSave = &Hook[hook_resolver.Resolver]{}
m.onMissingEpisodesRequested = &Hook[hook_resolver.Resolver]{}
m.onMissingEpisodes = &Hook[hook_resolver.Resolver]{}
m.onAnimeEntryDownloadInfoRequested = &Hook[hook_resolver.Resolver]{}
m.onAnimeEntryDownloadInfo = &Hook[hook_resolver.Resolver]{}
m.onAnimeEpisodeCollectionRequested = &Hook[hook_resolver.Resolver]{}
m.onAnimeEpisodeCollection = &Hook[hook_resolver.Resolver]{}
// Anime library collection events
m.onAnimeLibraryCollectionRequested = &Hook[hook_resolver.Resolver]{}
m.onAnimeLibraryCollection = &Hook[hook_resolver.Resolver]{}
m.onAnimeLibraryStreamCollectionRequested = &Hook[hook_resolver.Resolver]{}
m.onAnimeLibraryStreamCollection = &Hook[hook_resolver.Resolver]{}
m.onAnimeScheduleItems = &Hook[hook_resolver.Resolver]{}
// Auto Downloader events
m.onAutoDownloaderMatchVerified = &Hook[hook_resolver.Resolver]{}
m.onAutoDownloaderRunStarted = &Hook[hook_resolver.Resolver]{}
m.onAutoDownloaderRunCompleted = &Hook[hook_resolver.Resolver]{}
m.onAutoDownloaderSettingsUpdated = &Hook[hook_resolver.Resolver]{}
m.onAutoDownloaderTorrentsFetched = &Hook[hook_resolver.Resolver]{}
m.onAutoDownloaderBeforeDownloadTorrent = &Hook[hook_resolver.Resolver]{}
m.onAutoDownloaderAfterDownloadTorrent = &Hook[hook_resolver.Resolver]{}
// Scanner events
m.onScanStarted = &Hook[hook_resolver.Resolver]{}
m.onScanFilePathsRetrieved = &Hook[hook_resolver.Resolver]{}
m.onScanLocalFilesParsed = &Hook[hook_resolver.Resolver]{}
m.onScanCompleted = &Hook[hook_resolver.Resolver]{}
m.onScanMediaFetcherStarted = &Hook[hook_resolver.Resolver]{}
m.onScanMediaFetcherCompleted = &Hook[hook_resolver.Resolver]{}
m.onScanMatchingStarted = &Hook[hook_resolver.Resolver]{}
m.onScanLocalFileMatched = &Hook[hook_resolver.Resolver]{}
m.onScanMatchingCompleted = &Hook[hook_resolver.Resolver]{}
m.onScanHydrationStarted = &Hook[hook_resolver.Resolver]{}
m.onScanLocalFileHydrationStarted = &Hook[hook_resolver.Resolver]{}
m.onScanLocalFileHydrated = &Hook[hook_resolver.Resolver]{}
// Anime metadata events
m.onAnimeMetadataRequested = &Hook[hook_resolver.Resolver]{}
m.onAnimeMetadata = &Hook[hook_resolver.Resolver]{}
m.onAnimeEpisodeMetadataRequested = &Hook[hook_resolver.Resolver]{}
m.onAnimeEpisodeMetadata = &Hook[hook_resolver.Resolver]{}
// Manga events
m.onMangaEntryRequested = &Hook[hook_resolver.Resolver]{}
m.onMangaEntry = &Hook[hook_resolver.Resolver]{}
m.onMangaLibraryCollectionRequested = &Hook[hook_resolver.Resolver]{}
m.onMangaLibraryCollection = &Hook[hook_resolver.Resolver]{}
m.onMangaDownloadedChapterContainersRequested = &Hook[hook_resolver.Resolver]{}
m.onMangaDownloadedChapterContainers = &Hook[hook_resolver.Resolver]{}
m.onMangaLatestChapterNumbersMap = &Hook[hook_resolver.Resolver]{}
m.onMangaDownloadMap = &Hook[hook_resolver.Resolver]{}
m.onMangaChapterContainerRequested = &Hook[hook_resolver.Resolver]{}
m.onMangaChapterContainer = &Hook[hook_resolver.Resolver]{}
// Playback events
m.onLocalFilePlaybackRequested = &Hook[hook_resolver.Resolver]{}
m.onPlaybackBeforeTracking = &Hook[hook_resolver.Resolver]{}
m.onStreamPlaybackRequested = &Hook[hook_resolver.Resolver]{}
m.onPlaybackLocalFileDetailsRequested = &Hook[hook_resolver.Resolver]{}
m.onPlaybackStreamDetailsRequested = &Hook[hook_resolver.Resolver]{}
// Media player events
m.onMediaPlayerLocalFileTrackingRequested = &Hook[hook_resolver.Resolver]{}
m.onMediaPlayerStreamTrackingRequested = &Hook[hook_resolver.Resolver]{}
// Debrid events
m.onDebridAutoSelectTorrentsFetched = &Hook[hook_resolver.Resolver]{}
m.onDebridSendStreamToMediaPlayer = &Hook[hook_resolver.Resolver]{}
m.onDebridLocalDownloadRequested = &Hook[hook_resolver.Resolver]{}
m.onDebridSkipStreamCheck = &Hook[hook_resolver.Resolver]{}
// Torrent stream events
m.onTorrentStreamAutoSelectTorrentsFetched = &Hook[hook_resolver.Resolver]{}
m.onTorrentStreamSendStreamToMediaPlayer = &Hook[hook_resolver.Resolver]{}
// Continuity events
m.onWatchHistoryItemRequested = &Hook[hook_resolver.Resolver]{}
m.onWatchHistoryItemUpdated = &Hook[hook_resolver.Resolver]{}
m.onWatchHistoryLocalFileEpisodeItemRequested = &Hook[hook_resolver.Resolver]{}
m.onWatchHistoryStreamEpisodeItemRequested = &Hook[hook_resolver.Resolver]{}
// Discord RPC events
m.onDiscordPresenceAnimeActivityRequested = &Hook[hook_resolver.Resolver]{}
m.onDiscordPresenceMangaActivityRequested = &Hook[hook_resolver.Resolver]{}
m.onDiscordPresenceClientClosed = &Hook[hook_resolver.Resolver]{}
// Anilist events
m.onListMissedSequelsRequested = &Hook[hook_resolver.Resolver]{}
m.onListMissedSequels = &Hook[hook_resolver.Resolver]{}
// Anizip events
m.onAnizipMediaRequested = &Hook[hook_resolver.Resolver]{}
m.onAnizipMedia = &Hook[hook_resolver.Resolver]{}
// Animap events
m.onAnimapMediaRequested = &Hook[hook_resolver.Resolver]{}
m.onAnimapMedia = &Hook[hook_resolver.Resolver]{}
// Filler manager events
m.onHydrateFillerDataRequested = &Hook[hook_resolver.Resolver]{}
m.onHydrateOnlinestreamFillerDataRequested = &Hook[hook_resolver.Resolver]{}
m.onHydrateEpisodeFillerDataRequested = &Hook[hook_resolver.Resolver]{}
}
func (m *ManagerImpl) OnGetAnime() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onGetAnime
}
func (m *ManagerImpl) OnGetAnimeDetails() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onGetAnimeDetails
}
func (m *ManagerImpl) OnGetManga() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onGetManga
}
func (m *ManagerImpl) OnGetMangaDetails() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onGetMangaDetails
}
func (m *ManagerImpl) OnGetAnimeCollection() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onGetAnimeCollection
}
func (m *ManagerImpl) OnGetMangaCollection() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onGetMangaCollection
}
func (m *ManagerImpl) OnGetCachedAnimeCollection() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onGetCachedAnimeCollection
}
func (m *ManagerImpl) OnGetCachedMangaCollection() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onGetCachedMangaCollection
}
func (m *ManagerImpl) OnGetRawAnimeCollection() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onGetRawAnimeCollection
}
func (m *ManagerImpl) OnGetRawMangaCollection() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onGetRawMangaCollection
}
func (m *ManagerImpl) OnGetCachedRawAnimeCollection() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onGetCachedRawAnimeCollection
}
func (m *ManagerImpl) OnGetCachedRawMangaCollection() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onGetCachedRawMangaCollection
}
func (m *ManagerImpl) OnGetStudioDetails() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onGetStudioDetails
}
func (m *ManagerImpl) OnPreUpdateEntry() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onPreUpdateEntry
}
func (m *ManagerImpl) OnPostUpdateEntry() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onPostUpdateEntry
}
func (m *ManagerImpl) OnPreUpdateEntryProgress() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onPreUpdateEntryProgress
}
func (m *ManagerImpl) OnPostUpdateEntryProgress() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onPostUpdateEntryProgress
}
func (m *ManagerImpl) OnPreUpdateEntryRepeat() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onPreUpdateEntryRepeat
}
func (m *ManagerImpl) OnPostUpdateEntryRepeat() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onPostUpdateEntryRepeat
}
// Anime entry events
func (m *ManagerImpl) OnAnimeEntryRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeEntryRequested
}
func (m *ManagerImpl) OnAnimeEntry() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeEntry
}
func (m *ManagerImpl) OnAnimeEntryFillerHydration() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeEntryFillerHydration
}
func (m *ManagerImpl) OnAnimeEntryLibraryDataRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeEntryLibraryDataRequested
}
func (m *ManagerImpl) OnAnimeEntryLibraryData() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeEntryLibraryData
}
func (m *ManagerImpl) OnAnimeEntryManualMatchBeforeSave() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeEntryManualMatchBeforeSave
}
func (m *ManagerImpl) OnMissingEpisodesRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMissingEpisodesRequested
}
func (m *ManagerImpl) OnMissingEpisodes() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMissingEpisodes
}
func (m *ManagerImpl) OnAnimeEntryDownloadInfoRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeEntryDownloadInfoRequested
}
func (m *ManagerImpl) OnAnimeEntryDownloadInfo() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeEntryDownloadInfo
}
func (m *ManagerImpl) OnAnimEpisodeCollectionRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeEpisodeCollectionRequested
}
func (m *ManagerImpl) OnAnimeEpisodeCollection() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeEpisodeCollection
}
// Anime library collection events
func (m *ManagerImpl) OnAnimeLibraryCollectionRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeLibraryCollectionRequested
}
func (m *ManagerImpl) OnAnimeLibraryStreamCollectionRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeLibraryStreamCollectionRequested
}
func (m *ManagerImpl) OnAnimeLibraryCollection() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeLibraryCollection
}
func (m *ManagerImpl) OnAnimeLibraryStreamCollection() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeLibraryStreamCollection
}
func (m *ManagerImpl) OnAnimeScheduleItems() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeScheduleItems
}
// Auto Downloader events
func (m *ManagerImpl) OnAutoDownloaderMatchVerified() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAutoDownloaderMatchVerified
}
func (m *ManagerImpl) OnAutoDownloaderRunStarted() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAutoDownloaderRunStarted
}
func (m *ManagerImpl) OnAutoDownloaderSettingsUpdated() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAutoDownloaderSettingsUpdated
}
func (m *ManagerImpl) OnAutoDownloaderTorrentsFetched() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAutoDownloaderTorrentsFetched
}
func (m *ManagerImpl) OnAutoDownloaderBeforeDownloadTorrent() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAutoDownloaderBeforeDownloadTorrent
}
func (m *ManagerImpl) OnAutoDownloaderAfterDownloadTorrent() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAutoDownloaderAfterDownloadTorrent
}
// Scanner events
func (m *ManagerImpl) OnScanStarted() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onScanStarted
}
func (m *ManagerImpl) OnScanFilePathsRetrieved() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onScanFilePathsRetrieved
}
func (m *ManagerImpl) OnScanLocalFilesParsed() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onScanLocalFilesParsed
}
func (m *ManagerImpl) OnScanCompleted() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onScanCompleted
}
func (m *ManagerImpl) OnScanMediaFetcherStarted() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onScanMediaFetcherStarted
}
func (m *ManagerImpl) OnScanMediaFetcherCompleted() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onScanMediaFetcherCompleted
}
func (m *ManagerImpl) OnScanMatchingStarted() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onScanMatchingStarted
}
func (m *ManagerImpl) OnScanLocalFileMatched() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onScanLocalFileMatched
}
func (m *ManagerImpl) OnScanMatchingCompleted() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onScanMatchingCompleted
}
func (m *ManagerImpl) OnScanHydrationStarted() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onScanHydrationStarted
}
func (m *ManagerImpl) OnScanLocalFileHydrationStarted() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onScanLocalFileHydrationStarted
}
func (m *ManagerImpl) OnScanLocalFileHydrated() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onScanLocalFileHydrated
}
// Anime metadata events
func (m *ManagerImpl) OnAnimeMetadataRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeMetadataRequested
}
func (m *ManagerImpl) OnAnimeMetadata() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeMetadata
}
func (m *ManagerImpl) OnAnimeEpisodeMetadataRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeEpisodeMetadataRequested
}
func (m *ManagerImpl) OnAnimeEpisodeMetadata() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimeEpisodeMetadata
}
// Manga events
func (m *ManagerImpl) OnMangaEntryRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMangaEntryRequested
}
func (m *ManagerImpl) OnMangaEntry() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMangaEntry
}
func (m *ManagerImpl) OnMangaLibraryCollectionRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMangaLibraryCollectionRequested
}
func (m *ManagerImpl) OnMangaLibraryCollection() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMangaLibraryCollection
}
func (m *ManagerImpl) OnMangaDownloadedChapterContainersRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMangaDownloadedChapterContainersRequested
}
func (m *ManagerImpl) OnMangaDownloadedChapterContainers() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMangaDownloadedChapterContainers
}
func (m *ManagerImpl) OnMangaLatestChapterNumbersMap() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMangaLatestChapterNumbersMap
}
func (m *ManagerImpl) OnMangaDownloadMap() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMangaDownloadMap
}
func (m *ManagerImpl) OnMangaChapterContainerRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMangaChapterContainerRequested
}
func (m *ManagerImpl) OnMangaChapterContainer() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMangaChapterContainer
}
// Playback events
func (m *ManagerImpl) OnLocalFilePlaybackRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onLocalFilePlaybackRequested
}
func (m *ManagerImpl) OnPlaybackBeforeTracking() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onPlaybackBeforeTracking
}
func (m *ManagerImpl) OnStreamPlaybackRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onStreamPlaybackRequested
}
func (m *ManagerImpl) OnPlaybackLocalFileDetailsRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onPlaybackLocalFileDetailsRequested
}
func (m *ManagerImpl) OnPlaybackStreamDetailsRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onPlaybackStreamDetailsRequested
}
// Media player events
func (m *ManagerImpl) OnMediaPlayerLocalFileTrackingRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMediaPlayerLocalFileTrackingRequested
}
func (m *ManagerImpl) OnMediaPlayerStreamTrackingRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onMediaPlayerStreamTrackingRequested
}
// Debrid events
func (m *ManagerImpl) OnDebridAutoSelectTorrentsFetched() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onDebridAutoSelectTorrentsFetched
}
func (m *ManagerImpl) OnDebridSendStreamToMediaPlayer() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onDebridSendStreamToMediaPlayer
}
func (m *ManagerImpl) OnDebridLocalDownloadRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onDebridLocalDownloadRequested
}
func (m *ManagerImpl) OnDebridSkipStreamCheck() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onDebridSkipStreamCheck
}
// Torrent stream events
func (m *ManagerImpl) OnTorrentStreamAutoSelectTorrentsFetched() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onTorrentStreamAutoSelectTorrentsFetched
}
func (m *ManagerImpl) OnTorrentStreamSendStreamToMediaPlayer() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onTorrentStreamSendStreamToMediaPlayer
}
// Continuity events
func (m *ManagerImpl) OnWatchHistoryItemRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onWatchHistoryItemRequested
}
func (m *ManagerImpl) OnWatchHistoryItemUpdated() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onWatchHistoryItemUpdated
}
func (m *ManagerImpl) OnWatchHistoryLocalFileEpisodeItemRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onWatchHistoryLocalFileEpisodeItemRequested
}
func (m *ManagerImpl) OnWatchHistoryStreamEpisodeItemRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onWatchHistoryStreamEpisodeItemRequested
}
// Discord RPC events
func (m *ManagerImpl) OnDiscordPresenceAnimeActivityRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onDiscordPresenceAnimeActivityRequested
}
func (m *ManagerImpl) OnDiscordPresenceMangaActivityRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onDiscordPresenceMangaActivityRequested
}
func (m *ManagerImpl) OnDiscordPresenceClientClosed() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onDiscordPresenceClientClosed
}
// Anilist events
func (m *ManagerImpl) OnListMissedSequelsRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onListMissedSequelsRequested
}
func (m *ManagerImpl) OnListMissedSequels() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onListMissedSequels
}
// Anizip events
func (m *ManagerImpl) OnAnizipMediaRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnizipMediaRequested
}
func (m *ManagerImpl) OnAnizipMedia() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnizipMedia
}
// Animap events
func (m *ManagerImpl) OnAnimapMediaRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimapMediaRequested
}
func (m *ManagerImpl) OnAnimapMedia() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onAnimapMedia
}
// Filler manager events
func (m *ManagerImpl) OnHydrateFillerDataRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onHydrateFillerDataRequested
}
func (m *ManagerImpl) OnHydrateOnlinestreamFillerDataRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onHydrateOnlinestreamFillerDataRequested
}
func (m *ManagerImpl) OnHydrateEpisodeFillerDataRequested() *Hook[hook_resolver.Resolver] {
if m == nil {
return &Hook[hook_resolver.Resolver]{}
}
return m.onHydrateEpisodeFillerDataRequested
}