Skip to content

UniNews Documentation

1. Introduction

UniNews is a desktop application designed to aggregate news, announcements, and updates from universities into a single interface.

University information is often distributed across multiple sources, including RSS feeds, departmental websites, faculty announcements, and institution-wide news portals. As a result, students, researchers, and staff must frequently navigate several websites to remain informed.

UniNews addresses this problem by collecting content from multiple sources and presenting it through a unified desktop application.

The application is developed in Python using PyQt6 and follows a modular architecture that supports both RSS feeds and custom website scrapers.


2. Objectives

The primary objectives of UniNews are:

  • Centralize university-related news.
  • Reduce the effort required to monitor multiple websites.
  • Provide a clean and modern desktop experience.
  • Support extensibility through community-contributed scrapers.
  • Enable offline access to previously retrieved articles.
  • Provide configurable notifications for new content.

3. System Architecture

The system consists of five major components:

User Interface Layer

Responsible for:

  • Displaying articles
  • Searching articles
  • Filtering content
  • Managing settings
  • Presenting notifications

Implemented using:

  • PyQt6

Data Acquisition Layer

Responsible for collecting news from external sources.

Supports:

  • RSS feeds
  • Custom HTML scrapers

Implemented using:

  • feedparser
  • requests
  • BeautifulSoup

Scraper Framework

Provides a standardized mechanism for integrating new content sources.

Each scraper inherits from a common base class and returns articles in a unified format.

Persistence Layer

Responsible for:

  • Storing articles
  • Storing settings
  • Preventing duplicate entries

Implemented using:

  • SQLite

Notification Layer

Responsible for desktop notifications whenever new articles are discovered.

Implemented using:

  • Plyer

4. Article Data Model

All sources are normalized into a common structure.

{
    "university": str,
    "source": str,
    "title": str,
    "summary": str,
    "link": str,
    "published": str,
    "fetched_at": str,
    "image_url": str
}

This allows RSS feeds and HTML scrapers to be handled identically by the application.


5. RSS Feed Support

RSS feeds are defined in:

data/feeds.json

Example:

{
  "name": "MIT News",
  "type": "rss",
  "url": "https://news.mit.edu/rss/feed"
}

The RSS service retrieves entries and converts them into the internal article format.


6. Scraper Framework

Scrapers are located inside:

scrapers/

Each scraper extends the abstract BaseScraper class.

Example:

class ExampleScraper(BaseScraper):

    def scrape(self):
        return []

Scrapers are registered through:

SCRAPER_REGISTRY

This design allows contributors to add support for new universities without modifying the rest of the system.


7. University of Macedonia Integration

The initial scraper implementation targets the University of Macedonia.

Supported sources include:

  • Main university news
  • Departmental announcements
  • Faculty-specific news pages

The scraper supports multiple subpages and categorizes articles by source.

Examples:

  • UoM Main News
  • UoM Applied Informatics
  • UoM Economics
  • UoM Business Administration

This categorization enables filtering directly from the application interface.


8. Local Storage

UniNews stores information locally within:

local_data/

Contents include:

SQLite Database

Stores:

  • Articles
  • Sources
  • Metadata

Settings File

Stores:

  • Theme preferences
  • Refresh intervals
  • Notification preferences
  • Cache limits

9. Search and Filtering

The application provides:

Allows users to search:

  • Article titles
  • Article summaries
  • Source names

Source Filtering

Users may filter content by:

  • University
  • Department
  • Individual source

This functionality is exposed through the sidebar navigation panel.


10. Notifications

The notification subsystem supports:

  • Desktop notifications
  • Keyword-based filtering
  • Optional startup refreshes
  • Periodic automatic refreshes

Users may define keywords that trigger notifications when matched within article content.


11. User Interface

The application follows a card-based design.

Key interface components include:

Displays:

  • Application title
  • Refresh controls

Provides:

  • University filtering
  • Department filtering
  • Search functionality

Article View

Displays:

  • Article image
  • Title
  • Source
  • Publication date
  • Summary

Settings Dialog

Allows users to configure:

  • Theme
  • Refresh interval
  • Notification preferences
  • Cache settings

12. Extensibility

UniNews has been designed with extensibility as a primary goal.

New universities can be integrated through:

RSS Feed Integration

Adding a new entry to:

feeds.json

Scraper Integration

Implementing:

BaseScraper

and registering it within:

SCRAPER_REGISTRY

No modifications to the user interface or database layer are required.


13. Future Work

Planned enhancements include:

  • Additional university integrations
  • Improved image caching
  • Pagination support
  • Plugin-based scraper loading
  • OPML feed import/export
  • Article bookmarking
  • Automatic update checks
  • Native Linux package distribution
  • Cross-platform installers

14. License

UniNews is released under the GNU General Public License v3.0 (GPL-3.0).

The project is maintained as an open-source initiative and welcomes community contributions.

Contributors