From b5401ac501de985fdcaad8fa75330a368081971c Mon Sep 17 00:00:00 2001 From: MarkusJoe Date: Fri, 4 Mar 2022 18:14:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=8B=E8=BD=BD=E7=94=A8?= =?UTF-8?q?=E6=97=B6=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/__init__.py | 36 ++-- bin/tests/MySQL.py | 130 -------------- bin/tests/MySQL_.py | 155 ----------------- bin/tests/SQLite_.py | 141 --------------- bin/tests/down.py | 101 +++++++++++ bin/tests/downloader.py | 7 +- bin/tests/fetchtable.py | 18 -- bin/tests/init_db.py | 30 ---- bin/tests/models.py | 376 ---------------------------------------- 9 files changed, 129 insertions(+), 865 deletions(-) delete mode 100644 bin/tests/MySQL.py delete mode 100644 bin/tests/MySQL_.py delete mode 100644 bin/tests/SQLite_.py create mode 100644 bin/tests/down.py delete mode 100644 bin/tests/fetchtable.py delete mode 100644 bin/tests/init_db.py delete mode 100644 bin/tests/models.py diff --git a/bin/__init__.py b/bin/__init__.py index bd8c126..59f51fb 100644 --- a/bin/__init__.py +++ b/bin/__init__.py @@ -7,27 +7,28 @@ import os +import time import requests import threading from bin.utils.logger import logger class Threaded(threading.Thread): - def __init__(self, s, e, fp, id_, url): + def __init__(self, s, e, id_, url, name): """ 初始化类 :param s: 开始点 :param e: 结束点 - :param fp: 文件操作 :param id_: 线程id :param url: 文件url + :param name: 文件名 """ - super().__init__() + super(Threaded, self).__init__() self.start_ = s self.end_ = e - self.fp = fp self.id = id_ self.url = url + self.name = name def download(self): """ @@ -37,8 +38,9 @@ class Threaded(threading.Thread): """ logger.info(f'线程: {self.id} 开始下载') res = requests.get(self.url, headers={'Range': f'Bytes={self.start_}-{self.end_}'}).content - self.fp.seek(self.start_) - self.fp.write(res) + with open(self.name, 'r+b') as fp: + fp.seek(self.start_) + fp.write(res) logger.info(f'线程: {self.id} 结束下载') def run(self): @@ -49,7 +51,20 @@ class Threaded(threading.Thread): self.download() -def main(url: str, name: str, path: str = '.', workers: int = 8): +def cost(func): + def wrapper(*args, **kwargs): + logger.info('文件开始开始下载') + s = time.time() + execute = func(*args, **kwargs) + e = time.time() + logger.info(f'下载结束, 用时: {round(e - s, 2)} s') + return execute + + return wrapper + + +@cost +def main(url: str, name: str, path: str = '.', workers: int = 4): """ 主函数 :param url: @@ -60,14 +75,13 @@ def main(url: str, name: str, path: str = '.', workers: int = 8): """ logger.info(f'本次下载使用线程数: {workers}') file_size = int(requests.get(url).headers['Content-Length']) - if requests.get(url).status_code == '302': + if requests.get(url).status_code == 302: url = requests.get(url).headers['Location'] logger.warning(f'下载地址已重定向到了: {url}') logger.info(f'文件大小: {round(file_size / 1024 / 1024, 2)} Mb') offset = int(file_size / workers) start = 0 open(path + name, 'wb').close() - fp = open(path + name, 'r+b') for i in range(workers): if i == workers - 1: end = file_size @@ -75,7 +89,7 @@ def main(url: str, name: str, path: str = '.', workers: int = 8): end = i * offset else: end = offset - threads = Threaded(start, end, fp, i, url) + threads = Threaded(start, end, i, url, path + name) threads.start() threads.join() start = end + 1 @@ -84,4 +98,4 @@ def main(url: str, name: str, path: str = '.', workers: int = 8): if __name__ != '__main__': if not os.path.exists('./bin/db/data.db'): logger.warning('数据库文件不存在, 即将开始下载') - main('https://themedatabase.vercel.app/assets', 'data.db', './bin/db/', 6) + main('https://themedatabase.vercel.app/assets', 'data.db', './bin/db/') diff --git a/bin/tests/MySQL.py b/bin/tests/MySQL.py deleted file mode 100644 index 951926b..0000000 --- a/bin/tests/MySQL.py +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env python3 -# -- coding:utf-8 -- -# @Author: markushammered@gmail.com -# @Development Tool: PyCharm -# @Create Time: 2022/2/26 -# @File Name: MySQL.py - - -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker -from models import * # 导入所有的主题表模型 -from typing import List, Tuple - - -class MySQL: - """使用SQLAlchemy进行的MySQL数据库操作""" - - @property - def session(self): - """ - 创建会话 - :return: - """ - return self.Session() - - def __init__(self, - host: str, - user: str, - pwd: str, - database: str, - charset: str = 'utf8', - port: int = 3306 - ) -> None: - """ - 初始化 - :param host: 数据库地址 - :param port: 数据库端口默认3306 - :param user: 用户名 - :param pwd: 登陆密码 - :param database: 数据库名 - :param charset: 字符集 默认utf8 - """ - self.host = host - self.port = port - self.user = user - self.password = pwd - self.database = database - self.charset = charset - self.engine = create_engine( - f'mysql+pymysql://{self.user}:{self.password}@{self.host}:{self.port}/{self.database}') # 连接到数据库 - self.Session = sessionmaker(bind=self.engine) # 创建引擎 - self.Base = Base - - def __del__(self): - """ - 自动提交 - 自动关闭连接 - :return: - """ - self.session.commit() - self.session.close() - - def insert(self, name: str, times: int = 0) -> bool: - """ - 插入数据 - :param name: 名称 - :param times: 次数 默认0 - :return: - """ - new_data = ReqCount(name=name, times=times) - self.session.add(new_data) - self.session.commit() - return True - - def update(self, name: str, times: int) -> bool: - """ - 更新数据 - :param name: 名称 - :param times: 次数 - :return: - """ - self.session.query(ReqCount).filter(ReqCount.name == name).update({'name': name, 'times': times}) - return True - - def delete(self, name: str) -> bool: - """ - 删除数据 - :param name: 名称 - :return: - """ - self.session.query(ReqCount).filter(ReqCount.name == name) - return True - - def fetch(self, name: str) -> int: - """ - 查询数据 - :param name: - :return: - """ - data = self.session.query(ReqCount).filter(ReqCount.name == name).all() - for i in data: - return i.times - - def fetchall(self) -> List[Tuple]: - """ - 抓取全部数据 - :return: - """ - data_list = [] - data = self.session.query(ReqCount).filter().all() - for tup in data: - data_list.append((tup.name, tup.times)) - - return data_list - - def fetch_table(self, table_name: str) -> List[Tuple] or bool: - """ - 抓取指定名称的表 - :param table_name: - :return: - """ - table_list = [] - tables = self.session.query(eval(table_name)).filter().all() # 使用eval函数将字符串转换为Python对象 - for tup in tables: - table_list.append((tup.k, tup.v, tup.w, tup.h)) - return table_list - - def create(self): - self.Base.metadata.create_all(self.engine) - diff --git a/bin/tests/MySQL_.py b/bin/tests/MySQL_.py deleted file mode 100644 index 3460329..0000000 --- a/bin/tests/MySQL_.py +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/env python3 -# -- coding:utf-8 -- -# @Author: markushammered@gmail.com -# @Development Tool: PyCharm -# @Create Time: 2022/2/27 -# @File Name: MySQL_.py - - -import pymysql - - -class MySQL: - """操作MySQL数据库""" - - def __init__(self, - host: str, - user: str, - pwd: str, - database: str - ) -> None: - """ - 初始化MySQL对象并创建一个连接 - 创建的连接会在执行完毕后自动提交以及自动关闭 - :param host: 数据库地址 - :param user: 数据库用户名 - :param pwd: 数据库密码 - :param database: 数据库名 - """ - self.__host = host - self.__user = user - self.__password = pwd - self.__database = database - self.__conn = pymysql.connect(user=self.__user, - password=self.__password, - host=self.__host, - database=self.__database) # 创建连接 - self.__cursor = self.__conn.cursor() - - def __del__(self): - """ - 自动提交 - 自动关闭连接 - :return: - """ - self.__conn.commit() - self.__cursor.close() - self.__conn.close() - - @property - def show_tables(self) -> list: - """ - 查询已有的表 - :return: - """ - self.__cursor.execute('show tables;') # 列出所有的表名 - tuple_tables = self.__cursor.fetchall() - # 将元组类型转换为列表 - tables = [] - for origin in tuple_tables: - tables.append(origin[0]) - del tuple_tables - return tables - - def exists_name(self, name: str): - """ - 判断是否存在于数据库内 - :param name: - :return: - """ - status = self.fetch(name) - if status == (): - return False - else: - return True - - def exists_table(self, table: str) -> bool: - """ - 判断表是否在数据库内 - :param table: - :return: - """ - tables = self.show_tables - if table in tables: - return True - else: - return False - - def insert(self, name: str, times: int = 0) -> bool: - """ - 插入数据 - :param name: - :param times: - :return: - """ - try: - self.__cursor.execute( - 'insert into reqcount(name, times) values("%(name)s", %(times)s);' % {'name': name, 'times': times}) - return True - except pymysql.err.IntegrityError: - return False - - def delete(self, name: str) -> bool: - """ - 删除数据 - :param name: - :return: - """ - self.__cursor.execute('delete from reqcount where name="%(name)s";' % {'name': name}) - return True - - def fetch(self, name: str) -> bool or tuple: - """ - 抓取数据 - :param name: - :return: - """ - self.__cursor.execute('select * from reqcount where name="%(name)s";' % {'name': name}) - data = self.__cursor.fetchall() - if data == (): - return False - else: - return data[0] - - def update(self, name: str, times: int) -> bool: - """ - 更改数据 - :param name: - :param times: - :return: - """ - self.__cursor.execute( - 'update reqcount set times="%(times)s where name="%(name)s"";' % {'times': times, 'name': name}) - return True - - def fetching_table(self, table: str) -> list: - """ - 抓取主题表内的数据 - :param table: - :return: - """ - self.__cursor.execute('select * from %(table)s' % {'table': table}) - datas = self.__cursor.fetchall() - lst = [] - for i in datas: - lst.append({'k': i[0], - 'v': i[1], - 'w': i[2], - 'h': i[3]} - ) # 向空列表内添加抓取到的数据 -> 将元组数据转换为列表 - - del datas - return lst - - -__all__ = ['MySQL'] \ No newline at end of file diff --git a/bin/tests/SQLite_.py b/bin/tests/SQLite_.py deleted file mode 100644 index c5a3acd..0000000 --- a/bin/tests/SQLite_.py +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/env python3 -# -- coding:utf-8 -- -# @Author: markushammered@gmail.com -# @Development Tool: PyCharm -# @Create Time: 2022/2/27 -# @File Name: SQLite_.py - - -import sqlite3 - - -class SQLite: - """操作SQLite数据库""" - - def __init__(self, - path: str = './bin/db/data.db' - ) -> None: - """ - 初始化SQLite对象 - :param path: 数据库路径 - """ - self.__path = path - self.__conn = sqlite3.connect(self.__path) - self.__cursor = self.__conn.cursor() - - def __del__(self) -> None: - """ - 自动提交 - 自动关闭连接 - :return: - """ - self.__conn.commit() - self.__cursor.close() - self.__conn.close() - - @property - def show_tables(self) -> list: - """ - 列出所有在数据库内的表 - :return: - """ - self.__cursor.execute('select * from sqlite_master where type="table"') - tables = self.__cursor.fetchall() - lst = [] - for table in tables: - lst.append(table[1]) - del tables - return lst - - def exist_name(self, name: str) -> bool: - """ - 判断当前名称是否在数据库内 - 调用fetch方法判断 - :param name: - :return: - """ - status = self.fetch(name) - if status == (): - return False - else: - return True - - def exist_table(self, table: str) -> bool: - """ - 判断表是否在数据库内 - :param table: - :return: - """ - tables = self.show_tables - if table in tables: - return True - else: - return False - - def insert(self, name: str, times: int) -> bool: - """ - 插入数据 - :param name: - :param times: - :return: - """ - self.__cursor.execute( - 'insert into reqcount values(name="%(name)s", times=%(times)s)' % {'name': name, 'times': times}) - return True - - def delete(self, name: str) -> bool: - """ - 删除数据 - :param name: - :return: - """ - self.__cursor.execute('delete from reqcount where name="%(name)s"' % {'name': name}) - return True - - def fetch(self, name: str) -> tuple: - """ - 抓取数据 - :param name: - :return: - """ - self.__cursor.execute('select * from reqcount where name="%(name)s"' % {'name': name}) - data = self.__cursor.fetchall() - if len(data): - return data[0] - else: - return tuple(data) - - def update(self, name: str, times: int) -> bool: - """ - 更新数据 - :param name: - :param times: - :return: - """ - self.__cursor.execute( - 'update reqcount set times=%(times)s where name="%(name)s"' % {'times': times, 'name': name}) - return True - - def fetching_table(self, table: str) -> list[dict]: - """ - 抓取主题表的数据 - :param table: - :return: - """ - status = self.exist_table(table) - if status: - tables = self.__cursor.execute('select * from %(table)s' % {'table': table}) - lst = [] - for data in tables: - lst.append({'index': data[0], - 'base64': data[1], - 'width': data[2], - 'height': data[3]}) - del tables - return lst - else: - return [] - - -sqlite = SQLite('../db/data.db') -print(sqlite.fetching_table('gelbooru')) diff --git a/bin/tests/down.py b/bin/tests/down.py new file mode 100644 index 0000000..a191639 --- /dev/null +++ b/bin/tests/down.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +# -- coding:utf-8 -- +# @Author: markushammered@gmail.com +# @Development Tool: PyCharm +# @Create Time: 2022/3/4 +# @File Name: down.py + + +import sys +import time +import requests +import threading + + +class Downloader(threading.Thread): + """继承threading实现多线程""" + + def __init__(self, start_: int, end_: int, t_id: int, url: str, name: str): + """ + 初始化类 + :param start_: seek开始点 + :param end_: seek结束点 + :param t_id: 线程id + :param url: 资源地址 + :param name: 文件名 + """ + super(Downloader, self).__init__() + self.start_ = start_ + self.end_ = end_ + self.t_id = t_id + self.url = url + self.name = name + + def download(self): + """ + 开始下载 + :return: + """ + print(f'{self.t_id} 开始下载') + res = requests.get(self.url, headers={'Range': f'Bytes={self.start_}-{self.end_}'}).content + with open(self.name, 'r+b') as fp: + fp.seek(self.start_) + fp.write(res) + print(f'{self.t_id} 结束下载') + + def run(self): + """ + 开始运行 + :return: + """ + self.download() + + +def cost(func): + def wrapper(*args, **kwargs): + print('文件开始开始下载') + s = time.time() + execute = func(*args, **kwargs) + e = time.time() + print(f'下载结束, 用时: {round(e - s, 2)} s') + return execute + + return wrapper + + +@cost +def main(url: str, threads: int = 4): + """ + 处理各种数据 + :param url: 资源地址 + :param threads: 线程数 + :return: + """ + try: + res = requests.get(url) + except requests.exceptions.ConnectionError: + print('资源连接错误') + sys.exit(-1) + if res.status_code == 302: + url = res.headers['Location'] + print(f'资源已重定向到: {url}') + file_name = url.split('/')[-1] + open(file_name, 'w').close() + file_size = int(res.headers['Content-Length']) + offset = file_size // threads + start = 0 + for i in range(threads): + if i == 0: + end = offset + elif i == threads - 1: + end = file_size + else: + end = i * offset + t = Downloader(start, end, i, url, file_name) + t.start() + t.join() + start = end + + +if __name__ == '__main__': + main('https://i0.hdslb.com/bfs/archive/ef0945f7d54a505953272022063a6335a9d3becf.jpg') diff --git a/bin/tests/downloader.py b/bin/tests/downloader.py index 856a89a..8e1ffb9 100644 --- a/bin/tests/downloader.py +++ b/bin/tests/downloader.py @@ -8,7 +8,6 @@ import requests import threading -from bin.utils.logger import logger class Threaded(threading.Thread): @@ -21,18 +20,18 @@ class Threaded(threading.Thread): self.url = url def download(self): - logger.info(f'线程: {self.id} 开始下载') + print(f'线程: {self.id} 开始下载') res = requests.get(self.url, headers={'Range': f'Bytes={self.start_}-{self.end_}'}).content self.fp.seek(self.start_) self.fp.write(res) - logger.info(f'线程: {self.id} 结束下载') + print(f'线程: {self.id} 结束下载') def run(self): self.download() def main(url: str, path: str = '.', workers: int = 8): - logger.info(f'本次下载使用线程数: {workers}') + print(f'本次下载使用线程数: {workers}') file_name = url.split('/')[-1] file_size = int(requests.get(url).headers['Content-Length']) if requests.get(url).status_code == '302': diff --git a/bin/tests/fetchtable.py b/bin/tests/fetchtable.py deleted file mode 100644 index 8dfc6b1..0000000 --- a/bin/tests/fetchtable.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env python3 -# -- coding:utf-8 -- -# @Author: markushammered@gmail.com -# @Development Tool: PyCharm -# @Create Time: 2022/2/26 -# @File Name: fetchtable.py - - -import sqlite3 - -conn = sqlite3.connect('../db/data.db') -cursor = conn.cursor() -cursor.execute('select * from sqlite_master where type="table"') -tables = [] -for i in cursor.fetchall(): - tables.append(i[1]) - -print(tables) diff --git a/bin/tests/init_db.py b/bin/tests/init_db.py deleted file mode 100644 index 2082c93..0000000 --- a/bin/tests/init_db.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python3 -# -- coding:utf-8 -- -# @Author: markushammered@gmail.com -# @Development Tool: PyCharm -# @Create Time: 2022/2/5 -# @File Name: init_db.py - -import os -import sqlite3 -import sys - -if __name__ == '__main__': - while True: - yes_or_no = input('该操作会将数据库初始化输入y继续:') - if yes_or_no == 'y': - try: - os.remove('../db/count.db') - except PermissionError: - print('有其他程序正在使用此数据库无法删除') - sys.exit(-1) - conn = sqlite3.connect('../db/count.db') - cursor = conn.cursor() - cursor.execute('create table ReqCount (name text primary key, times integer )') - sys.exit(0) - elif yes_or_no == 'n': - print('已取消') - sys.exit(0) - else: - print('请输入y继续或n退出') - continue diff --git a/bin/tests/models.py b/bin/tests/models.py deleted file mode 100644 index 3c8ec50..0000000 --- a/bin/tests/models.py +++ /dev/null @@ -1,376 +0,0 @@ -#!/usr/bin/env python3 -# -- coding:utf-8 -- -# @Author: markushammered@gmail.com -# @Development Tool: PyCharm -# @Create Time: 2022/2/26 -# @File Name: tables.py - - -from sqlalchemy import Column -from sqlalchemy import Integer -from sqlalchemy import String -from sqlalchemy import VARCHAR -from sqlalchemy.ext.declarative import declarative_base - -Base = declarative_base() - -"""所有已保存的主题均在此处列出""" - - -class ReqCount(Base): - """计数器数据库模型""" - - __tablename__ = 'reqcount' - name = Column(String(20), primary_key=True) # 名称 - times = Column(Integer()) # 次数 - - -class gelbooru(Base): - __tablename__ = 'gelbooru' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class moebooru(Base): - __tablename__ = 'moebooru' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class g(Base): - __tablename__ = 'g' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class cripple(Base): - __tablename__ = 'cripple' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class blacked(Base): - __tablename__ = 'blacked' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class rule34(Base): - __tablename__ = 'rule34' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class steambanner(Base): - __tablename__ = 'steambanner' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class lefty(Base): - __tablename__ = 'lefty' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class crewbooru(Base): - __tablename__ = 'crewbooru' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class sthg(Base): - __tablename__ = 'sthg' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class rfck(Base): - __tablename__ = 'rfck' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class lisu(Base): - __tablename__ = 'lisu' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class tv(Base): - __tablename__ = 'tv' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class lewd(Base): - __tablename__ = 'lewd' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class amibooru(Base): - __tablename__ = 'amibooru' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class blankatlas(Base): - __tablename__ = 'blankatlas' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class mmballbusting(Base): - __tablename__ = 'mmballbusting' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class sss(Base): - __tablename__ = 'sss' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class legolamb(Base): - __tablename__ = 'legolamb' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class goldengator(Base): - __tablename__ = 'goldengator' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class r6gdrawfriends(Base): - __tablename__ = 'r6gdrawfriends' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class vivi(Base): - __tablename__ = 'vivi' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class twifanartsfw(Base): - __tablename__ = 'twifanartsfw' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class hololive(Base): - __tablename__ = 'hololive' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class vglobby(Base): - __tablename__ = 'vglobby' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class jaypee(Base): - __tablename__ = 'jaypee' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class melanin(Base): - __tablename__ = 'melanin' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class orb(Base): - __tablename__ = 'orb' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class min(Base): - __tablename__ = 'min' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class mjg(Base): - __tablename__ = 'mjg' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class cloppers(Base): - __tablename__ = 'cloppers' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class townofgravityfalls(Base): - __tablename__ = 'townofgravityfalls' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class brown(Base): - __tablename__ = 'brown' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class enacdoa(Base): - __tablename__ = 'enacdoa' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class daifuku(Base): - __tablename__ = 'daifuku' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class osc(Base): - __tablename__ = 'osc' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class girlsfeet(Base): - __tablename__ = 'girlsfeet' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class hybreedsgeneral(Base): - __tablename__ = 'hybreedsgeneral' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class sr(Base): - __tablename__ = 'sr' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class mono(Base): - __tablename__ = 'mono' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class riskofrain(Base): - __tablename__ = 'riskofrain' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class neovb(Base): - __tablename__ = 'neovb' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -class ffsr(Base): - __tablename__ = 'ffsr' - k = Column(VARCHAR(500), primary_key=True) - v = Column(VARCHAR(500)) - w = Column(Integer()) - h = Column(Integer()) - - -__all__ = ['ReqCount', 'gelbooru', 'moebooru', 'g', 'cripple', 'blacked', 'rule34', 'steambanner', 'lefty', 'crewbooru', - 'sthg', 'rfck', 'lisu', 'tv', 'lewd', 'amibooru', 'blankatlas', 'mmballbusting', 'sss', 'legolamb', - 'goldengator', 'r6gdrawfriends', 'vivi', 'twifanartsfw', 'hololive', 'vglobby', 'jaypee', 'melanin', 'orb', - 'min', 'mjg', 'cloppers', 'townofgravityfalls', 'brown', 'enacdoa', 'daifuku', 'osc', 'girlsfeet', - 'hybreedsgeneral', 'sr', 'mono', 'riskofrain', 'neovb', 'ffsr', 'Base']