<atom:link href="http://people.skolelinux.org/pere/blog/index.rss" rel="self" type="application/rss+xml" />
<item>
- <title>A program should be able to open its own files on Linux</title>
- <link>http://people.skolelinux.org/pere/blog/A_program_should_be_able_to_open_its_own_files_on_Linux.html</link>
- <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/A_program_should_be_able_to_open_its_own_files_on_Linux.html</guid>
- <pubDate>Sun, 5 Jun 2016 08:30:00 +0200</pubDate>
- <description><p>Many years ago, when koffice was fresh and with few users, I
-decided to test its presentation tool when making the slides for a
-talk I was giving for NUUG on Japhar, a free Java virtual machine. I
-wrote the first draft of the slides, saved the result and went to bed
-the day before I would give the talk. The next day I took a plane to
-the location where the meeting should take place, and on the plane I
-started up koffice again to polish the talk a bit, only to discover
-that kpresenter refused to load its own data file. I cursed a bit and
-started making the slides again from memory, to have something to
-present when I arrived. I tested that the saved files could be
-loaded, and the day seemed to be rescued. I continued to polish the
-slides until I suddenly discovered that the saved file could no longer
-be loaded into kpresenter. In the end I had to rewrite the slides
-three times, condensing the content until the talk became shorter and
-shorter. After the talk I was able to pinpoint the problem &ndash;
-kpresenter wrote inline images in a way itself could not understand.
-Eventually that bug was fixed and kpresenter ended up being a great
-program to make slides. The point I'm trying to make is that we
-expect a program to be able to load its own data files, and it is
-embarrassing to its developers if it can't.</p>
-
-<p>Did you ever experience a program failing to load its own data
-files from the desktop file browser? It is not a uncommon problem. A
-while back I discovered that the screencast recorder
-gtk-recordmydesktop would save an Ogg Theora video file the KDE file
-browser would refuse to open. No video player claimed to understand
-such file. I tracked down the cause being <tt>file --mime-type</tt>
-returning the application/ogg MIME type, which no video player I had
-installed listed as a MIME type they would understand. I asked for
-<a href="http://bugs.gw.com/view.php?id=382">file to change its
-behavour</a> and use the MIME type video/ogg instead. I also asked
-several video players to add video/ogg to their desktop files, to give
-the file browser an idea what to do about Ogg Theora files. After a
-while, the desktop file browsers in Debian started to handle the
-output from gtk-recordmydesktop properly.</p>
-
-<p>But history repeats itself. A few days ago I tested the music
-system Rosegarden again, and I discovered that the KDE and xfce file
-browsers did not know what to do with the Rosegarden project files
-(*.rg). I've reported <a href="http://bugs.debian.org/825993">the
-rosegarden problem to BTS</a> and a fix is commited to git and will be
-included in the next upload. To increase the chance of me remembering
-how to fix the problem next time some program fail to load its files
-from the file browser, here are some notes on how to fix it.</p>
-
-<p>The file browsers in Debian in general operates on MIME types.
-There are two sources for the MIME type of a given file. The output from
-<tt>file --mime-type</tt> mentioned above, and the content of the
-shared MIME type registry (under /usr/share/mime/). The file MIME
-type is mapped to programs supporting the MIME type, and this
-information is collected from
-<a href="https://www.freedesktop.org/wiki/Specifications/desktop-entry-spec/">the
-desktop files</a> available in /usr/share/applications/. If there is
-one desktop file claiming support for the MIME type of the file, it is
-activated when asking to open a given file. If there are more, one
-can normally select which one to use by right-clicking on the file and
-selecting the wanted one using 'Open with' or similar. In general
-this work well. But it depend on each program picking a good MIME
-type (preferably
-<a href="http://www.iana.org/assignments/media-types/media-types.xhtml">a
-MIME type registered with IANA</a>), file and/or the shared MIME
-registry recognizing the file and the desktop file to list the MIME
-type in its list of supported MIME types.</p>
-
-<p>The <tt>/usr/share/mime/packages/rosegarden.xml</tt> entry for
-<a href="http://www.freedesktop.org/wiki/Specifications/shared-mime-info-spec">the
-Shared MIME database</a> look like this:</p>
+ <title>Automatic Google Drive sync using grive in Debian</title>
+ <link>http://people.skolelinux.org/pere/blog/Automatic_Google_Drive_sync_using_grive_in_Debian.html</link>
+ <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Automatic_Google_Drive_sync_using_grive_in_Debian.html</guid>
+ <pubDate>Thu, 4 Oct 2018 15:20:00 +0200</pubDate>
+ <description><p>A few days, I rescued a Windows victim over to Debian. To try to
+rescue the remains, I helped set up automatic sync with Google Drive.
+I did not find any sensible Debian package handling this
+automatically, so I rebuild the grive2 source from
+<a href="http://www.webupd8.org/">the Ubuntu UPD8 PPA</a> to do the
+task and added a autostart desktop entry and a small shell script to
+run in the background while the user is logged in to do the sync.
+Here is a sketch of the setup for future reference.</p>
+
+<p>I first created <tt>~/googledrive</tt>, entered the directory and
+ran '<tt>grive -a</tt>' to authenticate the machine/user. Next, I
+created a autostart hook in <tt>~/.config/autostart/grive.desktop</tt>
+to start the sync when the user log in:</p>
<p><blockquote><pre>
-&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info"&gt;
- &lt;mime-type type="audio/x-rosegarden"&gt;
- &lt;sub-class-of type="application/x-gzip"/&gt;
- &lt;comment&gt;Rosegarden project file&lt;/comment&gt;
- &lt;glob pattern="*.rg"/&gt;
- &lt;/mime-type&gt;
-&lt;/mime-info&gt;
+[Desktop Entry]
+Name=Google drive autosync
+Type=Application
+Exec=/home/user/bin/grive-sync
</pre></blockquote></p>
-<p>This states that audio/x-rosegarden is a kind of application/x-gzip
-(it is a gzipped XML file). Note, it is much better to use an
-official MIME type registered with IANA than it is to make up ones own
-unofficial ones like the x-rosegarden type used by rosegarden.</p>
-
-<p>The desktop file of the rosegarden program failed to list
-audio/x-rosegarden in its list of supported MIME types, causing the
-file browsers to have no idea what to do with *.rg files:</p>
+<p>Finally, I wrote the <tt>~/bin/grive-sync</tt> script to sync
+~/googledrive/ with the files in Google Drive.</p>
<p><blockquote><pre>
-% grep Mime /usr/share/applications/rosegarden.desktop
-MimeType=audio/x-rosegarden-composition;audio/x-rosegarden-device;audio/x-rosegarden-project;audio/x-rosegarden-template;audio/midi;
-X-KDE-NativeMimeType=audio/x-rosegarden-composition
-%
+#!/bin/sh
+set -e
+cd ~/
+cleanup() {
+ if [ "$syncpid" ] ; then
+ kill $syncpid
+ fi
+}
+trap cleanup EXIT INT QUIT
+/usr/lib/grive/grive-sync.sh listen googledrive 2>&1 | sed "s%^%$0:%" &
+syncpdi=$!
+while true; do
+ if ! xhost >/dev/null 2>&1 ; then
+ echo "no DISPLAY, exiting as the user probably logged out"
+ exit 1
+ fi
+ if [ ! -e /run/user/1000/grive-sync.sh_googledrive ] ; then
+ /usr/lib/grive/grive-sync.sh sync googledrive
+ fi
+ sleep 300
+done 2>&1 | sed "s%^%$0:%"
</pre></blockquote></p>
-<p>The fix was to add "audio/x-rosegarden;" at the end of the
-MimeType= line.</p>
+<p>Feel free to use the setup if you want. It can be assumed to be
+GNU GPL v2 licensed (or any later version, at your leisure), but I
+doubt this code is possible to claim copyright on.</p>
-<p>If you run into a file which fail to open the correct program when
-selected from the file browser, please check out the output from
-<tt>file --mime-type</tt> for the file, ensure the file ending and
-MIME type is registered somewhere under /usr/share/mime/ and check
-that some desktop file under /usr/share/applications/ is claiming
-support for this MIME type. If not, please report a bug to have it
-fixed. :)</p>
+<p>As usual, if you use Bitcoin and want to show your support of my
+activities, please send Bitcoin donations to my address
+<b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
</description>
</item>
<item>
- <title>Tor - from its creators mouth 11 years ago</title>
- <link>http://people.skolelinux.org/pere/blog/Tor___from_its_creators_mouth_11_years_ago.html</link>
- <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Tor___from_its_creators_mouth_11_years_ago.html</guid>
- <pubDate>Sat, 28 May 2016 14:20:00 +0200</pubDate>
- <description><p>A little more than 11 years ago, one of the creators of Tor, and
-the current President of <a href="https://www.torproject.org/">the Tor
-project</a>, Roger Dingledine, gave a talk for the members of the
-<a href="http://www.nuug.no/">Norwegian Unix User group</a> (NUUG). A
-video of the talk was recorded, and today, thanks to the great help
-from David Noble, I finally was able to publish the video of the talk
-on Frikanalen, the Norwegian open channel TV station where NUUG
-currently publishes its talks. You can
-<a href="http://frikanalen.no/se">watch the live stream using a web
-browser</a> with WebM support, or check out the recording on the video
-on demand page for the talk
-"<a href="http://beta.frikanalen.no/video/625599">Tor: Anonymous
-communication for the US Department of Defence...and you.</a>".</p>
-
-<p>Here is the video included for those of you using browsers with
-HTML video and Ogg Theora support:</p>
-
-<p><video width="70%" poster="http://simula.gunkies.org/media/625599/large_thumb/20050421-tor-frikanalen.jpg" controls>
- <source src="http://simula.gunkies.org/media/625599/theora/20050421-tor-frikanalen.ogv" type="video/ogg"/>
-</video></p>
-
-<p>I guess the gist of the talk can be summarised quite simply: If you
-want to help the military in USA (and everyone else), use Tor. :)</p>
+ <title>Valutakrambod - A python and bitcoin love story</title>
+ <link>http://people.skolelinux.org/pere/blog/Valutakrambod___A_python_and_bitcoin_love_story.html</link>
+ <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Valutakrambod___A_python_and_bitcoin_love_story.html</guid>
+ <pubDate>Sat, 29 Sep 2018 22:20:00 +0200</pubDate>
+ <description><p>It would come as no surprise to anyone that I am interested in
+bitcoins and virtual currencies. I've been keeping an eye on virtual
+currencies for many years, and it is part of the reason a few months
+ago, I started writing a python library for collecting currency
+exchange rates and trade on virtual currency exchanges. I decided to
+name the end result valutakrambod, which perhaps can be translated to
+small currency shop.</p>
+
+<p>The library uses the tornado python library to handle HTTP and
+websocket connections, and provide a asynchronous system for
+connecting to and tracking several services. The code is available
+from
+<a href="http://github.com/petterreinholdtsen/valutakrambod">github</a>.</p>
+
+</p>There are two example clients of the library. One is very simple and
+list every updated buy/sell price received from the various services.
+This code is started by running bin/btc-rates and call the client code
+in valutakrambod/client.py. The simple client look like this:</p>
+
+<p><blockquote><pre>
+import functools
+import tornado.ioloop
+import valutakrambod
+class SimpleClient(object):
+ def __init__(self):
+ self.services = []
+ self.streams = []
+ pass
+ def newdata(self, service, pair, changed):
+ print("%-15s %s-%s: %8.3f %8.3f" % (
+ service.servicename(),
+ pair[0],
+ pair[1],
+ service.rates[pair]['ask'],
+ service.rates[pair]['bid'])
+ )
+ async def refresh(self, service):
+ await service.fetchRates(service.wantedpairs)
+ def run(self):
+ self.ioloop = tornado.ioloop.IOLoop.current()
+ self.services = valutakrambod.service.knownServices()
+ for e in self.services:
+ service = e()
+ service.subscribe(self.newdata)
+ stream = service.websocket()
+ if stream:
+ self.streams.append(stream)
+ else:
+ # Fetch information from non-streaming services immediately
+ self.ioloop.call_later(len(self.services),
+ functools.partial(self.refresh, service))
+ # as well as regularly
+ service.periodicUpdate(60)
+ for stream in self.streams:
+ stream.connect()
+ try:
+ self.ioloop.start()
+ except KeyboardInterrupt:
+ print("Interrupted by keyboard, closing all connections.")
+ pass
+ for stream in self.streams:
+ stream.close()
+</pre></blockquote></p>
+
+<p>The library client loops over all known "public" services,
+initialises it, subscribes to any updates from the service, checks and
+activates websocket streaming if the service provide it, and if no
+streaming is supported, fetches information from the service and sets
+up a periodic update every 60 seconds. The output from this client
+can look like this:</p>
+
+<p><blockquote><pre>
+Bl3p BTC-EUR: 5687.110 5653.690
+Bl3p BTC-EUR: 5687.110 5653.690
+Bl3p BTC-EUR: 5687.110 5653.690
+Hitbtc BTC-USD: 6594.560 6593.690
+Hitbtc BTC-USD: 6594.560 6593.690
+Bl3p BTC-EUR: 5687.110 5653.690
+Hitbtc BTC-USD: 6594.570 6593.690
+Bitstamp EUR-USD: 1.159 1.154
+Hitbtc BTC-USD: 6594.570 6593.690
+Hitbtc BTC-USD: 6594.580 6593.690
+Hitbtc BTC-USD: 6594.580 6593.690
+Hitbtc BTC-USD: 6594.580 6593.690
+Bl3p BTC-EUR: 5687.110 5653.690
+Paymium BTC-EUR: 5680.000 5620.240
+</pre></blockquote></p>
+
+<p>The exchange order book is tracked in addition to the best buy/sell
+price, for those that need to know the details.</p>
+
+<p>The other example client is focusing on providing a curses view
+with updated buy/sell prices as soon as they are received from the
+services. This code is located in bin/btc-rates-curses and activated
+by using the '-c' argument. Without the argument the "curses" output
+is printed without using curses, which is useful for debugging. The
+curses view look like this:</p>
+
+<p><blockquote><pre>
+ Name Pair Bid Ask Spr Ftcd Age
+ BitcoinsNorway BTCEUR 5591.8400 5711.0800 2.1% 16 nan 60
+ Bitfinex BTCEUR 5671.0000 5671.2000 0.0% 16 22 59
+ Bitmynt BTCEUR 5580.8000 5807.5200 3.9% 16 41 60
+ Bitpay BTCEUR 5663.2700 nan nan% 15 nan 60
+ Bitstamp BTCEUR 5664.8400 5676.5300 0.2% 0 1 1
+ Bl3p BTCEUR 5653.6900 5684.9400 0.5% 0 nan 19
+ Coinbase BTCEUR 5600.8200 5714.9000 2.0% 15 nan nan
+ Kraken BTCEUR 5670.1000 5670.2000 0.0% 14 17 60
+ Paymium BTCEUR 5620.0600 5680.0000 1.1% 1 7515 nan
+ BitcoinsNorway BTCNOK 52898.9700 54034.6100 2.1% 16 nan 60
+ Bitmynt BTCNOK 52960.3200 54031.1900 2.0% 16 41 60
+ Bitpay BTCNOK 53477.7833 nan nan% 16 nan 60
+ Coinbase BTCNOK 52990.3500 54063.0600 2.0% 15 nan nan
+ MiraiEx BTCNOK 52856.5300 54100.6000 2.3% 16 nan nan
+ BitcoinsNorway BTCUSD 6495.5300 6631.5400 2.1% 16 nan 60
+ Bitfinex BTCUSD 6590.6000 6590.7000 0.0% 16 23 57
+ Bitpay BTCUSD 6564.1300 nan nan% 15 nan 60
+ Bitstamp BTCUSD 6561.1400 6565.6200 0.1% 0 2 1
+ Coinbase BTCUSD 6504.0600 6635.9700 2.0% 14 nan 117
+ Gemini BTCUSD 6567.1300 6573.0700 0.1% 16 89 nan
+ Hitbtc+BTCUSD 6592.6200 6594.2100 0.0% 0 0 0
+ Kraken BTCUSD 6565.2000 6570.9000 0.1% 15 17 58
+ Exchangerates EURNOK 9.4665 9.4665 0.0% 16 107789 nan
+ Norgesbank EURNOK 9.4665 9.4665 0.0% 16 107789 nan
+ Bitstamp EURUSD 1.1537 1.1593 0.5% 4 5 1
+ Exchangerates EURUSD 1.1576 1.1576 0.0% 16 107789 nan
+ BitcoinsNorway LTCEUR 1.0000 49.0000 98.0% 16 nan nan
+ BitcoinsNorway LTCNOK 492.4800 503.7500 2.2% 16 nan 60
+ BitcoinsNorway LTCUSD 1.0221 49.0000 97.9% 15 nan nan
+ Norgesbank USDNOK 8.1777 8.1777 0.0% 16 107789 nan
+</pre></blockquote></p>
+
+<p>The code for this client is too complex for a simple blog post, so
+you will have to check out the git repository to figure out how it
+work. What I can tell is how the three last numbers on each line
+should be interpreted. The first is how many seconds ago information
+was received from the service. The second is how long ago, according
+to the service, the provided information was updated. The last is an
+estimate on how often the buy/sell values change.</p>
+
+<p>If you find this library useful, or would like to improve it, I
+would love to hear from you. Note that for some of the services I've
+implemented a trading API. It might be the topic of a future blog
+post.</p>
+
+<p>As usual, if you use Bitcoin and want to show your support of my
+activities, please send Bitcoin donations to my address
+<b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
</description>
</item>
<item>
- <title>Isenkram with PackageKit support - new version 0.23 available in Debian unstable</title>
- <link>http://people.skolelinux.org/pere/blog/Isenkram_with_PackageKit_support___new_version_0_23_available_in_Debian_unstable.html</link>
- <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Isenkram_with_PackageKit_support___new_version_0_23_available_in_Debian_unstable.html</guid>
- <pubDate>Wed, 25 May 2016 10:20:00 +0200</pubDate>
- <description><p><a href="https://tracker.debian.org/pkg/isenkram">The isenkram
-system</a> is a user-focused solution in Debian for handling hardware
-related packages. The idea is to have a database of mappings between
-hardware and packages, and pop up a dialog suggesting for the user to
-install the packages to use a given hardware dongle. Some use cases
-are when you insert a Yubikey, it proposes to install the software
-needed to control it; when you insert a braille reader list it
-proposes to install the packages needed to send text to the reader;
-and when you insert a ColorHug screen calibrator it suggests to
-install the driver for it. The system work well, and even have a few
-command line tools to install firmware packages and packages for the
-hardware already in the machine (as opposed to hotpluggable hardware).</p>
-
-<p>The system was initially written using aptdaemon, because I found
-good documentation and example code on how to use it. But aptdaemon
-is going away and is generally being replaced by
-<a href="http://www.freedesktop.org/software/PackageKit/">PackageKit</a>,
-so Isenkram needed a rewrite. And today, thanks to the great patch
-from my college Sunil Mohan Adapa in the FreedomBox project, the
-rewrite finally took place. I've just uploaded a new version of
-Isenkram into Debian Unstable with the patch included, and the default
-for the background daemon is now to use PackageKit. To check it out,
-install the <tt>isenkram</tt> package and insert some hardware dongle
-and see if it is recognised.</p>
-
-<p>If you want to know what kind of packages isenkram would propose for
-the machine it is running on, you can check out the isenkram-lookup
-program. This is what it look like on a Thinkpad X230:</p>
+ <title>VLC in Debian now can do bittorrent streaming</title>
+ <link>http://people.skolelinux.org/pere/blog/VLC_in_Debian_now_can_do_bittorrent_streaming.html</link>
+ <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/VLC_in_Debian_now_can_do_bittorrent_streaming.html</guid>
+ <pubDate>Mon, 24 Sep 2018 21:20:00 +0200</pubDate>
+ <description><p>Back in February, I got curious to see
+<a href="http://people.skolelinux.org/pere/blog/Using_VLC_to_stream_bittorrent_sources.html">if
+VLC now supported Bittorrent streaming</a>. It did not, despite the
+fact that the idea and code to handle such streaming had been floating
+around for years. I did however find
+<a href="https://github.com/johang/vlc-bittorrent">a standalone plugin
+for VLC</a> to do it, and half a year later I decided to wrap up the
+plugin and get it into Debian. I uploaded it to NEW a few days ago,
+and am very happy to report that it
+<a href="https://tracker.debian.org/pkg/vlc-plugin-bittorrent">entered
+Debian</a> a few hours ago, and should be available in Debian/Unstable
+tomorrow, and Debian/Testing in a few days.</p>
+
+<p>With the vlc-plugin-bittorrent package installed you should be able
+to stream videos using a simple call to</p>
<p><blockquote><pre>
-% isenkram-lookup
-bluez
-cheese
-fprintd
-fprintd-demo
-gkrellm-thinkbat
-hdapsd
-libpam-fprintd
-pidgin-blinklight
-thinkfan
-tleds
-tp-smapi-dkms
-tp-smapi-source
-tpb
-%p
+vlc https://archive.org/download/TheGoat/TheGoat_archive.torrent
</pre></blockquote></p>
-<p>The hardware mappings come from several places. The preferred way
-is for packages to announce their hardware support using
-<a href="https://www.freedesktop.org/software/appstream/docs/">the
-cross distribution appstream system</a>.
-See
-<a href="http://people.skolelinux.org/pere/blog/tags/isenkram/">previous
-blog posts about isenkram</a> to learn how to do that.</p>
+</p>It can handle magnet links too. Now if only native vlc had
+bittorrent support. Then a lot more would be helping each other to
+share public domain and creative commons movies. The plugin need some
+stability work with seeking and picking the right file in a torrent
+with many files, but is already usable. Please note that the plugin
+is not removing downloaded files when vlc is stopped, so it can fill
+up your disk if you are not careful. Have fun. :)</p>
+
+<p>I would love to get help maintaining this package. Get in touch if
+you are interested.</p>
+
+<p>As usual, if you use Bitcoin and want to show your support of my
+activities, please send Bitcoin donations to my address
+<b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
</description>
</item>
<item>
- <title>Discharge rate estimate in new battery statistics collector for Debian</title>
- <link>http://people.skolelinux.org/pere/blog/Discharge_rate_estimate_in_new_battery_statistics_collector_for_Debian.html</link>
- <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Discharge_rate_estimate_in_new_battery_statistics_collector_for_Debian.html</guid>
- <pubDate>Mon, 23 May 2016 09:35:00 +0200</pubDate>
- <description><p>Yesterday I updated the
-<a href="https://tracker.debian.org/pkg/battery-stats">battery-stats
-package in Debian</a> with a few patches sent to me by skilled and
-enterprising users. There were some nice user and visible changes.
-First of all, both desktop menu entries now work. A design flaw in
-one of the script made the history graph fail to show up (its PNG was
-dumped in ~/.xsession-errors) if no controlling TTY was available.
-The script worked when called from the command line, but not when
-called from the desktop menu. I changed this to look for a DISPLAY
-variable or a TTY before deciding where to draw the graph, and now the
-graph window pop up as expected.</p>
-
-<p>The next new feature is a discharge rate estimator in one of the
-graphs (the one showing the last few hours). New is also the user of
-colours showing charging in blue and discharge in red. The percentages
-of this graph is relative to last full charge, not battery design
-capacity.</p>
-
-<p align="center"><img src="http://people.skolelinux.org/pere/blog/images/2016-05-23-battery-stats-rate.png"/></p>
-
-<p>The other graph show the entire history of the collected battery
-statistics, comparing it to the design capacity of the battery to
-visualise how the battery life time get shorter over time. The red
-line in this graph is what the previous graph considers 100 percent:
-
-<p align="center"><img src="http://people.skolelinux.org/pere/blog/images/2016-05-23-battery-stats-history.png"/></p>
-
-<p>In this graph you can see that I only charge the battery to 80
-percent of last full capacity, and how the capacity of the battery is
-shrinking. :(</p>
-
-<p>The last new feature is in the collector, which now will handle
-more hardware models. On some hardware, Linux power supply
-information is stored in /sys/class/power_supply/ACAD/, while the
-collector previously only looked in /sys/class/power_supply/AC/. Now
-both are checked to figure if there is power connected to the
-machine.</p>
-
-<p>If you are interested in how your laptop battery is doing, please
-check out the
-<a href="https://tracker.debian.org/pkg/battery-stats">battery-stats</a>
-in Debian unstable, or rebuild it on Jessie to get it working on
-Debian stable. :) The upstream source is available from <a
-href="https://github.com/petterreinholdtsen/battery-stats">github</a>.
-Patches are very welcome.</p>
+ <title>Using the Kodi API to play Youtube videos</title>
+ <link>http://people.skolelinux.org/pere/blog/Using_the_Kodi_API_to_play_Youtube_videos.html</link>
+ <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Using_the_Kodi_API_to_play_Youtube_videos.html</guid>
+ <pubDate>Sun, 2 Sep 2018 23:40:00 +0200</pubDate>
+ <description><p>I continue to explore my Kodi installation, and today I wanted to
+tell it to play a youtube URL I received in a chat, without having to
+insert search terms using the on-screen keyboard. After searching the
+web for API access to the Youtube plugin and testing a bit, I managed
+to find a recipe that worked. If you got a kodi instance with its API
+available from http://kodihost/jsonrpc, you can try the following to
+have check out a nice cover band.</p>
+
+<p><blockquote><pre>curl --silent --header 'Content-Type: application/json' \
+ --data-binary '{ "id": 1, "jsonrpc": "2.0", "method": "Player.Open",
+ "params": {"item": { "file":
+ "plugin://plugin.video.youtube/play/?video_id=LuRGVM9O0qg" } } }' \
+ http://projector.local/jsonrpc</pre></blockquote></p>
+
+<p>I've extended kodi-stream program to take a video source as its
+first argument. It can now handle direct video links, youtube links
+and 'desktop' to stream my desktop to Kodi. It is almost like a
+Chromecast. :)</p>
<p>As usual, if you use Bitcoin and want to show your support of my
activities, please send Bitcoin donations to my address
</item>
<item>
- <title>French edition of Lawrence Lessigs book Cultura Libre on Amazon and Barnes & Noble</title>
- <link>http://people.skolelinux.org/pere/blog/French_edition_of_Lawrence_Lessigs_book_Cultura_Libre_on_Amazon_and_Barnes___Noble.html</link>
- <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/French_edition_of_Lawrence_Lessigs_book_Cultura_Libre_on_Amazon_and_Barnes___Noble.html</guid>
- <pubDate>Sat, 21 May 2016 10:50:00 +0200</pubDate>
- <description><p>A few weeks ago the French paperback edition of Lawrence Lessigs
-2004 book Cultura Libre was published. Today I noticed that the book
-is now available from book stores. You can now buy it from
-<a href="http://www.amazon.com/Culture-Libre-French-Lawrence-Lessig/dp/8269018260">Amazon</a>
-($19.99),
-<a href="http://www.barnesandnoble.com/w/culture-libre-lawrence-lessig/1123776705">Barnes
-& Noble</a> ($?) and as always from
-<a href="http://www.lulu.com/shop/lawrence-lessig/culture-libre/paperback/product-22645082.html">Lulu.com</a>
-($19.99). The revenue is donated to the Creative Commons project. If
-you buy from Lulu.com, they currently get $10.59, while if you buy
-from one of the book stores most of the revenue go to the book store
-and the Creative Commons project get much (not sure how much
-less).</p>
-
-<p>I was a bit surprised to discover that there is a kindle edition
-sold by Amazon Digital Services LLC on Amazon. Not quite sure how
-that edition was created, but if you want to download a electronic
-edition (PDF, EPUB, Mobi) generated from the same files used to create
-the paperback edition, they are
-<a href="https://github.com/petterreinholdtsen/free-culture-lessig">available
-from github</a>.</p>
+ <title>Software created using taxpayers’ money should be Free Software</title>
+ <link>http://people.skolelinux.org/pere/blog/Software_created_using_taxpayers__money_should_be_Free_Software.html</link>
+ <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Software_created_using_taxpayers__money_should_be_Free_Software.html</guid>
+ <pubDate>Thu, 30 Aug 2018 13:50:00 +0200</pubDate>
+ <description><p>It might seem obvious that software created using tax money should
+be available for everyone to use and improve. Free Software
+Foundation Europe recentlystarted a campaign to help get more people
+to understand this, and I just signed the petition on
+<a href="https://publiccode.eu/">Public Money, Public Code</a> to help
+them. I hope you too will do the same.</p>
</description>
</item>
<item>
- <title>I want the courts to be involved before the police can hijack a news site DNS domain (#domstolkontroll)</title>
- <link>http://people.skolelinux.org/pere/blog/I_want_the_courts_to_be_involved_before_the_police_can_hijack_a_news_site_DNS_domain___domstolkontroll_.html</link>
- <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/I_want_the_courts_to_be_involved_before_the_police_can_hijack_a_news_site_DNS_domain___domstolkontroll_.html</guid>
- <pubDate>Thu, 19 May 2016 14:00:00 +0200</pubDate>
- <description><p>I just donated to the
-<a href="http://www.nuug.no/dns-beslag-donasjon.shtml">NUUG defence
-"fond"</a> to fund the effort in Norway to get the seizure of the news
-site popcorn-time.no tested in court. I hope everyone that agree with
-me will do the same.</p>
-
-<p>Would you be worried if you knew the police in your country could
-hijack DNS domains of news sites covering free software system without
-talking to a judge first? I am. What if the free software system
-combined search engine lookups, bittorrent downloads and video playout
-and was called Popcorn Time? Would that affect your view? It still
-make me worried.</p>
-
-<p>In March 2016, the Norwegian police seized (as in forced NORID to
-change the IP address pointed to by it to one controlled by the
-police) the DNS domain popcorn-time.no, without any supervision from
-the courts. I did not know about the web site back then, and assumed
-the courts had been involved, and was very surprised when I discovered
-that the police had hijacked the DNS domain without asking a judge for
-permission first. I was even more surprised when I had a look at
-<a href="https://web.archive.org/web/*/http://popcorn-time.no">the web
-site content on the Internet Archive</A>, and only found news coverage
-about Popcorn Time, not any material published without the right
-holders permissions.</p>
-
-<p>The seizure was widely covered in the Norwegian press (see for
-example <a href="http://www.hegnar.no/Nyheter/Naeringsliv/2016/03/Popcorn-time.no-beslaglagt-av-OEkokrim">Hegnar Online</a> and
-<a href="http://itavisen.no/2016/03/08/okokrim-har-beslaglagt-popcorn-time-no/">ITavisen<a/>
-and
-<a href="http://www.nrk.no/kultur/okokrim-gar-til-aksjon-mot-popcorn-time-1.12842452">NRK</a>),
-at first due to the press release sent out by Økokrim, but then based
-on
-<a href="http://blogg.torvund.net/2016/03/09/okokrims-beslag-i-domenet-popcorn-time-no/">protests
-from the law professor Olav Torvund</a> and
-<a href="http://www.klassekampen.no/article/20160311/ARTICLE/160319995">lawyer
-Jon Wessel-Aas</a>. It even got some
-<a href="https://torrentfreak.com/norwegian-authorities-sued-over-popcorn-time-domain-seizure-160418/">coverage
-on TorrentFreak</a>.</p>
-
-<p>I
-<a href="http://people.skolelinux.org/pere/blog/NUUG_contests_Norwegian_police_DNS_seizure_of_popcorn_time_no.html">
-wrote about the case a month ago</a>, when the
-<a href="http://www.nuug.no/">Norwegian Unix User Group</a> (NUUG),
-where I am an active member, decided to ask the courts to test this seizure.
-The request was denied, but NUUG and its co-requestor EFN have not
-given up, and now they are rallying for support to get the seizure
-legally challenged. They accept both bank and Bitcoin transfer for
-those that want to support the request.</p>
-
-<p>If you as me believe news sites about free software should not be
-censored, even if the free software have both legal and illegal
-applications, and that DNS hijacking should be tested by the courts, I
-suggest you <a href="http://www.nuug.no/dns-beslag-donasjon.shtml">show
-your support by donating to NUUG</a>.</a>
+ <title>A bit more on privacy respecting health monitor / fitness tracker</title>
+ <link>http://people.skolelinux.org/pere/blog/A_bit_more_on_privacy_respecting_health_monitor___fitness_tracker.html</link>
+ <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/A_bit_more_on_privacy_respecting_health_monitor___fitness_tracker.html</guid>
+ <pubDate>Mon, 13 Aug 2018 09:00:00 +0200</pubDate>
+ <description><p>A few days ago, I wondered if there are any privacy respecting
+health monitors and/or fitness trackers available for sale these days.
+I would like to buy one, but do not want to share my personal data
+with strangers, nor be forced to have a mobile phone to get data out
+of the unit. I've received some ideas, and would like to share them
+with you.
+
+One interesting data point was a pointer to a Free Software app for
+Android named
+<a href="https://github.com/Freeyourgadget/Gadgetbridge/">Gadgetbridge</a>.
+It provide cloudless collection and storing of data from a variety of
+trackers. Its
+<a href="https://github.com/Freeyourgadget/Gadgetbridge/#supported-devices">list
+of supported devices</a> is a good indicator for units where the
+protocol is fairly open, as it is obviously being handled by Free
+Software. Other units are reportedly encrypting the collected
+information with their own public key, making sure only the vendor
+cloud service is able to extract data from the unit. The people
+contacting me about Gadgetbirde said they were using
+<a href="https://us.amazfit.com/shop/bip?variant=336750">Amazfit
+Bip</a> and
+<a href="http://www.xiaomimi6phone.com/xiaomi-mi-band-3-features-release-date-rumors/">Xiaomi
+Band 3</a>.</p>
+
+<p>I also got a suggestion to look at some of the units from Garmin.
+I was told their GPS watches can be connected via USB and show up as a
+USB storage device with
+<a href="https://www.gpsbabel.org/htmldoc-development/fmt_garmin_fit.html">Garmin
+FIT files</a> containing the collected measurements. While
+proprietary, FIT files apparently can be read at least by
+<a href="https://www.gpsbabel.org">GPSBabel</a> and the
+<a href="https://apps.nextcloud.com/apps/gpxpod">GpxPod</a> Nextcloud
+app. It is unclear to me if they can read step count and heart rate
+data. The person I talked to was using a
+<a href="https://buy.garmin.com/en-US/US/p/564291">Garmin Forerunner
+935</a>, which is a fairly expensive unit. I doubt it is worth it for
+a unit where the vendor clearly is trying its best to move from open
+to closed systems. I still remember when Garmin dropped NMEA support
+in its GPSes.</p>
+
+<p>A final idea was to build ones own unit, perhaps by basing it on a
+wearable hardware platforms like
+<a href="https://learn.adafruit.com/flora-geo-watch">the Flora Geo
+Watch</a>. Sound like fun, but I had more money than time to spend on
+the topic, so I suspect it will have to wait for another time.</p>
+
+<p>While I was working on tracking down links, I came across an
+inspiring TED talk by Dave Debronkart about
+<a href="https://archive.org/details/DavedeBronkart_2010X">being a
+e-patient</a>, and discovered the web site
+<a href="https://participatorymedicine.org/epatients/">Participatory
+Medicine</a>. If you too want to track your own health and fitness
+without having information about your private life floating around on
+computers owned by others, I recommend checking it out.</p>
+
+<p>As usual, if you use Bitcoin and want to show your support of my
+activities, please send Bitcoin donations to my address
+<b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
</description>
</item>
<item>
- <title>Debian now with ZFS on Linux included</title>
- <link>http://people.skolelinux.org/pere/blog/Debian_now_with_ZFS_on_Linux_included.html</link>
- <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Debian_now_with_ZFS_on_Linux_included.html</guid>
- <pubDate>Thu, 12 May 2016 07:30:00 +0200</pubDate>
- <description><p>Today, after many years of hard work from many people,
-<a href="http://zfsonlinux.org/">ZFS for Linux</a> finally entered
-Debian. The package status can be seen on
-<a href="https://tracker.debian.org/pkg/zfs-linux">the package tracker
-for zfs-linux</a>. and
-<a href="https://qa.debian.org/developer.php?login=pkg-zfsonlinux-devel@lists.alioth.debian.org">the
-team status page</a>. If you want to help out, please join us.
-<a href="http://anonscm.debian.org/gitweb/?p=pkg-zfsonlinux/zfs.git">The
-source code</a> is available via git on Alioth. It would also be
-great if you could help out with
-<a href="https://tracker.debian.org/pkg/dkms">the dkms package</a>, as
-it is an important piece of the puzzle to get ZFS working.</p>
+ <title>Privacy respecting health monitor / fitness tracker?</title>
+ <link>http://people.skolelinux.org/pere/blog/Privacy_respecting_health_monitor___fitness_tracker_.html</link>
+ <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Privacy_respecting_health_monitor___fitness_tracker_.html</guid>
+ <pubDate>Tue, 7 Aug 2018 16:00:00 +0200</pubDate>
+ <description><p>Dear lazyweb,</p>
+
+<p>I wonder, is there a fitness tracker / health monitor available for
+sale today that respect the users privacy? With this I mean a
+watch/bracelet capable of measuring pulse rate and other
+fitness/health related values (and by all means, also the correct time
+and location if possible), which is <strong>only</strong> provided for
+me to extract/read from the unit with computer without a radio beacon
+and Internet connection. In other words, it do not depend on a cell
+phone app, and do make the measurements available via other peoples
+computer (aka "the cloud"). The collected data should be available
+using only free software. I'm not interested in depending on some
+non-free software that will leave me high and dry some time in the
+future. I've been unable to find any such unit. I would like to buy
+it. The ones I have seen for sale here in Norway are proud to report
+that they share my health data with strangers (aka "cloud enabled").
+Is there an alternative? I'm not interested in giving money to people
+requiring me to accept "privacy terms" to allow myself to measure my
+own health.</p>
+
+<p>As usual, if you use Bitcoin and want to show your support of my
+activities, please send Bitcoin donations to my address
+<b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
</description>
</item>
<item>
- <title>What is the best multimedia player in Debian?</title>
- <link>http://people.skolelinux.org/pere/blog/What_is_the_best_multimedia_player_in_Debian_.html</link>
- <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/What_is_the_best_multimedia_player_in_Debian_.html</guid>
- <pubDate>Sun, 8 May 2016 09:40:00 +0200</pubDate>
- <description><p><strong>Where I set out to figure out which multimedia player in
-Debian claim support for most file formats.</strong></p>
-
-<p>A few years ago, I had a look at the media support for Browser
-plugins in Debian, to get an idea which plugins to include in Debian
-Edu. I created a script to extract the set of supported MIME types
-for each plugin, and used this to find out which multimedia browser
-plugin supported most file formats / media types.
-<a href="https://wiki.debian.org/DebianEdu/BrowserMultimedia">The
-result</a> can still be seen on the Debian wiki, even though it have
-not been updated for a while. But browser plugins are less relevant
-these days, so I thought it was time to look at standalone
-players.</p>
-
-<p>A few days ago I was tired of VLC not being listed as a viable
-player when I wanted to play videos from the Norwegian National
-Broadcasting Company, and decided to investigate why. The cause is a
-<a href="https://bugs.debian.org/822245">missing MIME type in the VLC
-desktop file</a>. In the process I wrote a script to compare the set
-of MIME types announced in the desktop file and the browser plugin,
-only to discover that there is quite a large difference between the
-two for VLC. This discovery made me dig up the script I used to
-compare browser plugins, and adjust it to compare desktop files
-instead, to try to figure out which multimedia player in Debian
-support most file formats.</p>
-
-<p>The result can be seen on the Debian Wiki, as
-<a href="https://wiki.debian.org/DebianMultimedia/PlayerSupport">a
-table listing all MIME types supported by one of the packages included
-in the table</a>, with the package supporting most MIME types being
-listed first in the table.</p>
-
-</p>The best multimedia player in Debian? It is totem, followed by
-parole, kplayer, mpv, vlc, smplayer mplayer-gui gnome-mpv and
-kmplayer. Time for the other players to update their announced MIME
-support?</p>
+ <title>Sharing images with friends and family using RSS and EXIF/XMP metadata</title>
+ <link>http://people.skolelinux.org/pere/blog/Sharing_images_with_friends_and_family_using_RSS_and_EXIF_XMP_metadata.html</link>
+ <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Sharing_images_with_friends_and_family_using_RSS_and_EXIF_XMP_metadata.html</guid>
+ <pubDate>Tue, 31 Jul 2018 23:30:00 +0200</pubDate>
+ <description><p>For a while now, I have looked for a sensible way to share images
+with my family using a self hosted solution, as it is unacceptable to
+place images from my personal life under the control of strangers
+working for data hoarders like Google or Dropbox. The last few days I
+have drafted an approach that might work out, and I would like to
+share it with you. I would like to publish images on a server under
+my control, and point some Internet connected display units using some
+free and open standard to the images I published. As my primary
+language is not limited to ASCII, I need to store metadata using
+UTF-8. Many years ago, I hoped to find a digital photo frame capable
+of reading a RSS feed with image references (aka using the
+&lt;enclosure&gt; RSS tag), but was unable to find a current supplier
+of such frames. In the end I gave up that approach.</p>
+
+<p>Some months ago, I discovered that
+<a href="https://www.jwz.org/xscreensaver/">XScreensaver</a> is able to
+read images from a RSS feed, and used it to set up a screen saver on
+my home info screen, showing images from the Daily images feed from
+NASA. This proved to work well. More recently I discovered that
+<a href="https://kodi.tv">Kodi</a> (both using
+<a href="https://www.openelec.tv/">OpenELEC</a> and
+<a href="https://libreelec.tv">LibreELEC</a>) provide the
+<a href="https://github.com/grinsted/script.screensaver.feedreader">Feedreader</a>
+screen saver capable of reading a RSS feed with images and news. For
+fun, I used it this summer to test Kodi on my parents TV by hooking up
+a Raspberry PI unit with LibreELEC, and wanted to provide them with a
+screen saver showing selected pictures from my selection.</p>
+
+<p>Armed with motivation and a test photo frame, I set out to generate
+a RSS feed for the Kodi instance. I adjusted my <a
+href="https://freedombox.org/">Freedombox</a> instance, created
+/var/www/html/privatepictures/, wrote a small Perl script to extract
+title and description metadata from the photo files and generate the
+RSS file. I ended up using Perl instead of python, as the
+libimage-exiftool-perl Debian package seemed to handle the EXIF/XMP
+tags I ended up using, while python3-exif did not. The relevant EXIF
+tags only support ASCII, so I had to find better alternatives. XMP
+seem to have the support I need.</p>
+
+<p>I am a bit unsure which EXIF/XMP tags to use, as I would like to
+use tags that can be easily added/updated using normal free software
+photo managing software. I ended up using the tags set using this
+exiftool command, as these tags can also be set using digiKam:</p>
+
+<blockquote><pre>
+exiftool -headline='The RSS image title' \
+ -description='The RSS image description.' \
+ -subject+=for-family photo.jpeg
+</pre></blockquote>
+
+<p>I initially tried the "-title" and "keyword" tags, but they were
+invisible in digiKam, so I changed to "-headline" and "-subject". I
+use the keyword/subject 'for-family' to flag that the photo should be
+shared with my family. Images with this keyword set are located and
+copied into my Freedombox for the RSS generating script to find.</p>
+
+<p>Are there better ways to do this? Get in touch if you have better
+suggestions.</p>
+
+<p>As usual, if you use Bitcoin and want to show your support of my
+activities, please send Bitcoin donations to my address
+<b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
</description>
</item>
<item>
- <title>The Pyra - handheld computer with Debian preinstalled</title>
- <link>http://people.skolelinux.org/pere/blog/The_Pyra___handheld_computer_with_Debian_preinstalled.html</link>
- <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/The_Pyra___handheld_computer_with_Debian_preinstalled.html</guid>
- <pubDate>Wed, 4 May 2016 10:00:00 +0200</pubDate>
- <description>A friend of mine made me aware of
-<a href="https://pyra-handheld.com/boards/pages/pyra/">The Pyra</a>, a
-handheld computer which will be delivered with Debian preinstalled. I
-would love to get one of those for my birthday. :)</p>
-
-<p>The machine is a complete ARM-based PC with micro HDMI, SATA, USB
-plugs and many others connectors, and include a full keyboard and a 5"
-LCD touch screen. The 6000mAh battery is claimed to provide a whole
-day of battery life time, but I have not seen any independent tests
-confirming this. The vendor is still collecting preorders, and the
-last I heard last night was that 22 more orders were needed before
-production started.</p>
-
-<p>As far as I know, this is the first handheld preinstalled with
-Debian. Please let me know if you know of any others. Is it the
-first computer being sold with Debian preinstalled?</p>
+ <title>Simple streaming the Linux desktop to Kodi using GStreamer and RTP</title>
+ <link>http://people.skolelinux.org/pere/blog/Simple_streaming_the_Linux_desktop_to_Kodi_using_GStreamer_and_RTP.html</link>
+ <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Simple_streaming_the_Linux_desktop_to_Kodi_using_GStreamer_and_RTP.html</guid>
+ <pubDate>Thu, 12 Jul 2018 17:55:00 +0200</pubDate>
+ <description><p>Last night, I wrote
+<a href="http://people.skolelinux.org/pere/blog/Streaming_the_Linux_desktop_to_Kodi_using_VLC_and_RTSP.html">a
+recipe to stream a Linux desktop using VLC to a instance of Kodi</a>.
+During the day I received valuable feedback, and thanks to the
+suggestions I have been able to rewrite the recipe into a much simpler
+approach requiring no setup at all. It is a single script that take
+care of it all.</p>
+
+<p>This new script uses GStreamer instead of VLC to capture the
+desktop and stream it to Kodi. This fixed the video quality issue I
+saw initially. It further removes the need to add a m3u file on the
+Kodi machine, as it instead connects to
+<a href="https://kodi.wiki/view/JSON-RPC_API/v8">the JSON-RPC API in
+Kodi</a> and simply ask Kodi to play from the stream created using
+GStreamer. Streaming the desktop to Kodi now become trivial. Copy
+the script below, run it with the DNS name or IP address of the kodi
+server to stream to as the only argument, and watch your screen show
+up on the Kodi screen. Note, it depend on multicast on the local
+network, so if you need to stream outside the local network, the
+script must be modified. Also note, I have no idea if audio work, as
+I only care about the picture part.</p>
+
+<blockquote><pre>
+#!/bin/sh
+#
+# Stream the Linux desktop view to Kodi. See
+# http://people.skolelinux.org/pere/blog/Streaming_the_Linux_desktop_to_Kodi_using_VLC_and_RTSP.html
+# for backgorund information.
+
+# Make sure the stream is stopped in Kodi and the gstreamer process is
+# killed if something go wrong (for example if curl is unable to find the
+# kodi server). Do the same when interrupting this script.
+kodicmd() {
+ host="$1"
+ cmd="$2"
+ params="$3"
+ curl --silent --header 'Content-Type: application/json' \
+ --data-binary "{ \"id\": 1, \"jsonrpc\": \"2.0\", \"method\": \"$cmd\", \"params\": $params }" \
+ "http://$host/jsonrpc"
+}
+cleanup() {
+ if [ -n "$kodihost" ] ; then
+ # Stop the playing when we end
+ playerid=$(kodicmd "$kodihost" Player.GetActivePlayers "{}" |
+ jq .result[].playerid)
+ kodicmd "$kodihost" Player.Stop "{ \"playerid\" : $playerid }" > /dev/null
+ fi
+ if [ "$gstpid" ] && kill -0 "$gstpid" >/dev/null 2>&1; then
+ kill "$gstpid"
+ fi
+}
+trap cleanup EXIT INT
+
+if [ -n "$1" ]; then
+ kodihost=$1
+ shift
+else
+ kodihost=kodi.local
+fi
+
+mcast=239.255.0.1
+mcastport=1234
+mcastttl=1
+
+pasrc=$(pactl list | grep -A2 'Source #' | grep 'Name: .*\.monitor$' | \
+ cut -d" " -f2|head -1)
+gst-launch-1.0 ximagesrc use-damage=0 ! video/x-raw,framerate=30/1 ! \
+ videoconvert ! queue2 ! \
+ x264enc bitrate=8000 speed-preset=superfast tune=zerolatency qp-min=30 \
+ key-int-max=15 bframes=2 ! video/x-h264,profile=high ! queue2 ! \
+ mpegtsmux alignment=7 name=mux ! rndbuffersize max=1316 min=1316 ! \
+ udpsink host=$mcast port=$mcastport ttl-mc=$mcastttl auto-multicast=1 sync=0 \
+ pulsesrc device=$pasrc ! audioconvert ! queue2 ! avenc_aac ! queue2 ! mux. \
+ > /dev/null 2>&1 &
+gstpid=$!
+
+# Give stream a second to get going
+sleep 1
+
+# Ask kodi to start streaming using its JSON-RPC API
+kodicmd "$kodihost" Player.Open \
+ "{\"item\": { \"file\": \"udp://@$mcast:$mcastport\" } }" > /dev/null
+
+# wait for gst to end
+wait "$gstpid"
+</pre></blockquote>
+
+<p>I hope you find the approach useful. I know I do.</p>
+
+<p>As usual, if you use Bitcoin and want to show your support of my
+activities, please send Bitcoin donations to my address
+<b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
</description>
</item>
<item>
- <title>NUUG contests Norwegian police DNS seizure of popcorn-time.no</title>
- <link>http://people.skolelinux.org/pere/blog/NUUG_contests_Norwegian_police_DNS_seizure_of_popcorn_time_no.html</link>
- <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/NUUG_contests_Norwegian_police_DNS_seizure_of_popcorn_time_no.html</guid>
- <pubDate>Mon, 18 Apr 2016 10:00:00 +0200</pubDate>
- <description><p>It is days like today I am really happy to be a member of
-<a href="http://www.nuug.no/">the Norwegian Unix User group</a>, a
-member association for those of us believing in free software, open
-standards and unix-like operating systems. NUUG announced today it
-will
-<a href="http://www.nuug.no/news/Pressemelding__NUUG_og_EFN_begj_rer_rettslig_pr_ving_for_DNS_domenebeslag_av_popcorn_time_no.shtml">try
-to bring the seizure of the DNS domain popcorn-time.no as
-unlawful</a>, to stand up for the principle that writing about a
-controversial topic is not infringing copyrights, and censuring web
-pages by hijacking DNS domain should be decided by the courts, not the
-police. The DNS domain was seized by the Norwegian National Authority
-for Investigation and Prosecution of Economic and Environmental Crime
-a month ago. I hope this bring more paying members to NUUG to give
-the association the financial muscle needed to bring this case as far
-as it must go to stop this kind of DNS hijacking.</p>
+ <title>Streaming the Linux desktop to Kodi using VLC and RTSP</title>
+ <link>http://people.skolelinux.org/pere/blog/Streaming_the_Linux_desktop_to_Kodi_using_VLC_and_RTSP.html</link>
+ <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Streaming_the_Linux_desktop_to_Kodi_using_VLC_and_RTSP.html</guid>
+ <pubDate>Thu, 12 Jul 2018 02:00:00 +0200</pubDate>
+ <description><p>PS: See
+<ahref="http://people.skolelinux.org/pere/blog/Simple_streaming_the_Linux_desktop_to_Kodi_using_GStreamer_and_RTP.html">the
+followup post</a> for a even better approach.</p>
+
+<p>A while back, I was asked by a friend how to stream the desktop to
+my projector connected to Kodi. I sadly had to admit that I had no
+idea, as it was a task I never had tried. Since then, I have been
+looking for a way to do so, preferable without much extra software to
+install on either side. Today I found a way that seem to kind of
+work. Not great, but it is a start.</p>
+
+<p>I had a look at several approaches, for example
+<a href="https://github.com/mfoetsch/dlna_live_streaming">using uPnP
+DLNA as described in 2011</a>, but it required a uPnP server, fuse and
+local storage enough to store the stream locally. This is not going
+to work well for me, lacking enough free space, and it would
+impossible for my friend to get working.</p>
+
+<p>Next, it occurred to me that perhaps I could use VLC to create a
+video stream that Kodi could play. Preferably using
+broadcast/multicast, to avoid having to change any setup on the Kodi
+side when starting such stream. Unfortunately, the only recipe I
+could find using multicast used the rtp protocol, and this protocol
+seem to not be supported by Kodi.</p>
+
+<p>On the other hand, the rtsp protocol is working! Unfortunately I
+have to specify the IP address of the streaming machine in both the
+sending command and the file on the Kodi server. But it is showing my
+desktop, and thus allow us to have a shared look on the big screen at
+the programs I work on.</p>
+
+<p>I did not spend much time investigating codeces. I combined the
+rtp and rtsp recipes from
+<a href="https://wiki.videolan.org/Documentation:Streaming_HowTo/Command_Line_Examples/">the
+VLC Streaming HowTo/Command Line Examples</a>, and was able to get
+this working on the desktop/streaming end.</p>
+
+<blockquote><pre>
+vlc screen:// --sout \
+ '#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128}:rtp{dst=projector.local,port=1234,sdp=rtsp://192.168.11.4:8080/test.sdp}'
+</pre></blockquote>
+
+<p>I ssh-ed into my Kodi box and created a file like this with the
+same IP address:</p>
+
+<blockquote><pre>
+echo rtsp://192.168.11.4:8080/test.sdp \
+ > /storage/videos/screenstream.m3u
+</pre></blockquote>
+
+<p>Note the 192.168.11.4 IP address is my desktops IP address. As far
+as I can tell the IP must be hardcoded for this to work. In other
+words, if someone elses machine is going to do the steaming, you have
+to update screenstream.m3u on the Kodi machine and adjust the vlc
+recipe. To get started, locate the file in Kodi and select the m3u
+file while the VLC stream is running. The desktop then show up in my
+big screen. :)</p>
+
+<p>When using the same technique to stream a video file with audio,
+the audio quality is really bad. No idea if the problem is package
+loss or bad parameters for the transcode. I do not know VLC nor Kodi
+enough to tell.</p>
+
+<p><strong>Update 2018-07-12</strong>: Johannes Schauer send me a few
+succestions and reminded me about an important step. The "screen:"
+input source is only available once the vlc-plugin-access-extra
+package is installed on Debian. Without it, you will see this error
+message: "VLC is unable to open the MRL 'screen://'. Check the log
+for details." He further found that it is possible to drop some parts
+of the VLC command line to reduce the amount of hardcoded information.
+It is also useful to consider using cvlc to avoid having the VLC
+window in the desktop view. In sum, this give us this command line on
+the source end
+
+<blockquote><pre>
+cvlc screen:// --sout \
+ '#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128}:rtp{sdp=rtsp://:8080/}'
+</pre></blockquote>
+
+<p>and this on the Kodi end<p>
+
+<blockquote><pre>
+echo rtsp://192.168.11.4:8080/ \
+ > /storage/videos/screenstream.m3u
+</pre></blockquote>
+
+<p>Still bad image quality, though. But I did discover that streaming
+a DVD using dvdsimple:///dev/dvd as the source had excellent video and
+audio quality, so I guess the issue is in the input or transcoding
+parts, not the rtsp part. I've tried to change the vb and ab
+parameters to use more bandwidth, but it did not make a
+difference.</p>
+
+<p>I further received a suggestion from Einar Haraldseid to try using
+gstreamer instead of VLC, and this proved to work great! He also
+provided me with the trick to get Kodi to use a multicast stream as
+its source. By using this monstrous oneliner, I can stream my desktop
+with good video quality in reasonable framerate to the 239.255.0.1
+multicast address on port 1234:
+
+<blockquote><pre>
+gst-launch-1.0 ximagesrc use-damage=0 ! video/x-raw,framerate=30/1 ! \
+ videoconvert ! queue2 ! \
+ x264enc bitrate=8000 speed-preset=superfast tune=zerolatency qp-min=30 \
+ key-int-max=15 bframes=2 ! video/x-h264,profile=high ! queue2 ! \
+ mpegtsmux alignment=7 name=mux ! rndbuffersize max=1316 min=1316 ! \
+ udpsink host=239.255.0.1 port=1234 ttl-mc=1 auto-multicast=1 sync=0 \
+ pulsesrc device=$(pactl list | grep -A2 'Source #' | \
+ grep 'Name: .*\.monitor$' | cut -d" " -f2|head -1) ! \
+ audioconvert ! queue2 ! avenc_aac ! queue2 ! mux.
+</pre></blockquote>
+
+<p>and this on the Kodi end<p>
+
+<blockquote><pre>
+echo udp://@239.255.0.1:1234 \
+ > /storage/videos/screenstream.m3u
+</pre></blockquote>
+
+<p>Note the trick to pick a valid pulseaudio source. It might not
+pick the one you need. This approach will of course lead to trouble
+if more than one source uses the same multicast port and address.
+Note the ttl-mc=1 setting, which limit the multicast packages to the
+local network. If the value is increased, your screen will be
+broadcasted further, one network "hop" for each increase (read up on
+multicast to learn more. :)!</p>
+
+<p>Having cracked how to get Kodi to receive multicast streams, I
+could use this VLC command to stream to the same multicast address.
+The image quality is way better than the rtsp approach, but gstreamer
+seem to be doing a better job.</p>
+
+<blockquote><pre>
+cvlc screen:// --sout '#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128}:rtp{mux=ts,dst=239.255.0.1,port=1234,sdp=sap}'
+</pre></blockquote>
+
+<p>As usual, if you use Bitcoin and want to show your support of my
+activities, please send Bitcoin donations to my address
+<b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
</description>
</item>