Recent Posts

Liferea Trick #10: Custom CSS for Article Rendering

Liferea renders articles as HTML content using Webkit (the Safari rendering engine) with colors adapted to the active GTK theme in a somewhat neutral and mail like style. If you dislike it you might want to change aspects of the CSS used to render the articles.

How it Works

To facilitate this Liferea loads 2 CSS definitionsBoth stylesheets are loaded so that the one in your home directory overrules the predefined one. And the documentation should help you to find the selectors you want to overwrite. Just have a look at ~/.config/liferea/liferea.css and try to change stuff. It is really easy.

Some example lines from ~/.config/liferea/liferea.css :
/* Header table fields to different item metadata */
// .author, .categories, .source { }
// .date { }

/* Item/feed description */ // div.content { }

/* Comment rendering */ // div.comment { } // div.comment_body { } // div.comment_title { }

Recent Liferea Tricks

Liferea Trick #9: Skimming Trough the Headlines

I'm not sure about how many users are aware of the feature, but I'm certain it is worth to know about as it saves a lot of clicking and pointing with the mouse. If you are a keyboard user it's worth knowing about the hotkey to skim through headlines.

Remember the Hot Key

As this hotkey is configurable check the preference dialog ff you are not sure about the setting. The default setting is <Ctrl>-Space...

How it Works...

By using this hot key you can navigate the article pane and the item list view at the same time. As long as the article pane allow vertical scrolling it scrolls down. Once you reach bottom Liferea jumps to the next unread article.

Using the headline skimming hotkey is like a "Next Unread And Scroll Down" menu option...


Recent Liferea Tricks

Liferea Trick #8: Change Menu Accelerators

When you are not satisfied with the menu key bindings defined by Liferea do not despair it is easy to change them!

Variant #1: Edit ~/.config/liferea/accels

This variant is 100% portable and should work for everyone. Open ~/.config/liferea/accels in your favourite editor. This file is loaded upon startup by Liferea and contains lines like these:
[...]
; (gtk_accel_path "<Actions>/AddActions/NewVFolder" "")
; (gtk_accel_path "<Actions>/GeneralActions/SearchMenu" "")
; (gtk_accel_path "<Actions>/ItemActions/ToggleItemFlag" "<Primary>t")
; (gtk_accel_path "<Actions>/GeneralActions/PrevReadItem" "<Primary><Shift>n")
[...]
Note how only the "ToggleItemFlag" and the "PrevReadItem" line have defined key bindings, while "NewVFolder" and "SearchMenu" don't.

To change a key binding first remove the semicolon at the start of the line and then adapt or clear the key binding field. Choose prefixes like "<Primary>" (for Ctrl), "<Alt>", "$lt;Shift> as needed and append the key after it.

Variant #2: Enable Editable Accelerators with your Linux Distro Settings

This variant is hard to document as different distributions have different setting dialogs. Some expose a setting to enable life editing of key bindings. Once this is enabled you can open a menu hover over a menu option and press the accelerator you want to assign. It should show up instantly.


Recent Liferea Tricks

Liferea Trick #7: Force Read Full Posts

The Problem

When you have subscribed to an interesting feed that does not provide full posts it can be frustrating. Short of using website scraping as described in the latest post there is nothing you can do to enhance the feed content.

There are legitimate reasons for feed publishers to do so. One might be that the site is earning by display ads, another might be that the publisher wants to engage users directly on their own website.

How To Solve It?

So why not follow that wish and simply read the entire website? Liferea allows you to do so by enabling an option in the subscription properties. Just open the subscription properties dialog by right clicking the subscription as selecting "Properties ..." and select the last tab "Advanced":



Here you can enable the second option "Auto-load item link ...". From now own you will read the website directly and see full content!

Liferea Project Moved to Github

Today I closed the ticket tracker at Sourceforge the last remaining project tool there. Several maintainers and users already started using the new one at Github. Please also do!

If I set everything correctly the SF bugs should stay readable for everyone. You just cannot edit them anymore. I plan to close all of them with appriopriate results. In any case if you mind please reopen at Github:

https://github.com/lwindolf/liferea

Moving to Github simplifies my workflow a lot (especially the auto-linking of tickets by commits with ticket id) and less time will be spend on maintaining the tickets and more on the code and the actual issues to solve.

Also feel invited to make many many pull requests!

Liferea Trick #6: Website Scraping

Not every interesting website provides a feed. Some feeds are broken. And some websites do provide summaries only or no content at all. Besides asking the owner of the website to add a feed or provide more details the only choice left might be to "scrape" the website content.

Read about how to scrape websites with Liferea

Continuous Liferea git master builds with Travis CI

Today I set up Travis for Liferea git master. This should reduce mistakes like forgetting to add files or dependencies as well as testing compilation with LLVM.

I also converted the README to Markdown syntax and the new README.md now has a Liferea screenshot and a Travis build status badge looking like this:

Liferea Code Repo Moved to github

I moved the source repo away from SourceForge away to GitHub. It is currently located here:

https://github.com/lwindolf/liferea

If in doubt always follow the "Code" link from the website to find the repo.

Sorry, if this causes troubles for you. I'll contact all with current git write access directly to see how we can continue on github and who will be able to merge.

Please keep contributing! I think with github this can actually become easier and more developers are familiar with its best practices.

Liferea Bug Tracker Switching to Github

Dear maintainers and contributing end users,

I plan to switch the bug tracker from SourceForge to Github to the end of the month (31.05.2014) to further simplify the workflow of maintaining Liferea. As a benefit at Github I'll maintain milestones with due dates and assigned issues. The Github bug tracker is already in use by some users. Feel free to use it right now.

Nothing Gets Lost!

I won't ignore the old tickets, they will just become invisible. I promise to process all important SF tickets. I believe you will still get mail notifications on state changes. For the maintainers: if you still need to access the tickets I we can find a solution (admin user role...). I know this pains you guys probably the most and don't want to mess up your valuable work more than absolutely necessary.

If you are in any doubt please drop a short mail on the mailing list or just recreate all the tickets at Github: https://github.com/lwindolf/liferea/issues?milestone=2&state=open

The Future

I plan to entirely stop using the Sourceforge tools in favour of Github. Sourceforge is just not very useable. Code formatting looks funny all the time. One needs to edit tickets to change state. Also the commit correlation with tickets in Github is just a killer feature for me.

For the future I also hope to invite more contributions via Github forking and merging. By also switching more code to Python plugins I can imagine some more users crossing the barrier, that coding in C is, and contribute.

TinyTinyRSS Categories Support Finished

git master now has TinyTinyRSS categories (hierarchic folders) enabled. It will automatically reorganize your subscriptions into the folders.

Please help testing git master with this feature!

Liferea Distro Watch

Distribution adoption is slow as always, bugfixes released take time to end up at the users...
Ubuntu 13.041.8.10
Debian Wheezy1.8.6
Debian Wheezy Backports1.8.15
Debian Experimental1.10.1
OpenSuSE 12.31.8.14
Gentoo Stable1.8.8
Fedora 191.8.15
Fedora 201.10.2
FreeBSD1.8.15
Arch Linux1.10.3
1.8.15 is latest stable version of 1.8 line. So using Debian Backports, FreeBSD and Fedora 17-19 you are up-to-date. Only in Debian Experimental and Fedora 20 you get the most recent stable line.

TheOldReader Categories Support in Liferea git master

Git master now features categories support when subscribing to theoldreader.com accounts. As TheOldReader allows only level of folders nested folders are not possible. Still this allows to organize the feeds neatly. If you already have a subscription don't worry your feeds will be automatically reorganized without loosing any items.

The TheOldReader category support will be first included in release 1.11.0

No More Liferea Tray Icon in KDE

With bug report SF #1118 Mike Robinson reported the tray icon not working on KUbuntu. Quote:
I'm using version 1.8.10 on Kubuntu and the "Integrate with the 
messaging menu" doesn't cause the program to appear in the KDE 
system tray. When I click to close the application, I can see that it 
is still running in the background, and when I try to re-open it, it 
immediately pops up the window. I would assume that it is trying to 
integrate itself into a non-existent Gnome system tray instead of 
playing nice with KDE. I feel having this is essential to KDE users.
And he is right, as reported in other locations too (e.g. Redhat ticket #716358) it turns out that using GtkStatusIcon (the long needed EggTrayIcon replacement introduced in GTK+ 2.10) breaks the tray icon in KDE.

As explained in the Redhat ticket Ubuntu and KDE boldly went ahead an implemented a new XEmbed specification, while GNOME/GTK (and GtkStatusIcon used by Liferea) stayed with the old. While KDE tries to be backwards compatible it still fail with sizing issues. This is known for many different applications with tray icons.

For Liferea we intentionally leave all the complexity to the GtkTrayIcon widget implementation by GTK. There is no other portable way to do it right in GTK+ AFAIK.

And yes, effectively this means you cannot use the tray icon with recent KDE versions. For Ubuntu itself Liferea has libindicate support solving the issue there.

Writing Liferea Plugins Tutorial (Part 1)

Some time ago a fellow Liferea user asked about documentation on writing Liferea plugins. I see the need and the benefit and want to start doing so with a series of blog posts that later can be compiled into a tutorial to be included on the website/sources.

Plugins with GObject Introspection

First it is important to know that Liferea 1.10+ uses GObject Introspection (GI) and libpeas to allow implementing plugins. This quote from the GNOME wiki explain how GI works:

GObject introspection is a middleware layer between C libraries (using GObject) and language bindings. The C library can be scanned at compile time and generate a metadata file, in addition to the actual native C library. Then at runtime, language bindings can read this metadata and automatically provide bindings to call into the C library.

The important point is: by Liferea using GI (as all GNOME applications and many other GTK applications do now) plugins can be written in practically any scripting language. Most users seem to favour Python and all current plugins included with the Liferea sources are in Python. Note that this tutorial will also focus on Python only.

How are plugins triggered from with Liferea?

Ok, I can write a script in Python! How will Liferea run it and when?

This is where libpeas comes in, which is a basic library to implement a plugin system. If you click the preferences dialog and switch to the "Plugins" button you see a dialog provided by the PeasGtkPluginsManager class of libpeas. Detection, activation and configuration of plugins is handled by libpeas.



Now for the "When?" question: To properly allow applications to hook plugins into different parts of the applications libpeas allow an application to define one or more so called "Activatable" interfaces.

For simplicity for Liferea I decided to only support a LifereaShellActivatable interface. This means all plugins are activated together with the LifereaShell instance (src/ui/liferea_shell.c). This class represents the main application window holding all widgets. So when your plugin gets activated all widgets exist and you can access everything like extending or modifying the GUI, changing settings, everything you can think of.

Note: in the code there are two more interfaces: that are used to implement two important features (GNOME keyring support and a simple media player). Feel free to use those two, but be aware that they work differently and activate at other times and not just once as the LifereaShellActivatable.

Using LifereaShellActivatable

If you script in Python using LifereaShellActivatable means simply deriving a new class from it. For example:
from gi.repository import GObject, Peas, PeasGtk, Gtk, Liferea, Gdk


class ExamplePlugin (GObject.Object, Liferea.ShellActivatable): __gtype_name__ = 'ExamplePlugin'

object = GObject.property (type=GObject.Object) shell = GObject.property (type=Liferea.Shell)

def do_activate (self): # Do something here...

def do_deactivate (self): # Maybe do somethin here too...
The activate() and deactivate() methods are required by libpeas and provide you with the starting points to do stuff. By fetching the "Liferea.Shell" instance you gain access to the main window. Using this you can both lookup widgets or other Liferea classes like the Liferea.FeedList to perform actions against business objects of Liferea.

Providing a plugin configuration

Along with the actual plugin code libpeas requires a plugin configuration file defining the language the plugin is implemented with and metadata (name, description, website...) for this plugin. Such a file looks like this:
[Plugin]
Module=example
Loader=python
IAge=2
Name=Example Plugin
Description=Illustrates how to implement plugins in Liferea
Authors=Lars Windolf 
Copyright=Copyright © 2014 Lars Windolf
Website=http://lzone.de/liferea/
Help=http://lzone.de/liferea/
Most important is the "Loader" setting indicating the correct scripting language and the "Module" setting which together with the "Loader" setting as "python" indicates that or plugin script is to be named "example.py". Both the "example.py" plugin script and it's "example.plugin" config file need to be put into the Liferea plugins directory...

Where to put my plugin script?

There are two possible locations for the plugin script (and it's configuration file): Note that paths can be different with different XDG settings.

When writing and testing don't bother installing the plugin in the package directories. Just put it in ~/.config/liferea/plugins, fire up Liferea.




More about how to check for activation, debug problems and handling enabling/disabling in the next installment of this tutorial!

Liferea: git master now has TinyTinyRSS podcast support

If you use TinyTinyRSS synchronization and care about podcast try git master (upcoming 1.11.0 unstable release) to also fetch podcasts!

Missing tray icon on Ubuntu-derived distributions

If you are a MATE desktop user using a Liferea 1.10.xx package installed from the official package repositories of your Linux distribution and since the switch from 1.8.xx the trayicon went missing then the reason is very probably that you are using a package build by Ubuntu for the Unity desktop that strips the trayicon support.

You can verify wether this is the case in the "Preferences" dialog which should look like this



If the trayicon option is not visible than the package doesn't support a trayicon.

This is known to be the case for at least Mint17.

Help Needed: High Contrast Icon

Today Obsidien created ticket #148 about support for the GNOME high contrast icon theme.

Icons in this theme look like this:

(screenshot taken from GNOME Wiki)

As I'm not an artist in any way I want to ask you readers for your help! So if you are a graphics artist and have some spare time why not gift an high contrast icon for Liferea! If you are interested leave a note in the ticket.