HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //proc/self/cwd/wp-content/plugins/spotlight-social-photo-feeds/modules/EngineModule.php
<?php

declare(strict_types=1);

namespace RebelCode\Spotlight\Instagram\Modules;

use Dhii\Services\Factories\Constructor;
use Dhii\Services\Factories\ServiceList;
use Dhii\Services\Factories\Value;
use Dhii\Services\Factory;
use Psr\Http\Client\ClientInterface;
use RebelCode\Iris\Aggregator;
use RebelCode\Iris\Converter;
use RebelCode\Iris\Engine;
use RebelCode\Iris\Fetcher;
use RebelCode\Iris\Fetcher\Catalog;
use RebelCode\Iris\Importer;
use RebelCode\Spotlight\Instagram\Config\WpOption;
use RebelCode\Spotlight\Instagram\Di\ArrayExtension;
use RebelCode\Spotlight\Instagram\Engine\Aggregator\CustomMediaPreProcessor;
use RebelCode\Spotlight\Instagram\Engine\Aggregator\IgAggregationStrategy;
use RebelCode\Spotlight\Instagram\Engine\Aggregator\SortProcessor;
use RebelCode\Spotlight\Instagram\Engine\Converter\IgConversionStrategy;
use RebelCode\Spotlight\Instagram\Engine\Data\Source\UserSource;
use RebelCode\Spotlight\Instagram\Engine\DbTransientMarker;
use RebelCode\Spotlight\Instagram\Engine\Fetcher\AccountPostsCatalog;
use RebelCode\Spotlight\Instagram\Engine\Fetcher\IgFetchStrategy;
use RebelCode\Spotlight\Instagram\Engine\Fetcher\NullCatalog;
use RebelCode\Spotlight\Instagram\Engine\IgPostStore;
use RebelCode\Spotlight\Instagram\Engine\Importer\IgImportStrategy;
use RebelCode\Spotlight\Instagram\Engine\Importer\WpCronScheduler;
use RebelCode\Spotlight\Instagram\Engine\Store\MediaFileStore;
use RebelCode\Spotlight\Instagram\Engine\Store\ThumbnailRecipe;
use RebelCode\Spotlight\Instagram\Module;
use RebelCode\Spotlight\Instagram\Wp\PostType;

class EngineModule extends Module
{
    /** The name of the import limit config */
    const CFG_IMPORT_LIMIT = 'importLimit';
    /** The name of the thumbnail recipes config */
    const CFG_THUMBNAIL_RECIPES = 'thumbnailRecipes';
    /** The name of the config that controls whether videos are downloaded */
    const CFG_DOWNLOAD_VIDEOS = 'downloadVideos';

    public function getFactories(): array
    {
        return [
            //==========================================================================
            // ENGINE
            //==========================================================================

            'instance' => new Constructor(Engine::class, [
                'fetcher',
                'converter',
                'aggregator',
                'store',
            ]),

            //==========================================================================
            // FETCHER
            //==========================================================================

            'fetcher' => new Constructor(Fetcher::class, [
                'fetcher/strategy',
            ]),

            'fetcher/strategy' => new Constructor(IgFetchStrategy::class, [
                'fetcher/strategy/catalog_map',
            ]),

            'fetcher/strategy/catalog_map' => new Factory(
                ['fetcher/catalog/account'],
                function (Catalog $account) {
                    return [
                        UserSource::TYPE_PERSONAL => $account,
                        UserSource::TYPE_BUSINESS => $account,
                    ];
                }
            ),

            'fetcher/catalog/account' => new Factory(
                ['@ig/client', '@accounts/cpt', 'fetcher/catalog/stories'],
                function (ClientInterface $client, PostType $accounts, ?Catalog $storyCatalog) {
                    return new AccountPostsCatalog($client, $accounts, $storyCatalog);
                }
            ),

            'fetcher/catalog/stories' => new Value(null),

            'fetcher/catalog/fallback' => new Constructor(NullCatalog::class),

            //==========================================================================
            // CONVERTER
            //==========================================================================

            'converter' => new Constructor(Converter::class, [
                'store',
                'converter/strategy',
            ]),

            'converter/strategy' => new Constructor(IgConversionStrategy::class),

            //==========================================================================
            // AGGREGATOR
            //==========================================================================

            'aggregator' => new Constructor(Aggregator::class, [
                'store',
                'aggregator/strategy',
            ]),

            'aggregator/strategy' => new Constructor(IgAggregationStrategy::class, [
                'aggregator/pre_processors',
                'aggregator/post_processors',
            ]),

            'aggregator/pre_processors' => new ServiceList([
                'aggregator/processors/custom_media',
                'aggregator/processors/sorter',
            ]),

            'aggregator/post_processors' => new ServiceList([]),

            'aggregator/processors/custom_media' => new Constructor(CustomMediaPreProcessor::class),
            'aggregator/processors/sorter' => new Constructor(SortProcessor::class),

            //==========================================================================
            // STORE
            //==========================================================================

            'store' => new Constructor(IgPostStore::class, [
                '@media/cpt/slug',
                'store/files',
            ]),

            'store/files' => new Constructor(MediaFileStore::class, [
                'store/files/directory',
                'store/config/thumbnail_recipes',
                'store/config/download_videos',
            ]),

            'store/files/directory' => new Value('spotlight-insta'),

            'store/config/thumbnail_recipes' => new Factory([], function () {
                return new WpOption(
                    'sli_thumbnail_recipes',
                    [
                        MediaFileStore::SIZE_SMALL => (array) new ThumbnailRecipe(true, 400, 80),
                        MediaFileStore::SIZE_MEDIUM => (array) new ThumbnailRecipe(true, 600, 90),
                        MediaFileStore::SIZE_LARGE => (array) new ThumbnailRecipe(false, 0, 100),
                    ],
                    true
                );
            }),

            'store/config/download_videos' => new Factory([], function () {
                return new WpOption('sli_download_videos', false, true, WpOption::SANITIZE_BOOL);
            }),

            //==========================================================================
            // IMPORTER
            //==========================================================================

            // The importer instance
            'importer' => new Constructor(Importer::class, [
                'instance',
                'importer/strategy',
                'importer/scheduler',
                'importer/lock',
                'importer/interrupt',
            ]),

            // The strategy to use for importing
            'importer/strategy' => new Constructor(IgImportStrategy::class, [
                'store',
                'importer/strategy/limit_config',
                'importer/strategy/batch_size',
                'importer/strategy/max_hashtag_items',
            ]),
            'importer/strategy/batch_size' => new Value(50),
            'importer/strategy/max_hashtag_items' => new Value(200),
            'importer/strategy/limit_config' => new Factory([], function () {
                return new WpOption('sli_import_limit', 0, false);
            }),

            // The scheduler for the importer, which uses WP Cron
            'importer/scheduler' => new Constructor(WpCronScheduler::class, [
                'importer/scheduler/cron/hook',
                'importer/scheduler/cron/delay',
                'importer/scheduler/cron/time_limit',
            ]),
            'importer/scheduler/cron/hook' => new Value('spotlight/instagram/import_batch'),
            'importer/scheduler/cron/delay' => new Value(5),
            'importer/scheduler/cron/time_limit' => new Value(30 * 60),

            // The markers for the importer. They auto-expire in 5 minutes
            'importer/lock' => new Value(new DbTransientMarker('_sli_importer_running', 5 * 60)),
            'importer/interrupt' => new Value(new DbTransientMarker('_sli_importer_interrupt', 5 * 60)),
        ];
    }

    /** @inheritDoc */
    public function getExtensions(): array
    {
        return [
            'config/entries' => new ArrayExtension([
                static::CFG_IMPORT_LIMIT => 'importer/strategy/limit_config',
                static::CFG_THUMBNAIL_RECIPES => 'store/config/thumbnail_recipes',
                static::CFG_DOWNLOAD_VIDEOS => 'store/config/download_videos',
            ]),
        ];
    }
}