{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Ilya Birman’s Blog: posts tagged Jouele",
    "_rss_description": "Ilya Birman’s blog on design, cities, music, and life",
    "_rss_language": "en",
    "_itunes_email": "ilyabirman@ilyabirman.net",
    "_itunes_categories_xml": "<itunes:category text=\"Arts\"><itunes:category text=\"Design\" \/><\/itunes:category>\r\n<itunes:category text=\"Society &amp; Culture\"><itunes:category text=\"Personal Journals\" \/><\/itunes:category>\r\n<itunes:category text=\"Technology\" \/>\r\n",
    "_itunes_image": "https:\/\/ilyabirman.net\/meanwhile\/pictures\/userpic\/userpic-square@2x.jpg?1573933764",
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/ilyabirman.net\/meanwhile\/tags\/jouele\/",
    "feed_url": "https:\/\/ilyabirman.net\/meanwhile\/tags\/jouele\/json\/",
    "icon": "https:\/\/ilyabirman.net\/meanwhile\/pictures\/userpic\/userpic@2x.jpg?1573933764",
    "authors": [
        {
            "name": "Ilya Birman",
            "url": "https:\/\/ilyabirman.net\/meanwhile\/",
            "avatar": "https:\/\/ilyabirman.net\/meanwhile\/pictures\/userpic\/userpic@2x.jpg?1573933764"
        }
    ],
    "items": [
        {
            "id": "307",
            "url": "https:\/\/ilyabirman.net\/meanwhile\/all\/jouele-pro\/",
            "title": "Jouele Pro",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-2015-logo@2x.png\" width=\"273\" height=\"64\" alt=\"Jouele Pro\" \/>\n<\/div>\n<p>Jouele is an amazing audio player for the web. It was built to look simple and beautiful, and to use a simple and beautiful declarative API. With Jouele, you write code like this:<\/p>\n<pre class=\"e2-text-code\"><code>&lt;a href=&quot;ilya-birman-use-me-mix.mp3&quot; class=&quot;jouele&quot;&gt;\n  Ilya Birman: Use Me (DJ Mix)\n&lt;\/a&gt;<\/code><\/pre><p>And you get a player like this:<\/p>\n<div class=\"e2-text-audio\">\n<div class=\"e2-jouele-wrapper\"><a class=\"jouele\" data-space-control=\"true\" href=\"http:\/\/promodj.com\/download\/6419453\/\">Ilya Birman: Use Me (DJ Mix)<\/a><\/div>\n<\/div>\n<p>Playlists, repeating and keyboard control were gradually added in the recent years. But we wanted Jouele to be even more advanced and versatile. And we didn’t want to sacrifice the declarative nature of Jouele’s APIs.<\/p>\n<p>So we came up with something great: <a href=\"https:\/\/ilyabirman.net\/projects\/jouele\/pro\/\">Jouele Pro<\/a> with custom controls. Let me tell you about it.<\/p>\n<h2>What you can do with Jouele Pro<\/h2>\n<p>I’ve recently started publishing <a href=\"https:\/\/ilyabirman.net\/mixes\/use-me\/\">interactive playlists<\/a> for my DJ mixes. You can click the cover art to start and pause playback. You can click a track’s name, and the mix will jump to that track. And the currently playing track gets automatically highlighted in the playlist when the playback reaches it.<\/p>\n<p><a href=\"https:\/\/ilyabirman.net\/mixes\/use-me\/\">Try it<\/a> before reading on.<\/p>\n<p>The magic is that neither the cover art, nor the playlist are a part of the Jouele user interface. The are just part of the page, layed out the way I want. But they gain their special abilities by using Jouele Pro’s declarative API.<\/p>\n<p>So I have a player inserted with the code above, by using the CSS class <tt>jouele<\/tt> on an HTML <tt>a<\/tt> element. And I want the cover image to initiate and pause playback.<\/p>\n<p>Here’s what I do:<\/p>\n<pre class=\"e2-text-code\"><code>&lt;img\n  src=&quot;cover.jpg&quot;\n  class=&quot;jouele-control&quot;\n  data-type=&quot;play-pause&quot;\n\/&gt;<\/code><\/pre><p>That’s it. Now, when you click this image, the mix starts to play.<\/p>\n<p>And to make the playlist items clickable, I do this:<\/p>\n<pre class=\"e2-text-code\"><code>&lt;tr class=&quot;jouele-control&quot;\n  data-type=&quot;seek&quot; data-to=&quot;0:45:38&quot;\n&gt;\n  &lt;td&gt;0:45:38&lt;\/td&gt;\n  &lt;td&gt;Tensal&lt;\/td&gt;\n  &lt;td&gt;Achievement 3&lt;\/td&gt;\n&lt;\/tr&gt;<\/code><\/pre><p>Now when you click on a track’s name, you go directly to it in the mix.<\/p>\n<p>I also want the cover art to look somehow “active” when the music is playing. Here’s what I do in CSS:<\/p>\n<pre class=\"e2-text-code\"><code>img.jouele-is-playing {\n  outline: rgba(255, 255, 255, .2) 10px solid;\n}<\/code><\/pre><p>That’s it. Jouele Pro dynamically sets the class <tt>jouele-is-playing<\/tt> on each of its controls during playback, so the cover art highlighting now works. No JavaScript needed.<\/p>\n<p>The same way the highlighting of the currently playing playlist item works. The actual HTML code for each playlist item is this:<\/p>\n<pre class=\"e2-text-code\"><code>&lt;tr class=&quot;jouele-control&quot;\n  data-type=&quot;seek&quot; data-range=&quot;0:45:38...0:48:55&quot;\n&gt;\n  &lt;td&gt;0:45:38&lt;\/td&gt;\n  &lt;td&gt;Tensal&lt;\/td&gt;\n  &lt;td&gt;Achievement 3&lt;\/td&gt;\n&lt;\/tr&gt;<\/code><\/pre><p>This line is not just to jump to a point in time, but it also corresponds to a time range. To dynamically highlight it, I use this CSS:<\/p>\n<pre class=\"e2-text-code\"><code>tr.jouele-is-within {\n  background: rgba(255, 255, 255, .2);\n  color: #fd0093;\n}<\/code><\/pre><p>That’s it. Jouele sets the class <tt>jouele-is-within<\/tt> to all its range controls when the playback is within this range.<\/p>\n<p>If there are several players on a page, the controls control the one that was playing previously, or the first one on the page, if nothing was playing before. You can link the controls to a particular player.<\/p>\n<p>Jouele Pro is $39 per domain name. The free Jouele is available as before.<\/p>\n<p>Links:<\/p>\n<ul>\n  <li><a href=\"https:\/\/ilyabirman.net\/projects\/jouele\/\">Jouele<\/a><\/li>\n  <li><a href=\"https:\/\/ilyabirman.net\/projects\/jouele\/pro\/\">Jouele Pro<\/a><\/li>\n  <li><a href=\"https:\/\/ilyabirman.net\/projects\/jouele\/documentation\/\">Documentation<\/a><br \/>\n  How to use the declarative API and the controls. There is also an example of a full custom player built with the controls<\/li>\n  <li><a href=\"http:\/\/eugene-lazarev.ru\/\">Evgeniy Lazarev<\/a>, the developer of Jouele and Jouele Pro<\/li>\n<\/ul>\n",
            "summary": "Jouele is an amazing audio player for the web. It was built to look simple and beautiful, and to use a simple and beautiful declarative API",
            "date_published": "2019-05-18T19:21:19+03:00",
            "date_modified": "2019-05-18T19:18:28+03:00",
            "tags": [
                "Jouele",
                "my products",
                "projects",
                "release"
            ],
            "image": "https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-2015-logo@2x.png",
            "_date_published_rfc2822": "Sat, 18 May 2019 19:21:19 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "307",
            "_rss_enclosures": [
                {
                    "url": "http:\/\/promodj.com\/download\/6419453\/",
                    "type": null,
                    "length": ""
                }
            ],
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css",
                    "jquery\/jquery.js",
                    "jouele\/jouele.css",
                    "jouele\/jouele.js"
                ],
                "og_images": [
                    "https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-2015-logo@2x.png"
                ]
            }
        },
        {
            "id": "311",
            "url": "https:\/\/ilyabirman.net\/meanwhile\/all\/declarative-apis-talk\/",
            "title": "Designing declarative APIs",
            "content_html": "<p>The video of my Piter CSS conference talk “Designing declarative APIs” has been published:<\/p>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/uCQ3JFuQ7bQ?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<\/div>\n<p>I’m talking about why declarative APIs are great and give examples of their use in my own projects:<\/p>\n<ul>\n  <li><a href=\"https:\/\/ilyabirman.net\/projects\/likely\/\">Likely<\/a>,<\/li>\n  <li><a href=\"https:\/\/ilyabirman.net\/projects\/emerge\/\">Emerge<\/a>,<\/li>\n  <li><a href=\"https:\/\/ilyabirman.net\/projects\/jouele\/\">Jouele<\/a>.<\/li>\n<\/ul>\n<p>At the time of the talk, <a href=\"https:\/\/ilyabirman.net\/projects\/jouele\/pro\/\">the new Jouele Pro<\/a> was still in development. Now it is available.<\/p>\n<p>Thanks to the conference organisers.<\/p>\n",
            "summary": "The video of my Piter CSS conference talk “Designing declarative APIs” has been published",
            "date_published": "2018-02-26T11:28:58+03:00",
            "date_modified": "2021-02-09T16:40:15+03:00",
            "tags": [
                "Emerge",
                "Jouele",
                "Likely",
                "talks",
                "web"
            ],
            "image": "https:\/\/ilyabirman.net\/meanwhile\/pictures\/remote\/youtube-uCQ3JFuQ7bQ-cover.jpg",
            "_date_published_rfc2822": "Mon, 26 Feb 2018 11:28:58 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "311",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": true,
                "links_required": [],
                "og_images": [
                    "https:\/\/ilyabirman.net\/meanwhile\/pictures\/remote\/youtube-uCQ3JFuQ7bQ-cover.jpg"
                ]
            }
        },
        {
            "id": "269",
            "url": "https:\/\/ilyabirman.net\/meanwhile\/all\/jouele-2-3\/",
            "title": "Jouele 2.3",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-2015-logo@2x.png\" width=\"273\" height=\"64\" alt=\"Jouele 2.3\" \/>\n<\/div>\n<p><a href=\"http:\/\/ilyabirman.net\/projects\/jouele\/\">Jouele<\/a> is a simple and beautiful audio player for the web. Eugene Lazarev has been developing it lately.<\/p>\n<p>Version 2.3 has been released. Jouele now uses Howler (bundled) instead of jPlayer. This change helps use less bandwidth, display the preloader better and get rid of several bugs. The <tt>data-repeat<\/tt> feature is now supported on single tracks. When a file is unavailable, Jouele shows this with an icon, instead of just “hanging”. The markup works better in different browsers.<\/p>\n<p>Song example:<\/p>\n<div class=\"e2-text-audio\">\n<div class=\"e2-jouele-wrapper\"><a class=\"jouele\" data-space-control=\"true\" href=\"http:\/\/audio.ilyabirman.ru\/Ilya%20Birman%20-%20When%20I%20Am%20128.mp3\">Ilya Birman: When I Am 128<\/a><\/div>\n<\/div>\n<p>See documentation <a href=\"https:\/\/github.com\/ilyabirman\/Jouele\">on Github<\/a>.<\/p>\n",
            "summary": "Jouele is a simple and beautiful audio player for the web. Eugene Lazarev has been developing it lately",
            "date_published": "2017-04-30T16:18:08+03:00",
            "date_modified": "2017-04-30T16:17:11+03:00",
            "tags": [
                "Jouele",
                "projects",
                "web"
            ],
            "image": "https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-2015-logo@2x.png",
            "_date_published_rfc2822": "Sun, 30 Apr 2017 16:18:08 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "269",
            "_rss_enclosures": [
                {
                    "url": "http:\/\/audio.ilyabirman.ru\/Ilya%20Birman%20-%20When%20I%20Am%20128.mp3",
                    "type": "audio\/mpeg",
                    "length": ""
                }
            ],
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "jquery\/jquery.js",
                    "jouele\/jouele.css",
                    "jouele\/jouele.js"
                ],
                "og_images": [
                    "https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-2015-logo@2x.png"
                ]
            }
        },
        {
            "id": "220",
            "url": "https:\/\/ilyabirman.net\/meanwhile\/all\/jouele-2-1\/",
            "title": "Jouele 2.1",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-2015-logo@2x.png\" width=\"273\" height=\"64\" alt=\"Jouele 2.1\" \/>\n<\/div>\n<p>Eugene Lazarev has updated <a href=\"http:\/\/ilyabirman.net\/projects\/jouele\/\">Jouele<\/a> to version 2.1. It works much faster when multiple audio tracks are used on a page. So my blog post on <a href=\"http:\/\/ilyabirman.net\/meanwhile\/all\/london-underground-voice-announcements\/\">London Underground voice announcements<\/a> will no longer kill the browser. Also, space bar now toggles pause (after you’ve started playing a track with a mouse).<\/p>\n<div class=\"e2-text-audio\">\n<div class=\"e2-jouele-wrapper\"><a class=\"jouele\" data-space-control=\"true\" href=\"http:\/\/audio.ilyabirman.ru\/Ilya%20Birman%20-%20Links%20(Original%20Mix).mp3\">Ilya Birman: Links (Original Mix)<\/a><\/div>\n<\/div>\n<p>See documentation <a href=\"https:\/\/github.com\/ilyabirman\/Jouele\">on Github<\/a>. Special thanks to Alexandra Godun for the English translation.<\/p>\n",
            "summary": "Eugene Lazarev has updated Jouele to version 2.1. It works much faster when multiple audio tracks are used on a page",
            "date_published": "2016-01-01T23:01:57+03:00",
            "date_modified": "2016-08-12T17:44:02+03:00",
            "tags": [
                "Jouele",
                "projects",
                "web"
            ],
            "image": "https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-2015-logo@2x.png",
            "_date_published_rfc2822": "Fri, 01 Jan 2016 23:01:57 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "220",
            "_rss_enclosures": [
                {
                    "url": "http:\/\/audio.ilyabirman.ru\/Ilya%20Birman%20-%20Links%20(Original%20Mix).mp3",
                    "type": "audio\/mpeg",
                    "length": ""
                }
            ],
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "jquery\/jquery.js",
                    "jouele\/jouele.css",
                    "jouele\/jouele.js"
                ],
                "og_images": [
                    "https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-2015-logo@2x.png"
                ]
            }
        },
        {
            "id": "219",
            "url": "https:\/\/ilyabirman.net\/meanwhile\/all\/jouele-2-0\/",
            "title": "Jouele 2.0",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-2015-logo@2x.png\" width=\"273\" height=\"64\" alt=\"Jouele 2.0\" \/>\n<\/div>\n<p>Three years ago I made <a href=\"http:\/\/ilyabirman.net\/projects\/jouele\/\">Jouele<\/a>, a good audio player for the web.<\/p>\n<p>Eugene Lazarev has made version 2.0. The player has dropped the skeuomorphic look and got even nicer. It is now easier to customize the colours. The new version has dynamic initialisation, and is a jQuery plugin with an API (these are presumably good things). I have installed it on my website.<\/p>\n<div class=\"e2-text-audio\">\n<div class=\"e2-jouele-wrapper\"><a class=\"jouele\" data-space-control=\"true\" href=\"http:\/\/audio.ilyabirman.ru\/Ilya%20Birman%20-%20Saw%20U%20Dancing.mp3\">Ilya Birman: Saw U Dancing<\/a><\/div>\n<\/div>\n<p>Related:<\/p>\n<ul>\n  <li><a href=\"http:\/\/eugene-lazarev.ru\/\">Eugene Lazarev<\/a><\/li>\n  <li><a href=\"https:\/\/github.com\/ilyabirman\/Jouele\">Jouele on Github<\/a><\/li>\n  <li><a href=\"http:\/\/ilyabirman.net\/music\/\">My Music<\/a><\/li>\n<\/ul>\n",
            "summary": "Three years ago I made Jouele, a good audio player for the web",
            "date_published": "2015-11-09T16:03:46+03:00",
            "date_modified": "2015-11-09T16:03:37+03:00",
            "tags": [
                "Jouele",
                "projects",
                "web"
            ],
            "image": "https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-2015-logo@2x.png",
            "_date_published_rfc2822": "Mon, 09 Nov 2015 16:03:46 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "219",
            "_rss_enclosures": [
                {
                    "url": "http:\/\/audio.ilyabirman.ru\/Ilya%20Birman%20-%20Saw%20U%20Dancing.mp3",
                    "type": "audio\/mpeg",
                    "length": ""
                }
            ],
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "jquery\/jquery.js",
                    "jouele\/jouele.css",
                    "jouele\/jouele.js"
                ],
                "og_images": [
                    "https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-2015-logo@2x.png"
                ]
            }
        },
        {
            "id": "48",
            "url": "https:\/\/ilyabirman.net\/meanwhile\/2012\/04\/21\/1\/",
            "title": "Meet Jouele, an audio player for the web",
            "content_html": "<p>My audio player is now <a href=\"http:\/\/ilyabirman.net\/jouele\/\">available for everyone<\/a>. It’s called Jouele.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-logo.png\" width=\"302\" height=\"96\" alt=\"\" \/>\n<\/div>\n<p>There’s are many things to improve, but it’s already cool and works, which is enough to publish it. Also, it’s easier to use on your websites than any other player. Enjoy! By the way, it’s <a href=\"https:\/\/github.com\/ilyabirman\/Jouele\">on Github<\/a>, so you probably can commit bugfixes if you like (I have <a href=\"http:\/\/ilyabirman.net\/meanwhile\/2012\/04\/07\/1\/\">no idea<\/a> how it works).<\/p>\n",
            "summary": "My audio player is now available for everyone. It’s called Jouele",
            "date_published": "2012-04-21T11:11:57+03:00",
            "date_modified": "2012-05-05T13:45:04+03:00",
            "tags": [
                "Jouele",
                "projects"
            ],
            "image": "https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-logo.png",
            "_date_published_rfc2822": "Sat, 21 Apr 2012 11:11:57 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "48",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": true,
                "links_required": [],
                "og_images": [
                    "https:\/\/ilyabirman.net\/meanwhile\/pictures\/jouele-logo.png"
                ]
            }
        }
    ],
    "_e2_version": 4259,
    "_e2_ua_string": "Aegea 12.0a (v4259e)"
}