|
UniNews
University news from Greek and international universities in one place
|
UniNews is a desktop application that brings news and announcements from universities into a single place.
It started as a way to avoid visiting a dozen university and department pages every day. Instead of opening several tabs, UniNews collects everything into one window, stores it locally, and lets you search and filter it.
Written in Python with PyQt6. Publishers are plain JSON files: adding a university usually means adding a few lines of configuration, not writing code.
υποτροφιες finds ΥΠΟΤΡΟΦΙΕΣ)Download the .deb from the releases page, then:
Dependencies point one way: ui -> library -> database -> fetchers. Nothing below ui/ imports Qt, and only the main window touches the database.
Create src/uninews/resources/publishers/<name>.json. Check for an RSS feed first; it is more reliable than scraping.
For a site without a feed, describe its markup with CSS selectors. Open the page, inspect one article, and find the repeating container and the title link inside it.
| Key | Meaning |
|---|---|
type | rss or html |
label | Shown in the sidebar |
url | First page of the list, or the feed |
item_selector | Repeating element, one per article |
title_selector | The title link inside an item |
date_selector, summary_selector, image_selector | Optional |
pages, page_url | Pagination; {url} and {page} are substituted |
enabled | Set to false to park a source without deleting it |
Comma-separated selectors are tried left to right, and the first match wins.
Check your work before opening the app:
OK means articles were found, EMPTY means the selectors matched nothing, and FAIL prints the reason (blocked, offline, or changed markup).
If selectors are not enough (a JSON API, dates only on the article page), add a module to src/uninews/fetchers/ that subclasses HtmlFetcher or Fetcher:
Import it in fetchers/__init__.py so it registers itself, then reference it in JSON with "type": "example_announcements".
| What | Path |
|---|---|
| Settings | ~/.config/uninews/settings.json |
| Article cache | ~/.local/share/uninews/uninews.db |
| Generated UI assets | ~/.cache/uninews/ |
| Home university (read-only, written by UniDesk) | ~/.unios/academicConfig.json |
Deleting the database makes the next refresh fetch everything again.
UniNews opens with one university selected in the sidebar, chosen in this order:
universityName in ~/.unios/academicConfig.json, set from UniDesk's Configure UniOS page).All universities are still fetched; the selection only filters what is shown.
API docs are generated with Doxygen from the docstrings:
Tests run against saved pages in tests/fixtures/, so a failure means the code broke. To find out whether a site changed, run the fetcher checker instead.
University servers are not free to hit. UniNews fetches at most six sites in parallel and never more than one request at a time to the same site, auto-refresh is limited to once every 15 minutes, and every request identifies the application. If a site asks not to be fetched, remove it or set "enabled": false.
The easiest contribution is a new publisher: add a JSON file, verify it with the fetcher checker, and open a pull request.
Before opening a pull request:
python3 -m pytest -q passes.ruff check . is clean.GNU General Public License v3.0.