Construction d’AppleMusic2FreshRSS

J’en avais marre de rater les nouvelles sorties des artistes que je suis sur Apple Music. Les notifications intégrées sont incohérentes, et je voulais quelque chose de plus fiable qui s’intégrerait dans mon workflow RSS existant.

Synchronisation Apple Music vers RSS
Synchronisation automatique d'Apple Music vers les flux RSS

Le Problème

Le système de notifications d’Apple Music pour les nouvelles sorties est aléatoire. Parfois on est notifié, parfois non. Je voulais un moyen de suivre automatiquement tous mes artistes via des flux RSS puisque j’utilise déjà FreshRSS pour tout le reste.

Partie 1 : Intégration de l’API Apple Music

Récupérer les Données Nécessaires

Le principal défi était de comprendre comment accéder à l’API interne d’Apple Music. L’API publique MusicKit ne donne pas accès à votre bibliothèque personnelle, j’ai donc dû faire de la rétro-ingénierie sur les requêtes de l’application web :

# music.py - Core API interaction
BASE_URL = "https://amp-api.music.apple.com/v1"

def get_artists():
    """Fetch all artists from the Apple Music library."""
    print("Fetching artists", end="", flush=True)
    artists = []
    offset = 0
    
    while True:
        params = {
            'art[url]': 'f',
            'format[resources]': 'map',
            'include': 'catalog',
            'limit': '100',
            'meta': 'sorts',
            'offset': offset,
            'platform': 'web',
            'sort': 'name',
        }
        
        response = requests.get(
            f'{BASE_URL}/me/library/artists',
            headers=HEADERS,
            params=params
        )

À Quoi Ça Ressemble en Fonctionnement

Voici ce qui se passe quand j’exécute le script :

$ python music.py
Fetching artists........
Got 127 artists
Fetching number of albums for each artist
100%|████████████████| 127/127 [00:42<00:00,  3.01it/s]
Saving artists to artists.json

Number of artists per album count:
23 artists have 1 albums
18 artists have 2 albums
12 artists have 3 albums
8 artists have 4 albums
...

Cumulative statistics:
127 artists have >= 1 albums
104 artists have >= 2 albums
86 artists have >= 3 albums

Le script met tout en cache dans artists.json pour ne pas avoir à interroger l’API à chaque fois. Ça me donne aussi des stats intéressantes sur mes goûts musicaux.

Galères d’Authentification

Faire fonctionner l’auth était pénible. J’ai dû inspecter les requêtes réseau de mon navigateur vers Apple Music et extraire les cookies de session :

# headers.py
headers_applemusic = {
    'Cookie': 'your_apple_music_session_cookies_here',
    # Additional headers for authentication
}

Partie 2 : Ajouter Tout à FreshRSS

Utiliser RSS-Bridge

Au lieu d’essayer de scraper les pages Apple Music moi-même, j’ai trouvé que RSS-Bridge avait déjà un bridge Apple Music. Beaucoup plus simple de l’utiliser :

# add.py - FreshRSS integration
class FreshRSSClient:
    def __init__(self):
        self.api_key = os.getenv("API_KEY")
        self.bridge_url = "https://rss-bridge.noh.am"
        self.base_url = "https://rss.noh.am"
        self.csrf_token = self._get_csrf()

    def add_feed(self, artist_id, group_id, limit=50):
        """Add a new feed for an artist to a group."""
        print(f"Adding artist {artist_id} to Group ID {group_id}...")
        feed_url = f'{self.bridge_url}/?action=display&bridge=AppleMusicBridge&artist={artist_id}&limit={limit}&format=Atom'
        
        data = {
            '_csrf': self.csrf_token,
            'url_rss': feed_url,
            'category': group_id,
            'feed_kind': '0',
            # ... feed configuration
        }

Exécution de l’Ajout des Flux

Le script me permet de filtrer par nombre d’albums puisque je ne veux pas de flux pour les artistes dont je n’ai qu’une chanson :

$ python add.py
Enter the minimum number of albums: 3
Got 86 artists with at least 3 albums

Available groups:
1 - News
2 - Tech
3 - Music
Group ID: 3

Adding artist 1653145983 to Group ID 3...
Adding artist 1503438664 to Group ID 3...
Adding artist 159260351 to Group ID 3...
...
Checking new feeds...
Updating feed: Taylor Swift - Topic...
Updating feed: Arctic Monkeys - Topic...

Configuration Automatique

Je l’ai configuré pour paramétrer automatiquement les flux avec des valeurs par défaut sensées :

  • Configure les intervalles de mise à jour (quotidien par défaut)
  • Définit les politiques de rétention (garder 200 articles, 3 mois)
  • Gère les tokens CSRF pour les appels API sécurisés
  • Gère les catégories et métadonnées des flux
def edit_feed(self, feed_data, group_id, refresh_rate=86400):
    """Edit an existing feed's settings."""
    data = {
        'ttl': refresh_rate,  # 24 hours
        'keep_max': '200',    # Keep max 200 articles
        'keep_period_count': '3',
        'keep_period_unit': 'P1M',  # 3 months
        'priority': '10',
        # ... other settings
    }

Comment Tout Fonctionne

Configuration assez simple :

  1. music.py : Récupère et met en cache les données d’artistes d’Apple Music
  2. add.py : Ajoute les artistes comme flux RSS à FreshRSS

Les deux scripts utilisent les mêmes headers d’auth et variables d’environnement. Rien de fancy.

Ce que J’ai Obtenu au Final

Maintenant j’ai :

  • Des flux RSS pour tous les artistes qui m’intéressent vraiment
  • Des flux qui se mettent à jour quotidiennement
  • Tout organisé dans mon lecteur RSS existant
  • Plus de sorties ratées

C’est une solution simple qui fonctionne bien pour mon workflow. L’API Apple Music donne de bonnes données, et FreshRSS gère la gestion des flux nickel.

Si Vous Voulez l’Essayer

Le code est sur GitHub si ça vous intéresse :

  1. Configurer l’authentification dans headers.py
  2. Ajouter la clé API FreshRSS à .env
  3. Exécuter python music.py pour récupérer vos artistes
  4. Exécuter python add.py pour ajouter les flux

C’est principalement conçu pour ma config spécifique (instance RSS-Bridge, FreshRSS), mais l’idée de base pourrait fonctionner avec d’autres lecteurs RSS aussi.