screensaver basato su flusso di news

Personalizzazione grafica del sistema: icone, temi, sfondi, suoni, eccetera.
Scrivi risposta
condorbox
Prode Principiante
Messaggi: 76
Iscrizione: giovedì 5 ottobre 2006, 19:29

screensaver basato su flusso di news

Messaggio da condorbox »

Ciao
sto cercando uno screensaver che mi mostre le news magari provenienti da un flusso RSS o Json,
Qualcuno sa se esiste?
Grazie mille della collaborazione
Andrea
seasonunwrap
Prode Principiante
Messaggi: 1
Iscrizione: mercoledì 31 luglio 2024, 6:46

Re: screensaver basato su flusso di news

Messaggio da seasonunwrap »

RSS Screensaver for Windows:
Descrizione: Un'applicazione che visualizza i feed RSS come screensaver.
Download: Puoi cercare "RSS Screensaver for Windows" su Google per trovare siti di download affidabili.
RSS Feed Screensaver (Mac):
Descrizione: Un screensaver per macOS che può visualizzare feed RSS.
Download: Puoi trovare applicazioni di screensaver RSS per Mac su siti come MacUpdate.
drist029ity
Prode Principiante
Messaggi: 1
Iscrizione: martedì 28 luglio 2026, 13:07
Desktop: macbook
Distribuzione: linux
Sesso: Maschile

Re: screensaver basato su flusso di news

Messaggio da drist029ity »

condorbox ha scritto:
martedì 9 aprile 2024, 9:02
Ciao
sto cercando uno screensaver che mi mostre le news magari provenienti da un flusso RSS o Json,
Qualcuno sa se esiste? PerYourHealth employee portal
Grazie mille della collaborazione
Andrea
Sì, esistono diverse soluzioni. Alcuni screensaver supportano feed RSS, mentre per i JSON potrebbe essere necessario uno script o un'app dedicata che recuperi i dati e li visualizzi. Dipende anche dal sistema operativo che stai utilizzando (Windows, macOS o Linux).
LUBO-BACK
Prode Principiante
Messaggi: 127
Iscrizione: mercoledì 19 gennaio 2022, 1:00
Sesso: Maschile

Re: screensaver basato su flusso di news

Messaggio da LUBO-BACK »

Spero di non rispondere ad un bot, ma ne ho scritto al volo uno in python. Poi andrebbe integrato col desktop utilizzato ma comunque funziona.

Serve feedparser, io prediligo creare un env

Codice: Seleziona tutto

mkdir news_screensaver

cd news_screensaver

python3 -m venv env

source env/bin/activate

pip install PyQt6 feedparser
poi, sempre dalla stessa cartella

Codice: Seleziona tutto

nano python news_screensaver.py
e ci incolliamo il contenuto

Codice: Seleziona tutto

import sys
import feedparser
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt6.QtCore import Qt, QTimer
from PyQt6.QtGui import QFont, QPalette, QColor

class NewsScreensaver(QWidget):
    def __init__(self, rss_url):
        super().__init__()
        self.rss_url = rss_url
        self.news_items = []
        self.current_index = 0
        self.last_mouse_pos = None

        self.init_ui()
        self.fetch_news()

        # Timer 1: Cambia la notizia a schermo ogni 6 secondi
        self.display_timer = QTimer(self)
        self.display_timer.timeout.connect(self.update_display)
        self.display_timer.start(6000)

        # Timer 2: Aggiorna il feed RSS in background ogni 10 minuti (600000 ms)
        self.fetch_timer = QTimer(self)
        self.fetch_timer.timeout.connect(self.fetch_news)
        self.fetch_timer.start(600000)

    def init_ui(self):
        # Imposta la finestra a schermo intero, senza bordi e sempre in primo piano
        self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint)
        self.showFullScreen()
        
        # Nasconde il cursore del mouse
        self.setCursor(Qt.CursorShape.BlankCursor)

        # Imposta lo sfondo nero
        palette = self.palette()
        palette.setColor(QPalette.ColorRole.Window, QColor("black"))
        self.setPalette(palette)
        self.setAutoFillBackground(True)

        # Configura il layout
        self.layout = QVBoxLayout()
        self.layout.setAlignment(Qt.AlignmentFlag.AlignCenter)

        # --- Etichetta per il TITOLO ---
        self.title_label = QLabel("Caricamento notizie in corso...", self)
        self.title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.title_label.setFont(QFont("Sans Serif", 40, QFont.Weight.Bold))
        self.title_label.setStyleSheet("color: #FFFFFF; padding: 20px;")
        self.title_label.setWordWrap(True)
        self.layout.addWidget(self.title_label)

        # --- Etichetta per il CONTENUTO (Summary) ---
        self.content_label = QLabel("", self)
        self.content_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.content_label.setFont(QFont("Sans Serif", 24, QFont.Weight.Normal))
        self.content_label.setStyleSheet("color: #AAAAAA; padding: 0 100px;") # Margini per leggibilità
        self.content_label.setWordWrap(True)
        self.layout.addWidget(self.content_label)

        self.setLayout(self.layout)

        # Abilita il tracciamento del mouse
        self.setMouseTracking(True)

    def fetch_news(self):
        """Scarica e analizza il feed RSS, estraendo titolo e contenuto."""
        try:
            feed = feedparser.parse(self.rss_url)
            if feed.entries:
                self.news_items = []
                for entry in feed.entries:
                    title = entry.title
                    # Usa getattr per evitare errori se il campo summary non esiste
                    summary = getattr(entry, 'summary', '') 
                    self.news_items.append({"title": title, "summary": summary})
                
                self.update_display()
        except Exception as e:
            self.news_items = [{"title": "Errore di connessione", "summary": "Impossibile caricare il feed RSS in questo momento."}]

    def update_display(self):
        """Mostra la notizia successiva nella lista."""
        if self.news_items:
            item = self.news_items[self.current_index]
            
            self.title_label.setText(item["title"])
            # QLabel di PyQt6 formatta in automatico l'HTML di base (es. <b>, <p>) se presente nel feed
            self.content_label.setText(item["summary"])
            
            self.current_index = (self.current_index + 1) % len(self.news_items)

    # --- Gestione degli eventi di uscita (Interazione dell'utente) ---

    def keyPressEvent(self, event):
        sys.exit(0)

    def mousePressEvent(self, event):
        sys.exit(0)

    def mouseMoveEvent(self, event):
        """
        Chiude lo screensaver se il mouse viene mosso.
        Utilizza una tolleranza di 15 pixel per ignorare le micro-vibrazioni del sensore.
        """
        current_pos = event.position()
        if self.last_mouse_pos is None:
            self.last_mouse_pos = current_pos
        else:
            delta = (current_pos - self.last_mouse_pos).manhattanLength()
            if delta > 15:
                sys.exit(0)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    # URL del feed RSS (puoi cambiarlo con quello di un altro sito se preferisci)
    rss_feed = "https://www.ansa.it/sito/ansait_rss.xml"
    
    screensaver = NewsScreensaver(rss_feed)
    sys.exit(app.exec())
salviamo con crtl + x

e poi avviamo con

Codice: Seleziona tutto

python news_screensaver.py
Va integrato nel singolo desktop, ma python è trasveraale/cross platform.

Non è niente di speciale, ma è un programma carino, anche se rudimentale.

Rieditato, sotto si trovano altri spunti.
Ultima modifica di LUBO-BACK il sabato 1 agosto 2026, 17:50, modificato 1 volta in totale.
LUBO-BACK
Prode Principiante
Messaggi: 127
Iscrizione: mercoledì 19 gennaio 2022, 1:00
Sesso: Maschile

Re: screensaver basato su flusso di news

Messaggio da LUBO-BACK »

Ps; io ho usato i feed dell'Ansa, ma la riga

rss_feed = "https://www.ansa.it/sito/ansait_rss.xml"

può ovviamente essere modificata.
Avatar utente
wilecoyote
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 17098
Iscrizione: giovedì 20 agosto 2009, 16:21
Desktop: Kubuntu et alii
Distribuzione: 9.04 32bit 14/18/20/22.04 LTS 64bit
Sesso: Maschile
Località: Ceranesi - Ge

Re: screensaver basato su flusso di news

Messaggio da wilecoyote »

) Salve, @LUBO-BACK premesso che il tuo pythonato funziona, resta il fatto che l'hai postato in modo orribile, creando grattacapi a chi l'ha trovato cercando in rete, e provocando la richiesta d'aiuto brevi manu al sottoscritto.

Ti posto la revisione, verifica che sia tutto a posto:
Serve feedparser, io prediligo creare un env.

Creiamo la directory dell'ebv:

Codice: Seleziona tutto

mkdir news_screensaver
Spostati in ella:

Codice: Seleziona tutto

cd news_screensaver
Crea l'env:

Codice: Seleziona tutto

python3 -m venv env
Attiva l'env:

Codice: Seleziona tutto

source env/bin/activate
Creiamo la directory dell'env:

Codice: Seleziona tutto

mkdir news_screensaver
Spostati in ella:

Codice: Seleziona tutto

cd news_screensaver
Crea l'env:

Codice: Seleziona tutto

python3 -m venv env
Attiva l'env:

Codice: Seleziona tutto

source env/bin/activate
Installa le necessarie dipendenze:

Codice: Seleziona tutto

pip install PyQt6 feedparser
Crea con un'editor il file news_screensaver.py::

Codice: Seleziona tutto

nano python news_screensaver.py
Seleziona il listato e copialo con Ctrl+C, e poi incollialo nel file con Ctrl+Maisc.+V:

Codice: Seleziona tutto

import sys
import feedparser
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt6.QtCore import Qt, QTimer
from PyQt6.QtGui import QFont, QPalette, QColor

class NewsScreensaver(QWidget):
def __init__(self, rss_url):
super().__init__()
self.rss_url = rss_url
self.news_items = []
self.current_index = 0
self.last_mouse_pos = None

self.init_ui()
self.fetch_news()

# Timer 1: Cambia la notizia a schermo ogni 6 secondi
self.display_timer = QTimer(self)
self.display_timer.timeout.connect(self.update_display)
self.display_timer.start(6000)

# Timer 2: Aggiorna il feed RSS in background ogni 10 minuti (600000 ms)
self.fetch_timer = QTimer(self)
self.fetch_timer.timeout.connect(self.fetch_news)
self.fetch_timer.start(600000)

def init_ui(self):
# Imposta la finestra a schermo intero, senza bordi e sempre in primo piano
self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint)
self.showFullScreen()

# Nasconde il cursore del mouse
self.setCursor(Qt.CursorShape.BlankCursor)

# Imposta lo sfondo nero
palette = self.palette()
palette.setColor(QPalette.ColorRole.Window, QColor("black"))
self.setPalette(palette)
self.setAutoFillBackground(True)

# Configura il layout
self.layout = QVBoxLayout()
self.layout.setAlignment(Qt.AlignmentFlag.AlignCenter)

# --- Etichetta per il TITOLO ---
self.title_label = QLabel("Caricamento notizie in corso...", self)
self.title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.title_label.setFont(QFont("Sans Serif", 40, QFont.Weight.Bold))
self.title_label.setStyleSheet("color: #FFFFFF; padding: 20px;")
self.title_label.setWordWrap(True)
self.layout.addWidget(self.title_label)

# --- Etichetta per il CONTENUTO (Summary) ---
self.content_label = QLabel("", self)
self.content_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.content_label.setFont(QFont("Sans Serif", 24, QFont.Weight.Normal))
self.content_label.setStyleSheet("color: #AAAAAA; padding: 0 100px;") # Margini per leggibilità
self.content_label.setWordWrap(True)
self.layout.addWidget(self.content_label)

self.setLayout(self.layout)

# Abilita il tracciamento del mouse
self.setMouseTracking(True)

def fetch_news(self):
"""Scarica e analizza il feed RSS, estraendo titolo e contenuto."""
try:
feed = feedparser.parse(self.rss_url)
if feed.entries:
self.news_items = []
for entry in feed.entries:
title = entry.title
# Usa getattr per evitare errori se il campo summary non esiste
summary = getattr(entry, 'summary', '')
self.news_items.append({"title": title, "summary": summary})

self.update_display()
except Exception as e:
self.news_items = [{"title": "Errore di connessione", "summary": "Impossibile caricare il feed RSS in questo momento."}]

def update_display(self):
"""Mostra la notizia successiva nella lista."""
if self.news_items:
item = self.news_items[self.current_index]

self.title_label.setText(item["title"])
# QLabel di PyQt6 formatta in automatico l'HTML di base (es. <b>, <p>) se presente nel feed
self.content_label.setText(item["summary"])

self.current_index = (self.current_index + 1) % len(self.news_items)

# --- Gestione degli eventi di uscita (Interazione dell'utente) ---

def keyPressEvent(self, event):
sys.exit(0)

def mousePressEvent(self, event):
sys.exit(0)

def mouseMoveEvent(self, event):
"""
Chiude lo screensaver se il mouse viene mosso.
Utilizza una tolleranza di 15 pixel per ignorare le micro-vibrazioni del sensore.
"""
current_pos = event.position()
if self.last_mouse_pos is None:
self.last_mouse_pos = current_pos
else:
delta = (current_pos - self.last_mouse_pos).manhattanLength()
if delta > 15:
sys.exit(0)

if __name__ == '__main__':
app = QApplication(sys.argv)

# URL del feed RSS (puoi cambiarlo con quello di un altro sito se preferisci)
rss_feed = "https://www.ansa.it/sito/ansait_rss.xml"

screensaver = NewsScreensaver(rss_feed)
sys.exit(app.exec())
Salviamo con Crtl+X e poi avviamo con:

Codice: Seleziona tutto

python news_screensaver.py
Va integrato nel singolo desktop, ma python è trasveraale/cross platform.

Non è niente di speciale, ma è un programma carino, anche se rudimentale.
rie dipendenze:

Codice: Seleziona tutto

pip install PyQt6 feedparser
Crea con un'editor il file news_screensaver.py::

Codice: Seleziona tutto

nano python news_screensaver.py
Seleziona il listato e copialo con Ctrl+C, e poi incollialo nel file con Ctrl+Maisc.+V:

Codice: Seleziona tutto

import sys
import feedparser
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt6.QtCore import Qt, QTimer
from PyQt6.QtGui import QFont, QPalette, QColor

class NewsScreensaver(QWidget):
def __init__(self, rss_url):
super().__init__()
self.rss_url = rss_url
self.news_items = []
self.current_index = 0
self.last_mouse_pos = None

self.init_ui()
self.fetch_news()

# Timer 1: Cambia la notizia a schermo ogni 6 secondi
self.display_timer = QTimer(self)
self.display_timer.timeout.connect(self.update_display)
self.display_timer.start(6000)

# Timer 2: Aggiorna il feed RSS in background ogni 10 minuti (600000 ms)
self.fetch_timer = QTimer(self)
self.fetch_timer.timeout.connect(self.fetch_news)
self.fetch_timer.start(600000)

def init_ui(self):
# Imposta la finestra a schermo intero, senza bordi e sempre in primo piano
self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint)
self.showFullScreen()

# Nasconde il cursore del mouse
self.setCursor(Qt.CursorShape.BlankCursor)

# Imposta lo sfondo nero
palette = self.palette()
palette.setColor(QPalette.ColorRole.Window, QColor("black"))
self.setPalette(palette)
self.setAutoFillBackground(True)

# Configura il layout
self.layout = QVBoxLayout()
self.layout.setAlignment(Qt.AlignmentFlag.AlignCenter)

# --- Etichetta per il TITOLO ---
self.title_label = QLabel("Caricamento notizie in corso...", self)
self.title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.title_label.setFont(QFont("Sans Serif", 40, QFont.Weight.Bold))
self.title_label.setStyleSheet("color: #FFFFFF; padding: 20px;")
self.title_label.setWordWrap(True)
self.layout.addWidget(self.title_label)

# --- Etichetta per il CONTENUTO (Summary) ---
self.content_label = QLabel("", self)
self.content_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.content_label.setFont(QFont("Sans Serif", 24, QFont.Weight.Normal))
self.content_label.setStyleSheet("color: #AAAAAA; padding: 0 100px;") # Margini per leggibilità
self.content_label.setWordWrap(True)
self.layout.addWidget(self.content_label)

self.setLayout(self.layout)

# Abilita il tracciamento del mouse
self.setMouseTracking(True)

def fetch_news(self):
"""Scarica e analizza il feed RSS, estraendo titolo e contenuto."""
try:
feed = feedparser.parse(self.rss_url)
if feed.entries:
self.news_items = []
for entry in feed.entries:
title = entry.title
# Usa getattr per evitare errori se il campo summary non esiste
summary = getattr(entry, 'summary', '')
self.news_items.append({"title": title, "summary": summary})

self.update_display()
except Exception as e:
self.news_items = [{"title": "Errore di connessione", "summary": "Impossibile caricare il feed RSS in questo momento."}]

def update_display(self):
"""Mostra la notizia successiva nella lista."""
if self.news_items:
item = self.news_items[self.current_index]

self.title_label.setText(item["title"])
# QLabel di PyQt6 formatta in automatico l'HTML di base (es. <b>, <p>) se presente nel feed
self.content_label.setText(item["summary"])

self.current_index = (self.current_index + 1) % len(self.news_items)

# --- Gestione degli eventi di uscita (Interazione dell'utente) ---

def keyPressEvent(self, event):
sys.exit(0)

def mousePressEvent(self, event):
sys.exit(0)

def mouseMoveEvent(self, event):
"""
Chiude lo screensaver se il mouse viene mosso.
Utilizza una tolleranza di 15 pixel per ignorare le micro-vibrazioni del sensore.
"""
current_pos = event.position()
if self.last_mouse_pos is None:
self.last_mouse_pos = current_pos
else:
delta = (current_pos - self.last_mouse_pos).manhattanLength()
if delta > 15:
sys.exit(0)

if __name__ == '__main__':
app = QApplication(sys.argv)

# URL del feed RSS (puoi cambiarlo con quello di un altro sito se preferisci)
rss_feed = "https://www.ansa.it/sito/ansait_rss.xml"

screensaver = NewsScreensaver(rss_feed)
sys.exit(app.exec())
Salviamo con Crtl+X e poi avviamo con:

Codice: Seleziona tutto

python news_screensaver.py
Va integrato nel singolo desktop, ma python è trasveraale/cross platform.

Non è niente di speciale, ma è un programma carino, anche se rudimentale.

Già che ci siamo spiega come integrarlo nel desktop..

:: Ciao
ACER Extensa 5230E 2,2 Ghz cpu Celeron 900 hdd 160 GB Ram 1 GB scheda video Intel GM500
ACER Extensa 5635Z 2,2 Ghz cpu Celeron T3100 hdd 320 GB Ram 4 GB scheda video Intel Mobile 4
Quando una Finestra chiusa incontra un Pinguino la Finestra chiusa è una Finestra aperta.
LUBO-BACK
Prode Principiante
Messaggi: 127
Iscrizione: mercoledì 19 gennaio 2022, 1:00
Sesso: Maschile

Re: screensaver basato su flusso di news

Messaggio da LUBO-BACK »

Grazie, in realtà era una cosa buttata lì, non pensavo nemmeno potesse interessare.

Per integrarlo nel desktop dipende un po' dall'ambiente che si usa, in effetti.

Se avessi voluto fare una cosa integrata, avrei modificato lo screensaver del mio desktop, ma non sarebbe stato adattabile per ogni piattaforma.

Diciamo che, in linea di massima, la maggioranza dei desktop hanno una sezione "gestione energetica" o roba simile che consente di lanciare uno script quando il pc rimane inattivo per un certo lasso di tempo... Questo può essere un modo.

L'altro può essere quello di creare una scorciatoia da tastiera ed anche qui dipende da desktop a desktop.

Io che amo le cose più rozze, creerei un banale lanciatore da schiacciare manualmente per avviare il servizio.

Poi esisterebbero anche modi più raffinati, ma tutto dipende dall'uso che se ne fa. Personalmente preferisco che il pc, quando è inattivo, si blocchi e richieda pin o password per operare di nuovo. Con questo piccolo script non succede ed ecco perché, se mai avessi dovuto pensare ad una cosa seria, sarei andato ad editare, ad esempio in KDE Plasma, i file scritti in QML aggiungendo le stesse funzioni, ma mantenendo il blocco con pin e password.

Quello che ho brevemente pubblicato è una cosa simpatica per un uso "casalingo" che non preveda malintenzionati davanti al pc.

Magari provo a fare in modo che, toccando lo schermo o qualsiasi tasto, rimandi l'utente alla schermata di blocco,

Se davvero a qualcuno interessasse, potrei aggiungere la scelta dei feed rss. A me sembrava una cosa semplice semplice, scusate,

Solo una precisazione, per lanciare un comando di un file python che è dentro un /env , salvo dare ogni volta, all'interno della cartella

Codice: Seleziona tutto

source env/bin/activate
la soluzione più semplice è adottare un comndo del genere

Codice: Seleziona tutto

/home/tuoutente/news_screensaver/env/bin/python /home/tuoutente/news_screensaver/news_screensaver.py
LUBO-BACK
Prode Principiante
Messaggi: 127
Iscrizione: mercoledì 19 gennaio 2022, 1:00
Sesso: Maschile

Re: screensaver basato su flusso di news

Messaggio da LUBO-BACK »

Vi allego la versione alpha 2, ho aggiunto la dissolvenza ed il rimando alla schermata di blocco, così è un attimo più sicuro

Codice: Seleziona tutto

import sys
import subprocess
import feedparser
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QGraphicsOpacityEffect
from PyQt6.QtCore import Qt, QTimer, QPropertyAnimation, QParallelAnimationGroup
from PyQt6.QtGui import QFont, QPalette, QColor

class NewsScreensaver(QWidget):
    # Durata dell'animazione di dissolvenza in millisecondi
    ANIMATION_DURATION = 1000 
    
    def __init__(self, rss_url):
        super().__init__()
        self.rss_url = rss_url
        self.news_items = []
        self.current_index = 0
        self.last_mouse_pos = None

        self.init_ui()
        self.setup_animations()
        self.fetch_news()

        # Timer 1: Mostra la notizia successiva ogni 6 secondi
        self.display_timer = QTimer(self)
        self.display_timer.timeout.connect(self.show_next_news)
        self.display_timer.start(6000)

        # Timer 2: Aggiorna il feed RSS in background ogni 10 minuti (600000 ms)
        self.fetch_timer = QTimer(self)
        self.fetch_timer.timeout.connect(self.fetch_news)
        self.fetch_timer.start(600000)

    def init_ui(self):
        # Finestra a schermo intero, senza bordi e sempre in primo piano
        self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint)
        self.showFullScreen()
        self.setCursor(Qt.CursorShape.BlankCursor)

        # Sfondo nero
        palette = self.palette()
        palette.setColor(QPalette.ColorRole.Window, QColor("black"))
        self.setPalette(palette)
        self.setAutoFillBackground(True)

        self.layout = QVBoxLayout()
        self.layout.setAlignment(Qt.AlignmentFlag.AlignCenter)

        # --- Etichetta per il TITOLO ---
        self.title_label = QLabel("Caricamento notizie in corso...", self)
        self.title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.title_label.setFont(QFont("Sans Serif", 40, QFont.Weight.Bold))
        self.title_label.setStyleSheet("color: #FFFFFF; padding: 20px;")
        self.title_label.setWordWrap(True)
        self.layout.addWidget(self.title_label)

        # --- Etichetta per il CONTENUTO (Summary) ---
        self.content_label = QLabel("", self)
        self.content_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.content_label.setFont(QFont("Sans Serif", 24, QFont.Weight.Normal))
        self.content_label.setStyleSheet("color: #AAAAAA; padding: 0 100px;")
        self.content_label.setWordWrap(True)
        self.layout.addWidget(self.content_label)

        self.setLayout(self.layout)
        self.setMouseTracking(True)

    def setup_animations(self):
        """Configura gli effetti di opacità e le animazioni di dissolvenza."""
        # Effetti di opacità impostati a 0 (invisibili) all'avvio
        self.title_opacity_effect = QGraphicsOpacityEffect(self)
        self.title_label.setGraphicsEffect(self.title_opacity_effect)
        self.title_opacity_effect.setOpacity(0)

        self.content_opacity_effect = QGraphicsOpacityEffect(self)
        self.content_label.setGraphicsEffect(self.content_opacity_effect)
        self.content_opacity_effect.setOpacity(0)

        # --- Animazioni Fade-Out (da 1 a 0) ---
        self.title_fade_out = QPropertyAnimation(self.title_opacity_effect, b"opacity")
        self.title_fade_out.setDuration(self.ANIMATION_DURATION)
        self.title_fade_out.setStartValue(1)
        self.title_fade_out.setEndValue(0)

        self.content_fade_out = QPropertyAnimation(self.content_opacity_effect, b"opacity")
        self.content_fade_out.setDuration(self.ANIMATION_DURATION)
        self.content_fade_out.setStartValue(1)
        self.content_fade_out.setEndValue(0)

        self.fade_out_group = QParallelAnimationGroup()
        self.fade_out_group.addAnimation(self.title_fade_out)
        self.fade_out_group.addAnimation(self.content_fade_out)
        self.fade_out_group.finished.connect(self.update_labels_and_fade_in)

        # --- Animazioni Fade-In (da 0 a 1) ---
        self.title_fade_in = QPropertyAnimation(self.title_opacity_effect, b"opacity")
        self.title_fade_in.setDuration(self.ANIMATION_DURATION)
        self.title_fade_in.setStartValue(0)
        self.title_fade_in.setEndValue(1)

        self.content_fade_in = QPropertyAnimation(self.content_opacity_effect, b"opacity")
        self.content_fade_in.setDuration(self.ANIMATION_DURATION)
        self.content_fade_in.setStartValue(0)
        self.content_fade_in.setEndValue(1)

        self.fade_in_group = QParallelAnimationGroup()
        self.fade_in_group.addAnimation(self.title_fade_in)
        self.fade_in_group.addAnimation(self.content_fade_in)

    def fetch_news(self):
        """Scarica e analizza il feed RSS."""
        try:
            feed = feedparser.parse(self.rss_url)
            if feed.entries:
                self.news_items = []
                for entry in feed.entries:
                    title = entry.title
                    summary = getattr(entry, 'summary', '') 
                    self.news_items.append({"title": title, "summary": summary})
                
                # Avvia subito la prima notizia
                self.update_labels_and_fade_in(start_immediately=True)
        except Exception as e:
            self.news_items = [{"title": "Errore", "summary": f"Impossibile caricare il feed RSS: {e}"}]
            self.update_labels_and_fade_in(start_immediately=True)

    def show_next_news(self):
        """Avvia l'animazione di fade-out per preparare la notizia successiva."""
        if self.news_items:
            if self.fade_in_group.state() == QPropertyAnimation.State.Running:
                self.fade_in_group.stop()
            self.fade_out_group.start()

    def update_labels_and_fade_in(self, start_immediately=False):
        """Aggiorna il testo e avvia il fade-in."""
        if self.news_items:
            if not start_immediately:
                self.current_index = (self.current_index + 1) % len(self.news_items)
            
            item = self.news_items[self.current_index]
            self.title_label.setText(item["title"])
            self.content_label.setText(item["summary"])
            
            if self.fade_out_group.state() == QPropertyAnimation.State.Running:
                self.fade_out_group.stop()
            self.fade_in_group.start()

    # --- Gestione Eventi e Chiusura ---

    def lock_screen_and_exit(self):
        """Avvia il blocco schermo di sistema e chiude il programma."""
        try:
            subprocess.run(["loginctl", "lock-session"])
        except Exception as e:
            print(f"Errore durante il blocco dello schermo: {e}")
        finally:
            sys.exit(0)

    def keyPressEvent(self, event):
        self.lock_screen_and_exit()

    def mousePressEvent(self, event):
        self.lock_screen_and_exit()

    def mouseMoveEvent(self, event):
        current_pos = event.position()
        if self.last_mouse_pos is None:
            self.last_mouse_pos = current_pos
        else:
            delta = (current_pos - self.last_mouse_pos).manhattanLength()
            if delta > 15:
                self.lock_screen_and_exit()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    # Scegli il tuo feed preferito
    rss_feed = "https://www.ansa.it/sito/ansait_rss.xml"
    # rss_feed = "https://www.ilsole24ore.com/rss/norme-e-tributi.xml"
    
    screensaver = NewsScreensaver(rss_feed)
    sys.exit(app.exec())
L'ho testata su kde plasma con ubuntu, ma loginctl lock-session dovrebbe funzionare ovunque.
LUBO-BACK
Prode Principiante
Messaggi: 127
Iscrizione: mercoledì 19 gennaio 2022, 1:00
Sesso: Maschile

Re: screensaver basato su flusso di news

Messaggio da LUBO-BACK »

Versione Alpha 3, ho ridotto alcuni font e cacciato dentro qualche feed in più a riproduzione random. Quello dell'Ansa era molto limitato

Codice: Seleziona tutto

import sys
import subprocess
import random  # Aggiunto per mescolare le notizie
import feedparser
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QGraphicsOpacityEffect
from PyQt6.QtCore import Qt, QTimer, QPropertyAnimation, QParallelAnimationGroup
from PyQt6.QtGui import QFont, QPalette, QColor

class NewsScreensaver(QWidget):
    ANIMATION_DURATION = 1000 
    
    def __init__(self, rss_urls):
        super().__init__()
        self.rss_urls = rss_urls  # Ora accetta una lista di URL
        self.news_items = []
        self.current_index = 0
        self.last_mouse_pos = None

        self.init_ui()
        self.setup_animations()
        self.fetch_news()

        # Timer 1: Mostra la notizia successiva ogni 6 secondi
        self.display_timer = QTimer(self)
        self.display_timer.timeout.connect(self.show_next_news)
        self.display_timer.start(6000)

        # Timer 2: Aggiorna i feed RSS in background ogni 10 minuti
        self.fetch_timer = QTimer(self)
        self.fetch_timer.timeout.connect(self.fetch_news)
        self.fetch_timer.start(600000)

    def init_ui(self):
        self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint)
        self.showFullScreen()
        self.setCursor(Qt.CursorShape.BlankCursor)

        palette = self.palette()
        palette.setColor(QPalette.ColorRole.Window, QColor("black"))
        self.setPalette(palette)
        self.setAutoFillBackground(True)

        self.layout = QVBoxLayout()
        self.layout.setAlignment(Qt.AlignmentFlag.AlignCenter)

        # --- Etichetta per il TITOLO ---
        self.title_label = QLabel("Caricamento notizie in corso...", self)
        self.title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.title_label.setFont(QFont("Sans Serif", 28, QFont.Weight.Bold))
        self.title_label.setStyleSheet("color: #FFFFFF; padding: 20px 100px;")
        self.title_label.setWordWrap(True)
        self.layout.addWidget(self.title_label)

        # --- Etichetta per il CONTENUTO (Summary) ---
        self.content_label = QLabel("", self)
        self.content_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.content_label.setFont(QFont("Sans Serif", 18, QFont.Weight.Normal))
        self.content_label.setStyleSheet("color: #AAAAAA; padding: 0 100px;")
        self.content_label.setWordWrap(True)
        self.layout.addWidget(self.content_label)

        self.setLayout(self.layout)
        self.setMouseTracking(True)

    def setup_animations(self):
        self.title_opacity_effect = QGraphicsOpacityEffect(self)
        self.title_label.setGraphicsEffect(self.title_opacity_effect)
        self.title_opacity_effect.setOpacity(0)

        self.content_opacity_effect = QGraphicsOpacityEffect(self)
        self.content_label.setGraphicsEffect(self.content_opacity_effect)
        self.content_opacity_effect.setOpacity(0)

        # Fade-Out
        self.title_fade_out = QPropertyAnimation(self.title_opacity_effect, b"opacity")
        self.title_fade_out.setDuration(self.ANIMATION_DURATION)
        self.title_fade_out.setStartValue(1)
        self.title_fade_out.setEndValue(0)

        self.content_fade_out = QPropertyAnimation(self.content_opacity_effect, b"opacity")
        self.content_fade_out.setDuration(self.ANIMATION_DURATION)
        self.content_fade_out.setStartValue(1)
        self.content_fade_out.setEndValue(0)

        self.fade_out_group = QParallelAnimationGroup()
        self.fade_out_group.addAnimation(self.title_fade_out)
        self.fade_out_group.addAnimation(self.content_fade_out)
        self.fade_out_group.finished.connect(self.update_labels_and_fade_in)

        # Fade-In
        self.title_fade_in = QPropertyAnimation(self.title_opacity_effect, b"opacity")
        self.title_fade_in.setDuration(self.ANIMATION_DURATION)
        self.title_fade_in.setStartValue(0)
        self.title_fade_in.setEndValue(1)

        self.content_fade_in = QPropertyAnimation(self.content_opacity_effect, b"opacity")
        self.content_fade_in.setDuration(self.ANIMATION_DURATION)
        self.content_fade_in.setStartValue(0)
        self.content_fade_in.setEndValue(1)

        self.fade_in_group = QParallelAnimationGroup()
        self.fade_in_group.addAnimation(self.title_fade_in)
        self.fade_in_group.addAnimation(self.content_fade_in)

    def fetch_news(self):
        """Scarica e analizza tutti i feed RSS nella lista."""
        self.news_items = []
        
        for url in self.rss_urls:
            try:
                feed = feedparser.parse(url)
                
                # Cerca di estrarre il nome del sito (es. "ANSA.it")
                site_name = feed.feed.title if 'title' in feed.feed else "News"
                
                if feed.entries:
                    for entry in feed.entries:
                        # Aggiunge il nome del sito prima del titolo
                        title = f"[{site_name}] {entry.title}"
                        summary = getattr(entry, 'summary', '') 
                        self.news_items.append({"title": title, "summary": summary})
            except Exception as e:
                print(f"Errore di connessione al feed {url}: {e}")

        # Se sono state trovate notizie, le mescola in ordine casuale
        if self.news_items:
            random.shuffle(self.news_items)
            self.update_labels_and_fade_in(start_immediately=True)
        else:
            self.news_items = [{"title": "Nessuna notizia", "summary": "Impossibile caricare i feed RSS in questo momento."}]
            self.update_labels_and_fade_in(start_immediately=True)

    def show_next_news(self):
        if self.news_items:
            if self.fade_in_group.state() == QPropertyAnimation.State.Running:
                self.fade_in_group.stop()
            self.fade_out_group.start()

    def update_labels_and_fade_in(self, start_immediately=False):
        if self.news_items:
            if not start_immediately:
                self.current_index = (self.current_index + 1) % len(self.news_items)
            
            item = self.news_items[self.current_index]
            self.title_label.setText(item["title"])
            self.content_label.setText(item["summary"])
            
            if self.fade_out_group.state() == QPropertyAnimation.State.Running:
                self.fade_out_group.stop()
            self.fade_in_group.start()

    # --- Gestione Eventi e Chiusura ---

    def lock_screen_and_exit(self):
        try:
            subprocess.run(["loginctl", "lock-session"])
        except Exception as e:
            print(f"Errore durante il blocco dello schermo: {e}")
        finally:
            sys.exit(0)

    def keyPressEvent(self, event):
        self.lock_screen_and_exit()

    def mousePressEvent(self, event):
        self.lock_screen_and_exit()

    def mouseMoveEvent(self, event):
        current_pos = event.position()
        if self.last_mouse_pos is None:
            self.last_mouse_pos = current_pos
        else:
            delta = (current_pos - self.last_mouse_pos).manhattanLength()
            if delta > 15:
                self.lock_screen_and_exit()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    # ELENCO DEI FEED RSS: Aggiungi qui tutti i link che vuoi!
    rss_feeds_list = [
        "https://www.ansa.it/sito/ansait_rss.xml",
        "https://www.ilsole24ore.com/rss/norme-e-tributi.xml",
        "https://www.lffl.org/feed"
    ]
    
    screensaver = NewsScreensaver(rss_feeds_list)
    sys.exit(app.exec())
LUBO-BACK
Prode Principiante
Messaggi: 127
Iscrizione: mercoledì 19 gennaio 2022, 1:00
Sesso: Maschile

Re: screensaver basato su flusso di news

Messaggio da LUBO-BACK »

LUBO-BACK ha scritto:
sabato 1 agosto 2026, 17:48

Io che amo le cose più rozze, creerei un banale lanciatore da schiacciare manualmente per avviare il servizio.
L'ho risolta così:

- ho scaricato un'icona png e l'ho salvata in /usr/share/icons

- ho realizzato un file desktop con questo contenuto

Codice: Seleziona tutto

[Desktop Entry]
Version=alpha 3
Name=screenrss
Comment=screensavercon feed rss
Exec=/home/lucab/news_screensaver/env/bin/python /home/lucab/news_screensaver/news_screensaver.py
Terminal=false
X-MultipleArgs=false
Type=Application
Icon=/usr/share/icons/feed.png
Categories=Office;
StartupNotify=true
ed ho salvato il link all'app in una posizione comoda. Ovviamente lucab è il mio nome utente, chi usasse questa soluzione dovrebbe metterci il suo.

L'unico consiglio che posso aggiungere, poiché linux è diventato schizzinoso in merito ai file .desktop, è di andare nella cartella /usr/share/applications e di copiare un file desktop già esistente con un nuovo nome e di editare poi quello, invece di creare un nuovo file .desktop.
Avatar utente
wilecoyote
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 17098
Iscrizione: giovedì 20 agosto 2009, 16:21
Desktop: Kubuntu et alii
Distribuzione: 9.04 32bit 14/18/20/22.04 LTS 64bit
Sesso: Maschile
Località: Ceranesi - Ge

Re: screensaver basato su flusso di news

Messaggio da wilecoyote »

) Salve, troppa grazia, grazie delle integrazioni.

! dettaglio dalle Debian Policy, i file che integri nel sistema, esclusa la «Home», vanno allocati in /usr/local.

Ovvero /usr/share/icons → /usr/local/share/icons, /usr/share/applications → /usr/local/share/applications, ecc., serve a non «»sporcare il sistema ed evitare che vengano persi nell'aggiornamento.

Vale anche pelle altre directory, ovvero /etc → /usr/local/etc, ecc.

:: Ciao
ACER Extensa 5230E 2,2 Ghz cpu Celeron 900 hdd 160 GB Ram 1 GB scheda video Intel GM500
ACER Extensa 5635Z 2,2 Ghz cpu Celeron T3100 hdd 320 GB Ram 4 GB scheda video Intel Mobile 4
Quando una Finestra chiusa incontra un Pinguino la Finestra chiusa è una Finestra aperta.
LUBO-BACK
Prode Principiante
Messaggi: 127
Iscrizione: mercoledì 19 gennaio 2022, 1:00
Sesso: Maschile

Re: screensaver basato su flusso di news

Messaggio da LUBO-BACK »

wilecoyote ha scritto:
sabato 1 agosto 2026, 21:34
) Salve, troppa grazia, grazie delle integrazioni.

! dettaglio dalle Debian Policy, i file che integri nel sistema, esclusa la «Home», vanno allocati in /usr/local.

Ovvero /usr/share/icons → /usr/local/share/icons, /usr/share/applications → /usr/local/share/applications, ecc., serve a non «»sporcare il sistema ed evitare che vengano persi nell'aggiornamento.

Vale anche pelle altre directory, ovvero /etc → /usr/local/etc, ecc.

:: Ciao
Ok, io sono un autodidatta e tendo a fare le cose come mi vengono.

Ho trovato un modo abbastanza elegante di automatizzare lo screensaver in kde plasma.

Come prima cosa, si installa questo

Codice: Seleziona tutto

sudo apt install swayidle
Poi, nella stessa cartella in cui c'è il file python

Codice: Seleziona tutto

nano avvia_screensaver.sh


e ci mettiamo dentro questo

Codice: Seleziona tutto

#!/bin/bash

# Uccide eventuali istanze precedenti di swayidle
killall swayidle

# Definisce il comando intelligente: esegue Python SOLO se la sessione NON è bloccata ("no")
COMANDO='if [ "$(loginctl show-session -p LockedHint --value)" = "no" ]; then /home/lucab/news_screensaver/env/bin/python /home/lucab/news_screensaver/news_screensaver.py; fi'

# Avvia swayidle passando il comando intelligente
swayidle -w timeout 30 "$COMANDO" &
Ovviamente chi userà lo script dovrà inserire il proprio percorso assoluto.

Poi lo rendiamo eseguibile

Codice: Seleziona tutto

chmod +x avvia_screensaver.sh 
ed andiamo in avvio automatico ad inserire avvia_screensaver.sh come script di accesso.

Il tempo timeout 30 può essere aumentato, l'importante è che sia un tempo inferiore a quello inserito in gestione energetica per la sospensione.

Edit: ho aggiunto un check per evitare che un errore nella password/pin riportasse allo screensaver invece che alla schermata di blocco.
LUBO-BACK
Prode Principiante
Messaggi: 127
Iscrizione: mercoledì 19 gennaio 2022, 1:00
Sesso: Maschile

Re: screensaver basato su flusso di news

Messaggio da LUBO-BACK »

Il sistema per l'integrazione automatica nel desktop basato su swayidle funziona di sicuro su kde plasma, ma taglia fuori tutti gli ambienti ancora legati ad x11.

Dovrebbe funzionare anche su gnome wayland che però è un po' più rognoso, magari qualcuno lo testi.

Su Sway, Hyprland e Wayfire, nonché su Cinnamom wayland funzionerà di sicuro perché non ci sono possibili intoppi.

Se interessa, preparo un .deb.
Avatar utente
wilecoyote
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 17098
Iscrizione: giovedì 20 agosto 2009, 16:21
Desktop: Kubuntu et alii
Distribuzione: 9.04 32bit 14/18/20/22.04 LTS 64bit
Sesso: Maschile
Località: Ceranesi - Ge

Re: screensaver basato su flusso di news

Messaggio da wilecoyote »

) Salve, non ho un Wayland con cui provare il swayidle, posso confermare però che il creare il file .desktop, allocandolo in /usr/local/share/applications, e linkandolo in /usr/share/applications funziona in LinuxMint Zena 22.3 Cinnamon..

Non essendoci problemi d'accesso rispetto terzi la questione login non si pone.

:: Ciao
ACER Extensa 5230E 2,2 Ghz cpu Celeron 900 hdd 160 GB Ram 1 GB scheda video Intel GM500
ACER Extensa 5635Z 2,2 Ghz cpu Celeron T3100 hdd 320 GB Ram 4 GB scheda video Intel Mobile 4
Quando una Finestra chiusa incontra un Pinguino la Finestra chiusa è una Finestra aperta.
LUBO-BACK
Prode Principiante
Messaggi: 127
Iscrizione: mercoledì 19 gennaio 2022, 1:00
Sesso: Maschile

Re: screensaver basato su flusso di news

Messaggio da LUBO-BACK »

Ciao. su x11, invece di swayidle si potrebbe usare xautolock (oppure xidlehook).

Alla fine svolgono lo stesso ruolo.

Riflessione laterale e premesso che sono un dilettante: ogni volta che cerco di realizzare qualcosa che funzioni "generalmente" su gnu linux mi scontro con ennemila versioni etc.. Chi scrive software per android deve solo preoccuparsi di mettere le versioni compatibili nel manifest, su windows gira anche roba delle guerre puniche. Macos non lo conosco quasi per nulla e non so che dire, Però tutta questa diversificazione o frammentazione che dir si voglia non è sempre segnale di salute dell'ecosistema linux. Anche perché il kernel è arrivato a livelli pazzeschi e sono i desktop a complicare la compatibilità.
Avatar utente
wilecoyote
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 17098
Iscrizione: giovedì 20 agosto 2009, 16:21
Desktop: Kubuntu et alii
Distribuzione: 9.04 32bit 14/18/20/22.04 LTS 64bit
Sesso: Maschile
Località: Ceranesi - Ge

Re: screensaver basato su flusso di news

Messaggio da wilecoyote »

) Salve, se ho modo vedo di provare anche quei 2 programmi.

:: Ciao
ACER Extensa 5230E 2,2 Ghz cpu Celeron 900 hdd 160 GB Ram 1 GB scheda video Intel GM500
ACER Extensa 5635Z 2,2 Ghz cpu Celeron T3100 hdd 320 GB Ram 4 GB scheda video Intel Mobile 4
Quando una Finestra chiusa incontra un Pinguino la Finestra chiusa è una Finestra aperta.
Scrivi risposta

Ritorna a “Personalizzazione dell'ambiente desktop”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 1 ospite