Skip to content

Module rss

Podcast

Source code in nbs/rss.py
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
class Podcast:
    def __init__(self):
        """
        Initialise la classe Podcast en analysant le flux RSS et en obtenant la collection MongoDB.
        """
        self.parsed_flow = feedparser.parse(get_RSS_URL())
        DB_HOST, DB_NAME, _ = get_DB_VARS()
        self.collection = get_collection(
            target_db=DB_HOST, client_name=DB_NAME, collection_name="episodes"
        )

    def get_most_recent_episode_from_DB(self) -> Optional[datetime]:
        """
        Récupère la date la plus récente des épisodes stockés dans la base de données.

        Returns:
            Optional[datetime]: La date la plus récente des épisodes stockés, ou None si aucun épisode n'est trouvé.
        """
        most_recent_document = self.collection.find().sort({"date": -1}).limit(1)
        most_recent_date = None
        for doc in most_recent_document:
            most_recent_date = doc["date"].replace(tzinfo=pytz.timezone("Europe/Paris"))
        return most_recent_date

    def list_last_large_episodes(
        self, duree_mini_minutes: int = 15
    ) -> List[FeedParserDict]:
        """
        Liste les épisodes RSS qui sont plus récents que le plus récent épisode stocké dans la base de données
        et qui durent plus de `duree_mini_minutes` minutes.

        Args:
            duree_mini_minutes (int): La durée minimale en minutes des épisodes à lister. Par défaut à 15 minutes.

        Returns:
            List[FeedParserDict]: Une liste d'entrées RSS correspondant aux critères.
        """
        last_large_episodes = []
        for entry in self.parsed_flow.entries:
            date_rss = datetime.strptime(entry.published, RSS_DATE_FORMAT)
            date_db = self.get_most_recent_episode_from_DB()
            if date_db and date_rss > date_db:
                if (
                    RSS_episode.get_duree_in_seconds(entry.itunes_duration)
                    > duree_mini_minutes * 60
                ):
                    last_large_episodes.append(entry)
        return last_large_episodes

    def store_last_large_episodes(self, duree_mini_minutes: int = 15) -> None:
        """
        Parcourt la liste des épisodes longs récents, instancie RSS_episode et les conserve dans la base de données.
        Affiche le nombre de mises à jour réussies dans la base de données.

        Args:
            duree_mini_minutes (int): La durée minimale en minutes des épisodes à stocker. Par défaut à 15 minutes.
        """
        updates = 0
        last_large_episodes = self.list_last_large_episodes(duree_mini_minutes)
        for entry in last_large_episodes:
            rss_entry = RSS_episode.from_feed_entry(entry)
            updates += rss_entry.keep()
        print(f"Updated episodes: {updates}")

__init__()

Initialise la classe Podcast en analysant le flux RSS et en obtenant la collection MongoDB.

Source code in nbs/rss.py
73
74
75
76
77
78
79
80
81
def __init__(self):
    """
    Initialise la classe Podcast en analysant le flux RSS et en obtenant la collection MongoDB.
    """
    self.parsed_flow = feedparser.parse(get_RSS_URL())
    DB_HOST, DB_NAME, _ = get_DB_VARS()
    self.collection = get_collection(
        target_db=DB_HOST, client_name=DB_NAME, collection_name="episodes"
    )

get_most_recent_episode_from_DB()

Récupère la date la plus récente des épisodes stockés dans la base de données.

Returns:

Type Description
Optional[datetime]

Optional[datetime]: La date la plus récente des épisodes stockés, ou None si aucun épisode n'est trouvé.

Source code in nbs/rss.py
83
84
85
86
87
88
89
90
91
92
93
94
def get_most_recent_episode_from_DB(self) -> Optional[datetime]:
    """
    Récupère la date la plus récente des épisodes stockés dans la base de données.

    Returns:
        Optional[datetime]: La date la plus récente des épisodes stockés, ou None si aucun épisode n'est trouvé.
    """
    most_recent_document = self.collection.find().sort({"date": -1}).limit(1)
    most_recent_date = None
    for doc in most_recent_document:
        most_recent_date = doc["date"].replace(tzinfo=pytz.timezone("Europe/Paris"))
    return most_recent_date

list_last_large_episodes(duree_mini_minutes=15)

Liste les épisodes RSS qui sont plus récents que le plus récent épisode stocké dans la base de données et qui durent plus de duree_mini_minutes minutes.

Parameters:

Name Type Description Default
duree_mini_minutes int

La durée minimale en minutes des épisodes à lister. Par défaut à 15 minutes.

15

Returns:

Type Description
List[FeedParserDict]

List[FeedParserDict]: Une liste d'entrées RSS correspondant aux critères.

Source code in nbs/rss.py
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
def list_last_large_episodes(
    self, duree_mini_minutes: int = 15
) -> List[FeedParserDict]:
    """
    Liste les épisodes RSS qui sont plus récents que le plus récent épisode stocké dans la base de données
    et qui durent plus de `duree_mini_minutes` minutes.

    Args:
        duree_mini_minutes (int): La durée minimale en minutes des épisodes à lister. Par défaut à 15 minutes.

    Returns:
        List[FeedParserDict]: Une liste d'entrées RSS correspondant aux critères.
    """
    last_large_episodes = []
    for entry in self.parsed_flow.entries:
        date_rss = datetime.strptime(entry.published, RSS_DATE_FORMAT)
        date_db = self.get_most_recent_episode_from_DB()
        if date_db and date_rss > date_db:
            if (
                RSS_episode.get_duree_in_seconds(entry.itunes_duration)
                > duree_mini_minutes * 60
            ):
                last_large_episodes.append(entry)
    return last_large_episodes

store_last_large_episodes(duree_mini_minutes=15)

Parcourt la liste des épisodes longs récents, instancie RSS_episode et les conserve dans la base de données. Affiche le nombre de mises à jour réussies dans la base de données.

Parameters:

Name Type Description Default
duree_mini_minutes int

La durée minimale en minutes des épisodes à stocker. Par défaut à 15 minutes.

15
Source code in nbs/rss.py
121
122
123
124
125
126
127
128
129
130
131
132
133
134
def store_last_large_episodes(self, duree_mini_minutes: int = 15) -> None:
    """
    Parcourt la liste des épisodes longs récents, instancie RSS_episode et les conserve dans la base de données.
    Affiche le nombre de mises à jour réussies dans la base de données.

    Args:
        duree_mini_minutes (int): La durée minimale en minutes des épisodes à stocker. Par défaut à 15 minutes.
    """
    updates = 0
    last_large_episodes = self.list_last_large_episodes(duree_mini_minutes)
    for entry in last_large_episodes:
        rss_entry = RSS_episode.from_feed_entry(entry)
        updates += rss_entry.keep()
    print(f"Updated episodes: {updates}")

extraire_dureesummary(summary)

Extrait la durée d'un épisode du masque.

Parameters:

Name Type Description Default
summary str

Le résumé de l'épisode contenant la durée.

required

Returns:

Name Type Description
int int

Le nombre de secondes correspondant à la durée d'un épisode.

int

Retourne -1 si la durée n'est pas trouvée.

Source code in nbs/rss.py
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def extraire_dureesummary(summary: str) -> int:
    """
    Extrait la durée d'un épisode du masque.

    Args:
        summary (str): Le résumé de l'épisode contenant la durée.

    Returns:
        int: Le nombre de secondes correspondant à la durée d'un épisode.
        Retourne -1 si la durée n'est pas trouvée.
    """
    # Expression régulière pour extraire la durée
    pattern_duree = r"durée\s*:\s*(\d{2}:\d{2}:\d{2})"

    # Recherche de la durée dans le texte
    match = re.search(pattern_duree, summary)

    if match:
        duree_str = match.group(1)
        heures, minutes, secondes = map(int, duree_str.split(":"))
        return heures * 3600 + minutes * 60 + secondes
    else:
        return -1

extraire_urls_rss(duree_mini_minutes=15)

Extrait les URLs des balises enclosure d'un flux RSS des épisodes durant plus de duree_mini_minutes minutes.

Parameters:

Name Type Description Default
duree_mini_minutes int

La durée minimale en minutes des épisodes du flux.

15

Returns:

Type Description
List[str]

List[str]: Une liste d'URLs.

Source code in nbs/rss.py
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
def extraire_urls_rss(duree_mini_minutes: int = 15) -> List[str]:
    """
    Extrait les URLs des balises `enclosure` d'un flux RSS des épisodes durant plus de `duree_mini_minutes` minutes.

    Args:
        duree_mini_minutes (int): La durée minimale en minutes des épisodes du flux.

    Returns:
        List[str]: Une liste d'URLs.
    """
    url_flux = get_RSS_URL()

    flux = feedparser.parse(url_flux)
    urls = []
    for entree in flux.entries:
        for link in entree.links:
            if link.type == "audio/mpeg":
                if extraire_dureesummary(entree.summary) > duree_mini_minutes * 60:
                    urls.append(link.href)
    return urls