/**
  *
  *
  * @since    2.6.0
  */
 public function build_embed($provider, $atts)
 {
     $object_params_autoplay_yes = $object_params_autoplay_no = '';
     $output = '';
     $iframe = true;
     $properties = $this->get_properties();
     $shortcode_atts_defaults = array('align' => null, 'aspect_ratio' => (double) $properties[$provider]['aspect_ratio'], 'autoplay' => (bool) $this->options['autoplay'], 'id' => null, 'lang' => null, 'maxwidth' => null, 'mode' => (string) $this->options['mode'], 'parameters' => null, 'start' => null, 'thumbnail' => null, 'link_text' => null);
     $atts = shortcode_atts($shortcode_atts_defaults, $atts, $this->options['shortcodes'][$provider]);
     extract($atts);
     $maxwidth = (int) $maxwidth;
     $aspect_ratio = $this->aspect_ratio_to_padding($aspect_ratio);
     $thumbnail = trim($thumbnail);
     if ('dailymotionlist' === $provider) {
         switch ($mode) {
             case 'normal':
             case 'lazyload':
             case 'lazyload-fixed':
             case 'lazyload-fullscreen':
                 $aspect_ratio = 72;
                 break;
         }
     }
     if (empty($id)) {
         return $this->error(__('no id set', $this->plugin_slug));
     } elseif (!preg_match('/[^\\x20-\\x7f]/', $provider)) {
         // fine
     } else {
         return $this->error(sprintf(__('Provider <code>%s</code> not valid', $this->plugin_slug), esc_html($provider)));
     }
     switch ($align) {
         case null:
         case '':
             break;
         case 'left':
         case 'right':
         case 'center':
             $align = "align{$align}";
             break;
         default:
             return $this->error(sprintf(__('Align <code>%s</code> not valid', $this->plugin_slug), esc_html($align)));
             break;
     }
     if ('thumbnail' === $mode) {
         $mode = 'lazyload-lightbox';
     }
     $supported_modes = Advanced_Responsive_Video_Embedder_Shared::get_supported_modes();
     if (!array_key_exists($mode, $supported_modes)) {
         return $this->error(sprintf(__('Mode: <code>%s</code> is invalid or not supported. Note that you will need the Pro Addon for lazyload modes.', $this->plugin_slug), esc_html($mode)));
     }
     if ($maxwidth < 100 && in_array($align, array('alignleft', 'alignright', 'aligncenter'))) {
         $maxwidth = (int) $this->options['align_maxwidth'];
     }
     $maxwidth = apply_filters('arve_maxwidth', $maxwidth, $align, $mode);
     switch ($autoplay) {
         case null:
         case '':
             break;
         case 'true':
         case '1':
         case 'yes':
             $autoplay = true;
             break;
         case 'false':
         case '0':
         case 'no':
             $autoplay = false;
             break;
         default:
             return $this->error(sprintf(__('Autoplay <code>%s</code> not valid', $this->plugin_slug), $autoplay));
             break;
     }
     switch ($start) {
         case null:
         case '':
         case preg_match("/^[0-9a-z]\$/", $start):
             break;
         default:
             return $this->error(sprintf(__('Start <code>%s</code> not valid', $this->plugin_slug), $start));
             break;
     }
     switch ($provider) {
         case '4players':
             $url = 'http://www.4players.de/4players.php/tvplayer_embed/4PlayersTV/' . $id;
             break;
         case 'metacafe':
             $url = 'http://www.metacafe.com/embed/' . $id . '/';
             break;
         case 'liveleak':
             //* For backwards compatibilty and possible mistakes
             if ($id[0] != 'f' && $id[0] != 'i') {
                 $id = 'i=' . $id;
             }
             $url = 'http://www.liveleak.com/ll_embed?' . $id;
             break;
         case 'myspace':
             $url = 'https://myspace.com/play/video/' . $id;
             break;
         case 'blip':
             if ($blip_xml = simplexml_load_file('http://blip.tv/rss/view/' . $id)) {
                 $blip_result = $blip_xml->xpath("/rss/channel/item/blip:embedLookup");
                 $id = (string) $blip_result[0];
             } else {
                 return $this->error(__('Could not get Blip.tv embed ID', $this->plugin_slug));
             }
         case 'bliptv':
             //* Deprecated
             $url = 'http://blip.tv/play/' . $id . '.html?p=1&backcolor=0x000000&lightcolor=0xffffff';
             break;
         case 'collegehumor':
             $url = 'http://www.collegehumor.com/e/' . $id;
             break;
         case 'videojug':
             $url = 'http://www.videojug.com/embed/' . $id;
             break;
         case 'veoh':
             $url = 'http://www.veoh.com/swf/webplayer/WebPlayer.swf?version=AFrontend.5.7.0.1396&permalinkId=' . $id;
             $object_params = sprintf('<param name="movie" value="%s" />', esc_url($url));
             break;
         case 'break':
             $url = 'http://break.com/embed/' . $id;
             break;
         case 'dailymotion':
             $url = '//www.dailymotion.com/embed/video/' . $id;
             break;
         case 'dailymotionlist':
             $url = '//www.dailymotion.com/widget/jukebox?list[]=%2Fplaylist%2F' . $id . '%2F1';
             break;
         case 'movieweb':
             $url = 'http://www.movieweb.com/v/' . $id;
             break;
         case 'mpora':
             $url = 'http://mpora.com/videos/' . $id . '/embed';
             break;
         case 'myvideo':
             $url = '//www.myvideo.de/embed/' . $id;
             break;
         case 'vimeo':
             $url = '//player.vimeo.com/video/' . $id;
             break;
         case 'gametrailers':
             $url = 'http://media.mtvnservices.com/embed/mgid:arc:video:gametrailers.com:' . $id;
             break;
         case 'comedycentral':
             $url = 'http://media.mtvnservices.com/embed/mgid:arc:video:comedycentral.com:' . $id;
             break;
         case 'spike':
             $url = 'http://media.mtvnservices.com/embed/mgid:arc:video:spike.com:' . $id;
             break;
         case 'viddler':
             $url = '//www.viddler.com/player/' . $id . '/';
             break;
         case 'snotr':
             $url = 'http://www.snotr.com/embed/' . $id;
             break;
         case 'funnyordie':
             $url = 'http://www.funnyordie.com/embed/' . $id;
             break;
         case 'youtube':
             $id = str_replace(array('&list=', '&amp;list='), '?list=', $id);
             $url = '//www.youtube.com/embed/' . $id;
             # TODO switch back to -nocookie.com when YT resolves issue
             break;
         case 'youtubelist':
             //* DEPRICATED
             $url = '//www.youtube.com/embed/videoseries?list=' . $id . '&wmode=transparent&rel=0&autohide=1&hd=1&iv_load_policy=3';
             break;
         case 'archiveorg':
             $url = 'http://www.archive.org/embed/' . $id . '/';
             break;
         case 'flickr':
             $url = 'http://www.flickr.com/apps/video/stewart.swf?v=109786';
             $object_params = '<param name="flashvars" value="intl_lang=en-us&photo_secret=9da70ced92&photo_id=' . $id . '"></param>';
             break;
         case 'ustream':
             $url = 'http://www.ustream.tv/embed/' . $id . '?v=3&wmode=transparent';
             break;
         case 'yahoo':
             $id = str_ireplace(array('screen.yahoo,com/', 'screen.yahoo.com/embed/'), '', $id);
             $url = 'http://screen.yahoo.com/embed/' . $id . '.html';
             break;
         case 'vevo':
             $url = 'http://cache.vevo.com/assets/html/embed.html?video=' . $id;
             break;
         case 'ted':
             if (preg_match("/^[a-z]{2}\$/", $lang) === 1) {
                 $url = "https://embed-ssl.ted.com/talks/lang/{$lang}/{$id}.html";
             } else {
                 $url = "https://embed-ssl.ted.com/talks/{$id}.html";
             }
             break;
         case 'iframe':
             $url = $id;
             break;
         case 'kickstarter':
             $url = 'http://www.kickstarter.com/projects/' . $id . '/widget/video.html';
             break;
         case 'ign':
             $url = 'http://widgets.ign.com/video/embed/content.html?url=' . $id;
             break;
         case 'xtube':
             $url = 'http://www.xtube.com/embedded/user/play.php?v=' . $id;
             break;
         case 'facebook':
             $url = 'http://www.facebook.com/video/embed?video_id=' . $id;
             break;
         case 'twitch':
             $tw = explode('/', $id);
             $url = 'http://www.twitch.tv/' . $tw[0] . '/embed';
             if (isset($tw[1]) && isset($tw[2]) && is_numeric($tw[2])) {
                 $url = 'http://www.twitch.tv/swflibs/TwitchPlayer.swf';
                 $object_params = '<param name="movie" value="http://www.twitch.tv/swflibs/TwitchPlayer.swf">';
                 $object_params .= '<param name="allowNetworking" value="all">';
                 switch ($tw[1]) {
                     case 'b':
                     case 'c':
                     case 'v':
                         $videoid_flashvar = '&amp;videoId=' . $tw[1] . $tw[2];
                         break;
                     default:
                         return $this->error(sprintf(__('Twitch ID <code>%s</code> is invalid', $this->plugin_slug), $id));
                         break;
                 }
                 $object_params_autoplay_yes = $object_params . sprintf('<param name="flashvars" value="channel=%s%s&amp;auto_play=true">', $tw[0], $videoid_flashvar);
                 $object_params_autoplay_no = $object_params . sprintf('<param name="flashvars" value="channel=%s%s&amp;auto_play=false">', $tw[0], $videoid_flashvar);
             }
             break;
         case 'vine':
             $url = 'https://vine.co/v/' . $id . '/embed/simple';
             break;
         default:
             return $this->error(sprintf(__('Provider <code>%s</code> not valid', $this->plugin_slug), $provider));
             break;
     }
     if (!empty($object_params)) {
         $iframe = false;
         $mode = 'normal';
         if (empty($object_params_autoplay_yes)) {
             $object_params_autoplay_yes = $object_params;
             $object_params_autoplay_no = $object_params;
         }
     }
     //* Take parameters from Options as defaults and maybe merge custom parameters from shortcode in.
     //* If there are no options we assume the provider not supports any params and do nothing.
     if (!empty($this->options['params'][$provider])) {
         $parameters = wp_parse_args(preg_replace('!\\s+!', '&', trim($parameters)));
         $option_parameters = wp_parse_args(preg_replace('!\\s+!', '&', trim($this->options['params'][$provider])));
         $parameters = wp_parse_args($parameters, $option_parameters);
         $url = add_query_arg($parameters, $url);
         #d($url);
     }
     switch ($provider) {
         case 'youtube':
         case 'youtubelist':
         case 'vimeo':
         case 'dailymotion':
         case 'dailymotionlist':
         case 'viddler':
         case 'vevo':
             $url_autoplay_no = add_query_arg('autoplay', 0, $url);
             $url_autoplay_yes = add_query_arg('autoplay', 1, $url);
             break;
         case 'ustream':
             $url_autoplay_no = add_query_arg('autoplay', 'false', $url);
             $url_autoplay_yes = add_query_arg('autoplay', 'true', $url);
             break;
         case 'yahoo':
             $url_autoplay_no = add_query_arg('player_autoplay', 'false', $url);
             $url_autoplay_yes = add_query_arg('player_autoplay', 'true', $url);
             break;
         case 'metacafe':
             $url_autoplay_no = $url;
             $url_autoplay_yes = add_query_arg('ap', 1, $url);
             break;
         case 'videojug':
             $url_autoplay_no = add_query_arg('ap', 0, $url);
             $url_autoplay_yes = add_query_arg('ap', 1, $url);
             break;
         case 'blip':
         case 'bliptv':
             $url_autoplay_no = add_query_arg('autoStart', 'false', $url);
             $url_autoplay_yes = add_query_arg('autoStart', 'true', $url);
             break;
         case 'veoh':
             $url_autoplay_no = add_query_arg('videoAutoPlay', 0, $url);
             $url_autoplay_yes = add_query_arg('videoAutoPlay', 1, $url);
             break;
         case 'snotr':
             $url_autoplay_no = $url;
             $url_autoplay_yes = add_query_arg('autoplay', '', $url);
             break;
             //* Do nothing for providers that to not support autoplay or fail with parameters
         //* Do nothing for providers that to not support autoplay or fail with parameters
         case 'ign':
         case 'xtube':
         case 'collegehumor':
         case 'facebook':
         case 'twitch':
             //* uses flashvar for autoplay
             $url_autoplay_no = $url;
             $url_autoplay_yes = $url;
             break;
         case 'iframe':
         default:
             //* We are spamming all kinds of autoplay parameters here in hope of a effect
             $url_autoplay_no = add_query_arg(array('ap' => '0', 'autoplay' => '0', 'autoStart' => 'false', 'player_autoStart' => 'false'), $url);
             $url_autoplay_yes = add_query_arg(array('ap' => '1', 'autoplay' => '1', 'autoStart' => 'true', 'player_autoStart' => 'true'), $url);
             break;
     }
     if ('vimeo' == $provider && !empty($start)) {
         $url_autoplay_no .= '#t=' . $start;
         $url_autoplay_yes .= '#t=' . $start;
     }
     $thumbnail = apply_filters('arve_thumbnail', $thumbnail, array('id' => $id, 'provider' => $provider, 'mode' => $mode));
     if (is_wp_error($thumbnail)) {
         return $this->error($thumbnail->get_error_message());
     }
     $output = apply_filters('arve_output', '', array('aspect_ratio' => $aspect_ratio, 'iframe' => $iframe, 'autoplay' => $autoplay, 'maxwidth' => $maxwidth, 'align' => $align, 'id' => $id, 'mode' => $mode, 'provider' => $provider, 'properties' => $properties, 'thumbnail' => $thumbnail, 'link_text' => $link_text, 'url_autoplay_no' => $url_autoplay_no, 'url_autoplay_yes' => $url_autoplay_yes, 'object_params_autoplay_yes' => $object_params_autoplay_yes, 'object_params_autoplay_no' => $object_params_autoplay_no));
     if (is_wp_error($output)) {
         return $this->error($output->get_error_message());
     } elseif (empty($output)) {
         return $this->error('The output is empty, this should not happen');
     }
     if (isset($_GET['arve-debug'])) {
         static $show_options_debug = true;
         $options_dump = '';
         if ($show_options_debug) {
             ob_start();
             var_dump($this->options);
             $options_dump = sprintf('Options: <pre>%s</pre>', ob_get_clean());
         }
         $show_options_debug = false;
         ob_start();
         var_dump($atts);
         $atts_dump = sprintf('<pre>%s</pre>', ob_get_clean());
         return sprintf('<div>%s Provider: %s<br>%s<pre>%s</pre></div>%s', $options_dump, $provider, $atts_dump, esc_html($output), $output);
     }
     return $output;
 }