PluginProbe
VdoCipher: Secure Video Player and Hosting / 1.28
VdoCipher: Secure Video Player and Hosting v1.28
trunk 1.10 1.11 1.12 1.13 1.14 1.15 1.17 1.18 1.19 1.20 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.28 1.29 1.3 1.30 1.4 1.5 1.6 All 28 releases
← All changes | vdocipher.php +318 -169 1.221.28 View file →
@@ -1,10 +1,10 @@
1 1 <?php
2 2 /**
3 3 * Plugin Name: VdoCipher
4 4 * Plugin URI: https://www.vdocipher.com
5 - * Description: Secured video hosting for wordpress
6 - * Version: 1.22
5 + * Description: Secured video hosting for WordPress
6 + * Version: 1.28
7 7 * Author: VdoCipher
8 8 * Author URI: https://www.vdocipher.com
9 9 * License: GPL2
10 10 */
@@ -10,80 +10,133 @@
10 10 */
11 11
12 12 if (__FILE__ == $_SERVER['SCRIPT_FILENAME']) {
13 13 header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
14 - exit("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html><head>\r\n<title>404 Not Found</title>\r\n".
14 + exit("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html lang='en'><head>\r\n<title>404 Not Found</title>\r\n".
15 15 "</head><body>\r\n<h1>Not Found</h1>\r\n<p>The requested URL " . $_SERVER['SCRIPT_NAME'] . " was not found on ".
16 16 "this server.</p>\r\n</body></html>");
17 17 }
18 18
19 -function vdo_send($action, $params, $posts = array())
19 +if (!defined('VDOCIPHER_PLUGIN_VERSION')) {
20 + define('VDOCIPHER_PLUGIN_VERSION', '1.28');
21 +}
22 +
23 +if (!defined('VDOCIPHER_PLAYER_VERSION')) {
24 + define('VDOCIPHER_PLAYER_VERSION', 'v2');
25 +}
26 +
27 +if (!defined('VDOCIPHER_DEFAULT_THEME')) {
28 + define('VDOCIPHER_DEFAULT_THEME', '');
29 +}
30 +
31 +function vdo_plugin_check_version()
20 32 {
33 + // This applies only for installs 1.24 and below
34 + if (!get_option('vdo_plugin_version')) {
35 + if (preg_match('/^1\.[0123456]\.[0-9]{1,2}$/', get_option('vdo_embed_version'))) {
36 + update_option('vdo_embed_version', VDOCIPHER_PLAYER_VERSION);
37 + }
38 + if (preg_match('/^1\.[01234]\.[0-9]{1,2}$/', get_option('vdo_embed_version'))) {
39 + update_option('vdo_default_height', 'auto');
40 + }
41 + update_option('vdo_plugin_version', VDOCIPHER_PLUGIN_VERSION);
42 + return ;
43 + }
44 + // This applies for all new installations after 1.25
45 + if (VDOCIPHER_PLUGIN_VERSION !== get_option('vdo_plugin_version')) {
46 + if (preg_match('/^1\.[0-9]{1,2}\.[0-9]{1,2}$/', get_option('vdo_embed_version'))) {
47 + update_option('vdo_embed_version', VDOCIPHER_PLAYER_VERSION);
48 + }
49 + update_option('vdo_plugin_version', VDOCIPHER_PLUGIN_VERSION);
50 + }
51 +}
52 +
53 +add_action('plugins_loaded', 'vdo_plugin_check_version');
54 +
55 +// Function called to get OTP, starts
56 +function vdo_otp($video, $otp_post_array = array())
57 +{
21 58 $client_key = get_option('vdo_client_key');
22 59 if ($client_key == false || $client_key == "") {
23 - return "Plugin not configured. Please set the key to embed videos.";
60 + return (object)['message' => 'Plugin not configured. API Key missing.'];
61 + } else if (strlen($client_key) !== 64) {
62 + return (object)["message" => "Invalid API Key."];
24 63 }
25 -
26 - $getData = http_build_query($params);
27 - $posts["clientSecretKey"] = $client_key;
28 - $url = "https://api.vdocipher.com/v2/$action/?$getData";
29 - $response = wp_safe_remote_post($url, array(
30 - 'method' => 'POST',
31 - 'body' => $posts
32 - ));
64 + $url = "https://dev.vdocipher.com/api/videos/$video/otp";
65 + $headers = array(
66 + 'Authorization'=>'Apisecret '.$client_key,
67 + 'Content-Type'=>'application/json',
68 + 'Accept'=>'application/json'
69 + );
70 + $otp_post_json = json_encode($otp_post_array);
71 + $response = wp_remote_post(
72 + $url,
73 + array(
74 + 'method' => 'POST',
75 + 'headers' => $headers,
76 + 'body' => $otp_post_json
77 + )
78 + );
33 79 if (is_wp_error($response)) {
34 80 $error_message = $response->get_error_message();
35 - echo "VdoCipher: Something went wrong: $error_message";
36 - return "";
81 + if (false !== stripos($error_message, 'Operation timed out')) {
82 + $error_message = 'Operation timed out. Check your firewall at web host or try after sometime.';
83 + } else if (false !== stripos($error_message, 'Could not resolve host')) {
84 + $error_message = 'Connectivity issue. Check firewall at web host.';
85 + }
86 + return ["message" => $error_message];
37 87 }
38 - return $response['body'];
88 +
89 + $responseCode = $response['response']['code'];
90 + if ($responseCode === 404) {
91 + return (object)["message" => "Video ID not found"];
92 + }
93 + else if ($responseCode === 403) {
94 + return (object)["message" => "API key does not have OTP creator permission"];
95 + }
96 + else if ($responseCode === 400 || $responseCode === 401) {
97 + return (object)["message" => "Incorrect API key"];
98 + } else {
99 + return json_decode($response['body']);
100 + }
39 101 }
102 +// Function called to get OTP, ends
103 +
104 +// VdoCipher Shortcode starts
40 105 function vdo_shortcode($atts)
41 106 {
42 - extract(shortcode_atts(
107 + $vdo_args = shortcode_atts(
43 108 array(
44 - 'title' => 'TITLE_OF_VIDEO',
45 - 'width' => get_option('vdo_default_width') . "px",
46 - 'height' => get_option('vdo_default_height') . "px",
47 - 'id' => 'id',
48 - 'no_annotate'=> false,
49 - 'version'=> 0,
50 - 'player_tech'=> ''
51 - ),
109 + 'width' => get_option('vdo_default_width'),
110 + 'height' => get_option('vdo_default_height'),
111 + 'id' => 'id',
112 + 'no_annotate'=> false,
113 + 'vdo_theme'=> false,
114 + ),
52 115 $atts
53 - ));
54 - if ((get_option('vdo_default_height')) == 'auto') {
55 - $height = 'auto';
116 + );
117 + $width = $vdo_args['width'];
118 + $height = $vdo_args['height'];
119 + $id = $vdo_args['id'];
120 + $no_annotate = $vdo_args['no_annotate'];
121 + $vdo_theme = $vdo_args['vdo_theme'];
122 +
123 + if (!preg_match('/.*px$/', $width)) {
124 + $width = $width."px";
56 125 }
126 + if (!preg_match('/.*px$/', $height)) {
127 + if ($height != 'auto') {
128 + $height = $height."px";
129 + }
130 + }
57 131 if (!$atts['id']) {
58 - if (!$atts['title']) {
59 - return "Required argument id for embedded video not found.";
60 - }
61 - $params = array(
62 - 'search'=>array(
63 - 'title'=>$title
64 - ),
65 - 'page'=>1,
66 - 'limit'=>30,
67 - 'type'=>'json'
68 - );
69 - $video = vdo_send("videos", $params);
70 - $video = json_decode($video);
71 - if ($video == null) {
72 - return "404. Video not found.";
73 - }
74 - $video = $video[0]->id;
75 - if ($video == null) {
76 - return "No video with given title found.";
77 - }
132 + return "Required argument id for embedded video not found.";
78 133 } else {
79 134 $video = $id;
80 135 }
81 136
82 - $params = array(
83 - 'video'=>$video
84 - );
85 - $anno = false;
137 + // Initialize $otp_post_array, to be sent as part of OTP request, as for time-to-live 300
138 + $otp_post_array = array("ttl" => 300);
86 139 if (!function_exists("eval_date")) {
87 140 function eval_date($matches)
88 141 {
89 142 return current_time($matches[1]);
@@ -99,111 +152,151 @@
99 152 $vdo_annotate_code = str_replace('{username}', $current_user->user_login, $vdo_annotate_code);
100 153 $vdo_annotate_code = str_replace('{id}', $current_user->ID, $vdo_annotate_code);
101 154 }
102 155 $vdo_annotate_code = str_replace('{ip}', $_SERVER['REMOTE_ADDR'], $vdo_annotate_code);
103 - $vdo_annotate_code = preg_replace_callback('/\{date\.([^\}]+)\}/', "eval_date", $vdo_annotate_code);
156 + $vdo_annotate_code = preg_replace_callback('/{date\.([^}]+)}/', "eval_date", $vdo_annotate_code);
104 157 $vdo_annotate_code = apply_filters('vdocipher_annotate_postprocess', $vdo_annotate_code);
158 + // Add annotate code to $otp_post_array, which will be
159 + // converted to Json and then sent as POST body to API endpoint
105 160 if (!$no_annotate) {
106 - $anno = array("annotate" => $vdo_annotate_code);
161 + $otp_post_array["annotate"] = $vdo_annotate_code;
107 162 }
108 163 }
109 - $OTP = vdo_send("otp", $params, $anno);
110 - $OTP = json_decode($OTP);
164 + // OTP is requested via vdo_otp function
165 + $OTP_Response = vdo_otp($video, $otp_post_array);
166 +
167 + // https://www.php.net/manual/en/function.isset.php#86313
168 + $message = (isset($OTP_Response->message)) ? $OTP_Response->message : null;
169 + $OTP = (isset($OTP_Response->otp)) ? $OTP_Response->otp : null;
170 + $playbackInfo = (isset($OTP_Response->playbackInfo)) ? $OTP_Response->playbackInfo : null;
171 +
111 172 if (is_null($OTP)) {
112 - $output = "<span id='vdo$OTP' style='background:#555555;color:#FFFFFF'><h4>Video not found</h4></span>";
113 - return $output;
173 + return "<div id='vdo$OTP'><strong>VdoCipher Error: $message</strong></div>";
114 174 }
115 - $OTP = $OTP->otp;
116 175
176 + // Version, legacy, for flash only
117 177 $version = 0;
118 178 if (isset($atts['version'])) {
119 179 $version = $atts['version'];
120 180 }
121 - if ((get_option('vdo_embed_version')) == false) {
122 - update_option('vdo_embed_version', '1.6.4');
123 - }
124 - if ((get_option('vdo_player_theme')) == false) {
125 - update_option('vdo_player_theme', '9ae8bbe8dd964ddc9bdb932cca1cb59a');
126 - }
181 +
182 + // Video Embed version is retrieved from options table or from shortcode attribute
127 183 $vdo_embed_version_str = get_option('vdo_embed_version');
128 - $vdo_player_theme = get_option('vdo_player_theme');
129 184
130 - // tech override custom names start
131 - switch ($player_tech) {
132 - case "flash":
133 - $player_tech = "*,-dash";
134 - break;
135 - case "nohtml5":
136 - $player_tech = "*,-dash";
137 - break;
138 - case "noflash":
139 - $player_tech = "*,-hss";
140 - break;
141 - case "nozen":
142 - $player_tech = "*,-zen";
143 - break;
144 - case "noios":
145 - $player_tech = "*,-hlse";
146 - break;
147 - default:
148 - break;
185 + // Video Player theme, update and as shortcode attribute
186 + if (!$vdo_theme) {
187 + $vdo_player_theme = get_option('vdo_player_theme');
188 + } else {
189 + $vdo_player_theme = $vdo_theme;
149 190 }
150 - // tech override ends
191 + if (strpos($vdo_player_theme, 'v1/') === 0 || strlen($vdo_player_theme) === 32) {
192 + $vdo_embed_version_str = '1.6.10';
193 + } else if (strlen($vdo_player_theme) === 16) {
194 + $vdo_embed_version_str = 'v2';
195 + }
196 + $speedOptions = esc_attr(get_option('vdo_player_speed'));
197 + $speedPattern = '/^\d.\d{1,2}(,\d.\d{1,2})+$/';
151 198
152 199 // Old Embed Code
153 - if ($vdo_embed_version_str === '0.5') {
154 - $output = "<div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>";
155 - $output .= "<script> (function(v,i,d,e,o){v[o]=v[o]||{}; v[o].add = v[o].add || function V(a){".
156 - " (v[o].d=v[o].d||[]).push(a);};";
157 - $output .= "if(!v[o].l) { v[o].l=1*new Date();a=i.createElement(d),m=i.getElementsByTagName(d)[0];a.async=1;".
158 - "a.src=e; m.parentNode.insertBefore(a,m);}";
159 - $output .= " })(window,document,'script','//de122v0opjemw.cloudfront.net/vdo.js','vdo'); vdo.add({ ";
160 - $output .= "o: '$OTP', ";
161 - if ($version == 32) {
162 - $output .= "version: '$version' ";
200 + if ($vdo_embed_version_str === '1.6.10') {
201 + //Old embed code
202 + $output = <<<END
203 + <div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>
204 + <script>(function(v,i,d,e,o){v[o]=v[o]||{}; v[o].add = v[o].add || function V(a){
205 + (v[o].d=v[o].d||[]).push(a);};
206 + if(!v[o].l) { v[o].l=1*new Date(); a=i.createElement(d), m=i.getElementsByTagName(d)[0];
207 + a.async=1; a.src=e; m.parentNode.insertBefore(a,m);}
208 + })(window,document,'script','https://d1z78r8i505acl.cloudfront.net/playerAssets/1.6.10/vdo.js','vdo');
209 + vdo.add({
210 + otp: '$OTP',
211 + playbackInfo: '$playbackInfo',
212 + theme: '$vdo_player_theme',
213 + plugins: [{
214 + name: 'keyboard',
215 + options: {
216 + preset: 'default',
217 + bindings: {
218 + 'Left' : (player) => player.seek(player.currentTime - 15),
219 + 'Right' : (player) => player.seek(player.currentTime + 15),
220 + },
221 + }
222 + }],
223 + container: document.querySelector('#vdo$OTP'),
224 + })
225 + </script>
226 +END;
227 +
228 + if ($speedOptions !== false && preg_match($speedPattern, $speedOptions)) {
229 + $output .= <<<END
230 + <script>
231 + (function () {
232 + var originalReadyFunction = window.onVdoCipherAPIReady;
233 + // private API; do not use anywhere else; might change without notice
234 + var index = vdo.d.length - 1;
235 + window.onVdoCipherAPIReady = () => {
236 + if (originalReadyFunction) originalReadyFunction();
237 + var v_ = vdo.getObjects()[index];
238 + v_.addEventListener('load', () => {
239 + v_.availablePlaybackRates = [$speedOptions]
240 + });
241 + }
242 + })()
243 + </script>
244 +END;
163 245 }
164 - $output .= "}); </script>";
246 + } else if ($vdo_embed_version_str === 'v2') {
247 + $uniq = 'u' . rand();
248 + $output = <<<END
249 +<script src="https://player.vdocipher.com/v2/api.js"></script>
250 +<iframe
251 + src="https://player.vdocipher.com/v2/?otp=$OTP&playbackInfo=$playbackInfo"
252 + id="$uniq"
253 + style="height:$height;width:$width;max-width:100%;border:0;display: block;"
254 + allow="encrypted-media"
255 + allowfullscreen
256 +></iframe>
257 +<script>
258 +(function() {
259 + const iframe = document.querySelector('#$uniq');
260 + const player = VdoPlayer.getInstance(iframe);
261 + player.video.addEventListener('loadstart', async () => {
262 + const aspectRatio = (await player.api.getMetaData()).aspectRatio;
263 + if (iframe.style.height === 'auto' && iframe.style.width.endsWith('px')) {
264 + iframe.style.maxHeight = '100vh';
265 + if (CSS.supports('aspect-ratio', 1)) {
266 + iframe.style.aspectRatio = aspectRatio;
267 + } else {
268 + const offsetWidth = iframe.offsetWidth;
269 + iframe.style.height = Math.round(offsetWidth / aspectRatio) + 'px';
270 + }
271 + }
272 + });
273 +})();
274 +</script>
275 +END;
276 + if ($speedOptions !== false && preg_match($speedPattern, $speedOptions)) {
277 + $output .= <<<END
278 +<script>
279 +(function() {
280 + const iframe = document.querySelector('#$uniq')
281 + const player = VdoPlayer.getInstance(iframe);
282 + player.video.addEventListener('loadstart', async () => {
283 + player.api.updatePlayerConfig({playbackSpeedOptions: [$speedOptions]});
284 + });
285 +})();
286 +</script>
287 +END;
288 + }
289 +
165 290 } else {
166 - //New embed code
167 - if ($player_tech === '') {
168 - if (get_option(vdo_watermark_flash_html) === 'flash') {
169 - $player_tech = "*,-dash";
170 - }
171 - }
172 - $output .= "<div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>";
173 - $output .= "<script>(function(v,i,d,e,o){v[o]=v[o]||{}; v[o].add = v[o].add || function V(a){".
174 - "(v[o].d=v[o].d||[]).push(a);};";
175 - $output .= "if(!v[o].l) { v[o].l=1*new Date(); a=i.createElement(d), m=i.getElementsByTagName(d)[0];";
176 - $output .= "a.async=1; a.src=e; m.parentNode.insertBefore(a,m);}";
177 - $output .= "})(window,document,'script','https://d1z78r8i505acl.cloudfront.net/playerAssets/";
178 - $output .= "$vdo_embed_version_str";
179 - $output .= "/vdo.js','vdo');";
180 - $output .= "vdo.add({";
181 - $output .= "otp: '$OTP',";
182 - $output .= "playbackInfo: btoa(JSON.stringify({";
183 - $output .= "videoId: '$video'})),";
184 - $output .= "theme: '$vdo_player_theme',";
185 - if ($player_tech !== '') {
186 - $output .= "techoverride: [" ;
187 - $techarray = explode(',', $player_tech);
188 - for ($i = 0; $i < sizeof($techarray); $i++) {
189 - $techStr = $techarray[$i];
190 - $output .= "'$techStr'";
191 - if ($i !== sizeof($techarray)-1) {
192 - $output .= ", ";
193 - }
194 - }
195 - $output .= "],";
196 - }
197 - $output .= "container: document.querySelector('#vdo$OTP'),});";
198 - $output .= "</script>";
291 + $output = 'Invalid player selection: ' . $vdo_embed_version_str;
199 292 }
200 293 return $output;
201 294 }
202 -
203 295 add_shortcode('vdo', 'vdo_shortcode');
296 +// VdoCipher Shortcode ends
204 297
205 -/// adding the settings link
298 +// adding the Settings link, starts
206 299 $plugin = plugin_basename(__FILE__);
207 300 add_filter("plugin_action_links_$plugin", 'vdo_settings_link');
208 301
209 302 function vdo_settings_link($links)
@@ -211,18 +304,26 @@
211 304 $settings_link = '<a href="options-general.php?page=vdocipher">Settings</a>';
212 305 array_unshift($links, $settings_link);
213 306 return $links;
214 307 }
308 +// adding the Settings link, ends
215 309
216 -/// add the menu item and register settings
310 +// add the menu item and register settings (3 functions), starts
217 311 if (is_admin()) { // admin actions
312 + add_action('admin_init', 'register_vdo_settings');
218 313 add_action('admin_menu', 'vdo_menu');
219 - add_action('admin_init', 'register_vdo_settings');
220 -} else {
221 - // non-admin enqueues, actions, and filters
222 314 }
223 315 function vdo_menu()
224 316 {
317 + if (get_option('vdo_show_plugin_in_sidebar') === "") {
318 + add_options_page(
319 + 'VdoCipher Options',
320 + 'VdoCipher',
321 + 'manage_options',
322 + 'vdocipher',
323 + 'vdo_options'
324 + );
325 + } else {
225 326 add_menu_page(
226 327 'VdoCipher Options',
227 328 'VdoCipher',
228 329 'manage_options',
@@ -229,9 +330,11 @@
229 330 'vdocipher',
230 331 'vdo_options',
231 332 plugin_dir_url(__FILE__).'images/logo.png'
232 333 );
334 + }
233 335 }
336 +
234 337 function vdo_options()
235 338 {
236 339 if (!get_option('vdo_default_height')) {
237 340 update_option('vdo_default_height', 'auto');
@@ -238,18 +341,15 @@
238 341 }
239 342 if (!get_option('vdo_default_width')) {
240 343 update_option('vdo_default_width', '1280');
241 344 }
242 - $vdo_client_key = get_option('vdo_client_key');
243 - if (!$vdo_client_key && strlen($vdo_client_key) != 64) {
244 - vdo_show_form_client_key();
245 - return "";
246 - }
247 345 if (!current_user_can('manage_options')) {
248 - wp_die(__('You do not have sufficient permissions to access this page.'));
346 + wp_die(__('You do not have sufficient permissions to access this page.'));
249 347 }
250 348 include('include/options.php');
349 + return "";
251 350 }
351 +
252 352 function register_vdo_settings()
253 353 {
254 354 // whitelist options
255 355 register_setting('vdo_option-group', 'vdo_client_key');
@@ -257,19 +357,83 @@
257 357 register_setting('vdo_option-group', 'vdo_default_width');
258 358 register_setting('vdo_option-group', 'vdo_annotate_code');
259 359 register_setting('vdo_option-group', 'vdo_embed_version');
260 360 register_setting('vdo_option-group', 'vdo_player_theme');
261 - register_setting('vdo_option-group', 'vdo_watermark_flash_html');
361 + register_setting('vdo_option-group', 'vdo_plugin_version');
362 + register_setting('vdo_option-group', 'vdo_player_speed');
363 + register_setting('vdo_option-group', 'vdo_show_plugin_in_sidebar');
262 364 }
365 +// add the menu item and register settings (3 functions), ends
263 366
264 -/// adding a section for asking for the client key
265 -function vdo_show_form_client_key()
367 +// Activation Hook starts
368 +function vdo_activate()
266 369 {
267 - include('include/setting_form.php');
370 + add_option('vdo_default_height', 'auto');
371 + add_option('vdo_default_width', 1280);
372 + add_option('vdo_embed_version', VDOCIPHER_PLAYER_VERSION);
373 + add_option('vdo_player_theme', VDOCIPHER_DEFAULT_THEME);
374 + add_option('vdo_show_plugin_in_sidebar', 'true');
268 375 }
269 -register_deactivation_hook(__FILE__, 'vdo_deactivate');
270 -function vdo_deactivate()
376 +register_activation_hook(__FILE__, 'vdo_activate');
377 +
378 +// Registering and specifying Gutenberg block
379 +function vdo_register_block()
271 380 {
381 + if (!function_exists('register_block_type')) {
382 + return ;
383 + }
384 + wp_register_script(
385 + 'vdo-block-script',
386 + plugins_url('/include/block/dist/blocks.build.js', __FILE__),
387 + array('wp-blocks', 'wp-element', 'wp-editor', 'wp-i18n')
388 + );
389 + wp_register_style(
390 + 'vdo-block-base-style',
391 + plugins_url('/include/block/dist/blocks.style.build.css', __FILE__),
392 + array('wp-blocks')
393 + );
394 + wp_register_style(
395 + 'vdo-block-editor-style',
396 + plugins_url('/include/block/dist/blocks.editor.build.css', __FILE__),
397 + array('wp-edit-blocks')
398 + );
399 + register_block_type(
400 + 'vdo/block',
401 + array(
402 + 'editor_script'=>'vdo-block-script',
403 + 'editor_style'=>'vdo-block-editor-style',
404 + 'style'=>'vdo-block-base-style',
405 + 'attributes'=>array(
406 + 'id'=>array(
407 + 'type'=>'string',
408 + ),
409 + 'width'=>array(
410 + 'type'=>'string',
411 + 'default'=>get_option('vdo_default_width')
412 + ),
413 + 'height'=>array(
414 + 'type'=>'string',
415 + 'default'=>get_option('vdo_default_height')
416 + ),
417 + 'vdo_theme'=>array(
418 + 'type'=>'string',
419 + 'default'=>get_option('vdo_player_theme')
420 + ),
421 + 'vdo_version'=>array(
422 + 'type'=>'string',
423 + 'default'=>get_option('vdo_embed_version')
424 + ),
425 + ),
426 + 'render_callback'=>'vdo_shortcode'
427 + )
428 + );
429 +}
430 +
431 +add_action('init', 'vdo_register_block');
432 +
433 +// Deactivation Hook starts
434 +function vdo_uninstall()
435 +{
272 436 delete_option('vdo_client_key');
273 437 delete_option('vdo_default_width');
274 438 delete_option('vdo_default_height');
275 439 delete_option('vdo_annotate_code');
@@ -274,30 +438,15 @@
274 438 delete_option('vdo_default_height');
275 439 delete_option('vdo_annotate_code');
276 440 delete_option('vdo_embed_version');
277 441 delete_option('vdo_player_theme');
278 - delete_option('vdo_watermark_flash_html');
442 + delete_option('vdo_plugin_version');
443 + delete_option('vdo_player_speed');
444 + delete_option('vdo_show_plugin_in_sidebar');
279 445 }
280 -function vdo_activate()
281 -{
282 - if ((get_option('vdo_default_height')) == false) {
283 - update_option('vdo_default_height', 'auto');
284 - }
285 - if ((get_option('vdo_default_width')) == false) {
286 - update_option('vdo_default_width', '1280');
287 - }
288 - //https://stackoverflow.com/a/2173318/5022684
289 - if ((get_option('vdo_embed_version')) == false) {
290 - update_option('vdo_embed_version', '1.6.4');
291 - }
292 - if ((get_option('vdo_player_theme')) == false) {
293 - update_option('vdo_player_theme', '9ae8bbe8dd964ddc9bdb932cca1cb59a');
294 - }
295 - if ((get_option('vdo_watermark_flash_html')) == false) {
296 - update_option('vdo_watermark_flash_html', 'html5');
297 - }
298 -}
299 -register_activation_hook(__FILE__, 'vdo_activate');
446 +register_uninstall_hook(__FILE__, 'vdo_uninstall');
447 +
448 +// Admin notice to configure plugin for new installs, starts
300 449 function vdo_admin_notice()
301 450 {
302 451 if ((!get_option('vdo_client_key') || strlen(get_option('vdo_client_key')) != 64)
303 452 && basename($_SERVER['PHP_SELF']) == "plugins.php"