Support for Bato.to

Added support for bato.to. No PhantomJS is needed now.
Also, added a list of people who have donated for comic-dl.
master
Xonshiz 2017-12-31 11:30:43 +05:30
parent 939115e348
commit 80ef3ce950
12 changed files with 386 additions and 35 deletions

View File

@ -66,4 +66,5 @@
- Added MangaFox.la (mangafox.me redirects to .la now) [2017.12.27]
- Added Feature to Search and Download Manga from MangaEden [2017.12.28]
- Fix for #64 [2017.12.28]
- Fix for #62 [2017.12.29]
- Fix for #62 [2017.12.29]
- Added Support for [Bato.to](http://bato.to/) [2017.12.31] [No PhantomJS Needed Now]

View File

@ -1,5 +1,5 @@
[![N|Solid](https://raw.githubusercontent.com/Xonshiz/comic-dl/master/Images/Icon.png)](https://github.com/Xonshiz/comic-dl)
# Comic-DL | [![Build Status](https://travis-ci.org/Xonshiz/comic-dl.svg?branch=master)](https://travis-ci.org/Xonshiz/comic-dl) [![Documentation Status](https://readthedocs.org/projects/comic-dl/badge/?version=latest)](http://comic-dl.readthedocs.io/en/latest/?badge=latest) | [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/xonshiz)
# Comic-DL | [![Build Status](https://travis-ci.org/Xonshiz/comic-dl.svg?branch=master)](https://travis-ci.org/Xonshiz/comic-dl) [![Documentation Status](https://readthedocs.org/projects/comic-dl/badge/?version=latest)](http://comic-dl.readthedocs.io/en/latest/?badge=latest) | [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/xonshiz) | [![GitHub release](https://img.shields.io/github/release/xonshiz/comic-dl.svg?style=flat-square)](https://github.com/xonshiz/comic-dl/releases/latest) | [![Github All Releases](https://img.shields.io/github/downloads/xonshiz/comic-dl/total.svg?style=flat-square)](https://github.com/xonshiz/comic-dl/releases)
Comic-dl is a command line tool to download Comics and Manga from various Manga and Comic sites easily. You can search Manga from this tool as well. Idea from [youtube-dl](https://github.com/rg3/youtube-dl)
@ -19,6 +19,7 @@ Comic-dl is a command line tool to download Comics and Manga from various Manga
* [Python Support](#python-support)
* [Windows Binary](#windows-binary)
* [List of Arguments](#list-of-arguments)
* [Language Codes](#language-codes)
* [Using The Search](#using-the-search)
* [Youtube Tutorial](https://www.youtube.com/watch?v=TmQYhLHEZxA)
* [Usage](#usage)
@ -157,6 +158,45 @@ Currently, the script supports these arguments :
-fd, --force-download Forces download of chapters, when using comic-dl's search function.
-pid, --page-id Takes the Page ID to download a particular "chapter number" of a manga.
```
## Language Codes:
These codes correspond to the languages. So, just pass in these language codes, to download Manga/Comic in that language (only supported by few sites).
Language Code --> Language
--------------------------
```
0 --> English
1 --> Italian
2 --> Spanish
3 --> French
4 --> German
5 --> Portuguese
6 --> Turkish
7 --> Indonesian
8 --> Greek
9 --> Filipino
10 --> Polish
11 --> Thai
12 --> Malay
13 --> Hungarian
14 --> Romanian
15 --> Arabic
16 --> Hebrew
17 --> Russian
18 --> Vietnamese
19 --> Dutch
20 --> Bengali
21 --> Persian
22 --> Czech
23 --> Brazilian
24 --> Bulgarian
25 --> Danish
26 --> Esperanto
27 --> Swedish
28 --> Lithuanian
29 --> Other
```
#### Note :
1.) Some websites like bato.to don't let you view some pages if you're not logged in. You'll have to create an account and pass the login information to the script via `-p` and `-u` arguments.
@ -309,7 +349,13 @@ If you're here to make suggestions, please follow the basic syntax to post a req
This should be enough, but it'll be great if you can add more ;)
# Notes
comic.naver.com has korean characters and some OS won't handle those characters. So, instead of naming the file folder with the series name in korean, the script will download and name the folder with the comic's ID instead.
* comic.naver.com has korean characters and some OS won't handle those characters. So, instead of naming the file folder with the series name in korean, the script will download and name the folder with the comic's ID instead.
* Bato.to requires you to "log in" to read some chapters. So, to be on a safe side, provide the username/password combination to the script via "-p" and "-u" arguments.
* Bato.to also has comics for various languages. You need to pass the language code via "-ml" argument. Read the [Language Codes](#language-codes) section to find out the language codes.
* Bato.to only supports custom language downloads in "Batch" mode.
# Donations
You can always send some money over from this :

View File

@ -1,14 +1,11 @@
#List of Supported Websites
# List of Supported Websites
[PhantomJS] = Denotes that these sites need PhantomJS to be able to download content.
* [Mangafox.me](http://mangafox.me/) or [Mangafox.la](http://mangafox.la/)
* [YoManga](http://yomanga.co/)
* [GoManga](http://gomanga.co/)
~~* [Batoto](http://bato.to/) [PhantomJS]~~ [Under Development]
~~* [Kissmanga](http://kissmanga.com/)~~ [Under Development]
* [Batoto](http://bato.to/)
* [Comic Naver](http://comic.naver.com/index.nhn)
* [Readcomiconline.to](http://readcomiconline.to/)
* [mangahere.co](http://mangahere.co/)

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__version__ = "2017.12.29"
__version__ = "2017.12.31"

View File

@ -53,6 +53,14 @@ class ComicDL(object):
" search function.",
action="store_true")
parser.add_argument('-p', '--password', nargs=1,
help='Takes Password used to log into a website, along with a username/email.',
default=['None'])
parser.add_argument('-u', '--username', nargs=1,
help='Takes username/email used to log into a website, along with a password.',
default=['None'])
parser.add_argument("-v", "--verbose", help="Prints important debugging messages on screen.",
action="store_true")
logger = False
@ -82,7 +90,7 @@ class ComicDL(object):
if args.search:
start_time = time.time()
mangaSearch.MangaSearch(search_string=str(args.search[0]),
manga_language=args.manga_language[0], skip_cache=args.skip_cache[0])
manga_language=args.manga_language[0], skip_cache=args.skip_cache[0])
end_time = time.time()
total_time = end_time - start_time
@ -110,11 +118,10 @@ class ComicDL(object):
args.download_directory = [os.getcwd()]
start_time = time.time()
mangaChapters.MangaChapters(chapter_id=args.chapter_id[0],
download_directory=args.download_directory[0],
conversion=args.convert[0], delete_files=args.keep[0],
chapter_range=args.range, sorting_order=args.sorting[0],
force_download=force_download)
mangaChapters.MangaChapters(chapter_id=args.chapter_id[0], download_directory=args.download_directory[0],
conversion=args.convert[0], delete_files=args.keep[0],
chapter_range=args.range, sorting_order=args.sorting[0],
force_download=force_download)
end_time = time.time()
total_time = end_time - start_time
@ -166,7 +173,9 @@ class ComicDL(object):
sorting_order=args.sorting[0], logger=logger,
download_directory=args.download_directory[0],
chapter_range=args.range, conversion=args.convert[0],
delete_files=args.keep[0], image_quality=args.quality[0])
delete_files=args.keep[0], image_quality=args.quality[0],
username=args.username[0], password=args.password[0],
comic_language=args.manga_language[0])
end_time = time.time()
total_time = end_time - start_time
print("Total Time Taken To Complete : %s" % total_time)

View File

@ -15,15 +15,16 @@ import img2pdf
class GlobalFunctions(object):
def page_downloader(self, manga_url, **kwargs):
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Accept-Encoding': 'gzip, deflate'
}
headers = kwargs.get("headers")
if not headers:
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Accept-Encoding': 'gzip, deflate'
}
sess = requests.session()
sess = cfscrape.create_scraper(sess)
connection = sess.get(manga_url, headers=headers, cookies=kwargs.get("cookies"))
if connection.status_code != 200:
print("Whoops! Seems like I can't connect to website.")

View File

@ -19,10 +19,48 @@ from sites import stripUtopia
from sites import readComicBooksOnline
from sites import readComicsWebsite
from sites import mangaRock
from sites import batoto
import globalFunctions
class Honcho(object):
def comic_language_resolver(self, language_code):
# Will return the Language Name corresponding to the language code.
language_dict = {
'0': 'English',
'1': 'Italian',
'2': 'Spanish',
'3': 'French',
'4': 'German',
'5': 'Portuguese',
'6': 'Turkish',
'7': 'Indonesian',
'8': 'Greek',
'9': 'Filipino',
'10': 'Polish',
'11': 'Thai',
'12': 'Malay',
'13 ': 'Hungarian',
'14': 'Romanian',
'15': ' Arabic',
'16': 'Hebrew',
'17': 'Russian',
'18': 'Vietnamese',
'19': 'Dutch',
'20': 'Bengali',
'21': 'Persian',
'22': 'Czech',
'23': 'Brazilian',
'24': 'Bulgarian',
'25': 'Danish',
'26': 'Esperanto',
'27': 'Swedish',
'28': 'Lithuanian',
'29': 'Other'
}
return language_dict[language_code]
def checker(self, comic_url, download_directory, chapter_range, **kwargs):
user_name = kwargs.get("username")
@ -30,6 +68,7 @@ class Honcho(object):
current_directory = kwargs.get("current_directory")
log_flag = kwargs.get("logger")
sorting = kwargs.get("sorting_order")
comic_language = kwargs.get("comic_language")
if log_flag is True:
logging.basicConfig(format='%(levelname)s: %(message)s', filename="Error Log.log", level=logging.DEBUG)
@ -95,8 +134,8 @@ class Honcho(object):
return 0
elif domain in ["www.striputopija.blogspot.in", "striputopija.blogspot.in"]:
stripUtopia.StripUtopia(manga_url=comic_url, logger=logging, current_directory=current_directory,
sorting_order=sorting, log_flag=log_flag, download_directory=download_directory,
chapter_range=chapter_range)
sorting_order=sorting, log_flag=log_flag, download_directory=download_directory,
chapter_range=chapter_range)
return 0
elif domain in ["www.mangareader.net", "mangareader.net"]:
mangaReader.MangaReader(manga_url=comic_url, logger=logging, current_directory=current_directory,
@ -130,9 +169,11 @@ class Honcho(object):
print("Under Development!")
return 0
elif domain in ["www.bato.to", "bato.to"]:
# kissManga.KissManga(manga_url = comic_url, logger = logging,
# current_directory = current_directory, sorting_order = sorting)
print("Under Development!")
batoto.Batoto(manga_url=comic_url, logger=logging, current_directory=current_directory,
sorting_order=sorting, log_flag=log_flag, download_directory=download_directory,
chapter_range=chapter_range, conversion=kwargs.get("conversion"),
delete_files=kwargs.get("delete_files"), username=user_name, password=password,
comic_language=self.comic_language_resolver(comic_language))
return 0
else:
print("%s is not supported at the moment. You can request it on the Github repository." % domain)

207
comic_dl/sites/batoto.py Normal file
View File

@ -0,0 +1,207 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import globalFunctions
import requests
import cfscrape
from bs4 import BeautifulSoup
import sys
import re
import os
class Batoto:
def __init__(self, manga_url, download_directory, chapter_range, **kwargs):
user_name = kwargs.get("username")
password = kwargs.get("password")
comic_language = kwargs.get("comic_language")
current_directory = kwargs.get("current_directory")
conversion = kwargs.get("conversion")
delete_files = kwargs.get("delete_files")
self.logging = kwargs.get("log_flag")
self.sorting = kwargs.get("sorting_order")
if "/reader#" in str(manga_url):
self.single_chapter(comic_url=manga_url, download_directory=download_directory, conversion=conversion,
delete_files=delete_files, user_name=user_name, user_password=password)
else:
self.full_series(comic_url=manga_url, sorting=self.sorting, download_directory=download_directory,
chapter_range=chapter_range, conversion=conversion, delete_files=delete_files,
user_name=user_name, user_password=password, manga_language=comic_language)
def user_login(self, username, password, **kwargs):
session_cookie = ""
headers = kwargs.get("headers")
if not headers:
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Accept-Encoding': 'gzip, deflate',
'referer': 'https://bato.to/'
}
print("Getting Auth Token...")
page_source, update_cookie = globalFunctions.GlobalFunctions().page_downloader(
manga_url="https://bato.to/forums/index.php?app=core&module=global&section=login")
soup_parse = page_source.find_all('input', {'type': 'hidden'})
auth_token = str([x['value'] for x in soup_parse][0]).strip()
payload = {
'auth_key': auth_token,
'ips_username': username,
'ips_password': password,
'rememberMe': '1'
}
sess = requests.session()
sess = cfscrape.create_scraper(sess)
print('Trying To Log In...')
connection = sess.post("https://bato.to/forums/index.php?app=core&module=global&section=login&do=process",
headers=headers, data=payload, cookies=kwargs.get("cookies"))
if connection.status_code != 200:
print("Whoops! Seems like I can't connect to website.")
print("It's showing : %s" % connection)
print("Run this script with the --verbose argument and report the issue along with log file on Github.")
sys.exit(1)
else:
page_source = BeautifulSoup(connection.text.encode("utf-8"), "html.parser")
if "logout" in str(page_source):
print("Successfully Logged In!")
else:
print("Couldn't Log You In. Please Check Your Credentials Again!")
session_cookie = sess.cookies
return session_cookie
def name_cleaner(self, scrapped_name):
return re.sub('[^A-Za-z0-9.\-\+\' ]+', '', ' '.join([str(word).strip().title() for word in str(scrapped_name).split("-")[:-1]]))
def single_chapter(self, comic_url, download_directory, conversion, delete_files, comic_name=None, user_name=None,
user_password=None, **kwargs):
chapter_id = str(str(comic_url).split("#")[-1]).replace("/", "")
temp_cookies = kwargs.get("session_cookies")
if str(user_name) != "None" and str(user_password) != "None":
print("Trying To Log You In...")
temp_cookies = self.user_login(username=user_name, password=user_password)
"""next_page denotes whether there will be a next page or not. Basically, it's like a flag to know whether we're
on the last page or not.
page_count starts from 0 and will add 1 to it in every iteration, which will in turn give us page number.
TRULY GENIUS! <3
"""
comic_name = ""
chapter_number = ""
file_directory = ""
directory_path = ""
next_page = True
page_count = 1
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Accept-Encoding': 'gzip, deflate',
'referer': 'https://bato.to/reader'
}
while next_page:
batoto_reader_url = "https://bato.to/areader?id=" + str(chapter_id) + "&p=" + str(page_count)
page_source, temp_cookies = globalFunctions.GlobalFunctions().page_downloader(manga_url=batoto_reader_url,
headers=headers,
cookies=temp_cookies)
if not comic_name or not chapter_number or not file_directory:
comic_name = self.name_cleaner(re.search(r'https://bato.to/comic/_/comics/(.*?)">', str(page_source)).group(1))
chapter_number = re.sub('[^0-9]+', '', str(re.search(r'Ch\.(.*?)\:', str(page_source)).group(1)))
file_directory = str(comic_name) + os.sep + str(chapter_number) + os.sep
directory_path = os.path.realpath(str(download_directory) + os.sep + str(file_directory))
if not os.path.exists(directory_path):
os.makedirs(directory_path)
globalFunctions.GlobalFunctions().info_printer(comic_name, chapter_number)
img_link = page_source.find_all("img", {"id": "comic_page"})
current_image_url = ""
for x in img_link:
current_image_url = str(x['src']).strip()
globalFunctions.GlobalFunctions().downloader(current_image_url, str(page_count) +
str(current_image_url)[-4:],
comic_url, directory_path, log_flag=self.logging)
try:
page_count = int(str(re.search(r"next_page = '(.*?)';", str(page_source)).group(1)).split("_")[-1])
next_page = True
except Exception as LastPage:
next_page = False
pass
globalFunctions.GlobalFunctions().conversion(directory_path, conversion, delete_files,
comic_name, chapter_number)
def full_series(self, comic_url, sorting, download_directory, chapter_range, conversion, delete_files,
user_name=None, user_password=None, **kwargs):
all_links = []
session_cookie = None
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Accept-Encoding': 'gzip, deflate',
'referer': 'https://bato.to/'
}
if str(user_name) != "None" and str(user_password) != "None":
print("Trying To Log You In...")
session_cookie = self.user_login(username=user_name, password=user_password)
else:
print("You are not logged in. You might not be able to download all the listed chapters from Batoto.")
print("")
manga_language = kwargs.get("manga_language")
page_source, update_cookie = globalFunctions.GlobalFunctions().page_downloader(manga_url=comic_url,
headers=headers,
cookies=session_cookie)
class_name = "row lang_{0} chapter_row".format(manga_language)
raw_chapters_table = page_source.find_all('tr', {'class': class_name})
for table_data in raw_chapters_table:
x = table_data.findAll('a')
for a in x:
if "/reader#" in str(a['href']):
all_links.append(str(a['href']).strip())
if chapter_range != "All":
# -1 to shift the episode number accordingly to the INDEX of it. List starts from 0 xD!
starting = int(str(chapter_range).split("-")[0]) - 1
if (str(chapter_range).split("-")[1]).decode().isdecimal():
ending = int(str(chapter_range).split("-")[1])
else:
ending = len(all_links)
indexes = [x for x in range(starting, ending)]
# [::-1] in sub_list in beginning to start this from the 1st episode and at the last,
# it is to reverse the list again, because I'm reverting it again at the end.
all_links = [all_links[::-1][x] for x in indexes][::-1]
else:
all_links = all_links
if str(sorting).lower() in ['new', 'desc', 'descending', 'latest']:
for chap_link in all_links:
self.single_chapter(comic_url=chap_link, download_directory=download_directory, conversion=conversion,
delete_files=delete_files, session_cookies=session_cookie)
elif str(sorting).lower() in ['old', 'asc', 'ascending', 'oldest', 'a']:
for chap_link in all_links[::-1]:
self.single_chapter(comic_url=chap_link, download_directory=download_directory, conversion=conversion,
delete_files=delete_files, session_cookies=session_cookie)
print("Finished Downloading")
return 0

View File

@ -66,4 +66,5 @@
- Added MangaFox.la (mangafox.me redirects to .la now) [2017.12.27]
- Added Feature to Search and Download Manga from MangaEden [2017.12.28]
- Fix for #64 [2017.12.28]
- Fix for #62 [2017.12.29]
- Fix for #62 [2017.12.29]
- Added Support for [Bato.to](http://bato.to/) [2017.12.31] [No PhantomJS Needed Now]

View File

@ -1,14 +1,11 @@
#List of Supported Websites
# List of Supported Websites
[PhantomJS] = Denotes that these sites need PhantomJS to be able to download content.
* [Mangafox.me](http://mangafox.me/) or [Mangafox.la](http://mangafox.la/)
* [YoManga](http://yomanga.co/)
* [GoManga](http://gomanga.co/)
~~* [Batoto](http://bato.to/) [PhantomJS]~~ [Under Development]
~~* [Kissmanga](http://kissmanga.com/)~~ [Under Development]
* [Batoto](http://bato.to/)
* [Comic Naver](http://comic.naver.com/index.nhn)
* [Readcomiconline.to](http://readcomiconline.to/)
* [mangahere.co](http://mangahere.co/)

View File

@ -1,5 +1,5 @@
[![N|Solid](https://raw.githubusercontent.com/Xonshiz/comic-dl/master/Images/Icon.png)](https://github.com/Xonshiz/comic-dl)
# Comic-DL | [![Build Status](https://travis-ci.org/Xonshiz/comic-dl.svg?branch=master)](https://travis-ci.org/Xonshiz/comic-dl) [![Documentation Status](https://readthedocs.org/projects/comic-dl/badge/?version=latest)](http://comic-dl.readthedocs.io/en/latest/?badge=latest) | [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/xonshiz)
# Comic-DL | [![Build Status](https://travis-ci.org/Xonshiz/comic-dl.svg?branch=master)](https://travis-ci.org/Xonshiz/comic-dl) [![Documentation Status](https://readthedocs.org/projects/comic-dl/badge/?version=latest)](http://comic-dl.readthedocs.io/en/latest/?badge=latest) | [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/xonshiz) | [![GitHub release](https://img.shields.io/github/release/xonshiz/comic-dl.svg?style=flat-square)](https://github.com/xonshiz/comic-dl/releases/latest) | [![Github All Releases](https://img.shields.io/github/downloads/xonshiz/comic-dl/total.svg?style=flat-square)](https://github.com/xonshiz/comic-dl/releases)
Comic-dl is a command line tool to download Comics and Manga from various Manga and Comic sites easily. You can search Manga from this tool as well. Idea from [youtube-dl](https://github.com/rg3/youtube-dl)
@ -19,6 +19,7 @@ Comic-dl is a command line tool to download Comics and Manga from various Manga
* [Python Support](#python-support)
* [Windows Binary](#windows-binary)
* [List of Arguments](#list-of-arguments)
* [Language Codes](#language-codes)
* [Using The Search](#using-the-search)
* [Youtube Tutorial](https://www.youtube.com/watch?v=TmQYhLHEZxA)
* [Usage](#usage)
@ -157,6 +158,45 @@ Currently, the script supports these arguments :
-fd, --force-download Forces download of chapters, when using comic-dl's search function.
-pid, --page-id Takes the Page ID to download a particular "chapter number" of a manga.
```
## Language Codes:
These codes correspond to the languages. So, just pass in these language codes, to download Manga/Comic in that language (only supported by few sites).
Language Code --> Language
--------------------------
```
0 --> English
1 --> Italian
2 --> Spanish
3 --> French
4 --> German
5 --> Portuguese
6 --> Turkish
7 --> Indonesian
8 --> Greek
9 --> Filipino
10 --> Polish
11 --> Thai
12 --> Malay
13 --> Hungarian
14 --> Romanian
15 --> Arabic
16 --> Hebrew
17 --> Russian
18 --> Vietnamese
19 --> Dutch
20 --> Bengali
21 --> Persian
22 --> Czech
23 --> Brazilian
24 --> Bulgarian
25 --> Danish
26 --> Esperanto
27 --> Swedish
28 --> Lithuanian
29 --> Other
```
#### Note :
1.) Some websites like bato.to don't let you view some pages if you're not logged in. You'll have to create an account and pass the login information to the script via `-p` and `-u` arguments.
@ -309,7 +349,13 @@ If you're here to make suggestions, please follow the basic syntax to post a req
This should be enough, but it'll be great if you can add more ;)
# Notes
comic.naver.com has korean characters and some OS won't handle those characters. So, instead of naming the file folder with the series name in korean, the script will download and name the folder with the comic's ID instead.
* comic.naver.com has korean characters and some OS won't handle those characters. So, instead of naming the file folder with the series name in korean, the script will download and name the folder with the comic's ID instead.
* Bato.to requires you to "log in" to read some chapters. So, to be on a safe side, provide the username/password combination to the script via "-p" and "-u" arguments.
* Bato.to also has comics for various languages. You need to pass the language code via "-ml" argument. Read the [Language Codes](#language-codes) section to find out the language codes.
* Bato.to only supports custom language downloads in "Batch" mode.
# Donations
You can always send some money over from this :

5
donors.md Normal file
View File

@ -0,0 +1,5 @@
# List of People who have donated for this project :
Thank you guys for the support. Even a appreciation email keeps me motivated! Thank you All!
* [Fruitblood](@fruitblood)
* Bolisetty