PluginProbe ʕ •ᴥ•ʔ
Presto Player / trunk
Presto Player vtrunk
4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.4 4.2.3 4.2.2 4.2.0 4.2.1 trunk 1.10.0 1.10.1 1.10.2 1.11.0 1.12.0 1.13.0 1.14.0 1.14.1 1.5.10 1.5.11 1.5.12 1.5.13 1.5.14 1.5.15 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.10 1.6.11 1.6.12 1.6.13 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.16 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.2.0 2.2.1 2.2.2 2.2.3 2.2.3-beta1 2.3.0 2.3.1 2.3.2 2.3.3 3.0.0 3.0.0-beta1 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.1.0 3.1.1 3.1.2 3.1.3 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4
presto-player / inc / Services / PreloadService.php
presto-player / inc / Services Last commit date
API 1 week ago Abilities 1 week ago Blocks 3 weeks ago License 1 month ago OAuth 1 week ago AdminNotice.php 2 months ago AdminNotices.php 2 months ago AjaxActions.php 2 months ago Blocks.php 2 years ago Compatibility.php 11 months ago FeatureAnnounce.php 1 week ago Learn.php 1 week ago Menu.php 1 week ago Migrations.php 2 years ago NpsSurvey.php 6 months ago Onboarding.php 2 months ago Player.php 3 weeks ago PluginInstaller.php 1 week ago PreloadService.php 1 year ago ProCompatibility.php 3 weeks ago ReusableVideos.php 1 month ago RewriteRulesManager.php 2 years ago Scripts.php 1 month ago Settings.php 3 months ago Shortcodes.php 1 week ago Streamer.php 2 months ago Translation.php 3 weeks ago Usage.php 1 week ago VideoPostType.php 3 weeks ago
PreloadService.php
141 lines
1 <?php
2 /**
3 * PreloadService class file.
4 *
5 * This file contains the PreloadService class which handles preloading of components.
6 *
7 * @package PrestoPlayer
8 * @subpackage Services
9 */
10
11 namespace PrestoPlayer\Services;
12
13 use PrestoPlayer\Support\Utility;
14
15 /**
16 * Class PreloadService
17 *
18 * Handles the preloading of components for Presto Player.
19 */
20 class PreloadService {
21
22 /**
23 * The stats file path.
24 *
25 * @var string
26 */
27 protected $stats_file = PRESTO_PLAYER_PLUGIN_DIR . 'dist/components/stats.json';
28
29 /**
30 * Components to preload.
31 *
32 * @var array
33 */
34 protected $components = array();
35
36 /**
37 * Bootstrap the preload.
38 *
39 * @return void
40 */
41 public function bootstrap() {
42 // Preload components.
43 add_action( 'wp_head', array( $this, 'renderComponents' ) );
44 add_action( 'wp_footer', array( $this, 'renderComponents' ) );
45 }
46
47 /**
48 * Render the components
49 *
50 * @return void
51 */
52 public function renderComponents() {
53 if ( ! empty( $this->components ) ) {
54 $this->renderTag( $this->components );
55 $this->components = array();
56 }
57 }
58
59 /**
60 * Render the preload tags.
61 *
62 * @param array $components An array of components.
63 * @param string $format The format.
64 * @param string $path The path to the component javascript file.
65 *
66 * @return void
67 */
68 public function renderTag( $components, $format = 'esmBrowser', $path = 'dist/components/web-components/' ) {
69 if ( empty( $components ) ) {
70 return;
71 }
72
73 $names = $this->getFileNames( $components, $format );
74
75 if ( empty( $names ) ) {
76 return;
77 }
78
79 foreach ( $names as $name ) {
80 echo "<link rel='modulepreload' href='" . esc_url( trailingslashit( PRESTO_PLAYER_PLUGIN_URL ) . trailingslashit( $path ) . $name ) . "' as='script' crossorigin />\n";
81 }
82 }
83
84 /**
85 * Get the bundle stats file.
86 *
87 * @return object|false;
88 */
89 protected function getStatsFile() {
90 if ( ! file_exists( $this->stats_file ) ) {
91 return false;
92 }
93 return wp_json_file_decode( $this->stats_file, array( 'associative' => true ) );
94 }
95
96 /**
97 * Get the filenames from the stats.
98 *
99 * @param array $components An array of component names.
100 * @param string $format The format we are using.
101 *
102 * @return array
103 */
104 public function getFileNames( $components, $format = 'esmBrowser' ) {
105 $json = $this->getStatsFile();
106 $entries = $json['formats'][ $format ] ?? array();
107
108 $set = array_map(
109 function ( $element ) use ( $entries ) {
110 $files = array();
111 $collection_bundles = array_filter(
112 $entries,
113 function ( $entry ) use ( $element ) {
114 return in_array( $element, $entry['components'], true );
115 }
116 );
117
118 foreach ( $collection_bundles as $bundle ) {
119 $files = array_merge( array( $bundle['fileName'] ), $bundle['imports'] );
120 }
121
122 return $files;
123 },
124 $components
125 );
126
127 return array_unique( Utility::flatten( $set ) );
128 }
129
130 /**
131 * Add preload components.
132 *
133 * @param array $components Component names.
134 *
135 * @return void
136 */
137 public function add( $components ) {
138 $this->components = array_filter( array_unique( array_merge( $this->components, $components ) ) );
139 }
140 }
141