Compare commits
	
		
			1 Commits
		
	
	
		
			499b9a3e74
			...
			03b1d6a38a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 03b1d6a38a | 
@ -1,6 +0,0 @@
 | 
				
			|||||||
feed:
 | 
					 | 
				
			||||||
	python feed.py `pwd`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rss: feed
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: feed
 | 
					 | 
				
			||||||
@ -1,58 +0,0 @@
 | 
				
			|||||||
#!/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())
 | 
					 | 
				
			||||||
@ -1,15 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
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>
 | 
					 | 
				
			||||||
@ -1,5 +0,0 @@
 | 
				
			|||||||
# Digital Gardens
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* Obsidian
 | 
					 | 
				
			||||||
* Notion
 | 
					 | 
				
			||||||
* Git
 | 
					 | 
				
			||||||
@ -1,22 +1,16 @@
 | 
				
			|||||||
# RSS
 | 
					# RSS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Really Simple Syndication (RSS) is an ancient file format for communicating updates over the Web, and my personal favourite.
 | 
					Really Simple Syndication (RSS) is a an ancient file format for communicating updates over the Web.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* [It's Time for an RSS Revival](https://www.wired.com/story/rss-readers-feedly-inoreader-old-reader/)
 | 
					## Stubs:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Stubs:
 | 
					* readers
 | 
				
			||||||
 | 
					* feed generation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* my curated feeds
 | 
					## YouTube Subscriptions
 | 
				
			||||||
* 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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## 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.
 | 
				
			||||||
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.
 | 
					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.
 | 
				
			||||||
Get a channel's ID:
 | 
					Get a channel's ID:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. Go to the channel's page
 | 
					1. Go to the channel's page
 | 
				
			||||||
 | 
				
			|||||||
@ -4,14 +4,14 @@
 | 
				
			|||||||
    text-align: center;
 | 
					    text-align: center;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.landing a {
 | 
					.landing .fsText a {
 | 
				
			||||||
    color: var(--foreground-inactive);
 | 
					    color: var(--foreground-inactive);
 | 
				
			||||||
    font-size: 2em;
 | 
					    font-size: 2em;
 | 
				
			||||||
    transform: translate(0,50%);
 | 
					    transform: translate(0,50%);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    transition: all 0.3s;
 | 
					    transition: all 0.3s;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
.landing a:hover {
 | 
					.landing .fsText a:hover {
 | 
				
			||||||
    color: var(--accent);
 | 
					    color: var(--accent);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -45,6 +45,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.landing .socials i {
 | 
					.landing .socials i {
 | 
				
			||||||
    color: var(--foreground-inactive);
 | 
					    color: var(--foreground-inactive);
 | 
				
			||||||
 | 
					    font-size: 3.5em;
 | 
				
			||||||
    padding: 0 .07em;
 | 
					    padding: 0 .07em;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -30,12 +30,6 @@ ul.nav-links {
 | 
				
			|||||||
    margin-bottom: 0.8em;
 | 
					    margin-bottom: 0.8em;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.nav .nav-links li a {
 | 
					 | 
				
			||||||
    color: var(--foreground-inactive);
 | 
					 | 
				
			||||||
    font-size: 1.4em;
 | 
					 | 
				
			||||||
    display: block;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.nav li a::before {
 | 
					.nav li a::before {
 | 
				
			||||||
    content: "/";
 | 
					    content: "/";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.title h1 {
 | 
					.title h1 {
 | 
				
			||||||
    font-size: 1.4em;
 | 
					 | 
				
			||||||
    padding-bottom: 0;
 | 
					    padding-bottom: 0;
 | 
				
			||||||
    margin-bottom:0;
 | 
					    margin-bottom:0;
 | 
				
			||||||
    margin-top:0;
 | 
					    margin-top:0;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
<ul class="nav-links">
 | 
					<ul class="nav-links">
 | 
				
			||||||
    <li><a href="/about.html">about</a></li>
 | 
					    <li><a href="/about.html" class="fsText">about</a></li>
 | 
				
			||||||
    <li><a href="/blog.html">blog</a></li>
 | 
					    <li><a href="/blog.html" class="fsText">blog</a></li>
 | 
				
			||||||
    <li><a href="/gallery.html">gallery</a></li>
 | 
					    <li><a href="/gallery.html" class="fsText">gallery</a></li>
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,2 +1,2 @@
 | 
				
			|||||||
<div class="title">
 | 
					<div class="title">
 | 
				
			||||||
    <h1><a href="https://ktyl.dev/">ktyl.dev</a><span class="pageTitle">
 | 
					    <h1 class="fsText"><a href="https://ktyl.dev/">ktyl.dev</a><span class="pageTitle">
 | 
				
			||||||
 | 
				
			|||||||
@ -14,8 +14,4 @@
 | 
				
			|||||||
    --color3: #ff00ff;
 | 
					    --color3: #ff00ff;
 | 
				
			||||||
    --color4: #ffff00;
 | 
					    --color4: #ffff00;
 | 
				
			||||||
    --color5: #00ffff;
 | 
					    --color5: #00ffff;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* TODO: extract general varibles file ? */
 | 
					 | 
				
			||||||
    /* Text */
 | 
					 | 
				
			||||||
    --font-size: 1.4em;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -21,8 +21,21 @@ li {
 | 
				
			|||||||
    display:inline;
 | 
					    display:inline;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
a {
 | 
					a.fsText {
 | 
				
			||||||
    text-decoration: none;
 | 
					    text-decoration: none;
 | 
				
			||||||
 | 
					    color: var(--foreground-inactive);
 | 
				
			||||||
 | 
					    transform: scale(1);
 | 
				
			||||||
 | 
					    transition: background-color 0.2s, color 0.2s, transform 0.2s;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.fsText a {
 | 
				
			||||||
 | 
					    text-decoration: none;
 | 
				
			||||||
 | 
					    color: var(--foreground);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.fsText {
 | 
				
			||||||
 | 
					    --font-size: 1.4em;
 | 
				
			||||||
 | 
					    font-size: var(--font-size);
 | 
				
			||||||
    color: var(--foreground);
 | 
					    color: var(--foreground);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user