{"id":2944,"date":"2015-11-18T05:00:00","date_gmt":"2015-11-18T05:00:00","guid":{"rendered":"http:\/\/jwplayer.com\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/"},"modified":"2023-02-06T14:28:22","modified_gmt":"2023-02-06T19:28:22","slug":"how-jw-player-does-video-player-testing-with-qa-automation-tools","status":"publish","type":"post","link":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/","title":{"rendered":"How JW Player does Video Player Testing with QA Automation Tools"},"content":{"rendered":"
\n

The major challenge with automated integration testing for a web player via\u00a0browser automation tools is that these tools better serve the purposes of web applications such as e-commerce sites, single page applications, and social networks. How do you take a product like JW Player which is embedded on over 2 million websites where publishers are always coming up with unique ways to use the player, and build an automated testing framework that will ensure the quality of that player? I would like to walk through how we\u2019ve taken on that challenge.<\/p>\n

\"\"<\/p>\n

Test Harness<\/h2>\n

We\u2019ve created a Test Harness which allows us\u00a0to setup a player using any valid JSON configuration and exposes the Player API in the DOM on\u00a0an HTML form, providing a visual representation of the API. The entire player event history (count of events being triggered and event properties) are being populated as actions are performed on the player. We use the browser automation library, Capybara<\/a> (Ruby Gem) to interact with the test harness form as well as the player. Capybara validates the DOM elements of the harness form (checking text value of the divs containing event count\/property history) as we interact with the player.\u00a0<\/p>\n

Capybara\u2019s API was designed to handle the challenges of working with asynchronous javascript which made it a good choice for us over other Selenium API Wrappers. What\u2019s quite interesting and challenging about our automated test workflow is the decisions we make to assert steps in our test scenarios. In most web applications, a user would follow various actions to land on a certain page and successfully complete an action. A video player has no such completion\u00a0path and we have to make internal determinations on what assertions would consider a step to be passed or failed. Take for example, how can we determine whether the player has actually started playback after we clicked on the play button? The approach we take is to consider the various JW Player API Events and Getters that can help us determine playback actually started. We’re also testing against the JW Player’s UI, which has been designed in JW7 in a way in\u00a0which\u00a0we take advantage of validating for the presence or lack of presence of css flags.\u00a0In order to create and run scenarios we use Cucumber<\/a>.\u00a0Here is an example of a very basic Cucumber test scenario we automate:<\/p>\n

Scenario: MP4 Playback<\/p>\n

Given I set up the player on the harness page with mp4-playlist.json<\/p>\n

When I click on the centered play button<\/p>\n

Then playback begins <\/p>\n

So what is actually happening under the hood\u00a0when these steps are being executed?<\/p>\n

The \u201cGiven\u201d step is where we are loading the test harness page in the\u00a0browser. We then read\u00a0the JSON\u00a0file which contains a player configuration and set up the player with that configuration. The JSON\u00a0file will consist of a playlist and may also\u00a0include options such as an ad schedule or plugin. Before we go to the next step we want to validate that the player is actually properly set up by checking that the jwplayer api on(\u2018ready\u2019) event was triggered once in the harness.<\/p>\n

The \u201cWhen\u201d step is where we perform a click action on the css selector associated to the play button displayed on the player. We are using the Site Prism<\/a> page object library to encapsulate all our test\u00a0methods and css selectors available to us for the player. We can perform actions such as clicks, hovers, keyboard commands, visibility validations, and some more advanced interactions such as dragging the control bar scrubber from left to right to perform seek actions. <\/p>\n

The \u201cThen\u201d step is where we have to make more difficult decisions on a successful playback attempt. This is where we really take advantage of the harness event history. We verify which components of our API should be used to determine that playback began. For this particular example we determinate\u00a0that on(‘buffer’), on(‘beforePlay’), on(‘play’), on(‘time’) events are all being triggered and populated in the DOM. For some of these events we verify the exact count of the events firing to help us find potential bugs with duplicated event calls. We then verify that our API Getter for getting state of the player is returning “playing.” We can also make a UI validation on the player to verify that the time slider text in the control bar is updating.\u00a0If you take a look at the screenshot above of the test harness, you can observe the different events being triggered and the getters for that particular player test.<\/p>\n

Test Management – \u201cSquash\u201d<\/h2>\n

\"\"<\/p>\n

Some time back when we decided to use Cucumber, we also decided that we would write our manual test cases with Cucumber. We liked the way the Gherkin language made us follow a behavioral flow and it provided us a standard we can follow when writing new test cases. This is really helpful when you have an entire team contributing to test case writing. Even with this approach we still had test management pains. The biggest pain, which many engineers can relate to is using Spreadsheets to manage regression test plans.<\/p>\n

Our player team software engineer, Donato Borrello, created a test management solution for our team\u00a0named \u201cSquash\u201d that moved us away from relying on\u00a0spreadsheets. Squash is a single page app which manages all of our manual cucumber tests. Squash parses Cucumber feature files and generates an html table for each scenario where test runs can be performed against the scenario. Squash will also embed a player configuration specific to the test case above the table. If you take a look at the screenshots below you can see how it all comes together. First you create a\u00a0test scenario in a Cucumber feature file. Above the scenario you provide the browser tags for the browsers supported for this particular scenario. We then add a line below the scenario title which does a lookup for a JSON config with\u00a0the file name provided after “Config.” Once that is all done we are all set to go and test!<\/p>\n

\"\"<\/p>\n

Squash has been a huge\u00a0success in helping us move away from the days of spreadsheet management. We\u2019ve also been able to find synergies between Squash and our automated scenarios. Since we\u2019re using Cucumber for both our manual and automated tests, we have been including our automated tests in Squash. When we run our automated tests, we take advantage of Cucumber\u2019s hooks and make a request to the Squash API with the appropriate pass or fail status after the scenario runs. This hybrid approach has helped team members who participate in adding manual test cases to get a better understanding of some commonly used automated step patterns so that when they do add new manual tests, the test can potentially already have multiple automated steps, and I can thank them for making my life easier! It may still seem to be a strange use case to include automated test reporting as part of your manual testing infrastructure, but consider the fact that we have over 700 test cases of which ~200 are currently automated, then\u00a0multiply that by all supported browsers, and note that some supported browsers such as Android Stock currently have no automated test coverage.<\/p>\n

What\u2019s Next?<\/h2>\n

Visual Regression Testing – One of our next big goals is to add visual regression testing into our framework. There are only so so many test cases that we feel confident enough to automate with our existing test infrastructure before we need visual feedback. We have recently evaluated Applitools<\/a> and have found it to be a great solution with minimal time spent on framework integration. We plan to continue to evaluate it and progressively add visual tests where it makes the most sense.<\/p>\n

Mobile Device Coverage – Our tests are currently geared towards automating against a desktop browser environment and one of our goals is to step up our game in getting more automated coverage against mobile devices. One of the challenges with this is that we do not testing with emulators which means our automated tests will need to run with real devices.<\/p>\n

And of course, we\u2019re always looking to add\u00a0more and more automated\u00a0tests! We are making\u00a0big strides in our automation efforts and will have more to talk about soon!<\/p>\n

\u00a0<\/p>\n

Danny Finkelstein, Test Automation Engineer, JW Player<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"

The major challenge with automated integration testing for a web player via\u00a0browser automation tools is that these tools better serve the purposes of web applications such as e-commerce sites, single page applications, and social networks. How do you take a product like JW Player which is embedded on over 2 million websites where publishers are […]<\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2944","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"acf":[],"yoast_head":"\nHow JW Player does Video Player Testing with QA Automation Tools - JW Player<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How JW Player does Video Player Testing with QA Automation Tools - JW Player\" \/>\n<meta property=\"og:description\" content=\"The major challenge with automated integration testing for a web player via\u00a0browser automation tools is that these tools better serve the purposes of web applications such as e-commerce sites, single page applications, and social networks. How do you take a product like JW Player which is embedded on over 2 million websites where publishers are […]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/\" \/>\n<meta property=\"og:site_name\" content=\"JW Player\" \/>\n<meta property=\"article:published_time\" content=\"2015-11-18T05:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-02-06T19:28:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/f.hubspotusercontent30.net\/hubfs\/20577834\/Imported_Blog_Media\/8f8a3ff0d3cd0f8a1f426ae84669d9623f50a5b5_test_harness-879x1024-1.jpg\" \/>\n<meta name=\"author\" content=\"JW Player\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"JW Player\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/\"},\"author\":{\"name\":\"JW Player\",\"@id\":\"https:\/\/jwplayer.com\/#\/schema\/person\/4ce3d83ed5ba775537e8e6c8307f3c6f\"},\"headline\":\"How JW Player does Video Player Testing with QA Automation Tools\",\"datePublished\":\"2015-11-18T05:00:00+00:00\",\"dateModified\":\"2023-02-06T19:28:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/\"},\"wordCount\":1418,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/jwplayer.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/f.hubspotusercontent30.net\/hubfs\/20577834\/Imported_Blog_Media\/8f8a3ff0d3cd0f8a1f426ae84669d9623f50a5b5_test_harness-879x1024-1.jpg\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/\",\"url\":\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/\",\"name\":\"How JW Player does Video Player Testing with QA Automation Tools - JW Player\",\"isPartOf\":{\"@id\":\"https:\/\/jwplayer.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/f.hubspotusercontent30.net\/hubfs\/20577834\/Imported_Blog_Media\/8f8a3ff0d3cd0f8a1f426ae84669d9623f50a5b5_test_harness-879x1024-1.jpg\",\"datePublished\":\"2015-11-18T05:00:00+00:00\",\"dateModified\":\"2023-02-06T19:28:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#primaryimage\",\"url\":\"https:\/\/f.hubspotusercontent30.net\/hubfs\/20577834\/Imported_Blog_Media\/8f8a3ff0d3cd0f8a1f426ae84669d9623f50a5b5_test_harness-879x1024-1.jpg\",\"contentUrl\":\"https:\/\/f.hubspotusercontent30.net\/hubfs\/20577834\/Imported_Blog_Media\/8f8a3ff0d3cd0f8a1f426ae84669d9623f50a5b5_test_harness-879x1024-1.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/jwplayer.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How JW Player does Video Player Testing with QA Automation Tools\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/jwplayer.com\/#website\",\"url\":\"https:\/\/jwplayer.com\/\",\"name\":\"JW Player\",\"description\":\"End-to-End Solution for Streaming & Monetizing Video\",\"publisher\":{\"@id\":\"https:\/\/jwplayer.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/jwplayer.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/jwplayer.com\/#organization\",\"name\":\"JW Player\",\"url\":\"https:\/\/jwplayer.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/jwplayer.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/jwplayer.com\/wp-content\/uploads\/2023\/02\/logo-jwp-primary.png\",\"contentUrl\":\"https:\/\/jwplayer.com\/wp-content\/uploads\/2023\/02\/logo-jwp-primary.png\",\"width\":1000,\"height\":417,\"caption\":\"JW Player\"},\"image\":{\"@id\":\"https:\/\/jwplayer.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/jwplayer.com\/#\/schema\/person\/4ce3d83ed5ba775537e8e6c8307f3c6f\",\"name\":\"JW Player\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/jwplayer.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/2db7398616357b21568fd90b8357560b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/2db7398616357b21568fd90b8357560b?s=96&d=mm&r=g\",\"caption\":\"JW Player\"},\"url\":\"https:\/\/jwplayer.com\/blog\/author\/jw-player\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How JW Player does Video Player Testing with QA Automation Tools - JW Player","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/","og_locale":"en_US","og_type":"article","og_title":"How JW Player does Video Player Testing with QA Automation Tools - JW Player","og_description":"The major challenge with automated integration testing for a web player via\u00a0browser automation tools is that these tools better serve the purposes of web applications such as e-commerce sites, single page applications, and social networks. How do you take a product like JW Player which is embedded on over 2 million websites where publishers are […]","og_url":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/","og_site_name":"JW Player","article_published_time":"2015-11-18T05:00:00+00:00","article_modified_time":"2023-02-06T19:28:22+00:00","og_image":[{"url":"https:\/\/f.hubspotusercontent30.net\/hubfs\/20577834\/Imported_Blog_Media\/8f8a3ff0d3cd0f8a1f426ae84669d9623f50a5b5_test_harness-879x1024-1.jpg"}],"author":"JW Player","twitter_card":"summary_large_image","twitter_misc":{"Written by":"JW Player","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#article","isPartOf":{"@id":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/"},"author":{"name":"JW Player","@id":"https:\/\/jwplayer.com\/#\/schema\/person\/4ce3d83ed5ba775537e8e6c8307f3c6f"},"headline":"How JW Player does Video Player Testing with QA Automation Tools","datePublished":"2015-11-18T05:00:00+00:00","dateModified":"2023-02-06T19:28:22+00:00","mainEntityOfPage":{"@id":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/"},"wordCount":1418,"commentCount":0,"publisher":{"@id":"https:\/\/jwplayer.com\/#organization"},"image":{"@id":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#primaryimage"},"thumbnailUrl":"https:\/\/f.hubspotusercontent30.net\/hubfs\/20577834\/Imported_Blog_Media\/8f8a3ff0d3cd0f8a1f426ae84669d9623f50a5b5_test_harness-879x1024-1.jpg","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/","url":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/","name":"How JW Player does Video Player Testing with QA Automation Tools - JW Player","isPartOf":{"@id":"https:\/\/jwplayer.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#primaryimage"},"image":{"@id":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#primaryimage"},"thumbnailUrl":"https:\/\/f.hubspotusercontent30.net\/hubfs\/20577834\/Imported_Blog_Media\/8f8a3ff0d3cd0f8a1f426ae84669d9623f50a5b5_test_harness-879x1024-1.jpg","datePublished":"2015-11-18T05:00:00+00:00","dateModified":"2023-02-06T19:28:22+00:00","breadcrumb":{"@id":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#primaryimage","url":"https:\/\/f.hubspotusercontent30.net\/hubfs\/20577834\/Imported_Blog_Media\/8f8a3ff0d3cd0f8a1f426ae84669d9623f50a5b5_test_harness-879x1024-1.jpg","contentUrl":"https:\/\/f.hubspotusercontent30.net\/hubfs\/20577834\/Imported_Blog_Media\/8f8a3ff0d3cd0f8a1f426ae84669d9623f50a5b5_test_harness-879x1024-1.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/jwplayer.com\/blog\/how-jw-player-does-video-player-testing-with-qa-automation-tools\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/jwplayer.com\/"},{"@type":"ListItem","position":2,"name":"How JW Player does Video Player Testing with QA Automation Tools"}]},{"@type":"WebSite","@id":"https:\/\/jwplayer.com\/#website","url":"https:\/\/jwplayer.com\/","name":"JW Player","description":"End-to-End Solution for Streaming & Monetizing Video","publisher":{"@id":"https:\/\/jwplayer.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jwplayer.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/jwplayer.com\/#organization","name":"JW Player","url":"https:\/\/jwplayer.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jwplayer.com\/#\/schema\/logo\/image\/","url":"https:\/\/jwplayer.com\/wp-content\/uploads\/2023\/02\/logo-jwp-primary.png","contentUrl":"https:\/\/jwplayer.com\/wp-content\/uploads\/2023\/02\/logo-jwp-primary.png","width":1000,"height":417,"caption":"JW Player"},"image":{"@id":"https:\/\/jwplayer.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/jwplayer.com\/#\/schema\/person\/4ce3d83ed5ba775537e8e6c8307f3c6f","name":"JW Player","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jwplayer.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/2db7398616357b21568fd90b8357560b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2db7398616357b21568fd90b8357560b?s=96&d=mm&r=g","caption":"JW Player"},"url":"https:\/\/jwplayer.com\/blog\/author\/jw-player\/"}]}},"_links":{"self":[{"href":"https:\/\/jwplayer.com\/wp-json\/wp\/v2\/posts\/2944"}],"collection":[{"href":"https:\/\/jwplayer.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jwplayer.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jwplayer.com\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/jwplayer.com\/wp-json\/wp\/v2\/comments?post=2944"}],"version-history":[{"count":1,"href":"https:\/\/jwplayer.com\/wp-json\/wp\/v2\/posts\/2944\/revisions"}],"predecessor-version":[{"id":5887,"href":"https:\/\/jwplayer.com\/wp-json\/wp\/v2\/posts\/2944\/revisions\/5887"}],"wp:attachment":[{"href":"https:\/\/jwplayer.com\/wp-json\/wp\/v2\/media?parent=2944"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jwplayer.com\/wp-json\/wp\/v2\/categories?post=2944"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jwplayer.com\/wp-json\/wp\/v2\/tags?post=2944"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}