<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: JW Player</title>
    <description>The latest articles on DEV Community by JW Player (@jwplayer).</description>
    <link>https://dev.to/jwplayer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F35%2F66c0692a-40e9-42cc-b6eb-1097c68a8d2c.jpg</url>
      <title>DEV Community: JW Player</title>
      <link>https://dev.to/jwplayer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jwplayer"/>
    <language>en</language>
    <item>
      <title>Under the Hood of the Most Powerful Video JavaScript API</title>
      <dc:creator>The JW Player Team</dc:creator>
      <pubDate>Fri, 01 Jun 2018 15:47:32 +0000</pubDate>
      <link>https://dev.to/jwplayer/under-the-hood-of-the-most-powerful-video-javascript-api-4kme</link>
      <guid>https://dev.to/jwplayer/under-the-hood-of-the-most-powerful-video-javascript-api-4kme</guid>
      <description>

&lt;h2&gt;Introduction&lt;/h2&gt;

&lt;p&gt;At &lt;a href="https://www.jwplayer.com/plans/?utm_source=dev.to&amp;amp;utm_medium=blog"&gt;JW Player&lt;/a&gt;, we believe our technology enables developers to deliver the best video experience on their websites. From individual developers to enterprises like Vice, Business Insider, and Amazon Web Services — we have the right solution for everyone. &lt;a href="https://dev.to/vaidehijoshi/stacks-and-queues--basecs-video-series--20oj"&gt;Dev.to&lt;/a&gt; seems to think so as well (right-click on the video player)!&lt;/p&gt;

&lt;p&gt;In this article, we'll prove this with code instead of lip service. The goal is to demonstrate how to leverage our player JavaScript API to deliver a better video experience on your website through code walkthroughs &amp;amp; demos. We'll then wrap up with some details under the hood of JW Player, explaining &lt;i&gt;how&lt;/i&gt; we're the fastest player on the web. Without further ado:&lt;/p&gt;

&lt;h2&gt;A robust, powerful video JavaScript API&lt;/h2&gt;

&lt;p&gt;At JW Player, our mission is to provide developers with the most robust JavaScript API to allow you to take full control of your video experience. This includes functionality ranging from advanced player customization to analytics reporting.&lt;/p&gt;

&lt;p&gt;Compared to open source solutions, we’re committed to providing robust documentation in addition to code demos alongside a dedicated, world-class support team to ensure development and implementation is a breeze. Your time is valuable and our developer &amp;amp; support sites ensure that you spend less time sorting through StackOverflow.&lt;/p&gt;

&lt;p&gt;Here’s examples of what you can do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://developer.jwplayer.com/jw-player/demos/innovation/click-to-play/?utm_source=dev.to&amp;amp;utm_medium=blog"&gt;Video Wall&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.jwplayer.com/jw-player/demos/innovation/360-video/?utm_source=dev.to&amp;amp;utm_medium=blog"&gt;360 Degree Video &amp;amp; VR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.jwplayer.com/jw-player/demos/developer-showcase/video-background/?utm_source=dev.to&amp;amp;utm_medium=blog"&gt;Video Background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.jwplayer.com/jw-player/demos/customization/custom-icons/?utm_source=dev.to&amp;amp;utm_medium=blog"&gt;Custom Control Icons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.jwplayer.com/jw-player/demos/toolbox/closed-captions/?utm_source=dev.to&amp;amp;utm_medium=blog"&gt;Closed Captions&lt;/a&gt; &amp;amp; &lt;a href="https://developer.jwplayer.com/jw-player/demos/customization/captions-styling/?utm_source=dev.to&amp;amp;utm_medium=blog"&gt;Caption Styling&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's walk through the first demo - creating a click-to-play Video Wall. The purpose of this video wall is to display content in a cinematic format without slowing down your web page.&lt;/p&gt;

&lt;p&gt;In this demo, you can set up a responsive video grid that only pulls the poster images from the videos to ensure a fast time to first frame by only loading the video player upon clicking the thumbnail.  As the viewer clicks around, it pauses the original video as well.&lt;/p&gt;

&lt;p&gt;Instead of loading several players at once, which would be painful on mobile, you can create a cinematic experience while providing the optimal UX for your viewers.&lt;/p&gt;

&lt;p&gt;Setup and play a video with a single click on a thumbnail within a responsive image grid as seen below:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/kim_hart/embed/aKOVQN%20?height=500&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt; &lt;/iframe&gt;&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// Request playlist data&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;httpRequest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;XMLHttpRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;httpRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;httpRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onreadystatechange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;httpRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readyState&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;XMLHttpRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DONE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;httpRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;httpRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="nx"&gt;getThumbnails&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;httpRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;httpRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'//cdn.jwplayer.com/v2/playlists/0FDAGB12'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;httpRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;})();&lt;/span&gt;

  &lt;span class="c1"&gt;// Render thumbnails into grid layout&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;thumbs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'.thumb'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;player&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getThumbnails&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;playlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;playlist&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;thumbs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;thumb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;playlist&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;titleText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'div'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;titleText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'title-text'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;titleText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;thumb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;titleText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;thumb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mediaid&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;thumb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backgroundImage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"url('"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"')"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="nx"&gt;thumb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'click'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;handleActivePlayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c1"&gt;// On click, destroy existing player, setup new player in target div&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;handleActivePlayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;activeDiv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;player&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;player&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;thumbs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;thumb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;thumb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nx"&gt;activeDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Chain .play() onto player setup (rather than autostart: true)&lt;/span&gt;
    &lt;span class="nx"&gt;player&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jwplayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;activeDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'//content.jwplatform.com/manifests/'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mediaid&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'.m3u8'&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;play&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Destroy the player and replace with thumbnail&lt;/span&gt;
    &lt;span class="nx"&gt;player&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'complete'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;player&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;player&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;How we built the web's fastest video player&lt;/h2&gt;

&lt;p&gt;When thinking about the user experience of a video player, time to first frame is the most noticeable factor that impacts the viewability of a video.&lt;/p&gt;

&lt;p&gt;An &lt;a href="https://www.akamai.com/us/en/multimedia/documents/technical-publication/video-stream-quality-impacts-viewer-behavior-inferring-causality-using-quasi-experimental-designs-technical-publication.pdf"&gt;Akamai study&lt;/a&gt; discovered that &lt;b&gt;video abandonment rate increases by 6% for every second of load time beyond two seconds&lt;/b&gt;. A &lt;a href="http://www.fiercecable.com/online-video/akamai-ott-video-streaming-quality-experience-drives-viewer-loyalty-provider-success"&gt;separate study on OTT viewership&lt;/a&gt; showed that &lt;b&gt;buffering increases negative emotions by 16% and decreases engagement by 20%&lt;/b&gt;. These two studies strongly indicate that poor playback is the biggest inhibitor of video engagement.&lt;/p&gt;

&lt;p&gt;That’s why we ensured our player has &lt;b&gt;sub-second load times&lt;/b&gt; across all devices and browsers so end viewers never see a buffering screen.&lt;/p&gt;

&lt;p&gt;How?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Our player detects the viewer’s rendering environments and &lt;b&gt;loads only the necessary components required for playback&lt;/b&gt;. Based on a combination of the media type contained in playlists and the viewer’s browser, we’ve optimized the player to make fewer network requests for the most common use cases of video playback, reducing latency costs associated with setup times.&lt;/li&gt;
&lt;li&gt;Our embed script is engineered to &lt;b&gt;make fewer server requests&lt;/b&gt; to better interact with the overall composition of modern webpages. By implementing the latest version of our web player, you can rest assured that JW Player is &lt;b&gt;actively reducing its footprint to improve your entire website experience.&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;Our video preloading fetches media data before playback and as soon as the page loads which allows viewers to enjoy &lt;b&gt;faster playback with reduced bandwidth&lt;/b&gt;. Specifically, our backend preloading process is smarter about when it occurs and is more precise with how much is preloaded. We’ve also taken steps to optimize bandwidth consumption for websites that load multiple video players on a single page by only preloading players when they become more than 50% viewable.&lt;/li&gt;
&lt;li&gt;The player is set to load metadata by default so playback starts immediately for click-to-play players once playback is initiated. To reiterate, these preloading changes allows the player to be &lt;b&gt;more intelligent to avoid wasting audience bandwidth while simultaneously improving start times.&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;Finally, our player &lt;b&gt;does not compromise video quality&lt;/b&gt; if the end viewer can support a higher quality stream. The player maintains the viewer’s bandwidth between videos, allowing the second and subsequent videos to benefit from a higher quality start at the beginning. If the viewer is watching the player embed’s first video, the player can start up at the last known bandwidth when a viewer returns to a site on the same device and browser.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To see what’s going on under the hood, check out the &lt;a href="https://developer.jwplayer.com/tools/player-event-inspector/?utm_source=dev.to&amp;amp;utm_medium=blog"&gt;player event inspector&lt;/a&gt; on our developer website. Here, you can test and debug a JW Player setup with our return of all available JW Player events, getters, and utils.&lt;/p&gt;

&lt;p&gt;For more info, you can also check our comprehensive &lt;a href="https://developer.jwplayer.com/jw-player/docs/developer-guide/customization/configuration-reference/?utm_source=dev.to&amp;amp;utm_medium=blog"&gt;configuration reference documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;We created the most powerful, flexible video Javascript API so you can deliver a great video experience customized to your standards. Our team maintains the player to ensure full device and browser support so you're always up to date — plus tools, demos and robust API documentation so you can focus on what matters.&lt;/p&gt;

&lt;p&gt;For more information, &lt;a href="https://www.jwplayer.com/plans/?utm_source=dev.to&amp;amp;utm_medium=blog"&gt;compare options&lt;/a&gt; and see which plan is right for you.&lt;/p&gt;


</description>
      <category>video</category>
      <category>videoplayer</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>JW Player is Hiring a Senior Javascript Engineer</title>
      <dc:creator>dequaina</dc:creator>
      <pubDate>Fri, 06 Oct 2017 16:16:14 +0000</pubDate>
      <link>https://dev.to/jwplayer/jw-player-is-hiring-a-senior-javascript-engineer-4gg</link>
      <guid>https://dev.to/jwplayer/jw-player-is-hiring-a-senior-javascript-engineer-4gg</guid>
      <description>&lt;h1&gt;
  
  
  Senior Javascript Engineer
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;New York, NY&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JW Player is the world's most widely-adopted web video player, generating more than 15 billion video streams a month.&lt;/strong&gt; We're looking for a JavaScript programmer to join a world-class team of front-end software engineers dedicated to building cutting-edge features while maintaining our best-in-class performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  In this role you will:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Write clean and reusable code using the latest web technologies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Participate in code reviews on github and with your peers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Develop expertise in JavaScript, CSS and multi-browser development&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improve performance, stability and user experience of the JW Video Player&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Take ownership of feature development and releases&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Requirements:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Expertise in front-end web development with JavaScript, HTML5 and CSS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Experience developing and deploying web applications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Attention to detail implementing designs and testing across browsers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Knowledge of best practices, frameworks, functional programming and OOP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;B.S. degree or higher in Computer Science or related technical field&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bonus Points
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Strong portfolio or Github profile&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ES6/ES2015, W3C standards, CommonJS/AMD, Node.JS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Experience with DASH, HLS and/or other streaming technologies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Experience with 3rd party advertising and analytics frameworks and sdks&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This is a full time role based in our NY offices.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About Us
&lt;/h2&gt;

&lt;p&gt;If you've watched video on the web, you already know us. JW Player is the largest, and fastest growing, independent online video platform in the market today. We provide a popular suite of software products that enable over 2 million publishers to deliver and monetize their content on any device. Our flagship product, JW Player, is currently the most widely used video player in the world and is used in over nine billion streams each month. We recently finalized a $20 million round of series C financing to continue this upward momentum and invest in products that are changing the online video landscape.&lt;/p&gt;

&lt;p&gt;We are an equal opportunity employer and value diversity at our company. We do not discriminate on the basis of race, religion, color, national origin, gender, sexual orientation, age, marital status, veteran status, or disability status. &lt;/p&gt;



&lt;center&gt;&lt;h2&gt; &lt;a href="https://boards.greenhouse.io/jwplayer/jobs/846642?gh_src=a76vd81#.Wdep-hNSx0s"&gt;Apply For This Position&lt;/a&gt;&lt;br&gt;
&lt;/h2&gt;&lt;/center&gt;




</description>
      <category>hiring</category>
    </item>
    <item>
      <title>JW Player is Hiring a Javascript Engineer</title>
      <dc:creator>dequaina</dc:creator>
      <pubDate>Wed, 04 Oct 2017 18:45:26 +0000</pubDate>
      <link>https://dev.to/jwplayer/jw-player-javascript-engineer-a53</link>
      <guid>https://dev.to/jwplayer/jw-player-javascript-engineer-a53</guid>
      <description>&lt;h1&gt;
  
  
  Javascript Engineer
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;New York, NY&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;JW Player is the world's most widely-adopted web video player, generating more than 15 billion video streams a month. We're looking for a software engineer with top-notch JavaScript skills to join a world-class team of front-end software engineers dedicated to building cutting-edge features while maintaining our best-in-class performance. This role is on the Video Advertising Technology Team.&lt;/p&gt;

&lt;h2&gt;
  
  
  In this role you will:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Write clean and reusable code using the latest web technologies (JavaScript/ES6, Webpack, Node.js)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Take ownership of feature development and releases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Participate in code reviews on github and with your peers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improve performance, stability and user experience of ad playback in the JW Video Player&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Develop innovations in the video advertising ecosystem&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Requirements:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;3+ years commercial experience &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expertise in front-end web development with JavaScript, HTML5, CSS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Experience developing and deploying web applications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Attention to detail implementing designs and testing across browsers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Knowledge of best practices, frameworks, functional programming and OOP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;B.S. degree or higher in Computer Science or related technical field&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bonus Points:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Understanding of video advertising technologies and standards (VAST, VMAP, VPAID, Google IMA)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Strong portfolio or Github profile&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ES6/ES2015, W3C standards, CommonJS/AMD, Node.JS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Experience with DASH, HLS and/or other streaming technologies&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This is a full time role based in our NY offices.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About Us
&lt;/h2&gt;

&lt;p&gt;If you've watched video on the web, you already know us. JW Player is the largest, and fastest growing, independent online video platform in the market today. We provide a popular suite of software products that enable over 2 million publishers to deliver and monetize their content on any device. Our flagship product, JW Player, is currently the most widely used video player in the world and is used in over nine billion streams each month. We recently finalized a $20 million round of series C financing to continue this upward momentum and invest in products that are changing the online video landscape.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We are an equal opportunity employer and value diversity at our company. We do not discriminate on the basis of race, religion, color, national origin, gender, sexual orientation, age, marital status, veteran status, or disability status.&lt;/em&gt;&lt;/p&gt;



&lt;center&gt;&lt;h2&gt; &lt;a href="https://boards.greenhouse.io/jwplayer/jobs/748396?gh_src=fn4buv1#.WdewgBNSx0s"&gt;Apply For This Position&lt;/a&gt;&lt;br&gt;
&lt;/h2&gt;&lt;/center&gt;




</description>
      <category>hiring</category>
    </item>
    <item>
      <title>JW Player is Hiring a Software Engineer, Big Data</title>
      <dc:creator>dequaina</dc:creator>
      <pubDate>Wed, 04 Oct 2017 18:45:17 +0000</pubDate>
      <link>https://dev.to/jwplayer/jw-player-software-engineer-big-data-26l</link>
      <guid>https://dev.to/jwplayer/jw-player-software-engineer-big-data-26l</guid>
      <description>&lt;h1&gt;
  
  
  Software Engineer, Big Data
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;New York, NY&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do you love to code?  Want to work with big data?  Then we’ve got the job for you!  At JW Player, we process over 3.5 TB of data a day -- and the data is fascinating!  We’ve got the viewing habits of a couple billion people across thousands of websites -- everything from silly cat videos to hard-hitting journalism.&lt;/p&gt;

&lt;p&gt;Interested in realtime processing?  Batch processing?  We do both!  JW Player employs cutting-edge technologies like Spark, Kafka, Flink, and Storm to deliver high-quality analytics as fast as physics will allow.  &lt;/p&gt;

&lt;p&gt;If you have experience with big data, we’d love to speak with you!  But even if you don’t, we’d still love to speak with you. We’re looking for someone with a proven track record of writing high-quality code for a production environment. If you’re an excellent developer, you have a place at JW Player.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements :
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strong programming fundamentals.&lt;/strong&gt;  You know your algorithms, you know OOP, you know your way around a debugger.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A proven track record writing of code for a production environment.&lt;/strong&gt; A history of supporting that code through the full development lifecycle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Experience with data.&lt;/strong&gt;  Doesn’t need to be big data, but your SQL should be strong and you should have a solid grasp of data modeling principles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;An obsession with testing.&lt;/strong&gt;  Experience with TDD a strong plus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3+ years of industry experience&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A degree in Computer Science or a relevant discipline&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Our tech stack :
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt; Mostly Python with some Java&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-time processing:&lt;/strong&gt; Kafka, Flink, Storm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Batch processing:&lt;/strong&gt; Spark, Hadoop&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Storage:&lt;/strong&gt; S3, Postgres, Redis&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cloud:&lt;/strong&gt; All AWS, all the time!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About JW Player
&lt;/h2&gt;

&lt;p&gt;If you've watched video on the web, you already know us. JW Player is a venture-funded, online video software company based in Manhattan. Our flagship product, the JW Player, is deployed on over 2 million websites and streams billions of videos each month.  Started in 2008 as the world’s first open source video player, today the company’s customers span the globe across 193 countries and range from Fortune 500 companies to individual bloggers. We’re busy innovating for the future by actively hiring smart, motivated, and innovation-driven people! Come help us imagine and define what comes next! jwplayer.com/careers&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We are an equal opportunity employer and value diversity at our company. We do not discriminate on the basis of race, religion, color, national origin, gender, sexual orientation, age, marital status, veteran status, or disability status.&lt;/em&gt;&lt;/p&gt;



&lt;center&gt;&lt;h2&gt; &lt;a href="https://boards.greenhouse.io/jwplayer/jobs/734396?gh_src=ntb54y1#.Wdew7RNSx0s"&gt;Apply For This Position&lt;/a&gt;&lt;br&gt;
&lt;/h2&gt;&lt;/center&gt;




</description>
      <category>hiring</category>
    </item>
    <item>
      <title>JW Player is Hiring a Test Automation Engineer</title>
      <dc:creator>dequaina</dc:creator>
      <pubDate>Wed, 04 Oct 2017 18:45:13 +0000</pubDate>
      <link>https://dev.to/jwplayer/jw-player-test-automation-engineer-19p</link>
      <guid>https://dev.to/jwplayer/jw-player-test-automation-engineer-19p</guid>
      <description>&lt;h1&gt;
  
  
  Test Automation Engineer
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;New York, NY&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JW Player is the world's most widely-adopted web video player, generating more than 15 billion video streams a month.&lt;/strong&gt; We’re looking for an Automation Engineer who is as excited about helping scale our functional and automation testing processes as they are about new video technologies and finding ways to test them!&lt;/p&gt;

&lt;h2&gt;
  
  
  In this role, you will:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Work closely with the Product and Engineering teams to define acceptance criteria and build detailed test plans&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Take an active role in increasing the percentage of automated test cases by writing Cucumber feature files and contributing to our Selenium/Ruby framework&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execute hands-on functional testing on the JW Player, testing integrations across multiple platforms and configuration scenarios&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Collaborate with development teams to understand how development changes affect ongoing automation efforts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Work as part of a scrum team in an agile environment&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Minimum 3-5 years relevant test automation/software development experience&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Experience with HTML, JavaScript, and CSS; hands-on JavaScript coding/troubleshooting experience preferred&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Experience using open source tools like Git and Jenkins&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proven automation experience with Selenium Webdriver&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Skilled in analyzing feature requests/requirements, and determining potential tests that should be created&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ability to learn new technologies, tools, and processes quickly&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bonus Points
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You’ve successfully implemented new testing/automation tools and processes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You’ve implemented and maintained automated visual tests using tools such as Applitools&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You’ve held a developer role in the past&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comfortable multi-tasking between several projects and releases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Knowledge of video encoding, ad networks, content management platforms, and/or video streaming protocols&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This is a full time role based in our NY offices.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Company Description
&lt;/h2&gt;

&lt;p&gt;If you've watched video on the web, you already know us. JW Player is the largest, and fastest growing, independent online video platform in the market today. We provide a popular suite of software products that enable over 2 million publishers to deliver and monetize their content on any device. Our flagship product, JW Player, is currently the most widely used video player in the world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We are an equal opportunity employer and value diversity at our company. We do not discriminate on the basis of race, religion, color, national origin, gender, sexual orientation, age, marital status, veteran status, or disability status.&lt;/strong&gt;&lt;/p&gt;



&lt;center&gt;&lt;h2&gt; &lt;a href="https://boards.greenhouse.io/jwplayer/jobs/781926?gh_src=5kb07n1#.WdewxRNSx0s"&gt;Apply For This Position&lt;/a&gt;&lt;br&gt;
&lt;/h2&gt;&lt;/center&gt;




</description>
      <category>hiring</category>
    </item>
  </channel>
</rss>
