Update README.md

- Replace inline links with reference links because it's more organized

- Add titles to badges so more info appears in a tooltip
Fix #382 Add Video Playback feature

This feature adds the ability to play back the last recorded video after
a video has been recorded. The playback button is hidden until a last
video exists.

This feature is supported on Linux and Windows.

Closes #382
Signed-off-by: Thanh Ha <thanh.ha@alumni.carleton.ca>
Fix #151 Make RSS / CSV Loaders plugins

Refactored plugin.py to add importer plugin category. Refactored
database.py to use rss and csv plugins. Added tests for rss and csv
importers to test_database.py.

Closes #413
Make plugins use Python3 imports

ConfigParser -> configparser
HTMLParser -> html.parser

Signed-off-by: Thanh Ha <thanh.ha@alumni.carleton.ca>
Use Python3 style imports for qtresources

Signed-off-by: Thanh Ha <thanh.ha@alumni.carleton.ca>
Fix Qt resource import

Signed-off-by: Thanh Ha <thanh.ha@alumni.carleton.ca>
Remove obsolete .gitignore file
Fix test not ignoring renamed resource file

Signed-off-by: Thanh Ha <thanh.ha@alumni.carleton.ca>
Fix code style to confirm with Freeseer style guidelines

Signed-off-by: Thanh Ha <thanh.ha@alumni.carleton.ca>
Including .freeseer-plugin files when generating packages

Signed-off-by: Thanh Ha <thanh.ha@alumni.carleton.ca>
Feature #373: Declarative configs and profile / configuration refactor

New concepts:
    - ProfileManager, Profile
    - ConfigStorage, Config, Option

Profiles and Profile Management
===============================

`~/.freeseer/profiles` is now managed by a `ProfileManager`. It handles
creating profiles.

Each profile is now modeled by a `Profile` object. It can be used to get
files from within its folder in a pythonic-manner.

See `freeseer.framework.config.profile`.

Configuration
==============

`FreeseerConfig` and future "configuration classes" have been reworked
to remove needless boilerplate, provide stricter type checking, and
be easily persisted to a file or some other backend. Configs written in
a similar declarative manner like Django or SqlAlchemy models:

    from freeseer.framework.config import Config
    from freeseer.framework.config import options

    class MyConfig(Config):
        name = options.StringOption('foo')
        age = options.IntegerOption()

Upon instantiation, those options can be accessed as if they were
regular class attributes. Any changes to their values will be stored
internally. As you can imagine, values assigned are validated by the
various options (e.g. age only accepts integers).

Persistance of configs is handled by ConfigStorages. I've only
implemented two so far inside `freeseer.framework.config.persist`: one
that uses `ConfigParser` for INI-style files, and one that uses a JSON
file.

    from freeseer.framework.config.persist import ConfigParserStorage

    # load the config, if the file doesn't exist it'll use defaults
    storage = ConfigParserStorage('/tmp/path/to/file.conf')
    config = storage.load(MyConfig(), 'section')

    # make your changes
    config.name = 'michael'
    config.age = 22

    # save them
    storage.store(config, 'section')

This will create a file that looks like:

    [section]
    name = michael
    age = 22

In conjunction with the `Profile` abstraction, you have a nice way of
storing config files inside a profile (e.g. freeseer.conf and
plugins.conf).
Fix #401 Database upgrade failed when starting freeseer

Closes #417
Signed-off-by: Thanh Ha <thanh.ha@alumni.carleton.ca>
Fix #424 auto_hide now defaults to False
Fix #396 Create Youtube Internal API
- Use Google API v3
- Implement authentication via OAuth2
- Currently support uploads
- Support non-interactive use
- See documentation for usage and information

Fix #402
Fix #396
Fix #379
Fix #249