nothere990 commited on
Commit
48740e8
·
1 Parent(s): fca9714
Files changed (2) hide show
  1. src/database/model.py +58 -64
  2. src/youtube-cookies.txt +23 -0
src/database/model.py CHANGED
@@ -5,7 +5,7 @@ import math
5
  import os
6
  from contextlib import contextmanager
7
  from typing import Literal
8
-
9
  from sqlalchemy import (
10
  BigInteger,
11
  Column,
@@ -16,53 +16,50 @@ from sqlalchemy import (
16
  String,
17
  create_engine,
18
  )
19
- # from sqlalchemy.dialects.mysql import JSON
20
- from sqlalchemy.types import JSON, Text
21
  from sqlalchemy.ext.declarative import declarative_base
22
  from sqlalchemy.orm import relationship, sessionmaker
23
-
24
  from config import ENABLE_VIP, FREE_DOWNLOAD
25
-
26
-
27
  class PaymentStatus:
28
  PENDING = "pending"
29
  COMPLETED = "completed"
30
  FAILED = "failed"
31
  REFUNDED = "refunded"
32
-
33
-
34
  Base = declarative_base()
35
-
36
-
37
-
38
-
39
  class User(Base):
40
  __tablename__ = "users"
41
-
42
  id = Column(Integer, primary_key=True, autoincrement=True)
43
  user_id = Column(BigInteger, unique=True, nullable=False) # telegram user id
44
  free = Column(Integer, default=FREE_DOWNLOAD)
45
  paid = Column(Integer, default=0)
46
- config = Column(Text) # Use Text instead of JSON
47
-
48
  settings = relationship("Setting", back_populates="user", cascade="all, delete-orphan", uselist=False)
49
  payments = relationship("Payment", back_populates="user", cascade="all, delete-orphan")
50
-
51
-
52
  class Setting(Base):
53
  __tablename__ = "settings"
54
-
55
  id = Column(Integer, primary_key=True, autoincrement=True)
56
  quality = Column(Enum("high", "medium", "low", "audio", "custom"), nullable=False, default="high")
57
  format = Column(Enum("video", "audio", "document"), nullable=False, default="video")
58
  user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
59
-
60
  user = relationship("User", back_populates="settings")
61
-
62
-
63
  class Payment(Base):
64
  __tablename__ = "payments"
65
-
66
  id = Column(Integer, primary_key=True, autoincrement=True)
67
  method = Column(String(50), nullable=False)
68
  amount = Column(Float, nullable=False)
@@ -77,10 +74,10 @@ class Payment(Base):
77
  )
78
  transaction_id = Column(String(100))
79
  user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
80
-
81
  user = relationship("User", back_populates="payments")
82
-
83
-
84
  def create_session():
85
  engine = create_engine(
86
  os.getenv("DB_DSN"),
@@ -88,17 +85,14 @@ def create_session():
88
  max_overflow=100,
89
  pool_timeout=30,
90
  pool_recycle=1800,
91
- connect_args={
92
- 'ssl': {'ssl-mode': 'DISABLED'}
93
- }
94
  )
95
  Base.metadata.create_all(engine)
96
  return sessionmaker(bind=engine)
97
-
98
-
99
  SessionFactory = create_session()
100
-
101
-
102
  @contextmanager
103
  def session_manager():
104
  s = SessionFactory()
@@ -110,25 +104,25 @@ def session_manager():
110
  raise
111
  finally:
112
  s.close()
113
-
114
-
115
  def get_quality_settings(tgid) -> Literal["high", "medium", "low", "audio", "custom"]:
116
  with session_manager() as session:
117
  user = session.query(User).filter(User.user_id == tgid).first()
118
  if user and user.settings:
119
  return user.settings.quality
120
-
121
  return "high"
122
-
123
-
124
  def get_format_settings(tgid) -> Literal["video", "audio", "document"]:
125
  with session_manager() as session:
126
  user = session.query(User).filter(User.user_id == tgid).first()
127
  if user and user.settings:
128
  return user.settings.format
129
  return "video"
130
-
131
-
132
  def set_user_settings(tgid: int, key: str, value: str):
133
  # set quality or format settings
134
  with session_manager() as session:
@@ -140,60 +134,60 @@ def set_user_settings(tgid: int, key: str, value: str):
140
  setattr(setting, key, value)
141
  else:
142
  session.add(Setting(user_id=user.id, **{key: value}))
143
-
144
-
145
  def get_free_quota(uid: int):
146
  if not ENABLE_VIP:
147
  return math.inf
148
-
149
  with session_manager() as session:
150
  data = session.query(User).filter(User.user_id == uid).first()
151
  if data:
152
  return data.free
153
  return FREE_DOWNLOAD
154
-
155
-
156
  def get_paid_quota(uid: int):
157
  if ENABLE_VIP:
158
  with session_manager() as session:
159
  data = session.query(User).filter(User.user_id == uid).first()
160
  if data:
161
  return data.paid
162
-
163
  return 0
164
-
165
  return math.inf
166
-
167
-
168
  def reset_free_quota(uid: int):
169
  with session_manager() as session:
170
  data = session.query(User).filter(User.user_id == uid).first()
171
  if data:
172
  data.free = 5
173
-
174
-
175
  def add_paid_quota(uid: int, amount: int):
176
  with session_manager() as session:
177
  data = session.query(User).filter(User.user_id == uid).first()
178
  if data:
179
  data.paid += amount
180
-
181
-
182
  def check_quota(uid: int):
183
  if not ENABLE_VIP:
184
  return
185
-
186
  with session_manager() as session:
187
  data = session.query(User).filter(User.user_id == uid).first()
188
  if data and (data.free + data.paid) <= 0:
189
  raise Exception("Quota exhausted. Please /buy or wait until free quota is reset")
190
-
191
-
192
  def use_quota(uid: int):
193
  # use free first, then paid
194
  if not ENABLE_VIP:
195
  return
196
-
197
  with session_manager() as session:
198
  user = session.query(User).filter(User.user_id == uid).first()
199
  if user:
@@ -203,23 +197,23 @@ def use_quota(uid: int):
203
  user.paid -= 1
204
  else:
205
  raise Exception("Quota exhausted. Please /buy or wait until free quota is reset")
206
-
207
-
208
  def init_user(uid: int):
209
  with session_manager() as session:
210
  user = session.query(User).filter(User.user_id == uid).first()
211
  if not user:
212
  session.add(User(user_id=uid))
213
-
214
-
215
  def reset_free():
216
  with session_manager() as session:
217
  users = session.query(User).all()
218
  for user in users:
219
  user.free = FREE_DOWNLOAD
220
  session.commit()
221
-
222
-
223
  def credit_account(who, total_amount: int, quota: int, transaction, method="stripe"):
224
  with session_manager() as session:
225
  user = session.query(User).filter(User.user_id == who).first()
@@ -238,5 +232,5 @@ def credit_account(who, total_amount: int, quota: int, transaction, method="stri
238
  )
239
  session.commit()
240
  return user.free, user.paid
241
-
242
- return None, None
 
5
  import os
6
  from contextlib import contextmanager
7
  from typing import Literal
8
+
9
  from sqlalchemy import (
10
  BigInteger,
11
  Column,
 
16
  String,
17
  create_engine,
18
  )
19
+ from sqlalchemy.types import TEXT
 
20
  from sqlalchemy.ext.declarative import declarative_base
21
  from sqlalchemy.orm import relationship, sessionmaker
22
+
23
  from config import ENABLE_VIP, FREE_DOWNLOAD
24
+
25
+
26
  class PaymentStatus:
27
  PENDING = "pending"
28
  COMPLETED = "completed"
29
  FAILED = "failed"
30
  REFUNDED = "refunded"
31
+
32
+
33
  Base = declarative_base()
34
+
35
+
 
 
36
  class User(Base):
37
  __tablename__ = "users"
38
+
39
  id = Column(Integer, primary_key=True, autoincrement=True)
40
  user_id = Column(BigInteger, unique=True, nullable=False) # telegram user id
41
  free = Column(Integer, default=FREE_DOWNLOAD)
42
  paid = Column(Integer, default=0)
43
+ config = Column(TEXT)
44
+
45
  settings = relationship("Setting", back_populates="user", cascade="all, delete-orphan", uselist=False)
46
  payments = relationship("Payment", back_populates="user", cascade="all, delete-orphan")
47
+
48
+
49
  class Setting(Base):
50
  __tablename__ = "settings"
51
+
52
  id = Column(Integer, primary_key=True, autoincrement=True)
53
  quality = Column(Enum("high", "medium", "low", "audio", "custom"), nullable=False, default="high")
54
  format = Column(Enum("video", "audio", "document"), nullable=False, default="video")
55
  user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
56
+
57
  user = relationship("User", back_populates="settings")
58
+
59
+
60
  class Payment(Base):
61
  __tablename__ = "payments"
62
+
63
  id = Column(Integer, primary_key=True, autoincrement=True)
64
  method = Column(String(50), nullable=False)
65
  amount = Column(Float, nullable=False)
 
74
  )
75
  transaction_id = Column(String(100))
76
  user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
77
+
78
  user = relationship("User", back_populates="payments")
79
+
80
+
81
  def create_session():
82
  engine = create_engine(
83
  os.getenv("DB_DSN"),
 
85
  max_overflow=100,
86
  pool_timeout=30,
87
  pool_recycle=1800,
 
 
 
88
  )
89
  Base.metadata.create_all(engine)
90
  return sessionmaker(bind=engine)
91
+
92
+
93
  SessionFactory = create_session()
94
+
95
+
96
  @contextmanager
97
  def session_manager():
98
  s = SessionFactory()
 
104
  raise
105
  finally:
106
  s.close()
107
+
108
+
109
  def get_quality_settings(tgid) -> Literal["high", "medium", "low", "audio", "custom"]:
110
  with session_manager() as session:
111
  user = session.query(User).filter(User.user_id == tgid).first()
112
  if user and user.settings:
113
  return user.settings.quality
114
+
115
  return "high"
116
+
117
+
118
  def get_format_settings(tgid) -> Literal["video", "audio", "document"]:
119
  with session_manager() as session:
120
  user = session.query(User).filter(User.user_id == tgid).first()
121
  if user and user.settings:
122
  return user.settings.format
123
  return "video"
124
+
125
+
126
  def set_user_settings(tgid: int, key: str, value: str):
127
  # set quality or format settings
128
  with session_manager() as session:
 
134
  setattr(setting, key, value)
135
  else:
136
  session.add(Setting(user_id=user.id, **{key: value}))
137
+
138
+
139
  def get_free_quota(uid: int):
140
  if not ENABLE_VIP:
141
  return math.inf
142
+
143
  with session_manager() as session:
144
  data = session.query(User).filter(User.user_id == uid).first()
145
  if data:
146
  return data.free
147
  return FREE_DOWNLOAD
148
+
149
+
150
  def get_paid_quota(uid: int):
151
  if ENABLE_VIP:
152
  with session_manager() as session:
153
  data = session.query(User).filter(User.user_id == uid).first()
154
  if data:
155
  return data.paid
156
+
157
  return 0
158
+
159
  return math.inf
160
+
161
+
162
  def reset_free_quota(uid: int):
163
  with session_manager() as session:
164
  data = session.query(User).filter(User.user_id == uid).first()
165
  if data:
166
  data.free = 5
167
+
168
+
169
  def add_paid_quota(uid: int, amount: int):
170
  with session_manager() as session:
171
  data = session.query(User).filter(User.user_id == uid).first()
172
  if data:
173
  data.paid += amount
174
+
175
+
176
  def check_quota(uid: int):
177
  if not ENABLE_VIP:
178
  return
179
+
180
  with session_manager() as session:
181
  data = session.query(User).filter(User.user_id == uid).first()
182
  if data and (data.free + data.paid) <= 0:
183
  raise Exception("Quota exhausted. Please /buy or wait until free quota is reset")
184
+
185
+
186
  def use_quota(uid: int):
187
  # use free first, then paid
188
  if not ENABLE_VIP:
189
  return
190
+
191
  with session_manager() as session:
192
  user = session.query(User).filter(User.user_id == uid).first()
193
  if user:
 
197
  user.paid -= 1
198
  else:
199
  raise Exception("Quota exhausted. Please /buy or wait until free quota is reset")
200
+
201
+
202
  def init_user(uid: int):
203
  with session_manager() as session:
204
  user = session.query(User).filter(User.user_id == uid).first()
205
  if not user:
206
  session.add(User(user_id=uid))
207
+
208
+
209
  def reset_free():
210
  with session_manager() as session:
211
  users = session.query(User).all()
212
  for user in users:
213
  user.free = FREE_DOWNLOAD
214
  session.commit()
215
+
216
+
217
  def credit_account(who, total_amount: int, quota: int, transaction, method="stripe"):
218
  with session_manager() as session:
219
  user = session.query(User).filter(User.user_id == who).first()
 
232
  )
233
  session.commit()
234
  return user.free, user.paid
235
+
236
+ return None, None
src/youtube-cookies.txt ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Netscape HTTP Cookie File
2
+ # http://curl.haxx.se/rfc/cookie_spec.html
3
+ # This is a generated file! Do not edit.
4
+
5
+ .youtube.com TRUE / TRUE 1732086939 VISITOR_INFO1_LIVE C9CdIsqNlmI
6
+ .youtube.com TRUE / TRUE 1732086939 VISITOR_PRIVACY_METADATA CgJJThIEGgAgNA%3D%3D
7
+ .youtube.com TRUE / TRUE 1724395472 GPS 1
8
+ .youtube.com TRUE / TRUE 1758954109 PREF f6=40000000&tz=Asia.Calcutta
9
+ .youtube.com TRUE / TRUE 1755930028 __Secure-1PSIDTS sidts-CjEBUFGoh5471Wh0zjYLjIFL7_wLj2H9Bo364xeO-uWcqxYbADw2Pr1ZUVo8wyDPHKpjEAA
10
+ .youtube.com TRUE / TRUE 1755930028 __Secure-3PSIDTS sidts-CjEBUFGoh5471Wh0zjYLjIFL7_wLj2H9Bo364xeO-uWcqxYbADw2Pr1ZUVo8wyDPHKpjEAA
11
+ .youtube.com TRUE / FALSE 1758954028 HSID An6UOYydW3sfY69rS
12
+ .youtube.com TRUE / TRUE 1758954028 SSID AS1vCLfdRFg8QDUnN
13
+ .youtube.com TRUE / FALSE 1758954028 APISID Us9_UDUZFBTRslgm/Aparhb0GEWcjyBFhl
14
+ .youtube.com TRUE / TRUE 1758954028 SAPISID jtxzuP-d1whcvsdn/A1_eOuEg1gsR6EDBt
15
+ .youtube.com TRUE / TRUE 1758954028 __Secure-1PAPISID jtxzuP-d1whcvsdn/A1_eOuEg1gsR6EDBt
16
+ .youtube.com TRUE / TRUE 1758954028 __Secure-3PAPISID jtxzuP-d1whcvsdn/A1_eOuEg1gsR6EDBt
17
+ .youtube.com TRUE / FALSE 1758954028 SID g.a000nQiOraiy2UHBoARZc5CUpeHeRdP9su98g0ZXPkTd-ZDDKAaEN-A3c_Ou-lpGS5qAipktZQACgYKAfoSARYSFQHGX2MiTFzMzYE_5gOaeLJFIHebKBoVAUF8yKpPxOA4mhGcL3nM7q_6ZK4y0076
18
+ .youtube.com TRUE / TRUE 1758954028 __Secure-1PSID g.a000nQiOraiy2UHBoARZc5CUpeHeRdP9su98g0ZXPkTd-ZDDKAaEXq6W1vUIdvUMpHQnZg0yIwACgYKASgSARYSFQHGX2Mid8rDzov-4k_O37C2K3zWQhoVAUF8yKqI4RNSHR73gyH5d1XqrQvx0076
19
+ .youtube.com TRUE / TRUE 1758954028 __Secure-3PSID g.a000nQiOraiy2UHBoARZc5CUpeHeRdP9su98g0ZXPkTd-ZDDKAaEiZkPDZcjbqNmuq5ktTeEMgACgYKAd8SARYSFQHGX2MizADhVvvhUMCKvajXLqaJHRoVAUF8yKp61R-9lKY5kJFdE3rvl7LM0076
20
+ .youtube.com TRUE / TRUE 1758954030 LOGIN_INFO AFmmF2swRAIgKYNd4Ptn6BsidzH3GSLlaQN_tKgaio1VJKyhNo04h_4CIG-Wg-xibDvpV2466_7mYf6PJc57bYHem2L_iUhaV0oN:QUQ3MjNmeFExTG41YnI1ZTFaX21pdUxxb05qSHVKbjBpZ1FuYnZjNVFRYk5nZ1VQYVlVSDEyOThOOTBBbXZNTFlxbEhWMGxmRkN2VmMtVEsyYVljcHBra3pSaXpxSTAzLTlpTFVCMWJfRFQ5RnNxallxbFRLaG9aa2J1MEUxZkkzZ0dXY0ZYa1FjWW1aOEZjSld6NmQxOEdFOXQ3OVhQSzZ3
21
+ .youtube.com TRUE / FALSE 1755930113 SIDCC AKEyXzUtwkBGnsu1hHMDqTC9nvwxfeVQw_dsj489AxXN6RB1Yrsk2WJAqfOlosElU40OPiX-og
22
+ .youtube.com TRUE / TRUE 1755930113 __Secure-1PSIDCC AKEyXzUMdLQzRbbU9Xd66sefsPh5i-iTXWrRhFYNbQZiT3IHNl3m-bQmZWCVRDXx1krn3pAX
23
+ .youtube.com TRUE / TRUE 1755930113 __Secure-3PSIDCC AKEyXzWQVZuUC3gNWHeYkP0FLdOuYCiiocw43TFMhhMTy8Qil8cxTzdc6rrb0_sv466gpwHjKg