<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>jodal.dev - mopidy</title>
    <subtitle>Personal blog of Stein Magnus Jodal</subtitle>
    <link rel="self" type="application/atom+xml" href="https://jodal.dev/tags/mopidy/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://jodal.dev"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2019-12-23T00:00:00+00:00</updated>
    <id>https://jodal.dev/tags/mopidy/atom.xml</id>
    <entry xml:lang="en">
        <title>10 years of Mopidy</title>
        <published>2019-12-23T00:00:00+00:00</published>
        <updated>2019-12-23T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2019/12/23/10y-of-mopidy/"/>
        <id>https://jodal.dev/2019/12/23/10y-of-mopidy/</id>
        
        <summary type="html">&lt;p&gt;Ten years ago today, on December 23, 2009, Mopidy was born. While chatting with
my friend and then-colleague Johannes Knutsen, we came up with the idea of
building an MPD server that could play music from Spotify instead of local
files.&lt;/p&gt;
&lt;p&gt;This is the story of the first decade of Mopidy.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Pykka 2.0 released with better ergonomics and performance improvements</title>
        <published>2019-05-07T00:00:00+00:00</published>
        <updated>2019-05-07T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2019/05/07/pykka-2.0/"/>
        <id>https://jodal.dev/2019/05/07/pykka-2.0/</id>
        
        <summary type="html">&lt;p&gt;I’ve finally released &lt;a rel=&quot;external&quot; href=&quot;https://pykka.readthedocs.io/&quot;&gt;Pykka&lt;/a&gt; 2.0, the
first major update to Pykka in almost six years.&lt;/p&gt;
&lt;p&gt;Pykka is a Python implementation of the actor model. The actor model
introduces some simple rules to control the sharing of state and cooperation
between execution units, which makes it easier to build concurrent
applications.&lt;/p&gt;
&lt;p&gt;Pykka 2.0 is a major release because it is backwards incompatible in several
minor ways. However, the backwards incompatible changes should only affect
quite narrow use cases.
Mopidy and its extensions,
which is the largest open source ecosystem I know of that uses Pykka,
runs unmodified on Pykka 2.0.&lt;/p&gt;
&lt;p&gt;In this blog post I’ll go through some of the more important improvements in
2.0.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Mopidy-MPRIS 2.0 released</title>
        <published>2018-12-07T00:00:00+00:00</published>
        <updated>2018-12-07T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2018/12/07/mopidy-mpris-2.0/"/>
        <id>https://jodal.dev/2018/12/07/mopidy-mpris-2.0/</id>
        
        <summary type="html">&lt;p&gt;I’ve released &lt;a rel=&quot;external&quot; href=&quot;https://github.com/mopidy/mopidy-mpris&quot;&gt;Mopidy-MPRIS&lt;/a&gt; 2.0, the
first major update to Mopidy-MPRIS in about 3.5 years.&lt;/p&gt;
&lt;p&gt;Mopidy-MPRIS is a Mopidy extension that makes &lt;a rel=&quot;external&quot; href=&quot;https://mopidy.com/&quot;&gt;Mopidy&lt;/a&gt;
controllable from other programs on the same machine through D-Bus. This makes
it possible to control Mopidy from various widgets in GNOME/KDE/etc, as well as
with keyboard media keys.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Four years of JavaScript churn: Mopidy.js 1.0</title>
        <published>2018-12-02T00:00:00+00:00</published>
        <updated>2018-12-02T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2018/12/02/4y-of-js-churn/"/>
        <id>https://jodal.dev/2018/12/02/4y-of-js-churn/</id>
        
        <summary type="html">&lt;p&gt;Yesterday, I released v1.0.0 of the &lt;a rel=&quot;external&quot; href=&quot;https://github.com/mopidy/mopidy.js&quot;&gt;Mopidy.js&lt;/a&gt;
JavaScript library. Even though the library serves as the basis for most Mopidy
web clients and has been in active use since 2013, this was the first release
in almost four years.&lt;/p&gt;
&lt;p&gt;Four years is quite a long time in the world of JavaScript.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Bringing the Mopidy music server to the browser</title>
        <published>2017-08-26T00:00:00+00:00</published>
        <updated>2017-08-26T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2017/08/26/mopidy-in-the-browser/"/>
        <id>https://jodal.dev/2017/08/26/mopidy-in-the-browser/</id>
        
        <summary type="html">&lt;p&gt;Note: This is a blog post draft that was originally written in January 2013,
left unattended for 1689 days, and rediscovered and published unedited in
August 2017.&lt;/p&gt;
&lt;p&gt;During the five years since Mopidy entered the browser with its HTTP JSON-RPC
API and the Mopidy.js JavaScript library, many successful Mopidy web
clients have been built on top of this foundation. The APIs themselves have
survived the test of time and have required minimal maintenance, just as I
hoped when implementing the APIs back in November 2012.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://mopidy.com/&quot;&gt;Mopidy&lt;/a&gt; is a music server written in
Python. It plays music from various sources, including local disk and Spotify.
Mopidy can be remote-controlled by, among others, &lt;abbr title=&quot;Music Player
Daemon&quot;&gt;MPD&lt;/abbr&gt; clients.&lt;/p&gt;
&lt;p&gt;In Mopidy 0.10, released in the middle of December, we added an HTTP frontend.
The HTTP frontend takes Mopidy’s full core API and makes it available from
JavaScript in the browser. This means that you now can make your own web
clients for Mopidy in JavaScript, and Wouter van Wijk has already started on
&lt;a rel=&quot;external&quot; href=&quot;https://github.com/pimusicbox/mopidy-musicbox-webclient&quot;&gt;his client&lt;/a&gt; (&lt;em&gt;updated
link&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;I’d like to write a bit about how we made the HTTP client.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>March and April contributions</title>
        <published>2016-04-30T00:00:00+00:00</published>
        <updated>2016-04-30T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2016/04/30/march-and-april-contributions/"/>
        <id>https://jodal.dev/2016/04/30/march-and-april-contributions/</id>
        
        <summary type="html">&lt;p&gt;The following is a short summary of my open source work in March and April,
almost like in previous months, except that I haven’t spent as much time as
previously on Open Source the last two months.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>February contributions</title>
        <published>2016-03-01T00:00:00+00:00</published>
        <updated>2016-03-01T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2016/03/01/february-contributions/"/>
        <id>https://jodal.dev/2016/03/01/february-contributions/</id>
        
        <summary type="html">&lt;p&gt;The following is a short summary of my open source work in February, just like
&lt;a href=&quot;https://jodal.dev/2015/11/30/november-contributions/&quot;&gt;in&lt;/a&gt;
&lt;a href=&quot;https://jodal.dev/2016/01/01/december-contributions/&quot;&gt;previous&lt;/a&gt;
&lt;a href=&quot;https://jodal.dev/2016/02/01/january-contributions/&quot;&gt;months&lt;/a&gt;.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>A guide to poor API management</title>
        <published>2016-02-18T00:00:00+00:00</published>
        <updated>2016-02-18T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2016/02/18/guide-to-poor-api-management/"/>
        <id>https://jodal.dev/2016/02/18/guide-to-poor-api-management/</id>
        
        <summary type="html">&lt;p&gt;This is the story of libspotify, as experienced by a Spotify customer and
libspotify developer for six years.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>January contributions</title>
        <published>2016-02-01T00:00:00+00:00</published>
        <updated>2016-02-01T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2016/02/01/january-contributions/"/>
        <id>https://jodal.dev/2016/02/01/january-contributions/</id>
        
        <summary type="html">&lt;p&gt;The following is a short summary of my open source work in January, just like I
did back in &lt;a href=&quot;https://jodal.dev/2015/11/30/november-contributions/&quot;&gt;November&lt;/a&gt; and
&lt;a href=&quot;https://jodal.dev/2016/01/01/december-contributions/&quot;&gt;December&lt;/a&gt;.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>December contributions</title>
        <published>2016-01-01T00:00:00+00:00</published>
        <updated>2016-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2016/01/01/december-contributions/"/>
        <id>https://jodal.dev/2016/01/01/december-contributions/</id>
        
        <summary type="html">&lt;p&gt;The following is a short summary of my open source work in December, following
up on &lt;a href=&quot;https://jodal.dev/2015/11/30/november-contributions/&quot;&gt;my first report in November&lt;/a&gt;.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>November contributions</title>
        <published>2015-11-30T00:00:00+00:00</published>
        <updated>2015-11-30T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2015/11/30/november-contributions/"/>
        <id>https://jodal.dev/2015/11/30/november-contributions/</id>
        
        <summary type="html">&lt;p&gt;The following is a short summary of my open source work in November. My hope is
that keeping better track of what I’m doing will help me reflect on how I spend
my time, and help me to focus my efforts better.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Building ARM Debian packages with pbuilder</title>
        <published>2015-03-08T00:00:00+00:00</published>
        <updated>2015-03-08T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2015/03/08/building-arm-debs-with-pbuilder/"/>
        <id>https://jodal.dev/2015/03/08/building-arm-debs-with-pbuilder/</id>
        
        <summary type="html">&lt;p&gt;&lt;em&gt;The goal of this post is to help myself reproduce this pbuilder setup in the
future. If you find it useful too, then that’s great.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Building ARM packages on older ARM devices like the Raspberry Pi 1 is slow, so
I want to use a single amd64 machine to build Debian packages for all my target
platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;amd64,&lt;/li&gt;
&lt;li&gt;i386,&lt;/li&gt;
&lt;li&gt;armel/ARMv4+ (e.g. Debian on Raspberry Pi 1),&lt;/li&gt;
&lt;li&gt;armhf/ARMv6+ (Raspbian), and&lt;/li&gt;
&lt;li&gt;armhf/ARMv7+ (e.g. Debian/Ubuntu on Raspberry Pi 2, Odroid C1, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Preferably, I want to build the packages for the current Debian stable, which
at the time of writing is wheezy, so that they’ll work for as many users as
possible.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Debian packaging of Mopidy</title>
        <published>2014-10-28T00:00:00+00:00</published>
        <updated>2014-10-28T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2014/10/28/debian-packaging/"/>
        <id>https://jodal.dev/2014/10/28/debian-packaging/</id>
        
        <summary type="html">&lt;p&gt;My first upload to Debian as a Debian Maintainer, Mopidy 0.19.4-3, landed in
Debian testing today, well in time for the upcoming freeze.&lt;/p&gt;
&lt;p&gt;The new version adjusts the LSB facilities the sysvinit script depends on, to
make sure that DNS lookups, DBus (used by Mopidy-MPRIS), and Avahi (used for
Zeroconf service publishing) are available before Mopidy starts.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>pyspotify v2.0.0b1 released, with new event loop and audio sinks</title>
        <published>2014-04-24T00:00:00+00:00</published>
        <updated>2014-04-24T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2014/04/24/pyspotify-v2.0.0b1/"/>
        <id>https://jodal.dev/2014/04/24/pyspotify-v2.0.0b1/</id>
        
        <summary type="html">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://pyspotify.readthedocs.io/&quot;&gt;pyspotify&lt;/a&gt; 2.x is a full rewrite of pyspotify.
While pyspotify 1.x is a CPython C extension, pyspotify 2.x uses
&lt;a rel=&quot;external&quot; href=&quot;http://cffi.readthedocs.org/&quot;&gt;CFFI&lt;/a&gt; to make 100% of the libspotify C library
available from Python. It works on CPython 2.7 and 3.2+, as well as PyPy 2.1+.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>New Python wrapper for libspotify</title>
        <published>2014-02-14T00:00:00+00:00</published>
        <updated>2014-02-14T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2014/02/14/new-python-wrapper-for-libspotify/"/>
        <id>https://jodal.dev/2014/02/14/new-python-wrapper-for-libspotify/</id>
        
        <summary type="html">&lt;p&gt;Today, after about nine months of working on it now and then, I uploaded the
first alpha release of &lt;a rel=&quot;external&quot; href=&quot;https://pyspotify.readthedocs.io/&quot;&gt;pyspotify 2.0&lt;/a&gt; to
&lt;a rel=&quot;external&quot; href=&quot;https://pypi.python.org/pypi/pyspotify&quot;&gt;PyPI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;pyspotify provides a Python interface to &lt;a rel=&quot;external&quot; href=&quot;http://www.spotify.com/&quot;&gt;Spotify’s&lt;/a&gt;
online music streaming service. With it you can access music metadata, search
in Spotify’s library of 20+ million tracks, manage your Spotify playlists, and
play music from Spotify. All from your own Python applications.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Mopidy packaged in Debian and Ubuntu</title>
        <published>2013-12-28T00:00:00+00:00</published>
        <updated>2013-12-28T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2013/12/28/mopidy-packaged-in-debian-and-ubuntu/"/>
        <id>https://jodal.dev/2013/12/28/mopidy-packaged-in-debian-and-ubuntu/</id>
        
        <summary type="html">&lt;p&gt;Looking back to my last post from September, my goal was to have
the music server &lt;a rel=&quot;external&quot; href=&quot;https://mopidy.com/&quot;&gt;Mopidy&lt;/a&gt; packaged in Debian by the end
of the year and in Ubuntu in time for the 14.04 LTS release in April. As of
yesterday, Mopidy 0.17.0 is a part of &lt;a rel=&quot;external&quot; href=&quot;http://packages.debian.org/source/sid/mopidy&quot;&gt;Debian
unstable&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://launchpad.net/ubuntu/+source/mopidy&quot;&gt;Ubuntu
trusty&lt;/a&gt;, just a few days after
Mopidy’s fourth anniversary on December 23.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Mopidy hosted by Rackspace</title>
        <published>2013-07-22T00:00:00+00:00</published>
        <updated>2013-07-22T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2013/07/22/mopidy-hosted-by-rackspace/"/>
        <id>https://jodal.dev/2013/07/22/mopidy-hosted-by-rackspace/</id>
        
        <summary type="html">&lt;p&gt;A week ago &lt;a rel=&quot;external&quot; href=&quot;https://twitter.com/jessenoller/status/355757374906183680&quot;&gt;Jesse Noller
tweeted&lt;/a&gt; that
&lt;a rel=&quot;external&quot; href=&quot;http://www.rackspace.com/&quot;&gt;Rackspace&lt;/a&gt; would provide free Rackspace cloud
accounts for open source projects. It only took a couple of hours from I first
mailed Jesse to we had two servers up and running.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>pyspotify 1.2 released</title>
        <published>2011-06-08T00:00:00+00:00</published>
        <updated>2011-06-08T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2011/06/08/pyspotify-1-2-released/"/>
        <id>https://jodal.dev/2011/06/08/pyspotify-1-2-released/</id>
        
        <summary type="html">&lt;p&gt;pyspotify is a Python wrapper for
&lt;a rel=&quot;external&quot; href=&quot;https://developer.spotify.com/en/libspotify/&quot;&gt;libspotify&lt;/a&gt;, which give
developers access to the &lt;a rel=&quot;external&quot; href=&quot;https://www.spotify.com/&quot;&gt;Spotify&lt;/a&gt; music streaming
service.&lt;/p&gt;
&lt;p&gt;Today, I tagged pyspotify 1.2 at &lt;a rel=&quot;external&quot; href=&quot;https://github.com/mopidy/pyspotify&quot;&gt;GitHub&lt;/a&gt;
and pushed the new release to
&lt;a rel=&quot;external&quot; href=&quot;http://pypi.python.org/pypi/pyspotify/1.2&quot;&gt;PyPI&lt;/a&gt;. I’ve also made deb packages
of libspotify and pyspotify available at
&lt;a rel=&quot;external&quot; href=&quot;https://apt.mopidy.com/&quot;&gt;apt.mopidy.com&lt;/a&gt;.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>multiprocessing.Connection is not free</title>
        <published>2011-03-20T00:00:00+00:00</published>
        <updated>2011-03-20T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2011/03/20/multiprocessing-connection-is-not-free/"/>
        <id>https://jodal.dev/2011/03/20/multiprocessing-connection-is-not-free/</id>
        
        <summary type="html">&lt;p&gt;I’ve
&lt;a href=&quot;https://jodal.dev/2011/03/06/pickling-multiprocessing-connection-objects/&quot;&gt;previously written&lt;/a&gt;
about how to wrap &lt;code&gt;multiprocessing.Connection&lt;/code&gt; objects in a class that makes
&lt;code&gt;Connection&lt;/code&gt; objects picklable, and thus transferable over another
&lt;code&gt;Connection&lt;/code&gt;. That approach is still valid, but don’t use it–or &lt;code&gt;Connection&lt;/code&gt;
objects at all–for lots of use-once-and-throw-away connections.&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Traits in Python using multiple inheritance</title>
        <published>2011-03-15T00:00:00+00:00</published>
        <updated>2011-03-15T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jodal.dev/2011/03/15/traits-in-python-using-multiple-inheritance/"/>
        <id>https://jodal.dev/2011/03/15/traits-in-python-using-multiple-inheritance/</id>
        
        <summary type="html">&lt;p&gt;As you probably know, if a class needs to handle two mostly unrelated concerns, the
class should probably be split into two. This way, your will achieve
&lt;a rel=&quot;external&quot; href=&quot;http://en.wikipedia.org/wiki/Cohesion_(computer_science)&quot;&gt;higher cohesion&lt;/a&gt; in your
code, which is generally considered a good thing. Though, there are times where
you need to address two mostly unrelated concerns in a single class.&lt;/p&gt;
&lt;p&gt;The Scala programming language has a concept they call
&lt;a rel=&quot;external&quot; href=&quot;http://www.scala-lang.org/node/126&quot;&gt;traits&lt;/a&gt;. Scala traits can be compared to
Java interfaces, except that Scala traits may be partially or fully
implemented, like abstract classes. As with Java interfaces, you can &lt;em&gt;mixin&lt;/em&gt;
multiple traits in a class. If any of the traits has colliding method
signatures, the last trait mixed in overrides the earlier ones. Just as with
regular inheritance and interfaces, the class &lt;em&gt;must&lt;/em&gt; implement any methods that
has not been implemented by the traits, and &lt;em&gt;may&lt;/em&gt; override any methods that
already has been implemented.&lt;/p&gt;</summary>
        
    </entry>
</feed>
