<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title>Stein Magnus Jodal</title>
  <link href="https://jodal.no/"/>
  <link type="application/atom+xml" rel="self" href="https://jodal.no/atom.xml"/>
  <updated>2017-03-15T00:41:37CET</updated>
  <id>https://jodal.no/</id>
  <author>
    <name>Stein Magnus Jodal</name>
    <email>stein.magnus@jodal.no</email>
    <uri>https://jodal.no/</uri>
  </author>

  
    
      <entry>
        <id>https://jodal.no/2016/04/30/march-and-april-contributions/</id>
        <link type="text/html" rel="alternate" href="https://jodal.no/2016/04/30/march-and-april-contributions/"/>
        <title>March and April contributions</title>
        <updated>2016-04-30T00:00:00CEST</updated>
        <content 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;

&lt;h1 id=&quot;debian&quot;&gt;Debian&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Attended one day of the &lt;a href=&quot;https://wiki.debian.org/BSP/2016/04/09/no/Oslo&quot;&gt;Debian Bug Squashing Party in
Oslo&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/760868&quot;&gt;mopidy 2.0.2-2&lt;/a&gt;:
Fixed &lt;a href=&quot;https://bugs.debian.org/819174&quot;&gt;RC bug #819174&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/757945&quot;&gt;mopidy-dleyna 1.0.5-2&lt;/a&gt;:
Added missing dependency.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;mopidy&quot;&gt;Mopidy&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Bugfixes for the upcoming Mopidy 2.0.1 (which should have been released a
long time ago):
merged &lt;a href=&quot;https://github.com/mopidy/mopidy/pull/1455&quot;&gt;PR #1455&lt;/a&gt;,
created &lt;a href=&quot;https://github.com/mopidy/mopidy/pull/1493&quot;&gt;PR #1493&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Started on, but didn’t finish, fixing the Travis CI setup for Mopidy-GMusic.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Upgraded the Mopidy project server from Ubuntu 14.04 LTS to 16.04 LTS.
Rebuilt the discuss.mopidy.com Discourse/Docker instance.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Accepted Lars Kruse as the new maintainer of
&lt;a href=&quot;https://github.com/mopidy/mopidy-beets&quot;&gt;Mopidy-Beets&lt;/a&gt;. Thanks!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The extensions still in need of a new maintainer are:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/mopidy/mopidy-gmusic&quot;&gt;Mopidy-GMusic&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/mopidy/mopidy-nad&quot;&gt;Mopidy-NAD&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/mopidy/mopidy-soundcloud&quot;&gt;Mopidy-SoundCloud&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/mopidy/mopidy-youtube&quot;&gt;Mopidy-YouTube&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;If you’re a user of any of these and want to contribute, please step up.
Instructions can be found in the README of any of these projects.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</content>
        
          <category term="debian"/>
        
          <category term="python"/>
        
          <category term="mopidy"/>
        
          <category term="comics"/>
        
      </entry>
    
  
    
      <entry>
        <id>https://jodal.no/2016/03/01/february-contributions/</id>
        <link type="text/html" rel="alternate" href="https://jodal.no/2016/03/01/february-contributions/"/>
        <title>February contributions</title>
        <updated>2016-03-01T00:00:00CET</updated>
        <content 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.no/2015/11/30/november-contributions/&quot;&gt;in&lt;/a&gt;
&lt;a href=&quot;https://jodal.no/2016/01/01/december-contributions/&quot;&gt;previous&lt;/a&gt;
&lt;a href=&quot;https://jodal.no/2016/02/01/january-contributions/&quot;&gt;months&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;debian&quot;&gt;Debian&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/745492&quot;&gt;mopidy-dirble 1.3.0-1&lt;/a&gt;:
New upstream release.
Moved to &lt;a href=&quot;https://alioth.debian.org/projects/pkg-mopidy/&quot;&gt;pkg-mopidy&lt;/a&gt; team.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/748111&quot;&gt;mopidy-tunein 0.3.0-1&lt;/a&gt;:
New upstream release.
Moved to pkg-mopidy team.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/748410&quot;&gt;python-tunigo 1.0.0-1&lt;/a&gt;:
New package. &lt;a href=&quot;https://bugs.debian.org/814820&quot;&gt;ITP&lt;/a&gt;.
Maintained in the Debian Python Modules Team (DPMT).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/748365&quot;&gt;mopidy 2.0.0-1&lt;/a&gt;:
New upstream release.
Fixed &lt;a href=&quot;http://bugs.debian.org/785910&quot;&gt;RC bug #785910&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/748368&quot;&gt;mopidy-soundcloud 2.0.2-2&lt;/a&gt;:
Fixed &lt;a href=&quot;http://bugs.debian.org/799089&quot;&gt;RC bug #799089&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;mopidy&quot;&gt;Mopidy&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Released &lt;a href=&quot;https://github.com/mopidy/mopidy-spotify&quot;&gt;Mopidy-Spotify 2.3.1&lt;/a&gt;:
Works around search being broken in libspotify by using the Spotify Web API
for the search functionality, and nothing else.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Wrapped up and released &lt;a href=&quot;https://docs.mopidy.com/en/latest/changelog/&quot;&gt;Mopidy 2.0
release&lt;/a&gt;. This was a quite
large release that ports to GStreamer 1.x and adds support for gapless
playback. It was uploaded to Debian in time to be part of Ubuntu 16.04 LTS.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Released &lt;a href=&quot;https://github.com/mopidy/mopidy-spotify&quot;&gt;Mopidy-Spotify 3.0.0&lt;/a&gt;: A
couple of small compatibility fixes to work with Mopidy 2.x and GStreamer
1.x.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Updates to packages not in Debian, only at apt.mopidy.com:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Uploaded mopidy-spotify-tunigo 1.0.0-0mopidy1. Far down the chain, it
depends on libspotify, which is not in Debian.&lt;/li&gt;
      &lt;li&gt;Uploaded mopidy-spotify 2.0.0-0mopidy1.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Updated &lt;a href=&quot;https://github.com/mopidy/homebrew-mopidy&quot;&gt;homebrew-mopidy&lt;/a&gt; with
lots of new releases:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Mopidy 2.0.0&lt;/li&gt;
      &lt;li&gt;Mopidy-Dirble 1.3.0&lt;/li&gt;
      &lt;li&gt;Mopidy-SoundCloud 2.0.2&lt;/li&gt;
      &lt;li&gt;Mopidy-Spotify 2.3.0, 2.3.1 and 3.0.0&lt;/li&gt;
      &lt;li&gt;python-backports-abc 0.4&lt;/li&gt;
      &lt;li&gt;python-backports-ssl-match-hostname 3.5.0.1&lt;/li&gt;
      &lt;li&gt;python-certifi 2015.11.20.1&lt;/li&gt;
      &lt;li&gt;python-cffi 1.5.0 and 1.5.2&lt;/li&gt;
      &lt;li&gt;python-requests 2.9.1&lt;/li&gt;
      &lt;li&gt;python-singledispatch 3.4.0.3&lt;/li&gt;
      &lt;li&gt;python-six 1.10.0&lt;/li&gt;
      &lt;li&gt;python-tornado 4.3&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Rebased my
&lt;a href=&quot;https://github.com/jodal/mopidy/tree/feature/py3-compat&quot;&gt;feature/py3-compat&lt;/a&gt;
branch on top of Mopidy 2.0.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Planned breaking changes for Mopidy 3.0:
&lt;a href=&quot;https://github.com/mopidy/mopidy/issues/1460&quot;&gt;unbundling of Mopidy.js&lt;/a&gt;,
removal of deprecated
&lt;a href=&quot;https://github.com/mopidy/mopidy/issues/1461&quot;&gt;core APIs&lt;/a&gt;,
&lt;a href=&quot;https://github.com/mopidy/mopidy/issues/1464&quot;&gt;model APIs&lt;/a&gt;,
&lt;a href=&quot;https://github.com/mopidy/mopidy/issues/1465&quot;&gt;audio APIs&lt;/a&gt; and removal of the
&lt;code class=&quot;highlighter-rouge&quot;&gt;http/static_dir&lt;/code&gt; &lt;a href=&quot;https://github.com/mopidy/mopidy/issues/1463&quot;&gt;config&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Planned breaking changes to modernize Mopidy.js:
&lt;a href=&quot;https://github.com/mopidy/mopidy.js/issues/10&quot;&gt;change default calling convention&lt;/a&gt;
to &lt;code class=&quot;highlighter-rouge&quot;&gt;by-position-or-by-name&lt;/code&gt;,
&lt;a href=&quot;https://github.com/mopidy/mopidy.js/issues/11&quot;&gt;replace When.js with ES6 Promise&lt;/a&gt;,
&lt;a href=&quot;https://github.com/mopidy/mopidy.js/issues/12&quot;&gt;replace Bane.js with EventEmitter&lt;/a&gt;,
and
&lt;a href=&quot;https://github.com/mopidy/mopidy.js/issues/13&quot;&gt;replace Buster.js with Karma+Mocha&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;comics&quot;&gt;Comics&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;Started working on the upgrade to Django 1.8. Most deps are
&lt;a href=&quot;https://requires.io/github/jodal/comics/requirements/?branch=develop&quot;&gt;upgraded&lt;/a&gt;.
The major remaining pieces is to upgrade django-registration from 0.8 to 2.0
and to replace the years-old vendored copy of django-invitation (singular)
with &lt;a href=&quot;https://github.com/bee-keeper/django-invitations&quot;&gt;django-invitations&lt;/a&gt;
(plural).&lt;/li&gt;
&lt;/ul&gt;
</content>
        
          <category term="debian"/>
        
          <category term="python"/>
        
          <category term="mopidy"/>
        
          <category term="comics"/>
        
      </entry>
    
  
    
      <entry>
        <id>https://jodal.no/2016/02/18/guide-to-poor-api-management/</id>
        <link type="text/html" rel="alternate" href="https://jodal.no/2016/02/18/guide-to-poor-api-management/"/>
        <title>A guide to poor API management</title>
        <updated>2016-02-18T00:00:00CET</updated>
        <content 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;

&lt;h3 id=&quot;step-1-support-your-api-for-years&quot;&gt;Step 1: Support your API for years&lt;/h3&gt;

&lt;p&gt;Since &lt;a href=&quot;https://developer.spotify.com/news-stories/2009/04/07/launching-libspotify-and-developers-website/&quot;&gt;April
2009&lt;/a&gt;,
&lt;a href=&quot;https://developer.spotify.com/technologies/libspotify/&quot;&gt;libspotify&lt;/a&gt; has been a
mostly nice–although proprietary–C library for integrating with the Spotify
music streaming service, providing both music metadata and full playback
capabilities. Language wrappers have been written for a plenitude of
programming languages (including my own
&lt;a href=&quot;https://pyspotify.mopidy.com/&quot;&gt;pyspotify&lt;/a&gt;). libspotify is integrated into
numerous open source projects (including my own
&lt;a href=&quot;https://www.mopidy.com/&quot;&gt;Mopidy&lt;/a&gt;), networked AV receivers, and rumour has it:
even cars.&lt;/p&gt;

&lt;p&gt;In addition to being closed source, there was another catch: in order to use
it, you need the Spotify premium subscription. Speaking from my own
experience supporting a project integrating with Spotify for the last six
years: lots of end users upgraded to premium in order to use the projects built
on top of libspotify.&lt;/p&gt;

&lt;h3 id=&quot;step-2-stop-accepting-bug-reports-and-stop-releasing-updates&quot;&gt;Step 2: Stop accepting bug reports and stop releasing updates&lt;/h3&gt;

&lt;p&gt;In May 2012, Spotify released libspotify 12.1.51 for all supported
architectures, which now even included Android.&lt;/p&gt;

&lt;p&gt;After months of endless requests from the quickly growing hoards of Raspberry
Pi users, Spotify released &lt;a href=&quot;https://developer.spotify.com/news-stories/2013/01/22/libspotify-12-for-hardfloat-armv6-raspberry-pi-beta/&quot;&gt;libspotify 12.1.103 for hardfloat
armv6&lt;/a&gt;
on January 22 2013. The release included minor API additions, like the addition
of explicit lyrics and means for accepting Spotify’s Terms of Service.&lt;/p&gt;

&lt;p&gt;The additions in 12.1.103 never reached the other supported architectures and
12.1.51 remains the last release for those. There was no clear communication
about this being the end of libspotify, releases have just ceased. libspotify
has not been mentioned in a single developer blog post or developer email
newsletter since.&lt;/p&gt;

&lt;p&gt;That’s now more than three years ago.&lt;/p&gt;

&lt;h3 id=&quot;step-3-create-new-apis&quot;&gt;Step 3: Create new APIs&lt;/h3&gt;

&lt;p&gt;Over the next couple of years Spotify released a new &lt;a href=&quot;https://developer.spotify.com/web-api/&quot;&gt;Web
API&lt;/a&gt; and iOS and Android SDKs. Through
their developer blog, they communicated quite a bit both about these and about
the deprecation of the apps inside the Spotify desktop client.&lt;/p&gt;

&lt;p&gt;Here are some pieces from their developer blog to illustrate:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2014-02-03: &lt;a href=&quot;https://developer.spotify.com/news-stories/2014/02/03/deprecation-of-spotify-apps-api-0-x/&quot;&gt;Deprecation of Spotify Apps API
0.x&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2014-03-06: &lt;a href=&quot;https://developer.spotify.com/news-stories/2014/03/06/announcing-the-new-spotify-ios-sdk-beta/&quot;&gt;First Spotify iOS SDK beta
release&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2014-03-24: &lt;a href=&quot;https://developer.spotify.com/news-stories/2014/03/24/closure-of-spotify-apps-submissions/&quot;&gt;No longer accepting new Spotify
Apps&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2014-06-17: &lt;a href=&quot;https://developer.spotify.com/news-stories/2014/06/17/say-hello-new-web-api/&quot;&gt;First Spotify Web API
release&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2014-06-25: &lt;a href=&quot;https://developer.spotify.com/news-stories/2014/06/25/announcing-new-spotify-android-sdk-beta/&quot;&gt;First Spotify Android SDK beta
release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Web API grew steadily, as documented by the &lt;a href=&quot;https://developer.spotify.com/web-api/change-log/&quot;&gt;Web APIs
changelog&lt;/a&gt;. Over time, its
feature list improved, supporting anonymous endpoints for generic music
metadata as well as OAuth protected endpoints for managing your own music
collection and playlists. The only major part missing that prevented developers
replacing libspotify was music playback, as &lt;strong&gt;the Web API only provides 30
second previews.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From what I recall of 2014 IRC discussions with Spotify employees, they had
built a new much smaller library for streaming music. The iOS and Android SDKs
were simply platform specific wrappers around this new playback library and the
new Web API. My impression is that, after a number of beta releases, the iOS
and Android SDKs seamlessly replaced libspotify on those platforms. The plan
was apparently to release the new playback library for desktop too, so that it,
in combination with the Web API, could replace libspotify there as well.&lt;/p&gt;

&lt;p&gt;That was all back in 2014.&lt;/p&gt;

&lt;h3 id=&quot;step-4-deprecate-old-apis&quot;&gt;Step 4: Deprecate old APIs&lt;/h3&gt;

&lt;p&gt;At some point, Spotify deprecated their old web API, the &lt;a href=&quot;https://developer.spotify.com/technologies/metadata-api/&quot;&gt;Metadata
API&lt;/a&gt;. There was no
blog post about it and it was not mentioned in any Spotify Developer News email
I’ve received in recent years. I guess they only published this fact as a note
on the Metadata API web page; it is therefore hard to track down exactly when
it was deprecated and how the deprecation was communicated. Anyway, it was
deprecated, and the natural upgrade path was to the new Web API. Spotify even
has a &lt;a href=&quot;https://developer.spotify.com/web-api/migration-guide/&quot;&gt;migration guide&lt;/a&gt;
mapping the concepts of the Metadata API to the new Web API. All good.&lt;/p&gt;

&lt;p&gt;In May 2015, after 28 months without a single release or any news, libspotify
is officially deprecated. The communication channel of choice? A note on the
libspotify web page. No post on the developer blog. No Spotify Developer News
email. To be able to use libspotify, all developers have registered and
requested a personal application key. To my knowledge, none of these registered
library users were notified directly.&lt;/p&gt;

&lt;h3 id=&quot;step-5-shut-down-an-old-api&quot;&gt;Step 5: Shut down an old API&lt;/h3&gt;

&lt;p&gt;On January 20 2016 Spotify end-of-lifed their Metadata API. I don’t know if
this date was communicated on the Metadata API web page well in advance of this
shutdown. There’s no blog post on the topic. There’s no news email. There’s no
tweet from &lt;a href=&quot;https://twitter.com/SpotifyPlatform&quot;&gt;@SpotifyPlatform&lt;/a&gt; or
&lt;a href=&quot;https://twitter.com/SpotifyStatus&quot;&gt;@SpotifyStatus&lt;/a&gt;. I can’t find anything
except users commenting on various Spotify documentation pages that the text is
outdated because the API is no longer merely deprecated, but entirely shut
down.&lt;/p&gt;

&lt;p&gt;Hopefully they did publish the shutdown date ahead of time. It had a full
replacement API and a migration guide. Fair and square. Nothing much to
complain about here. It’s time to get porting your code to the Web API!&lt;/p&gt;

&lt;p&gt;But frankly, I don’t really care about this Metadata API because I don’t use
the Metadata API, do I?&lt;/p&gt;

&lt;h3 id=&quot;step-6-break-your-api-without-warning&quot;&gt;Step 6: Break your API without warning&lt;/h3&gt;

&lt;p&gt;February 3 2016, Mopidy users start
&lt;a href=&quot;https://github.com/mopidy/mopidy-spotify/issues/89&quot;&gt;reporting&lt;/a&gt; “General
transient error” when searching Spotify. This is a libspotify error message
known as “&lt;code class=&quot;highlighter-rouge&quot;&gt;SP_ERROR_OTHER_TRANSIENT&lt;/code&gt;” with error code 16. This error usually
means that there is some unspecified issue with the Spotify service. We’ve
actually seen it before and like its name suggests, it is indeed transient and
soon goes away.&lt;/p&gt;

&lt;p&gt;According to &lt;a href=&quot;https://twitter.com/kingosticks/status/697906633662398464&quot;&gt;a series of
tweets&lt;/a&gt; between
my fellow Mopidy developer Nick Steel and @SpotifyCares it appears that the
libspotify search functionality was backed by the Metadata API’s search
functionality. Who knew? I’m not aware of any relation between these APIs ever
being mentioned publicly. &lt;strong&gt;No libspotify user could possibly have known that
the Metadata API shutdown would affect them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s summarize: libspotify hasn’t had any releases for three years and it was
officially deprecated in May last year. But, there have been no warnings about
any shutdown. The libspotify project is likely no longer staffed at all. Did
someone just forget that libspotify depended on the Metadata API they were
shutting down?&lt;/p&gt;

&lt;p&gt;Many newer networked AV receivers use the Spotify Connect libraries that are
exclusive to Spotify’s commercial partners. But some receivers probably still
use libspotify. If so, did Spotify just break hardware sold with Spotify
support as a major feature? Something that people are paying a monthly fee to
use?&lt;/p&gt;

&lt;p&gt;It seems they did!&lt;/p&gt;

&lt;p&gt;In the Spotify Community forums there are numerous reports of broken devices
and software that all have two things in common: the date the problem started
occurring, and that search is the only feature that is broken.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://community.spotify.com/t5/Newcomers-and-Contribution/Spotify-on-Denon-CEOL-N8/td-p/1291990&quot;&gt;Denon
receivers&lt;/a&gt;,
including models: CEOL N8&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://forums.slimdevices.com/showthread.php?105136-Spotify-search-fails&quot;&gt;Logitech Squeezebox media
players&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://community.spotify.com/t5/Help-Other-Partners-Windows/Search-and-Whats-New-no-longer-working-on-Marantz-Nr1504/td-p/1290668&quot;&gt;Marantz
receivers&lt;/a&gt;,
including models: M-CR510, M-CR610, NR1504, NR1603, SR5007, SR6008&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://community.spotify.com/t5/Help-Other-Partners-Windows/Spotify-Search-no-longer-working-on-Onkyo-CR-N755/td-p/1289758&quot;&gt;Onkyo
receivers&lt;/a&gt;,
including CR-N755, TX-NR509, TX-NR609, TX-8050&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://community.spotify.com/t5/Help-Other-Partners-Windows/Roku-search-no-longer-working/td-p/1285836&quot;&gt;Roku media
players&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Surely, Spotify will quickly explain themselves and fix this?&lt;/p&gt;

&lt;h3 id=&quot;step-7-stay-quiet&quot;&gt;Step 7: Stay quiet&lt;/h3&gt;

&lt;p&gt;Since the API shutdown, Spotify has been very quiet. No posts on the developer
blog. No email newsletter. No tweets from @SpotifyPlatform since December 1
last year.&lt;/p&gt;

&lt;p&gt;Some users at The Spotify Community forum are quoting responses from Spotify.
Most responses seem to link to the Metadata API migration docs and state that
application developers must migrate. In other cases the responses point the
finger at the commercial partner which only adds to the confusion.&lt;/p&gt;

&lt;p&gt;Some of these devices may use the Metadata API directly, and in those cases the
application maintainers are probably to blame. However, I’m quite certain that
the libspotify search issue is responsible for a fair share of these
complaints. libspotify, in contrast to the Metadata API, has never been
officially shut down. &lt;strong&gt;The responsibility for any breakage caused by
libspotify is Spotify’s alone.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;what-i-want-from-spotify&quot;&gt;What I want from Spotify&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Apologize to your paying customers and supporters.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Get substantially better at communicating deprecations and shutdowns. We
want all news, not just good news.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Give us a new supported C library for audio playback. Now! Not later this
year. I’ve heard that promise for three consecutive years now.&lt;/p&gt;

    &lt;p&gt;We can live with pre-release software quality initially. Getting the library
out sooner rather than later shows us that there is a road ahead for all the
projects that stream music from Spotify. Let us get started making new
language wrappers.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Release Spotify Connect specifications and libraries.&lt;/p&gt;

    &lt;p&gt;We want to make music players that can be controlled by the Spotify mobile
app.&lt;/p&gt;

    &lt;p&gt;We want to make music controllers that can play music on all the Spotify
Connect software and hardware players we’ve invested in.&lt;/p&gt;

    &lt;p&gt;You’ve created this technology, now let us use it.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Thanks to &lt;a href=&quot;https://github.com/kingosticks&quot;&gt;Nick Steel&lt;/a&gt; for reviewing this blog
post.&lt;/em&gt;&lt;/p&gt;
</content>
        
          <category term="spotify"/>
        
          <category term="mopidy"/>
        
          <category term="debian"/>
        
      </entry>
    
  
    
      <entry>
        <id>https://jodal.no/2016/02/01/january-contributions/</id>
        <link type="text/html" rel="alternate" href="https://jodal.no/2016/02/01/january-contributions/"/>
        <title>January contributions</title>
        <updated>2016-02-01T00:00:00CET</updated>
        <content 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.no/2015/11/30/november-contributions/&quot;&gt;November&lt;/a&gt; and
&lt;a href=&quot;https://jodal.no/2016/01/01/december-contributions/&quot;&gt;December&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;debian&quot;&gt;Debian&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/742091&quot;&gt;mopidy 1.1.2-1&lt;/a&gt;:
New upstream release.
Moved to &lt;a href=&quot;https://alioth.debian.org/projects/pkg-mopidy/&quot;&gt;pkg-mopidy&lt;/a&gt; team.&lt;/li&gt;
  &lt;li&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/742828&quot;&gt;mopidy-dleyna 1.0.5-1&lt;/a&gt;:
New upstream release.
Moved to pkg-mopidy team.&lt;/li&gt;
  &lt;li&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/742835&quot;&gt;mopidy-soundcloud 2.0.2-1&lt;/a&gt;:
New upstream release.
Moved to pkg-mopidy team.&lt;/li&gt;
  &lt;li&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/743052&quot;&gt;mopidy-somafm 1.0.1-1&lt;/a&gt;:
New package in pkg-mopidy.&lt;/li&gt;
  &lt;li&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/743528&quot;&gt;mopidy-internetarchive
2.0.0-1&lt;/a&gt;:
New package in pkg-mopidy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;mopidy&quot;&gt;Mopidy&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/mopidy/mopidy/pull/1381&quot;&gt;PR #1381&lt;/a&gt;: Made &lt;code class=&quot;highlighter-rouge&quot;&gt;lookup()&lt;/code&gt;
ignore tracks without URI.&lt;/li&gt;
  &lt;li&gt;Updated docs for Raspberry Pi installation to match Raspbian jessie.&lt;/li&gt;
  &lt;li&gt;Rewrote docs for running Mopidy as a service, more focused on systemd than
Debian specifics to also cater for Arch users.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/mopidy/mopidy/pull/1397&quot;&gt;PR #1397&lt;/a&gt;: Added missing MPD
&lt;code class=&quot;highlighter-rouge&quot;&gt;volume&lt;/code&gt; command.&lt;/li&gt;
  &lt;li&gt;Merged a bunch of contributed fixes and released Mopidy 1.1.2.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Updated all extensions hosted under the Mopidy GitHub organization with
either the name of the primary maintainer or a call for a new maintainer. The
extensions in need of a new maintainer are:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/mopidy/mopidy-beets&quot;&gt;Mopidy-Beets&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/mopidy/mopidy-gmusic&quot;&gt;Mopidy-GMusic&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/mopidy/mopidy-nad&quot;&gt;Mopidy-NAD&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/mopidy/mopidy-soundcloud&quot;&gt;Mopidy-SoundCloud&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/mopidy/mopidy-youtube&quot;&gt;Mopidy-YouTube&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;If you’re a user of any of these and want to contribute, please step up.
Instructions can be found in the README of any of these projects.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;highlighter-rouge&quot;&gt;feature/gst1&lt;/code&gt; branch is complete as far as I know. There are no known
regressions from Mopidy 1.1.2. &lt;a href=&quot;https://github.com/mopidy/mopidy/pull/1419&quot;&gt;PR
#1419&lt;/a&gt; is hopefully the last
iteration of the pull request and GStreamer 1.x support will land in Mopidy
1.2.&lt;/li&gt;
  &lt;li&gt;Wrapping up the 1.2 release is now the focus. We might want to include this
in Debian/Ubuntu before the &lt;a href=&quot;https://wiki.ubuntu.com/XenialXerus/ReleaseSchedule&quot;&gt;Ubuntu 16.04 import
freeze&lt;/a&gt; February 18,
depending on feedback over the next week or two.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;comics&quot;&gt;Comics&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;Added one new crawler.&lt;/li&gt;
  &lt;li&gt;Released &lt;a href=&quot;https://comics.readthedocs.org/en/latest/changes/#v2-4-2-2016-01-19&quot;&gt;comics
2.4.2&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Merged one new crawler and a crawler update.&lt;/li&gt;
&lt;/ul&gt;
</content>
        
          <category term="debian"/>
        
          <category term="python"/>
        
          <category term="mopidy"/>
        
          <category term="comics"/>
        
      </entry>
    
  
    
      <entry>
        <id>https://jodal.no/2016/01/01/december-contributions/</id>
        <link type="text/html" rel="alternate" href="https://jodal.no/2016/01/01/december-contributions/"/>
        <title>December contributions</title>
        <updated>2016-01-01T00:00:00CET</updated>
        <content 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.no/2015/11/30/november-contributions/&quot;&gt;my first report in
November&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;debian&quot;&gt;Debian&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/731932&quot;&gt;mopidy-dirble 1.2.0-1&lt;/a&gt;:
New upstream release.&lt;/li&gt;
  &lt;li&gt;Created the &lt;a href=&quot;https://alioth.debian.org/projects/pkg-mopidy/&quot;&gt;pkg-mopidy&lt;/a&gt;
Alioth team to set myself up for sharing the maintenance of Mopidy packages.
As I upload new releases, I’ll gather the &lt;a href=&quot;https://anonscm.debian.org/cgit/pkg-mopidy&quot;&gt;git
repositories&lt;/a&gt; of Debian packages related
to Mopidy here. My intention is for the team to follow the &lt;a href=&quot;https://python-modules.alioth.debian.org/policy.html&quot;&gt;DPMT
policy&lt;/a&gt; closely.&lt;/li&gt;
  &lt;li&gt;Sponsored: &lt;a href=&quot;https://ftp-master.debian.org/new/python-ase_3.9.1.4567-2.html&quot;&gt;python-ase
3.9.1.4567-2&lt;/a&gt;,
which adds Python 3 support.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;mopidy&quot;&gt;Mopidy&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;code class=&quot;highlighter-rouge&quot;&gt;feature/gst1&lt;/code&gt; branch: Finished porting Mopidy from GStreamer 0.10 to
PyGI and GStreamer 1.x. Merge of the branch is currently blocked on a single
test failure (&lt;code class=&quot;highlighter-rouge&quot;&gt;test_gapless&lt;/code&gt;) and issues with transitioning from one track to
another with Mopidy-Spotify, which is the only backend using an &lt;code class=&quot;highlighter-rouge&quot;&gt;appsrc&lt;/code&gt; for
playback.&lt;/p&gt;

    &lt;p&gt;The goal is for this branch to be part of Mopidy 1.2, which I hope to have in
Debian/Ubuntu before the &lt;a href=&quot;https://wiki.ubuntu.com/XenialXerus/ReleaseSchedule&quot;&gt;Ubuntu 16.04 import
freeze&lt;/a&gt; February 18.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;code class=&quot;highlighter-rouge&quot;&gt;feature/py3-compat&lt;/code&gt; branch: I’ve worked quite a bit on this private
branch, frequently rebased on top of &lt;code class=&quot;highlighter-rouge&quot;&gt;feature/gst1&lt;/code&gt;. Currently Mopidy starts
without any crashes on Python 3 and the test suite is down to 262 failed and
1841 passed tests.&lt;/p&gt;

    &lt;p&gt;My current thinking, is that this will become part of a Mopidy 2.0 release,
which will support both Python 2.7 and 3.4+. As soon as most of Mopidy’s
extension ecosystem supports Python 2+3, a new Mopidy major release (3.0?)
will drop Python 2 support.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Merged a bunch of pull requests, both targeting the 1.1.2 bug fix release and
the 1.2 feature release.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</content>
        
          <category term="debian"/>
        
          <category term="python"/>
        
          <category term="mopidy"/>
        
      </entry>
    
  
    
      <entry>
        <id>https://jodal.no/2015/11/30/november-contributions/</id>
        <link type="text/html" rel="alternate" href="https://jodal.no/2015/11/30/november-contributions/"/>
        <title>November contributions</title>
        <updated>2015-11-30T00:00:00CET</updated>
        <content 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;

&lt;h1 id=&quot;debian&quot;&gt;Debian&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;Completed the NM process and became a Debian Developer in the end of October.&lt;/li&gt;
  &lt;li&gt;Joined the &lt;a href=&quot;https://wiki.debian.org/Teams/PythonModulesTeam&quot;&gt;Debian Python Modules
Team&lt;/a&gt; (DPMT).&lt;/li&gt;
  &lt;li&gt;Fixed
&lt;a href=&quot;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=803662&quot;&gt;RC bug #803662&lt;/a&gt;
and uploaded
&lt;a href=&quot;https://tracker.debian.org/news/723990&quot;&gt;sphinxcontrib-spelling 2.1.2-1&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/724203&quot;&gt;python-uritools 1.0.1-2&lt;/a&gt;:
Moved to DPMT.
Now runs tests when building.&lt;/li&gt;
  &lt;li&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/724051&quot;&gt;python-ws4py 0.3.4-2&lt;/a&gt;:
Moved to DPMT.
Migrated to git-dpm and pybuild.
Now runs tests when building.&lt;/li&gt;
  &lt;li&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/724587&quot;&gt;python-pykka 1.2.1-2&lt;/a&gt;:
Moved to DPMT.
Migrated to git-dpm and pybuild.
Now runs tests when building.&lt;/li&gt;
  &lt;li&gt;Tested the &lt;a href=&quot;https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi?a=project_list;pf=letsencrypt&quot;&gt;upcoming Debian
packaging&lt;/a&gt;
of the &lt;a href=&quot;https://www.letsencrypt.org/&quot;&gt;Let’s Encrypt&lt;/a&gt; client software on
Ubuntu 15.10, and &lt;a href=&quot;https://lists.alioth.debian.org/pipermail/letsencrypt-devel/Week-of-Mon-20151102/000010.html&quot;&gt;reported a missing
dependency&lt;/a&gt;.
(Successfully created and deployed five free TLS certificates in a few
minutes.)&lt;/li&gt;
  &lt;li&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/726640&quot;&gt;mopidy-dleyna 1.0.4-1&lt;/a&gt;:
New upstream release.&lt;/li&gt;
  &lt;li&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/726766&quot;&gt;mopidy-podcast 1.1.2-1&lt;/a&gt;:
New upstream release. Now runs tests when building.&lt;/li&gt;
  &lt;li&gt;Uploaded &lt;a href=&quot;https://tracker.debian.org/news/726641&quot;&gt;mopidy-soundcloud 2.0.1-1&lt;/a&gt;:
New upstream release.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;mopidy&quot;&gt;Mopidy&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;Released
&lt;a href=&quot;https://pypi.python.org/pypi/Mopidy-Spotify/2.2.0&quot;&gt;Mopidy-Spotify 2.2.0&lt;/a&gt;:
Fixes related to duplicate “Starred” playlists and albums from year 0.&lt;/li&gt;
  &lt;li&gt;Moved Mopidy’s Travis CI testing from Ubuntu 12.04 to Ubuntu 14.04, to
prepare for GStreamer 1.x, and eventually testing with Python 3.4.
&lt;a href=&quot;https://github.com/mopidy/mopidy/pull/1341&quot;&gt;PR #1341&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Worked on porting Mopidy from GStreamer 0.10 to PyGI and GStreamer 1.x.
&lt;a href=&quot;https://github.com/mopidy/mopidy/pull/1339&quot;&gt;PR #1339&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Briefly looked at what remains to get Mopidy running on both Python 2.7 and
3.4+ when we’ve landed the port to GStreamer 1.x. Doesn’t look too bad,
except that &lt;code class=&quot;highlighter-rouge&quot;&gt;ConfigParser&lt;/code&gt; doesn’t want to work with bytes in Python 3, so
there’s no easy way to read a config file referring to a path on a non-UTF-8
file system.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;comics&quot;&gt;Comics&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;Fixed two old crawlers. Added two new crawlers.&lt;/li&gt;
  &lt;li&gt;Needs to upgrade to Django 1.8 before the Django 1.7 security support ends
this December.&lt;/li&gt;
&lt;/ul&gt;
</content>
        
          <category term="debian"/>
        
          <category term="python"/>
        
          <category term="mopidy"/>
        
          <category term="comics"/>
        
      </entry>
    
  
    
      <entry>
        <id>https://jodal.no/2015/03/08/building-arm-debs-with-pbuilder/</id>
        <link type="text/html" rel="alternate" href="https://jodal.no/2015/03/08/building-arm-debs-with-pbuilder/"/>
        <title>Building ARM Debian packages with pbuilder</title>
        <updated>2015-03-08T00:00:00CET</updated>
        <content 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;

&lt;p&gt;Instead of managing a bunch of virtual machines by hand, we can use pbuilder.
pbuilder creates chroots with debootstrap, keeps them updated with changes to
the base system, and keeps the chroots clean of dependencies installed when you
build packages within them.&lt;/p&gt;

&lt;p&gt;There is an introduction to pbuilder and lots of information on various ways of
using it in the &lt;a href=&quot;https://wiki.ubuntu.com/PbuilderHowto&quot;&gt;Ubuntu wiki&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’m doing the following on an amd64 system running Ubuntu 14.10.&lt;/p&gt;

&lt;p&gt;I start out with a &lt;code class=&quot;highlighter-rouge&quot;&gt;~/.pbuilderrc&lt;/code&gt; to help simplify the later commands:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/sh&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; -e

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$OS&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;debian&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;; &lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;MIRRORSITE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://ftp.no.debian.org/debian/&quot;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;COMPONENTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;main contrib non-free&quot;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;DEBOOTSTRAPOPTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DEBOOTSTRAPOPTS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;s2&quot;&gt;&quot;--keyring=/usr/share/keyrings/debian-archive-keyring.gpg&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    : &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DIST&lt;/span&gt;:&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;wheezy&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
    : &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ARCH&lt;/span&gt;:&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;amd64&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DIST&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;wheezy&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
        &lt;span class=&quot;c&quot;&gt;#EXTRAPACKAGES=&quot;$EXTRAPACKAGES debian-backports-keyring&quot;&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;OTHERMIRROR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$OTHERMIRROR&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; | deb &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$MIRRORSITE&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; wheezy-backports &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$COMPONENTS&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;fi
elif&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$OS&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;raspbian&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;; &lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;MIRRORSITE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://ftp.acc.umu.se/mirror/raspbian/raspbian/&quot;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;COMPONENTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;main contrib non-free&quot;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;DEBOOTSTRAPOPTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DEBOOTSTRAPOPTS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;s2&quot;&gt;&quot;--keyring=/usr/share/keyrings/raspbian-archive-keyring.gpg&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    : &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DIST&lt;/span&gt;:&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;wheezy&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
    : &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ARCH&lt;/span&gt;:&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;armhf&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$OS&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;ubuntu&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;; &lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;MIRRORSITE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://no.archive.ubuntu.com/ubuntu/&quot;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;COMPONENTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;main restricted universe multiverse&quot;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;DEBOOTSTRAPOPTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DEBOOTSTRAPOPTS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;s2&quot;&gt;&quot;--keyring=/usr/share/keyrings/ubuntu-archive-keyring.gpg&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;else
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Unknown OS: &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$OS&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;1
&lt;span class=&quot;k&quot;&gt;fi

if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DIST&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;; &lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;DIST is not set&quot;&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;1
&lt;span class=&quot;k&quot;&gt;fi

if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;; &lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;ARCH is not set&quot;&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;1
&lt;span class=&quot;k&quot;&gt;fi

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$OS&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DIST&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;armel&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; !&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;armel&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;; &lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DEBOOTSTRAP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;qemu-debootstrap&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fi
if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;armhf&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; !&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;armhf&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;; &lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DEBOOTSTRAP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;qemu-debootstrap&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fi

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DEBOOTSTRAPOPTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DEBOOTSTRAPOPTS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;--arch=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;BASETGZ&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/var/cache/pbuilder/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NAME&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;-base.tgz&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;DISTRIBUTION&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DIST&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;BUILDRESULT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/var/cache/pbuilder/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NAME&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/result/&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;APTCACHE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/var/cache/pbuilder/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NAME&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/aptcache/&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;BUILDPLACE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/var/cache/pbuilder/build&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;HOOKDIR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/var/cache/pbuilder/hook.d/&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The &lt;code class=&quot;highlighter-rouge&quot;&gt;.pbuilderrc&lt;/code&gt; file cares about three environment variables:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;OS&lt;/code&gt;: Either &lt;code class=&quot;highlighter-rouge&quot;&gt;debian&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;raspbian&lt;/code&gt;, or &lt;code class=&quot;highlighter-rouge&quot;&gt;ubuntu&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;DIST&lt;/code&gt;: For example &lt;code class=&quot;highlighter-rouge&quot;&gt;wheezy&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;jessie&lt;/code&gt;, or &lt;code class=&quot;highlighter-rouge&quot;&gt;trusty&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ARCH&lt;/code&gt;: For example &lt;code class=&quot;highlighter-rouge&quot;&gt;amd64&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;i386&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;armel&lt;/code&gt;, or &lt;code class=&quot;highlighter-rouge&quot;&gt;armhf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Based on these three variables, the &lt;code class=&quot;highlighter-rouge&quot;&gt;.pbuilderrc&lt;/code&gt; script selects the proper APT
mirror, distribution components, and keyring to verify the downloaded packages.
If the architecture is &lt;code class=&quot;highlighter-rouge&quot;&gt;armel&lt;/code&gt; or &lt;code class=&quot;highlighter-rouge&quot;&gt;armhf&lt;/code&gt;, and we’re not currently on that
architecture, it uses &lt;code class=&quot;highlighter-rouge&quot;&gt;qemu-debootstrap&lt;/code&gt; to bootstrap the chroot and copies a
static qemu emulator for ARM into the chroot.&lt;/p&gt;

&lt;p&gt;For more details on the qemu part, see the &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDevelopment/Ports&quot;&gt;Ports
page&lt;/a&gt; in the Ubuntu wiki.&lt;/p&gt;

&lt;p&gt;Before running pbuilder, we have to install pbuilder and qemu-debootstrap:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;sudo apt install pbuilder qemu-user-static&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;And we also need the keyrings. Ubuntu includes packages with the Ubuntu and
Debian keyrings:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;sudo apt install ubuntu-keyring debian-archive-keyring&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;While we have to download the Raspbian keyring package and install it by hand:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;wget http://archive.raspbian.org/raspbian/pool/main/r/raspbian-archive-keyring/raspbian-archive-keyring_20120528.2_all.deb
sudo dpkg -i raspbian-archive-keyring_20120528.2_all.deb&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;You should now have all keyrings referenced from the &lt;code class=&quot;highlighter-rouge&quot;&gt;.pbuilderrc&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;$ ls /usr/share/keyrings
...
/usr/share/keyrings/debian-archive-keyring.gpg
/usr/share/keyrings/raspbian-archive-keyring.gpg
/usr/share/keyrings/ubuntu-archive-keyring.gpg
...
$&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Then we can bootstrap the five chroots. This takes a bit of time as it
downloads all packages needed to bootstrap a fully functional OS. Five times.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;sudo &lt;span class=&quot;nv&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;debian &lt;span class=&quot;nv&quot;&gt;DIST&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;wheezy &lt;span class=&quot;nv&quot;&gt;ARCH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;amd64 pbuilder --create
sudo &lt;span class=&quot;nv&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;debian &lt;span class=&quot;nv&quot;&gt;DIST&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;wheezy &lt;span class=&quot;nv&quot;&gt;ARCH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;i386 pbuilder --create
sudo &lt;span class=&quot;nv&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;debian &lt;span class=&quot;nv&quot;&gt;DIST&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;wheezy &lt;span class=&quot;nv&quot;&gt;ARCH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;armel pbuilder --create
sudo &lt;span class=&quot;nv&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;raspbian &lt;span class=&quot;nv&quot;&gt;DIST&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;wheezy &lt;span class=&quot;nv&quot;&gt;ARCH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;armhf pbuilder --create
sudo &lt;span class=&quot;nv&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;debian &lt;span class=&quot;nv&quot;&gt;DIST&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;wheezy &lt;span class=&quot;nv&quot;&gt;ARCH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;armhf pbuilder --create&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This will create tarballs with the pristine chroots:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;$ ls /var/cache/pbuilder
...
/var/cache/pbuilder/debian-wheezy-amd64-base.tgz
/var/cache/pbuilder/debian-wheezy-armel-base.tgz
/var/cache/pbuilder/debian-wheezy-armhf-base.tgz
/var/cache/pbuilder/debian-wheezy-i386-base.tgz
/var/cache/pbuilder/raspbian-wheezy-armhf-base.tgz
...&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Now we’re ready to build packages. Basically, you just get the source of a
Debian package, change into its directory, and run:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;raspbian &lt;span class=&quot;nv&quot;&gt;DIST&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;wheezy &lt;span class=&quot;nv&quot;&gt;ARCH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;armhf pdebuild&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;If the &lt;code class=&quot;highlighter-rouge&quot;&gt;pdebuild&lt;/code&gt; command completes successfully, you’ll find the resulting
Debian source and binary packages for armhf in e.g.
&lt;code class=&quot;highlighter-rouge&quot;&gt;/var/cache/pbuilder/raspbian-wheezy-armhf/result&lt;/code&gt;. All without using the
rather slow Raspberry Pi 1 I used to build packages with.&lt;/p&gt;

&lt;h1 id=&quot;appendix-depending-on-packages-from-an-unofficial-apt-repo&quot;&gt;Appendix: Depending on packages from an unofficial APT repo&lt;/h1&gt;

&lt;p&gt;Since I build packages for Mopidy, to be hosted at apt.mopidy.com, they often
depend on other packages hosted there, and not just packages from the official
repos. Thus I need to add an extra APT repository to the chroots. As I already
have five chroots, I don’t want to change each chroot manually with &lt;code class=&quot;highlighter-rouge&quot;&gt;pbuilder
--login --save-after-login&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The solution is to add a hook script to be executed every time the chroot is
being set up, before the Debian packaging begins, which adds apt.mopidy.com as
an APT repo and runs &lt;code class=&quot;highlighter-rouge&quot;&gt;apt-get update&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Create the directory &lt;code class=&quot;highlighter-rouge&quot;&gt;/var/cache/pbuilder/hook.d&lt;/code&gt; and make a file
&lt;code class=&quot;highlighter-rouge&quot;&gt;/var/cache/pbuilder/hook.d/D10add-apt.mopidy.com&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/sh&lt;/span&gt;

cat &lt;span class=&quot;sh&quot;&gt;&amp;lt;&amp;lt; EOF | apt-key add -
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.10 (GNU/Linux)

mQINBEzXBRYBEADGWsXEGa+WcoVMv6SevKPJQsFNbp/CbK6J8xJ0wVdf5LdfWF46
rNFMUa6DPwVOjp7wdY6mwTnW7OkpHLakP9DzaUXLGZ/9Bku7O+Aw+NDLC2W4IbdJ
... key data removed for brevity ...
0ax2VWX0487MYQcU8e2fEPOi3QkPc7zMr7wWDeB2JNBf2y/FnJxcbTLS6CEWr8mf
nXSGfezg+nzdC8eags3zCmQ5dlIKFLi7QautytYDA32vl09JcLl7mA8cxST8LyGw
rNNPwkCckaxcrWfSUso6saWj5j8y+OVn
=kcoa
-----END PGP PUBLIC KEY BLOCK-----
EOF

&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;deb http://apt.mopidy.com/ stable main contrib non-free&quot;&lt;/span&gt; &amp;gt;&amp;gt; /etc/apt/sources.list
apt-get update&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Remember to make the hook script executable, or else it will have no effect:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;sudo chmod a+x /var/cache/pbuilder/hook.d/D10add-apt.mopidy.com&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;And that should be it. The hook script will now be executed before any package
build and all packages from the APT repo will be available to &lt;code class=&quot;highlighter-rouge&quot;&gt;pdebuild&lt;/code&gt;.&lt;/p&gt;
</content>
        
          <category term="debian"/>
        
          <category term="mopidy"/>
        
      </entry>
    
  
    
      <entry>
        <id>https://jodal.no/2014/10/28/debian-packaging/</id>
        <link type="text/html" rel="alternate" href="https://jodal.no/2014/10/28/debian-packaging/"/>
        <title>Debian packaging of Mopidy</title>
        <updated>2014-10-28T00:00:00CET</updated>
        <content 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;

&lt;p&gt;Most importantly, maybe, the new package adds a systemd service file. The
sysvinit init script included a custom action called “run”, which is used to
run Mopidy subcommands with the same user and configuration as the system
service use. To replace this with something that can also be used on a system
running systemd, a new executable called &lt;code class=&quot;highlighter-rouge&quot;&gt;mopidyctl&lt;/code&gt; has been added. The new
executable does exactly the same: it runs Mopidy with the same user and
configuration as the init system use to start Mopidy as a system service.&lt;/p&gt;

&lt;p&gt;In short, &lt;code class=&quot;highlighter-rouge&quot;&gt;sudo service mopidy run config&lt;/code&gt; now becomes &lt;code class=&quot;highlighter-rouge&quot;&gt;sudo mopidyctl config&lt;/code&gt;,
both on systems running sysvinit and systems running systemd.&lt;/p&gt;
</content>
        
          <category term="debian"/>
        
          <category term="python"/>
        
          <category term="mopidy"/>
        
      </entry>
    
  
    
  
    
  
    
  
    
      <entry>
        <id>https://jodal.no/2013/12/28/mopidy-packaged-in-debian-and-ubuntu/</id>
        <link type="text/html" rel="alternate" href="https://jodal.no/2013/12/28/mopidy-packaged-in-debian-and-ubuntu/"/>
        <title>Mopidy packaged in Debian and Ubuntu</title>
        <updated>2013-12-28T00:00:00CET</updated>
        <content type="html">&lt;p&gt;Looking back to my last post from September, my goal was to have
the music server &lt;a href=&quot;http://www.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 href=&quot;http://packages.debian.org/source/sid/mopidy&quot;&gt;Debian
unstable&lt;/a&gt; and &lt;a 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;

&lt;p&gt;Next up will be to get some Mopidy extensions into Debian and Ubuntu, starting
with Mopidy-Scrobbler, Mopidy-MPRIS, Mopidy-Soundcloud, and Mopidy-Beets.&lt;/p&gt;

&lt;p&gt;Until then, Debian packages of some Mopidy extensions are available from
&lt;a href=&quot;https://apt.mopidy.com/&quot;&gt;apt.mopidy.com&lt;/a&gt;.&lt;/p&gt;
</content>
        
          <category term="python"/>
        
          <category term="mopidy"/>
        
          <category term="packaging"/>
        
          <category term="debian"/>
        
          <category term="ubuntu"/>
        
      </entry>
    
  
    
      <entry>
        <id>https://jodal.no/2013/09/03/pykka-packaged-in-debian-and-ubuntu/</id>
        <link type="text/html" rel="alternate" href="https://jodal.no/2013/09/03/pykka-packaged-in-debian-and-ubuntu/"/>
        <title>Pykka packaged in Debian and Ubuntu</title>
        <updated>2013-09-03T00:00:00CEST</updated>
        <content type="html">&lt;p&gt;The Python actor library &lt;a href=&quot;http://www.pykka.org/&quot;&gt;Pykka&lt;/a&gt; is now packaged as
&lt;code class=&quot;highlighter-rouge&quot;&gt;python-pykka&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;python3-pykka&lt;/code&gt; in
&lt;a href=&quot;http://packages.debian.org/source/sid/python-pykka&quot;&gt;Debian unstable&lt;/a&gt; and
&lt;a href=&quot;https://launchpad.net/ubuntu/+source/python-pykka&quot;&gt;Ubuntu saucy&lt;/a&gt;, soon to be
Ubuntu 13.10. In a few more days, the packages will be probably be available in
Debian testing as well.&lt;/p&gt;

&lt;p&gt;After a decade of using Debian and later Ubuntu, this is only my second package
in Debian and Ubuntu, and the first of my own projects being packaged. With
time, I’m planning on packaging and getting the rest of the
&lt;a href=&quot;http://www.mopidy.com/&quot;&gt;Mopidy&lt;/a&gt; ecosystem into Debian and Ubuntu. My current
goal is to have the majority in by the end of the year, as to get into Ubuntu
in time for the 14.04 LTS release.&lt;/p&gt;

&lt;p&gt;Until then, Debian packages related to Mopidy are available from
&lt;a href=&quot;https://apt.mopidy.com/&quot;&gt;apt.mopidy.com&lt;/a&gt;.&lt;/p&gt;
</content>
        
          <category term="python"/>
        
          <category term="pykka"/>
        
          <category term="packaging"/>
        
          <category term="debian"/>
        
          <category term="ubuntu"/>
        
      </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  

</feed>
