aboutsummaryrefslogtreecommitdiff
path: root/generate-rss.py
blob: a0ee6dd0904705174d8f3ffe5cb9a1794f4b3720 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/env python3

import re
import os

from xml.dom import minidom
from xml.etree import ElementTree as ET
from argparse import ArgumentParser

def generate_rss(input_file, output_file, feed_url):
    try:
        with open(input_file, "r", encoding="utf-8") as f:
            lines = f.readlines()
    except FileNotFoundError:
        print(f'[err] {input_file} not found')
        exit(1)

    lines = lines[::-1]

    feed_file = os.path.basename(output_file)
    rss = ET.Element('rss', version='2.0')
    rss.set('xmlns:atom', 'http://www.w3.org/2005/Atom')
    channel = ET.SubElement(rss, 'channel')
    ET.SubElement(channel, 'title').text = 'CVE Updates Feed'
    ET.SubElement(channel, 'link').text = feed_url
    ET.SubElement(channel, 'description').text = 'RSS feed for recent CVE GitHub repositories'
    ET.SubElement(channel, 'atom:link', href=f'{feed_url}/{feed_file}', rel='self', type='application/rss+xml')

    pattern = r'-\s*\[[^\]]+\]\(([^)]+)\)\s*(.*)'

    for line in lines:
        match = re.match(pattern, line.strip())
        if match:
            url = match.group(1).strip()
            description = match.group(2).strip() or 'No description'

            title = os.path.basename(url)

            item_elem = ET.SubElement(channel, 'item')
            ET.SubElement(item_elem, 'title').text = title
            ET.SubElement(item_elem, 'link').text = url
            ET.SubElement(item_elem, 'description').text = description

    rough_string = ET.tostring(rss, 'utf-8')
    reparsed = minidom.parseString(rough_string)
    pretty_xml = reparsed.toprettyxml(indent='  ', encoding='utf-8').decode('utf-8')

    with open(output_file, 'w', encoding='utf-8') as f:
        f.write(pretty_xml)

    print(f'[inf] rss feed generated at {output_file}')

if __name__ == '__main__':
    parser = ArgumentParser()
    parser.add_argument('-i', '--input', required=True, help='path to input markdown file')
    parser.add_argument('-o', '--output', required=True, help='path to output xml file')
    parser.add_argument('-u', '--url', required=True, help='feed url')
    args = parser.parse_args()

    generate_rss(
        args.input,
        args.output,
        args.url
    )