mirror of
https://github.com/JoseDeFreitas/awesome-youtubers.git
synced 2025-01-03 03:20:48 -05:00
Delete src directory
This commit is contained in:
parent
cacac033b1
commit
75fa5e22fd
@ -1,34 +0,0 @@
|
|||||||
# Last "as" keyword is in the form ab_cd, where "a" and
|
|
||||||
# "b" are the first letters of the two words of the module
|
|
||||||
# and "c" and "d" are the first letters of the two words
|
|
||||||
# of the function of the module.
|
|
||||||
|
|
||||||
from rules.content_about import trailing_slash as ca_ts
|
|
||||||
from rules.featured_playlists import trailing_slash as fp_ts
|
|
||||||
from rules.youtubers_names import trailing_slash as yn_ts
|
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
|
||||||
"""
|
|
||||||
Main function. Used specifically to call print results
|
|
||||||
by calling functions into rules/.
|
|
||||||
|
|
||||||
Functions:
|
|
||||||
content_about: trailing_slash, comma_separated
|
|
||||||
featured_playlists: trailing_slash, closed_backsticks
|
|
||||||
youtubers_names: trailing_slash, youtube_link
|
|
||||||
"""
|
|
||||||
|
|
||||||
# "youtubers_names"
|
|
||||||
print("YouTubers names:")
|
|
||||||
print(yn_ts())
|
|
||||||
# "content_about"
|
|
||||||
print("Content about:")
|
|
||||||
print(ca_ts())
|
|
||||||
# "featured_playlists"
|
|
||||||
print("Featured playlists:")
|
|
||||||
print(fp_ts())
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,14 +0,0 @@
|
|||||||
# Awesome YouTubers linter
|
|
||||||
|
|
||||||
The awesome-youtubers linter is a workflow that checks the layout of the pull requests opened. This helps the contributors show if
|
|
||||||
something in the layout is not formatted correctly so it can be fixed. This linter was created in order to keep the format of the
|
|
||||||
list without breaking the layouts (images, new lines, etc.)
|
|
||||||
|
|
||||||
## Rules
|
|
||||||
|
|
||||||
| File containing | Rules followed |
|
|
||||||
| ---------------------------------------------------------- | ---------------------------------------------------------------------------- |
|
|
||||||
| [YouTuber's name and link](rules/youtubers_names.py) line. | - Trailing `\`<br/>- Spaces between badges |
|
|
||||||
| [Content about](rules/content_about.py) line. | - Trailing `\`<br/>- Spaces between words (including `,`) |
|
|
||||||
| [Featured playlists](rules/featured_playlists.py) line. | - Trailing `\`<br/>- Spaces between words (including `,`) and a trailing `.` |
|
|
||||||
| [Links formatted](rules/link_format.py) | - Well-formatted links (`[text](link)`) |
|
|
@ -1,36 +0,0 @@
|
|||||||
import pathlib
|
|
||||||
|
|
||||||
here = pathlib.Path(__file__).parent
|
|
||||||
file_readme = here / '../../../readme.md'
|
|
||||||
with open(file_readme, 'r') as read_readme:
|
|
||||||
content = read_readme.readlines()
|
|
||||||
|
|
||||||
CHECKER = "Content about:"
|
|
||||||
|
|
||||||
|
|
||||||
def trailing_slash() -> str:
|
|
||||||
"""
|
|
||||||
Looks for backslash and the end of all the matching
|
|
||||||
lines ("Content about:" lines).
|
|
||||||
"""
|
|
||||||
|
|
||||||
result = ["🟢 0: perfect."]
|
|
||||||
|
|
||||||
for line, value in enumerate(content):
|
|
||||||
if CHECKER in value:
|
|
||||||
last = value[-2]
|
|
||||||
if last != "\\":
|
|
||||||
if last == " ":
|
|
||||||
content[line] = f"{value[:-1]}\\\n"
|
|
||||||
else:
|
|
||||||
content[line] = f"{value[:-1]} \\\n"
|
|
||||||
|
|
||||||
with open(file_readme, 'w') as write_readme:
|
|
||||||
write_readme.writelines(content)
|
|
||||||
|
|
||||||
result.append(f"🔴 {line}: backslash. Fixed.")
|
|
||||||
|
|
||||||
if len(result) > 1:
|
|
||||||
return '\n'.join(result[1:])
|
|
||||||
else:
|
|
||||||
return ''.join(result)
|
|
@ -1,56 +0,0 @@
|
|||||||
import pathlib
|
|
||||||
|
|
||||||
here = pathlib.Path(__file__).parent
|
|
||||||
file_readme = here / '../../../readme.md'
|
|
||||||
with open(file_readme, 'r') as read_readme:
|
|
||||||
content = read_readme.readlines()
|
|
||||||
|
|
||||||
CHECKER = "Featured playlists:"
|
|
||||||
LENGTH = 124
|
|
||||||
|
|
||||||
|
|
||||||
def trailing_slash() -> str:
|
|
||||||
"""
|
|
||||||
Looks for backslash and the end of all the matching
|
|
||||||
lines ("Featured playlists:" lines) and a line
|
|
||||||
break tag "<br>" at the next line.
|
|
||||||
"""
|
|
||||||
|
|
||||||
result = ["🟢 0: perfect."]
|
|
||||||
|
|
||||||
for line, value in enumerate(content):
|
|
||||||
if CHECKER in value:
|
|
||||||
last = value[-2]
|
|
||||||
if len(value) < LENGTH:
|
|
||||||
if last != "\\" and "<br>" not in content[line+1]:
|
|
||||||
if last == " ":
|
|
||||||
content[line] = f"{value[:-1]}\\\n<br>\n"
|
|
||||||
else:
|
|
||||||
content[line] = f"{value[:-1]} \\\n<br>\n"
|
|
||||||
|
|
||||||
with open(file_readme, 'w') as write_readme:
|
|
||||||
write_readme.writelines(content)
|
|
||||||
|
|
||||||
result.append(f"🔴 {line}: backslash | line break. Fixed.")
|
|
||||||
elif last != "\\" and "<br>" in content[line+1]:
|
|
||||||
if last == " ":
|
|
||||||
content[line] = f"{value[:-1]}\\\n"
|
|
||||||
else:
|
|
||||||
content[line] = f"{value[:-1]} \\\n"
|
|
||||||
|
|
||||||
with open(file_readme, 'w') as write_readme:
|
|
||||||
write_readme.writelines(content)
|
|
||||||
|
|
||||||
result.append(f"🔴 {line}: backslash. Fixed.")
|
|
||||||
elif last == "\\" and "<br>" not in content[line+1]:
|
|
||||||
content[line+1] = "<br>\n\n"
|
|
||||||
|
|
||||||
with open(file_readme, 'w') as write_readme:
|
|
||||||
write_readme.writelines(content)
|
|
||||||
|
|
||||||
result.append(f"🔴 {line}: line break. Fixed.")
|
|
||||||
|
|
||||||
if len(result) > 1:
|
|
||||||
return '\n'.join(result[1:])
|
|
||||||
else:
|
|
||||||
return ''.join(result)
|
|
@ -1,36 +0,0 @@
|
|||||||
import pathlib
|
|
||||||
|
|
||||||
here = pathlib.Path(__file__).parent
|
|
||||||
file_readme = here / '../../../readme.md'
|
|
||||||
with open(file_readme, 'r') as read_readme:
|
|
||||||
content = read_readme.readlines()
|
|
||||||
|
|
||||||
CHECKER = "[**"
|
|
||||||
|
|
||||||
|
|
||||||
def trailing_slash() -> str:
|
|
||||||
"""
|
|
||||||
Looks for backslash and the end of all the matching
|
|
||||||
lines (YouTubers names lines).
|
|
||||||
"""
|
|
||||||
|
|
||||||
result = ["🟢 0: perfect."]
|
|
||||||
|
|
||||||
for line, value in enumerate(content):
|
|
||||||
if CHECKER in value:
|
|
||||||
last = value[-2]
|
|
||||||
if last != "\\":
|
|
||||||
if last == " ":
|
|
||||||
content[line] = f"{value[:-1]}\\\n"
|
|
||||||
else:
|
|
||||||
content[line] = f"{value[:-1]} \\\n"
|
|
||||||
|
|
||||||
with open(file_readme, 'w') as write_readme:
|
|
||||||
write_readme.writelines(content)
|
|
||||||
|
|
||||||
result.append(f"🔴 {line}: backslash. Fixed.")
|
|
||||||
|
|
||||||
if len(result) > 1:
|
|
||||||
return '\n'.join(result[1:])
|
|
||||||
else:
|
|
||||||
return ''.join(result)
|
|
@ -1 +0,0 @@
|
|||||||
web: gunicorn main:app
|
|
@ -1,121 +0,0 @@
|
|||||||
import threading
|
|
||||||
from flask import (
|
|
||||||
Flask, make_response,
|
|
||||||
request, render_template
|
|
||||||
)
|
|
||||||
from flask_sqlalchemy import SQLAlchemy
|
|
||||||
from flask_limiter import Limiter
|
|
||||||
from flask_limiter.util import get_remote_address
|
|
||||||
|
|
||||||
# App configuration
|
|
||||||
|
|
||||||
app = Flask(__name__)
|
|
||||||
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///youtubers.sqlite3"
|
|
||||||
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
|
|
||||||
|
|
||||||
db = SQLAlchemy(app)
|
|
||||||
|
|
||||||
limiter = Limiter(app, key_func=get_remote_address,)
|
|
||||||
|
|
||||||
lock = threading.Lock()
|
|
||||||
|
|
||||||
|
|
||||||
# Database model
|
|
||||||
|
|
||||||
class Channel(db.Model):
|
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
|
||||||
name = db.Column(db.String, unique=True, nullable=False)
|
|
||||||
vote = db.Column(db.Integer, default=0, nullable=False)
|
|
||||||
|
|
||||||
|
|
||||||
channels = Channel.query.order_by(Channel.name).all()
|
|
||||||
channels_names = [cname.name for cname in channels]
|
|
||||||
|
|
||||||
|
|
||||||
# Routes
|
|
||||||
|
|
||||||
@app.route("/")
|
|
||||||
@limiter.exempt
|
|
||||||
def index():
|
|
||||||
""" Main route of the website. """
|
|
||||||
return "Awesome YouTubers voting system website."
|
|
||||||
|
|
||||||
|
|
||||||
@app.route("/channels/all")
|
|
||||||
@limiter.exempt
|
|
||||||
def list_channels():
|
|
||||||
""" Lists all channels in the database. """
|
|
||||||
|
|
||||||
return render_template("all.html", channels=channels)
|
|
||||||
|
|
||||||
|
|
||||||
@app.route("/channels/<channel>")
|
|
||||||
@limiter.limit("20 per minute")
|
|
||||||
def get_channel(channel):
|
|
||||||
"""
|
|
||||||
If no query specified, prints the name of the
|
|
||||||
YouTube channel typed. When a query with the
|
|
||||||
name "vote" is given, adds or substracts 1
|
|
||||||
from the specified YouTube score.
|
|
||||||
"""
|
|
||||||
|
|
||||||
if "vote" in request.args:
|
|
||||||
vote = str(request.args["vote"])
|
|
||||||
|
|
||||||
if channel in channels_names:
|
|
||||||
cvote = Channel.query.filter_by(name=channel).first()
|
|
||||||
# Adds/substracts 1 from the channel.
|
|
||||||
if vote == "upvote":
|
|
||||||
cvote.vote += 1
|
|
||||||
db.session.commit()
|
|
||||||
elif vote == "downvote":
|
|
||||||
cvote.vote -= 1
|
|
||||||
db.session.commit()
|
|
||||||
else:
|
|
||||||
return "Vote word not recognised."
|
|
||||||
|
|
||||||
return f"You {vote}d successfully the channel {channel}."
|
|
||||||
else:
|
|
||||||
return "Channel not found on the list."
|
|
||||||
else:
|
|
||||||
if channel in channels_names:
|
|
||||||
return "Channel: " + channel
|
|
||||||
else:
|
|
||||||
return "Channel not found on the list."
|
|
||||||
|
|
||||||
|
|
||||||
@app.route("/channels/<channel>/image.svg")
|
|
||||||
@limiter.exempt
|
|
||||||
def img_channel(channel):
|
|
||||||
""" Returns the YouTube score in a svg image. """
|
|
||||||
|
|
||||||
if channel in channels_names:
|
|
||||||
cvote = Channel.query.filter_by(name=channel).first()
|
|
||||||
svg_image = f"""
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px"
|
|
||||||
width="52px" height="22px" viewBox="0 0 52 22" fill="none">
|
|
||||||
<style>
|
|
||||||
.text {{
|
|
||||||
font-family: "Segoe UI", Ubuntu, Sans-Serif;
|
|
||||||
font-weight: bold;
|
|
||||||
}}
|
|
||||||
</style>
|
|
||||||
<rect x="0.5" y="0.5" height="99%" width="51" fill="none"/>
|
|
||||||
<g>
|
|
||||||
<text x="5" y="15" fill="#00b4f0" class="text">
|
|
||||||
{cvote.vote}
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
"""
|
|
||||||
|
|
||||||
response = make_response(svg_image)
|
|
||||||
response.headers.set('Content-Type', 'image/svg+xml')
|
|
||||||
return response
|
|
||||||
else:
|
|
||||||
return "Channel not found on the list."
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
db.create_all()
|
|
||||||
app.run(debug=True)
|
|
@ -1,35 +0,0 @@
|
|||||||
# Awesome YouTubers voting system
|
|
||||||
|
|
||||||
## How to vote a YouTuber?
|
|
||||||
|
|
||||||
It's as easy as clicking one of the two options that are located at the right-most part of the
|
|
||||||
YouTuber's name on the [list](../readme.md). You'll be redirected to the Awesome YouTubers
|
|
||||||
voting system website. You'll see the name of the YouTube channel and the vote you gave it.
|
|
||||||
This is anonymous and does not require authentication.
|
|
||||||
|
|
||||||
If you think the YouTuber is awesome, you can upvote the channel. If not, you can downvote the
|
|
||||||
channel. When you upvote a channel you sum 1 to its calification, whereas when you downvote it
|
|
||||||
you substract 1 from its calification. The score the YouTuber has appears next to the icons.
|
|
||||||
The value starts at 0 and goes above and below it according to the votes.
|
|
||||||
|
|
||||||
## How does it work?
|
|
||||||
|
|
||||||
Each YouTuber has two options (upvote and downvote) on the YouTuber's name line. The options
|
|
||||||
each YouTuber has are linked to the Awesome YouTubers voting system website (see the source
|
|
||||||
in this folder) by the name of the YouTuber. When you click an option, the website opens with
|
|
||||||
the YouTuber's channel name and the vote you gave it (upvote = +1; downvote = -1). Your vote gets
|
|
||||||
automatically sent to a database when the scores are stored. They then get printed in the
|
|
||||||
[readme.md](../readme.md) file by referencing the image url.
|
|
||||||
|
|
||||||
## Motivation
|
|
||||||
|
|
||||||
Despite having already a [discussion about YouTubers](https://github.com/JoseDeFreitas/awesome-youtubers/discussions/32)
|
|
||||||
(specifically the ones that according to the community should be removed from the list for x or y
|
|
||||||
reasons) this voting system makes it easier, anonymous, and fair to decide if a YouTuber should be
|
|
||||||
on this list. All the YouTubers added get revised by me (I check whether the information the
|
|
||||||
contributor provided matches and I watch some videos looking for well explanations, good audio and
|
|
||||||
video quality, coverage of the topics it explains, among others), but, of course, I'm only one person,
|
|
||||||
so I think being able to receive opinions from all users is a good way to filter and have truly
|
|
||||||
awesome content based on the community's opinion.
|
|
||||||
|
|
||||||
<img src="https://awesome-youtubers.herokuapp.com/channels/Don_Jones/image.svg">
|
|
Binary file not shown.
@ -1,16 +0,0 @@
|
|||||||
{% extends 'base.html' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<th>Name</th>
|
|
||||||
<th>Vote</th>
|
|
||||||
</tr>
|
|
||||||
{% for channel in channels %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ channel.name }}</td>
|
|
||||||
<td>{{ channel.vote }}</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</table>
|
|
||||||
{% endblock %}
|
|
@ -1,13 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Awesome YouTubers</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
{% block content %}
|
|
||||||
{% endblock %}
|
|
||||||
</body>
|
|
||||||
</html>
|
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user