feat(garden): generate rss
This commit is contained in:
		
							parent
							
								
									cb39047ee9
								
							
						
					
					
						commit
						6ed995de6c
					
				
							
								
								
									
										58
									
								
								src/garden/feed.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								src/garden/feed.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  | 
 | ||||||
|  | import markdown | ||||||
|  | import pathlib | ||||||
|  | import sys | ||||||
|  | import re | ||||||
|  | import glob | ||||||
|  | 
 | ||||||
|  | def print_usage(): | ||||||
|  |     print("\nusage: python feed.py ROOT\n") | ||||||
|  |     print("\n") | ||||||
|  |     print("\t\ROOT\tbase folder") | ||||||
|  | 
 | ||||||
|  | def validate(): | ||||||
|  |     # check args for at least one file path | ||||||
|  |     if len(sys.argv) < 2: | ||||||
|  |         print_usage() | ||||||
|  |         sys.exit(1) | ||||||
|  | 
 | ||||||
|  | validate() | ||||||
|  | 
 | ||||||
|  | base_folder = sys.argv[1] | ||||||
|  | 
 | ||||||
|  | def get_paths() -> [str]: | ||||||
|  |     return [x for x in glob.glob(f"{base_folder}/*.md")] | ||||||
|  | 
 | ||||||
|  | def get_text(path): | ||||||
|  |     with open(path) as f: | ||||||
|  |         return f.read() | ||||||
|  | 
 | ||||||
|  | #def to_html(md : str) -> str: | ||||||
|  | #    return markdown.markdown(md, extensions=["fenced_code"]) | ||||||
|  | 
 | ||||||
|  | def get_entry(path): | ||||||
|  |     return get_title(get_text(path)) | ||||||
|  | 
 | ||||||
|  | def get_title(md): | ||||||
|  |     return re.compile(r"^# (.+)\n").match(md).group(1) | ||||||
|  | 
 | ||||||
|  | def get_entries() -> [str]: | ||||||
|  |     return "\n\n".join([get_entry(p) for p in get_paths()]) | ||||||
|  | 
 | ||||||
|  | def get_header() -> str: | ||||||
|  |     return """<?xml version="1.0" encoding="utf-8" ?> | ||||||
|  | <rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"> | ||||||
|  | <channel> | ||||||
|  |     <title></title> | ||||||
|  |     <link>https://ktyl.dev/garden</link> | ||||||
|  |     <description></description> | ||||||
|  |     <atom:link href="https://ktyl.dev/garden/feed.xml" rel="self" type="application/rss+xml"/> | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | def get_footer() -> str: | ||||||
|  |     return "\n</channel></rss>" | ||||||
|  | 
 | ||||||
|  | print(get_header()) | ||||||
|  | print(get_entries()) | ||||||
|  | print(get_footer()) | ||||||
							
								
								
									
										15
									
								
								src/garden/feed.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/garden/feed.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | |||||||
|  | 
 | ||||||
|  | python feed.py `pwd` | ||||||
|  | <?xml version="1.0" encoding="utf-8" ?> | ||||||
|  | <rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"> | ||||||
|  | <channel> | ||||||
|  |     <title></title> | ||||||
|  |     <link>https://ktyl.dev/garden</link> | ||||||
|  |     <description></description> | ||||||
|  |     <atom:link href="https://ktyl.dev/garden/feed.xml" rel="self" type="application/rss+xml"/> | ||||||
|  | 
 | ||||||
|  | Digital Gardens | ||||||
|  | 
 | ||||||
|  | RSS | ||||||
|  | 
 | ||||||
|  | </channel></rss> | ||||||
							
								
								
									
										5
									
								
								src/garden/gardens.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/garden/gardens.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | # Digital Gardens | ||||||
|  | 
 | ||||||
|  | * Obsidian | ||||||
|  | * Notion | ||||||
|  | * Git | ||||||
| @ -1,16 +1,30 @@ | |||||||
| # RSS | # RSS | ||||||
| 
 | 
 | ||||||
| Really Simple Syndication (RSS) is a an ancient file format for communicating updates over the Web. | Really Simple Syndication (RSS) is an ancient file format for communicating updates over the Web, and my personal favourite. | ||||||
| 
 | 
 | ||||||
| ## Stubs: | * [It's Time for an RSS Revival](https://www.wired.com/story/rss-readers-feedly-inoreader-old-reader/) | ||||||
| 
 | 
 | ||||||
| * readers | ### Stubs: | ||||||
| * feed generation |  | ||||||
| 
 | 
 | ||||||
| ## YouTube Subscriptions | * my curated feeds | ||||||
|  | * reader applications | ||||||
|  | 
 | ||||||
|  | ## Technical Simplicity | ||||||
|  | 
 | ||||||
|  | From a technical perspective, like [Gemini](gemini://gemini.circumlunar.space) [\(HTTP\)](https://gemini.circumlunar.space/) it's grokkable with a couple good reads of the specification. | ||||||
|  | I wrote [a simple generator](https://ktyl.dev/blog/2022/6/3/rss.md)] for my blog posts, and am now working on [a simpler one](./feed.py) for the garden. | ||||||
|  | To start with, I'd like to generate it as simply as possible, from just a directory structure, but I can already see I'd like to do more with it. | ||||||
|  | 
 | ||||||
|  | I work predominantly in [Git](https://git-scm.com/) repositories, which, like a directory, or a garden, is tree-based. | ||||||
|  | My blog's feed has a chronological hierarchy, but at present it's based on manually creating and naming folders. | ||||||
|  | It's also very much a _published_ format, rather than a living one. | ||||||
|  | This is silly! | ||||||
|  | Instead, I'd like to structure my feed around a Git repository, as I think it'd be a much better descriptor of activity. | ||||||
|  | 
 | ||||||
|  | ## Managing YouTube Subscriptions | ||||||
| 
 | 
 | ||||||
| There are many reasons to avoid the YouTube homepage, such as recommended videos or the accursed Shorts. | There are many reasons to avoid the YouTube homepage, such as recommended videos or the accursed Shorts. | ||||||
| Since RSS feeds are published per-channel, it's totally possible to circumvent its subscription system entirely - including having to make an account - and keep track of channels one enjoys with RSS feeds instead. | YouTube publishes channel-specific RSS feeds, making it totally possible to circumvent its subscription system entirely - including having to make an account - and keep track of channels one enjoys with RSS feeds instead. | ||||||
| Get a channel's ID: | Get a channel's ID: | ||||||
| 
 | 
 | ||||||
| 1. Go to the channel's page | 1. Go to the channel's page | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user