Browse Source

Merge pull request 'developer' (#1) from developer into master

Reviewed-on: #1
master
zhangshu 9 months ago
parent
commit
f03acdf6e5
  1. 1
      .gitignore
  2. BIN
      db/youtube_prod.db
  3. BIN
      db/youtube_prod_bak.db
  4. 938
      download/1.txt
  5. 844
      download/2.txt
  6. 187
      download/DownloadUtil.py
  7. 14
      download/Orm.py
  8. 16
      download/SrtFileService.py
  9. BIN
      download/download.zip
  10. 106
      download/main_download.py
  11. 12
      src/KeyWordService.py
  12. 34
      src/Orm.py
  13. 16
      src/SrtFileService.py
  14. 2179
      src/hk_tw_names_20240703_v2.csv
  15. 31
      src/insert_keyword.py
  16. 82
      src/main.py
  17. 891
      test/1.srt
  18. 25
      test/test.py
  19. 11
      test/test3.py

1
.gitignore

@ -138,3 +138,4 @@ dmypy.json
# Cython debug symbols
cython_debug/
db/

BIN
db/youtube_prod.db

Binary file not shown.

BIN
db/youtube_prod_bak.db

Binary file not shown.

938
download/1.txt

@ -0,0 +1,938 @@
bXhm_EPnWyE
RS_m_n5l5GE
oj7PGVeblPQ
ausNlOUQJrk
05PVnmUjYi8
NJtpd7-K5g4
Pvysr8SF5kg
TyJXdyK_Aho
OfQZbrfb-0g
SvjVNVSwuF8
XcOevaLBmNY
g93ogrSbSDM
pBceUp7L7Ho
DZVSU2y3SUo
xnonzlTX6yk
EdGRKXMA1yo
5KRwX23mA9w
iPn9HbyLLUg
MPQJkvmSOXg
VgTiB--8EW8
av5Rbj4pOhI
jLUTJvXe5C0
92itdM_4fzk
GLc9o-ziiTA
Lb8MnSNqfgc
G4-cbmqwb40
thFQOqVyqaI
deyG2C5P4ZI
MmOeQBcN_HY
4_W0Ie05A1s
PRhBLFNCSOc
xWnH9WuH4qQ
Pm-5OcoxqRM
O3Vho7ITrw0
BJa77_EqoVE
R3rtQ-BBie4
juZ1y_suy24
AK1h6X7Vy6c
9v3PM3-IY-U
_6wZFNH_dxc
A7_vRWCnqD8
r_kiCJUCuCA
H87YoYw8G10
WzVg5Mv81UE
eVBiV1vXwuk
YW01ohYL-sw
fGtdBMxn1ig
FepZOEZa0zA
nqJWf4lY8Oo
sfxMhAugN0Q
-9eGr7Tir94
SDu06Hk7u3o
U5sGuBnkpWU
H59ah-8_Llo
_2QiwnbCiZA
rplQBk5UXjg
uNRk1pCXtzw
gOFuuPgtZJs
r9Wc-fun8K8
JZhF-CWa9qM
s7VpH97x60E
fzHrEyQoqF8
CfWUQ3y_Z-I
_1uRlBNi4K8
b2s494k8RWM
pks7nWNJtOE
O-lYQaaUCMk
zwxNRd-vOrc
Tsk219wxfUs
2cQSdkhC7WE
974qgpI9ZDI
esXXwoAfvlA
V1mpJDBclsk
tAb-s2rUIEU
jpGq7UttEns
WsEfQpADiWo
54BefoMhsNk
h3sNoA--MUU
nGoNw6q2imc
fHcIISVc-R0
LTbnhtEiu-A
vMplkBHvss0
GZRiNdjyQ_g
cJxSHCyAZGc
3WXO5PluQkg
40aUfgN0vYE
Tgj5qit2WCA
vkYzlXoMyCQ
n_tCgd7ab_4
e5c8584sHhA
TeN7hiD_g3Y
BZhwABsbkjY
PdZ60VNyyPc
pECRjppZ_k0
zDxKz1lmOGo
vdYGJfWSXME
oW6lNV5GsE0
b7GRlvef8GA
3zAX4hmrqms
NNdNMGbJKKg
RcrCgziZEv4
6ik88sSo4Sw
vdVlqMVxfU0
Ub8laDfvSk0
0cUfihFcQL8
mc5juoR5YOA
GsGwAHFo68Q
wXXnegHM0To
2ZUAnBNQdA8
DTiV1iKhExc
ZRp3i7-wWkw
KUfk37i2_Q0
dlJdHAoUhO4
toVDWAL8aAQ
fQFoJguzqKc
vm1pPOABdzw
aaZRC8exZds
JXoKchiev9w
_RgXyqX0wgY
xGGT4LwGZtQ
P96b_msFuQ4
OTXJAA-yf6Y
1KD5qzN8yTE
p9JBi_72qTg
5GInuq-_hv8
q1R-bwDlH2Y
7K3Qt7TaYzM
jBDvt6tS--o
exIbb0vt7rw
kxaKlU8Vsgg
TPrrEsQxdc4
5jRaiztjr9I
pe6QJXG9F-g
4eChvgMhkvg
dia3-_PzyNg
7BTDqJ-ackk
PUls4QmR_ro
-diLh6pizeQ
oldIqTgmf7A
923e8aprSlI
r410i1IUnP0
RerSg_4E7Jg
N_qCNbwODsA
gzQIt757uzc
GHzw1HY6sRA
RS36xWidtXU
d6wO5xYEZ4s
0zZVT6hgInk
gUy2Q6dJBuY
tHkoc2ry7O0
pALAjY9rgtc
w5fDq2HF6BQ
vtPswWzR1vU
GjApBeItsKg
IxiPZHsBpFg
zYHUH20uqzE
iCMxyJDCawc
-vNG3jZqIDc
855fzLnhFsY
dMkferLEyj8
N0oPc445U_U
H2F4ku7nefU
KNNyzXgLQYE
NhgywTXOAz4
63Wave4P2rY
fl2GlP51ZHs
PhmbV4Jgvtw
5hmH4AnAyTQ
qii7X0u1b8k
QdHwHdWf_gg
EcZ1eO333x8
fFXK-yefTRo
7DKukF2KCRU
_UY6fsjSEdw
v74eZF1XdhI
YSDKozRxa0Y
Ee15RgD9b1E
jQPTMImR3QM
cwyBdUTUFc0
hUeTs6MqSDM
6UCLK09OlKc
pxa5WVGRLoI
vPmOa_Y1fqE
N8NEk7DCgU8
MwDU2j9DvHw
GYUPGa4HQPg
gMPaOVjLyyQ
1k1TFzw8erc
Nmoc69cL6fI
kn6sQoMY0bQ
aiVZwOgDlU4
DPr4fA3DnM8
NJSVQue1Rlo
ITquAe1BaBs
yWmXgn707i4
lgiJyPsWSZk
yb3T4-1qMAY
PPuDIEmmZKQ
ZOldilYU6yA
AaHWU-fUReA
EaqX5Mh-TEo
MSpPsRjkXLM
TbPnqgFSeLQ
4QoKbd5zNjY
lreAQaYD7DM
hBzmwaVYYLg
9z9tFq5k6Kw
2fa0lntUQO0
rNR6aMlsNLo
sJUBWilQpJw
VvMQxq7wU8U
1y5GvevF10E
jfWmLBujhHI
khBFrSwfDlc
tryTAxF-Npk
UV7fdGvAgb0
STchzxGrS_s
JUoWmGNsQUA
_315UjnqjGI
LmBvsgTLUHM
Xo_x5hcI1JE
eH4xg4nf5dc
6cjOc0RGtUY
9zKjLyfMIxg
HGf2C-eHrM8
Pb7BHtXpIZI
aeVjNR-vQaU
W8WumC-49ck
cs5czxl6kJw
yAAhDLpCX6c
3J5xJYWuZu0
qQvB6txr9xg
pWmmLkhHjNE
W-pTkSXcmBU
FMxyZQdbsJU
jSWlkQ_yb24
GjPaiBa-Tos
N7t7qCr7-9g
T4M7Uv2rktc
f49CmYstRLY
ARphmeUQUqs
a9NhLXnNVR8
roZB5TMLSk4
wGsmfV4oT_c
R2j60RIiNlc
_36aymz-uHA
ogT4z94NPcQ
6r-X9zqmNeY
RtpIEW4MNpI
2XXXkUCnJho
aEIZFoApd6c
kqEbg-3ZArI
h4hPurvZSZg
ae1iwnQOKs4
IOF8vnkmy8o
0dIUBy8o8w8
RAQHGnfTn2k
uVM0ZGdF7vY
nw9Lb_-8mJM
w-gyzwwC4aw
tA_gRAE-4ME
Uqcc88v1JIE
lgXm6WlpRH4
TSf4E8ZQ4Fk
FRKD7GAukWU
zQEMi_53R3o
fZhNEL7h0Tw
FUKbW3nrI8w
E5f6hEYYFr0
X-UhbbpUPTc
J3sBGf3HZ2M
L6qs82evlQM
P5gj8rsBOZo
pcWJ5A5xbpQ
n13kXwptAFI
vN4Izh3i7wc
ezs3dEQCOb4
cPR7oIYgffw
MAHoGAX_O84
Ol1Vks6C1lo
9hv_PZOcI9o
Pyg75pvmHtk
0UVCWhmk8Lc
NiBHpbn5vvc
ZTjioIWf--U
XnNpUDyzJQo
P8XmJW4ALfw
OxDHN_hNtb4
JsxQuUnWFDg
E4fbjnkHITo
y6J76E9xftg
9QI1q7zGq-M
kA40StvCSak
c66LTFLun58
yubsyc0rE3A
uJcN5jY9kKA
ozY2DW7h3N0
JQzyEeq_qHA
WmPWI5T0P1Y
NsvZbWnbSi4
g93Vq2f2ah4
0gcRyR8flJs
z37N_00cC8A
tOkt57NxTd0
CQAtpnYlKMU
enILA8osi20
ajw4cHFS-0s
7DFqorM47ME
3arFGPJN6nY
xQg2cCvAPc8
nJ3HUXyXqoo
NY05P4zrzSw
Z1Od34Lkwdc
5wm9VrFiauE
uG2KswpDGw4
qOpZ5j2G7QE
FbBwtifUg1o
Mq3Qe9xT8Nc
V2ADUY5N9mw
VU1618jw6Cw
QWQ2bc8RK1c
3Bt2hu8lBEE
ayWVWAYktRU
fW8wyk8rRHQ
RhoUlJnM7hc
MQFnLVXW4Ks
pAFcFos6nu0
mq-ngcbLL6o
w7fjd7ZwblM
k5DqSvz1JKw
vOvM1MbZHz0
uyKm88WfweI
kjeEKOT1Luo
P4vgtGlASRk
mJ8-zTaYV1o
3yHXhLEs7LI
YbJzPeL-VGQ
PKFrqCQOZyI
ErtNCjNlUfo
vNBkNKax-Z4
GgxxggHvG3A
ZN26KwKQFvM
4yvJCSIGLg8
XUl_t6Niqf0
ZbcBo4ZmX2A
c9NFgy766MM
iMsRvRm3egI
p3rzHam2Mjo
Q1TX9Krb80o
SwWn4Sze3ig
DVj3yozJlYU
vT4yD4i9IsU
eb_kaB3QAxg
CZ9tIC3gzZ0
d7FsJcg6VFs
3pPNaGEzgbs
QsKrp1U7uto
V7ynsYAEjC0
xUMaboqMEXg
2EmYyjImEio
93zhgqnzM_A
CiOd4dN8930
_kwilbaoq-4
rSYswYc9nto
tm_YYLoiRM4
lM8vffoJSfA
OjUutBiA2Uk
SAh-gHhujDc
DxAF69QGZF4
uBSmzIXVOoM
UeMtNPoY9Ys
1Ihg0m_7YBI
0YsfFw1-8z4
8zxb_Bca0Aw
x5vLxLWPrR0
P-Gdcr3Rwxc
k5Lm2R3RUZg
GtPwGq6TsR8
jyhTi2O-8uU
HPgxGFbSYyo
_wTRkaOFOUw
ZxHyry6j8GI
O6B95eQdcTw
3OrV3ceynWA
r5hRD2eK2k4
piBNtx07tTo
DHv3PRwDClM
aOA-1Ik0R2c
PhyU80iN3-U
p-5QmKgWee4
pwsc9RKSGlM
MBWDYIRTTfM
V8mRMRm-5ig
F-Gn9s0oZ4Y
W5H9pQsH7Do
W5Sru6CWHu4
NGxwyni4gEc
Y-boIFMAqfA
h_Q9EuH9Vp4
wiGPQfCb3rs
qS8bu-LC2mI
ADMh2cFDh4w
t4e5bbp3yFk
7DQmYOUM7DQ
ZrEu8u2GkQY
YuslB4M-_b0
gC6pAUDKS3U
jRNPlGhZaY4
iiLh7UHu-bg
ddeLMeGcc2o
kf-Ro1gHimk
aWEZfGLdEH8
qMCUbiKQ0sI
35d5Rdct-zg
uFdZ4jyl28Y
lsGQWAbrQuU
vYeuTR4J-pQ
bfU_tvukEWY
SS_XlqqmxxE
aoPzysPXFCk
1BKnPoCe264
Tjc-6-PSrno
b_fZvAiCEIM
k5qUq4SnGLU
cM9K90lUUmE
v7WGnI0HEGY
BG2SagSRJPY
najWp5dkHZQ
Sk3DjcAYyHc
xpb7g1WM_y4
oiSKF36XkRc
77fduJAG1DA
3E2UEPeLygA
qfGg5GeT_wE
i4fh-NbSKHM
NzffTzHZ16E
pauNShaBuNs
XaxGzCThuBA
ZZ_9wU82bF4
_OCWHZM8Vdg
vm_NPzJQoXY
Wz-bDdTb1og
yMEFJH-GRFI
I7Aivt9D3pk
cpepW5i-xVg
217cPJOapbQ
d7ctBDcXhp4
xsTcrAssPU0
qIVvL-aFBL8
NwzavA4p_KQ
eu1tJ5cnKCs
Li0n71-gEg4
4qrsqjz8fr4
tb7gOanBmf0
n0bPfsiZWQs
kvCbgrMXWoE
TDvTkAmSE0o
RNban9kFNtw
jJziZNLJ-N8
xS9byA5CeH4
fjYLbLZJPKc
pSmjbAXVJBQ
YgZJaFckzuI
FJbx4oCunCQ
GhGL73gc0H4
QdBB2_Gu6sM
unEK4KHjTSI
Ni3Re7OqEWc
jvpwNNVlAWw
-hdWQL6bWqA
FL2xZ--DOp0
T_oxkC1k4vE
zs__bkxbz7c
u0HdvBUnwmE
cDmL6UvYO0I
CS40z4-t83w
FhKfjo46UOg
aBG6Z-ih0l8
JmAr9TUY6EQ
AcTUptb5B2k
oKwG-Mpd9vw
dqYPHAvSaGU
ULZFcnCrd-g
avabYRHk_VM
JCjfqESS870
RAQW5mWdVlU
RtCH-KAJI70
Yuh9cK7j7fo
og6rCFAxhIc
351v0buuz_o
_nLEF_GwBVI
Tbrm_s3iqQ8
UavgrUR1OkQ
ungPjLDLP8o
iK_I2OJkN_M
42TODu6XW00
-cpkcfo-og8
2CFBR-G47gU
YML_TKyFNnA
Yo3lxbsny64
wregGLnacmM
lgUQMm5tl0Y
-baKuQlJJpc
jm4wnOrpXf8
1JuCiu8YShk
w4s5qB26L4o
CbdphiJhZBs
vAbp-SULHDA
xng0euoZOgY
PXLXMoUmdNQ
SLUbW6c_bOE
ZVh_Qm_TC-0
1sHL8Rebzy8
dBcIIBLjTsI
OTXhEzwqnd8
zlWQnQtmwsY
h1Ry31a9ePc
pCdMx8eg-js
XvAqH0usngM
4iWph8VLgZ8
5eLgzz1l3DQ
v-OKq0vXeGU
HZDzNUjPAtc
3FXb9oHuR0k
MeQNbM6OfuI
-vppUhJxiFk
2_vT5ZwgX_U
f7R73cx75e0
AhsUGecx3dk
OMzX2_vk2Ok
Yb5hx2AOkt4
ji5FRfAQOVY
LOhW63Y3GIw
b2qB-e42jck
dwfWgU1tP6M
9EQsJNRRG-s
5bjP_PTEG30
T2oSWYTftrI
mDAjyEBZq7U
9gy7TQ_uggk
DOB5vgF0UxU
_Z6Za8gS_ZY
4ywEi7L_rJg
yx7B9LSbFvQ
8uUc0stMmR4
Get3uYL-uTs
0C3BcIQgw44
B4Ph1JQ0cpc
pgxcOUNaeNg
XvqAA_-wyuo
sHsnVZYTl8A
Bn9UyL5IXPY
sDQa-N_ryao
jpPpt-ThZww
N0b6gKUsNDU
EQjF76X3Kvg
T55JOnAJ1UM
G2OqWODLnwU
qLUNJ80yfaI
WUSlcDwzCr8
HRynBT6-HEI
NvsomFAEkjk
EAsLoCsRSOA
nNkSzRAcO9U
37sHOFI36Tw
2E-e4_NW7-g
2TjnQThTh9c
dLqgn_d4_B8
bPr-jw-ufmY
rQ5MB99ZUl8
5TLM0taAoK8
P-GSYNX_OIg
bzLcRuAcNS4
4Ap4QXfHBqk
QxhgJ7Iv2SY
vuTiL18SujQ
YBOWjUwjA-A
K172_8HDS9g
ND_KfwqZ7gc
rdfGcR2NFOw
99yrihn5sxU
gsEVyWGs9J0
u9LbJczE1Jk
BfkfvGLXcKg
nOXpZS0aL7A
OLL4Of8CGtU
eAJXxz6H1-k
tHEd4kdS1RI
8Pctz4lYSQY
JesA6QSZuTE
0dJg5cPrfuM
9fGEr_RshgY
qyWz4qpIzL0
c79kHqckhm0
amSPleTL86M
bEMwPHbiMP8
l0co1HX_qZw
xP5OEsR9PjA
o1HEGfjKzA8
vzDI9oPyTBU
VNTfVH9RzH0
vqfb1-dV0cM
IhROkd7-Ewo
aF5uIX8jYfA
OzV9V9gjVWw
mFEjwJ0Es-w
rIhNiOfE4BA
OlCMzzimW_U
XZi5YVDm0nQ
neafv_YT590
DaCQH1MDe1w
DBs9kYkVG-A
i95ILiKqWho
o5_fjaLIw38
hVxupKZKE9s
TLK_k0ScQYY
Ov6RSXoINwM
59-nvyefxq4
i1meEhY9Vhs
DGRbDS1a_ho
t579Af4dz9o
YNn8fiTL5q4
4AkXK7N9kC8
S8azl1UiKsU
aQ5lCKtB--s
frG86e_YfY4
cHSHK9NHciM
i0wzaKz2NkQ
VfLWzEArlpI
FjJ2OfA79sU
aLBwBfuIVQU
2d3iUIW2FJc
X4ag3QMfWpA
Gdsw1BPvzXQ
Rv1rLsn9dMM
1nH2nd-bfLk
cJWJvarZgJE
3df2MyIio5k
VsxJiEcnvrQ
H7Q57BAyLd0
OvMCXGdSnYI
pSS_7Gi1fFE
n78sJTLz-u4
5XbBLo9ALYs
w1XvZQGJwxc
Uz3ST1xfbC0
Qz7VYhJd38k
Mw_XfqThkug
rs-OMfV27ns
vya6XnW_uHI
Jx1oX6SYis4
WRGb759vq-A
vBdInqhLHEs
kwPgxxeWplE
I2fRpfJDJsQ
ukHQqvJk5jE
TOfo0MjGGKM
uq6khP17yQI
FHMHXLFaJ5Y
VH440tMvLho
T7zq5BlXNy0
Ypa3Kw2_iec
n3NLvpGHCMk
xgGMXXw8cWw
qUp_BZIA05g
6kYymRENLmk
U1QJEfT_sE0
9lm7oSFptFA
BR2SuSLxDSs
LCxCc33MOAQ
Mg59u9vR3JY
VGm3K1XeS5k
xOmuzqaSvXg
pvq3_4OpeDs
BnRB_KfFABI
3LwBO8TNHTo
YNWP31wp60Q
V8qJ-SsdSD8
_zXIdwTmCPo
J5FsulhY3qo
0jUZ0MILRJw
x36Mko6tE-g
KQyb_74YMGo
KNrI149-pb0
0XoSwrY0eJA
dUl6aKIs46g
RyMjGntLPug
oQA3C-flnXM
dHGe_-auj3Q
XhIo2khvIaE
XJAk6y17IdU
w4GszE5pC20
HKv_90w9pDM
SsClqGAYUP8
6YD3SG5bErs
kztJDpXlwPs
wRcV9gugFUE
gaisFdpIkWo
WHZThJrg_mg
KFMKZ7UO8cA
VNSbYG24VVs
bQiP_SZktN4
5N0201dSZlE
DjY9SxNoW8Q
3_g_QWXAzTg
n305LEScoQs
H0JFP9NpO70
QGvae363cXI
e57Fhj_gsA8
uDZ5iEvAua8
yvaEHa7Pds0
u80PDweSyOk
oYqmljaKBGU
6kySgpTwcPg
UJ_4GCJEYbg
_tHkgQBTlBM
S5JsM13ENWM
d8OvlgDqqxM
WoiBtgS8CT8
HB3XvkLuegI
Sds9_GEJPrM
vsB4fZofVSg
XLdKxDN86y8
vs3Q3RpO09U
jKJQKPGKcMw
LEIwLF3egoY
NihtDmAcEbE
2KECnTyxezc
GyBwFRV3ErI
Xb3p-WcEuPU
ld7XBH9nomk
YVICTszK1u8
Q5Mp0MISWMc
5OnN2lkTDtM
Uu0PMBhQ12w
W9fNeM3N0Cg
ApqGK0tsbNs
LFg_7DuFfZg
mYqKI8mrCtc
OJxVidA1vvo
sTF_IQ4buDY
Sbj4WSgNgf0
icHOYk4s1WA
meeQnTx7Qi0
fDusBxvn6oI
7OtBk61YWg4
aQy_YJzwyMY
2CD04k9R834
6GpcndfzPCU
qdoQ5iYlQlg
HeaLOsnt1P8
pPp48cjM718
oZdGf7tTVzc
yl9SmCggRjc
bmXJtvc1xlQ
0PtiFwYUB8c
62KZhFmPESs
7lnBueaWy8U
EKQwwRgt9p4
XbOTtnfocvw
q7-_I0rTHP4
pIDHMaIsWrQ
f-UZwV3mgbY
aH5Rf_dLIdk
4oAQB6d45w4
olhGeoNTric
OZnV5Ctf-j8
9PZFv8sE300
cdVeMvhNie0
h8Wo7pylXII
xJtdc3FFDrk
1NhfiRdUBAg
A1YSHUAttSQ
CoDWq8Lbquo
XMSyPuHJHSY
GzOTpwssjX4
vHXpDiCEJA8
4XgGLHnyWOM
D45s1E23OqY
wj-Stm_pPoo
gQsuQtPfzQQ
_lxlKNmL3Z0
0I6x-xNYj3U
YSqTSjDHiRI
-U_-aN50cc8
jCn_1vfvDS0
YjkSyf-9PC4
0PHBbP9yWMM
eLKnqrfL3_A
WQ48689A0xU
uw5ykW4sdhE
kCsEZcXQhL0
fUnyVRrQogk
1hLFdNnhS1A
fXyuRwmDr0g
WJnKxN9Xs5c
GhS8NEV4UdA
Zx0qLkVke2Y
N5QX5rMOYeY
joxnqx8EsD8
_T_qQxe4AFY
ejoF_UmuwVk
ddQ9m2ke_MQ
O-3B3jCWdzs
75JT0teaNLU
FDKKUZeg38Y
qsN1jmxJYtY
LdglrBGjQmw
A-rb_kJ67Zk
XYk893YsAeM
r455XJ_KvFU
ibmmonMr-Zc
nWRyxW9cBig
x1fddizb1TQ
_Ai47vbPxWA
9SGl-0dsCgY
UZossF145gI
t2BPKlG-K10
IV9JlCtJb6I
3Uf73Qv5vGk
zr35xktcl40
40qRgDpD7yQ
8rkN85HR-04
gf-hA-lR4k0
jj62STZ5ZcE
it4LZpaMY54
1DGbbbhv98U
t4f0zQ6nc88
AJ-RMBvphbE
qolSOc_tPus
vqbc7iQk2kw
FTGZq_tf0kI
iEY8aG1tubE
EPfRD6Tt4I8
aZLcxV-ZOCU
w9TUFqusf7o
dKoY-6MgMso
8SLNIs0NYHg
yGWrT6P-P48
5e10FKEoRLI
CGGoj0pUxdU
4qlmOPxfn6M
YyjFhMrkpWM
jdx3clxa-3c
7AhpcbIjb7Q
vt8GXHXX2dM
YBJ6tbYX0vo
9geLV3u585A
3sIfTZ2MtBk
gAPlTafSJ2c
rMOacrOlPO8
59xU2fdYddk
Q4VRNcoeNcs
KfV12SRFNSY
n5qhXbC0PjQ
6WCwzr0k0Sg
f7fZoGXD_nE
a-MIf-bP8Lw
VDab3upvmFA
qrWsA6rE8pI
uj2pdb737_M
FPUOaLYmYgw
s1r1sKMyxLQ
m7v48hXJdFg
izuk5Zcz91M
zwIukoBIFx4
6WiLFMH5PRc
wgCzD4QnrRY
PwYQ7E4KSI8
CflpsCVEaBM
HLKoQbt2MkU
QO2yCYLqR2Q
CEABAEiOpMc
c22mwHarpQ8
x81TgojyTgM
3v8zPPcWhFU
TdVD3U7OS9c
rtnKT1lfWy4
UshOcMvbjrA
klp14klyYY8
ZizsfYD9gs8
hFdfI4qvoE4
94V_UC7nGWU
w_we60nkEM0
5Tee4pJ7NHE
ZMCWTvYl15A
EjzhXsLBkCA
llNQlAy_V6Y
fBqKM-WiEVk
X-TzlpvsUAE
4dtFjgrHFEU
Jxg3Sj1vW74
1I0voQwn-4Q
G0s8Zt_SFZs
VYPVdzaaZ60
R5ig4_p1knw
Eqe_47Qzw0U
J8s5wsPoFW4
dJ-VFPgvp3M
Klr1HyCFyAY
M1UsyRHSmfY
Z-mMGE17Ohs
ozITfcCJDiM
a9-V41Obr_g
ls1RfqBD1uI
2J2cdnsVIHo
1VXf5nitQXc
ey-LKwwh5hY
_gr-Ty4Z2dY
Q_D4uVL8uxo
rd0f2PxoYQo
lLFFcujCYuE
CEDukM4IJ_w
IQHpbmzj4cY
q-lm5H-OqtI
YtSD2_Ylb40
9_O14WO2Ek0
5bvddaRc4dA
ng6-DvURKuE
UPN0vn5WnfI
xgMWSFySlWc
837vQ5Jyz3g
QWNO_iuofaE
XStV99lEXsA
dftIfMGJqCM
z5FVkn72cLY
N0cHOdRxkJs
TrNSacVqgVM
l5f2mI6GNJc
nxyST-fygkU
e9qFzteoO4I
AXCjUzfdFc0
BOMLocijYPg
Z2Jz2Yf8rzQ
XZ-AlA64y4c
DpODDZQPBuo
XgvQB1AdrGI
8Z6bFA6RIXk

844
download/2.txt

@ -0,0 +1,844 @@
UWtl6qGwWi4
z1oUmFdjBLM
WHxOQERmjj8
vP45wBOQLS8
zNRvAMJOfAI
8BcrPvTRwEw
vHUZVwvvP7o
q9SJrKu8bK8
8u29X8-FCdI
Xtzn5vcwd_k
u-OUVJ6Q3BQ
Q6eo6-7Zx2U
lZ2Iypruyvs
Dj7vqdzeAsc
AutEIJPO1Oo
U7Nz9hYubl4
VDR6vTLVKpQ
0gLvaVGzDLQ
JTHIiWCH5C8
XW1CPagJrng
lDrgvXXePa4
qOceoS9QfNY
M_djroI_SUc
7lcDcukeXL0
G4Q9bKjJm80
SJjb6s47fWM
JtIeGF90JmU
0qWGp3qLz8w
fyyjR-oV2X4
jcxPGt8hYDw
ILZqg8r-4Cc
tq-HN8NH560
bh5nwvHRBnY
bwHS0BBS8e8
CkdmEcxgA8s
DJpyqvikK9o
xdl6Ha4Fnz4
b7XxeNFPufQ
N1j8CUU5u_Q
VII78ZbiWco
rUZ4do9JGe4
CNRZZypRzcQ
dubffuGwCnI
Ck_59cugFk0
hyv7LIP2flQ
kE96mjfBim8
GMUPDRfi61w
DsizMS_KZUE
ppDxRVMngAs
vfd_8wQ_N1c
QYD5TL7DDR8
lVaClhjFYG8
zUVDbElrzQk
w11nkI15jSo
xpIdVqis9do
Sgo5ZA3qTHk
r6Puh1BGegY
0r2Xeh-pGgw
OqkhMVz4wCc
zHJB4UeKhUM
9ISGy61JnTg
6UGEc3R5X44
szP58gaqfWk
P6Kw8tpGQBk
7DptVeMPn-s
hWySnyhms9A
NsRmJDJCE-k
EIpxpLcEg44
7JRL7cb9Jc8
SQdRWIYCFyY
Rt2MnfWBmlE
3yHjCd4duDg
Qeqd6f4kZPA
minjC6jsvGc
DvQbBsYqK5U
0c_UB1Vx-MA
qRVIfAooJ6A
lkd7btzsXoQ
kAgXGVrnj8g
TakR3fGNYgA
134IqJyqTOU
an0lu1dcuC0
dcNWZQ3U7bo
miJOayHbOzQ
uW1k4uu7BNE
T2PPM12euAk
qmZ7iEtW1Nk
a6whaN_R778
PlKCr7wyqfs
rOY4qWy9ggI
lgE4dL93AsQ
kUyvsOqSmAU
vWOsT03UoA8
kaK-PM_lSgo
Ln9MN0stlv4
y1C-sZa8EZU
nKzBuKPfgmc
HIsNBvjus9E
0KWqjlYOq7w
YBV2_l-_eDg
iU6M-A7STwQ
cZakIrpAY2o
Wy7jEXVqoA8
-OVbFSrWCQY
Ff9-78ePMz4
LvofUAyjXGE
0mYf3i_TpTM
Aiy_NBnVg-o
GYCotOWMli8
afkHFuTZ1Pk
k9h8FcPPTvA
R1YfaukAS6M
OKKaSdbR7Bg
0B9e_6u2Yxo
wQIG01MYCo4
uZgl6gk8zVA
b03hMIPeZJs
Vanrw-pOxd8
cT2hdetPVPU
YbVger_nh-s
71C_wRR9sh8
QhpOev19qNs
L0513-woAxE
VACIHBkM2zU
1sF-wniP4M0
2tJ6wNDuQhk
RDzatS8S6NQ
XuL-sOgI1ZQ
o0J21fno0JM
bRNZMl6d6kY
gZjz-khSEh0
ZhIqqH-Na94
lMnwqmKymas
LW4fqta-pLA
0dwS-FBhoAI
IKPjKCx2vsg
a-287O54ZIs
Mi9Lm34Wv_Q
1EVtGvA3-3A
_bhF62xQvi0
PbvLvGkIOn4
zlAF-ptPYVg
dJ8bHIV6A2g
Uthr81xxaRU
36qbHik7c6U
pQbYHOPtMlg
ppwG1NoSxIY
WGTAo-U8aQM
bxFw_luD0Zc
naKGkXc6BSc
F8ctvrEEiOM
NusOfWWjvG4
uGdAXZNRRB4
wqEQgkOiSng
ZwprAHq25Kc
KQi1IfA72UQ
cesA_CNSxvg
ec0on_nfWso
9GTTxDzICFY
8_9gzAqqXQc
ZTQiXvPig3M
NAhVZOzaft4
hCpVDYGfh4Q
U_qym3GfPAg
sGdSvaZOT_Y
mYgCld_f1sg
kvyhv9p46lI
lBYF_5eTOXo
kD0fOuNq8f8
YG258iaFdo4
21zUEx7QZ90
hZ3IOfY3X4g
lfYcXHkpno0
_NS7cWO16SI
hSYHqPbyETU
Zplt8BbzQuM
_S0UKtzUcjQ
Ovw02gl84TI
QW3XHmbAuLQ
NsdCnkCkpKM
hAXQAzT76to
OxtsTQ9Pkn4
3cz0MT1NxYY
Ivru-6cJ57I
8xM62YCiaso
VVRBQLiJ_k4
Tik9Bf__o64
lLqyn_C7g2Y
_i5CoY_LMYs
HiQUQApU-HM
J2WRd2zHiDs
YtgWm3dMhUY
K0LzVRhq0Lo
8eExicJR5rM
ebed71b-76k
7g9ZXxIDvDA
XBlXzrMWetY
-eVd337Aqdc
mc7gvsDJfIA
bVOQZ8plSjo
oi6n4ES4V0w
PU9JATcXEuM
B0zC9ldLX5c
XOtfAuu2Ft4
UXyRRqMZXJE
_ym5HwykD2s
d-hHmdHyJ5k
Sw9S0JYKu_c
GgRm1RxIuK8
Ks7ZmLAEJ_w
OQNHhSCaSsE
BhhOlKCj7sA
5OY6KvNwW5o
SoPb5ajisn4
QTF_F5KYOVY
Y680xh-MHDc
5X0y7dBK0-4
JgvHyRbcm6w
J4ttfZpy3Iw
iyp3xsVQYdY
ZimszWryrx8
AsjngETV-sU
w096RqLsqoU
BKA7zeYEa1s
4sJuQaHyUhY
yGWHO4K15a4
gjy9ns8Y82U
Qu5tFss83NQ
_j3uZbv3zQw
DAz5OUKO5pM
Z6EsDXnhFM8
UV7R78FgZmU
0-LuGpFlMtA
DfQ27TD8KQQ
Qn1V7ljJ_-k
DFVRJOhdvxo
eE6F_wc_zzg
4xAqysb3jpw
DfZM8L_72e0
ptt-J-X5TOc
zwBVXdVvvto
pRYIiPdV4N4
bu8NfyQOA_c
kah_Gnqmoeo
XPxjjJNd8-Y
PSqjwzsycE4
LFxmrvetjBs
YNk6PLK5yTE
I3YtSWY7orA
MHn37ruwEyk
pPNGgNPIcuk
e0ih7B8C-hA
-N7BceYS8Rk
YZw7b3Ld2d4
BN0Z1Li5asY
XNmedeg--ao
BCTEJuVY2SM
rm6pqwlQetI
kH03Zmvkv88
6sPfR3uLFGw
qwJ5wDiXUoI
54IB0gxQSjc
SxCh60RJsGI
oKeLlfU6m_0
2JkHVr2F8q8
48PBWRbB8_o
F9XZzBEL6JM
rVaMhMliKxc
ri3Xd9ACpEw
99eqLXRVbI8
Tcm2d6Fg9-M
8VtITkvKXnk
f8F3f4wsgws
zu72j73Zd-U
3Ny9aDDM1Zg
GdDXz86g72w
cialGlj3K3w
tSJ5PMOjj9E
YdwMV13eTHQ
B3fNZi4Tm-k
jS9dVXMRYvo
rsjFjJPkGbc
rIuxYR_9fQ8
iKaiQNpehE8
TUrM3t7BtOg
zKKHJqWGPlY
LMXEqWjmFNo
lYNf7I96XWw
LqzgPB50JJ4
L5uqiFGcc7w
QQfm5w-6R3c
VbagGmFzfXo
S2-nVAEeX6o
tK3SWHSAJSY
WIw2zrtkeQ8
pJCXmdn4H5c
SruPW8VJk_Q
MeqEK3jDR9c
LVCCOJH2jJQ
cVc6C77M9T8
XwLUBFJ4nRc
dGDrRZ7xuBg
mIjXVvLJxds
plsmu6xIscY
nml_koioK_w
ehJZnsWijGQ
vKXEPDEpQT0
h5VGMxmDBg8
BuZbZ8BYVlI
TQq7fc93lXA
hD-S9LlDtBE
AUa7OqqJPDg
danEfcTTOMc
utUY_zq_f4o
BNSLnOV9fhU
f56l-3fSRRg
uIRJKyHPR7s
GMKQjhHke4U
lETY5h5S7QI
-qcxWa2Ma0k
heAqqvrC2xU
ZwFktQC-8ng
DMFklDWkIac
rOwX8fw-hbU
Uq4-g0cwcns
PVi74KaEoqc
snOwJIqUwUg
_zg906NM0c0
9uArbbpq8Dw
2TY1owq0vXk
nx13JXa6bb4
s9QettXrHv0
ZeQxsYGIN0o
WZc4nPtReIk
aozXX_A8A-I
762iPaRbbYI
Vu7bbYBl-sE
FDpTv2P-3js
yvpINJSoG7Q
iBU0MiGpsF0
2zJ0_VWYi34
7UyfXElZtK8
mXpuyR-NTlI
kFzWiLB4K3E
KBcx72dwdy0
lNRExaIKz5k
LzRLGxOnnYo
QWFdQ1kfUK8
FFpx9WboJrs
fsmn0Iu04O8
kCzfw_mrwOc
tnMpIP6KlNo
oMcRx2goEnI
ni6tGA3mw8o
vpKJoVtic_Y
_erAGggM1-o
evU-adA2KOc
TbYvznjRzCA
P7Sm14AW5PM
EoGw9n5MThI
IkXVjRw79Dg
QoGJV5AO3IQ
WypLtEyXIeM
4zH-xz0CvhA
ZYxBj7I1Jrc
BgdHn1l7IPE
AK9IFG8kWxk
3dwO5oRudU8
jMHpK8GwZAA
dQ2bjo07aNs
2rYA9ouawDY
QF-iYYS4tno
Ymds3RPWLz0
7gf_bApDZoQ
4SjqkZJYKVM
nhrzoMlJqRU
9zpL9XQzKy4
uUL0nY8bfrg
PsQUH1_898M
aLtCAOP_hXY
YLGQRly_h7o
bqxfbOiBfPM
T2mv8LHz_V4
7SR3DILYx6Q
kjRklowoH-U
7Z919yXmPT4
G82AfqeprR8
37hCnVpQD1M
ltGND9pANxM
eHOk8GPFjA0
bYtwDRJyDP4
vps2I5xVYa4
z5WY2Sf4MaE
EqIeqHRSQxA
gb0k4YJQHHk
K-l2RIPZqLM
QrS0GESLElI
f90J6B8mplw
hgAKD96Yb8w
EKp4uIDHpx4
h5EjP4LVkgQ
EYOe99oay2Y
PaYiPim8U9Q
8OM1HhLAqIk
pg0-ORqb4VI
NQSurtmxC2I
GiuPBufrNx8
12Ns515_mNw
yY5OY0P7YoY
8LnSbIu5WQg
bCsfvxGlOSo
6Mx15eJ0gSY
OliqIpqvDIk
EswWez1IQpo
Z5npXPnItPs
HyXH0hO3zWU
dTGhDKV4u9s
NTWEmRo3mKQ
e8p9SEsq8II
dGFyDcceKBU
7TaYvpbav3g
j4GnPFT4x2s
8BexTuA2uV0
_GAO9VOCqhA
F-lPioe1q_g
kCDJysf2qbo
h9qH_56nvZc
R0otilV7gVM
FzMGrj781qE
ohP0VNOdkAA
XtZfD8BgSoo
aqMhscNfVy8
CwQEp_i8_IY
vuDHG2RAg08
beeBnMgq-Q4
3VF3YOkCrtQ
sQj3fSLFQso
vKijAA-ZB-Y
aw1i78Boqtw
F9B_udpSQ_o
FBa59sjpvo0
bymzxbxDcxc
EfJK3EJP4Yc
SC8ISPrAH1M
zOt3ITGW_oQ
eiNDYHLonYk
Do7-mbJgp_Y
YOZvavHKfTo
oN6gm9cW7AQ
FZ-cZ9AV5NI
FMQZKwiloKQ
5NPWrm7fzuU
SKhv_ASeqO8
HwLaRr2DdtI
zF8xqYVm0JA
JmC3F_rbNHw
ifIPb5TY6B0
P36Og8ydz8g
FOrR4b9dEM4
ncJ-hBfg9yQ
hQLa581XUNA
c_ZUDH9NtdE
phkQgLpB6NY
AjQwbSJ-4Hk
EG7wI4VBVYI
dNidgo2HpEQ
GfK7Ddh9k4M
eD5ktc3g7BA
WXdKlMDpkSI
38t71cVFnDI
pDYYNeoJ4_4
a-8lNiFM1_k
H4_VJS10-4Q
h2L7h3Xd7U0
PPZPEMLCid4
s8OyCB9zec8
zs7xtgiI8Ys
nU-ruZpQnZY
lmGvNgrhbq0
KCWbtoxQJg4
gGK1iOX_fRQ
E0vMonVAE8w
g5xGWxGArgM
gGcCI6xuWLk
0iK9VsWvCow
bfbmtwq2V7A
Le703VmJN3o
KqHRN3Yy2rs
gxeQa_iREpc
FaNu-wK4MTA
zbb09zSKYts
99y5OOPXg20
NvKq-hPPaoM
brI9r5D2cvc
Sv3Ra1btB8c
y2J4JBAvon8
HCNCR2ZE_HM
6FQLW2Whgxk
pSF5ZDmLpLo
fJf8Bg52HA8
-dPYFMapvzQ
t1Whs1-86aQ
LST5MIZLRUM
jwcAfGaA9eo
WoPwVT9Nrdw
A7wnOz32_Bk
FCTYkTe1J1g
WC3IdpV8B9Q
FaJOGRnEHNg
HUybRSLjTLI
0Z8KFCbh_xI
ShjK-pIKE90
MGqajM7d7U0
ay-sgjrl02g
-o-asb4ZV8M
QGjZGvpXBUo
oXLMC7DXqD4
KClLcmCid3U
t-MkDH12GSc
YY2Q4XDmZDE
-Lvgk3GUDlg
dKXMWcIve3k
W5XOP7JEces
FQ0q0uh9pzw
RYvO29kfHno
LTYchJ0X5CI
uTaBAfqqb-k
zD0XbB-9DT0
vqEu6CS9VzQ
jYeLPFRVEc4
vSIXsA4mIfs
xWhEwDdxxTM
uehHJ0SI05g
YLs7h3Qwwjw
0ju9bzMP_5g
LZ4RdnyYyvw
twN_-1gqR0k
7z29JVGcFpI
-tIoRbVZFOw
h5qiE1FbO7g
Zo6sKzFGl_Y
hdXotbChOh0
vk1sdoHEZuo
dc8rgD_nZNQ
RGRdIo_eUsQ
0dc4Y2PtwlU
1RU3QxuStiM
4MurylrXcI8
BM3jm780w4Q
oEOldNo7AJ0
ONCS00vhlss
5cKrQbOwxIU
GhlFJdmchLM
ydSudDbKbCY
aPea1Ym3vo4
KxlVqJFuQmY
oiO6XXzZk5w
rVh_ZXObpOc
twTUFVU7zkQ
hpKPxhxW_6c
c4lQRUOybpU
mNKHPtNMvbA
FWix7LL5cVQ
h_FndEQ10CQ
NFmxW6mBuiI
K74vN5j3o0E
3IvDf-PPfhY
PNP4z7a0E8k
oc4cdRe7Wuw
gyEMnvn6SQg
FiT0u_0u-v8
F8aNT5MbOsI
lf9OOZXe9hk
oCGD88gUSlw
CgidmeQ6uJo
wQjobzj6WzE
-uuwGfdTH2k
0VWMfexKl_s
2MJt1dTqbPk
SiQKA9u1hTM
GGaqEo1YiHg
xveUnsEc7V4
esOHvv5g5X4
aioEsYI1n-I
z1vJPOAYxnQ
lWMnayacTMw
wka1nCN3AVc
fo5m9uFKSSU
s7l2SDvnD1M
oi2L5ZdH1sE
XLUyNmBSf8Y
PajaZFBrNtI
FF8zPmRVAKY
EFhQG-1SC5s
dAHrXlofT-s
SFMmkDvD03Y
9gNA1onNL5s
9kMLtat5HX0
iVa1C8cOITY
y5-wzJjtlDM
0b0kkqUmkDg
n3D0THsr3U8
5srNHZA5Kj8
VCZKJI1W4Vw
4_9MV_42v6I
4teB-jgftS0
XR2GBIq7G0Q
ceTnsBlsnf0
RAEvkUXZBZ0
BefCARcRxjc
02EpjF21ftA
lH1GxH7W0v0
zAYAUMfMQgI
DDD9ioJww-M
yvdFiu8KitI
qHJQxPT_o-I
e5CUBBlu3HI
asHlr_Z4_G0
XCQNyRKrm8Y
c9GD0Yf0S40
tTgAz6TsgrY
fBvKl72uMRM
AsiuBT6k3aY
-SI8cZt6Pmk
Vm0tOnh6jHI
Mazv-J0ONfI
1At8lsatWyY
9oJ3UOHdrXE
wHjqNkWPUmk
KMKYutVNHRo
8BbG1Jr94o8
myFqzZ1wN5o
l7a08m-fTls
e8VlwCobFW4
9aMhbg3v7ZE
3v2PvgQg2cE
gcBcqflMp38
8b4zQWlCRUk
0HEYEcGX54Y
JdHvjiUEfRs
D6kjVwsEGyo
hruLwZfkVhk
fwk2QTUBidw
mxzC4Wqcsis
i7t3sSCc3K4
mnC4OK4YVL8
XDk3yFhZyYU
ysbMIjzzX_g
tKl2_PeK0DY
gNv26OMru5o
HZZpF0aOhRs
4cRZsCtfRgo
rLkUeVlecS8
aj6qedt2DDw
N-OdqsTXGOk
B8FbVCTTIO4
FSujL6gNxrY
E4YJArZK9n0
gYE8uRkzxHU
AGbx1BnJSoE
Az_zupGkG0M
1KpD6MOOzcc
YRLj_TosW7I
9CsrHv6eZIE
8TZ5BquBT2E
mfk_b32LSQw
Uh7TDCtIn8E
vbEG02oRyMY
peXyzRBdupw
4lJ6bNfOglU
T_Jo654U2xQ
VX06S13qeZI
axe0fGOhtKc
96q-ZU-XGng
Jm8mDXe5ngw
eKLZ6MM_h1g
5jjF0nH4yCc
TAoyA-DZaEU
vgYFJJbhPiw
9dif0O9DZJQ
aeSxj1V8Y3g
hbfeyS-oKd4
FjgR4ujytXM
Se81AYtTf34
0LYnHalA6Gc
Inpn4Ii9paM
466LT31Qf0Q
3s_bOmK1xKU
VPfEJl1AgVg
TBf1sPZMmYM
ep-lvjmdxFc
UXz5wkZ34-8
Iu4D3V2XaE8
_VlL_azNoKs
z43-N0AnSOw
3yqqTMdjXWo
p_-2QgNrpso
MYD6XdwP-JM
kRV9FhA1V6I
eAyLvQH2CcI
vJfZGz_HuIs
nBAqXqGxF6I
yCA9GVAn5H4
WQd1pYh5SrI
EUL78wa_tCI
tdnSANn-GMA
sa7quiyPj74
KwN4wQQ9mkk
HvgcqUcrgDc
BPNqDkiGhec
64kF17MVrhM
Sx44w4ifxRY
hhC9yzqGZ9U
XFpxWF3I27g
es0iDEjNH5s
IO3OKwIqfbg
Uy3S5mvNgtk
FgWg85IgSUU
Txim5iOLm4k
47m1uVWp5KE
sJyw55cuGbY
H0N1JL3dbsY
ceCeLOK9naA
DCvQcFEIkvw
omhKwYWmAUs
X-ebiJZfVeI
F8iT6mktjxw
zF9oBF3t5Ss
gb2-MxXFeCs
bDaTh-ZtAuU
NSSHi9Rr7KY
8J4nrVbV12k
M-VpDP19UvQ
Fum57IKx-Lw
3pt08ctDDCM
wC756nEakWY
jPQmJxFK31E
wjr36QmZP2w
eT8xd3ap5oU
sufXJvfHu3w
EmmRSpJu-jg
YrGbJe4liNY
r7Zb_mT3MQg
kNm9l_TJrYU
V64Td4RaqIc
uqQmtCL7jc8
Zalkuw0rvSk
s97xIWkTzFA
ivo5-TCkhOg
4Pqp_lzTNM0
4QT3j_5Uoeg
oTL3DSnpZr0
-HNTJcvj3zo
HRk03Rg7E7w
L5DTSQql98A
Y4bzi0vgZkI
5AX9ggE0U_8
UAZmT0lkFkk
sJbLjfYYu2E
HChvKX_D4Tw
17KQWdTvPWE
4UsSPWi5y1g
teMst1H9yn8
-z-UOCgnFfQ
f3zL0n_Hk3E
JRYJtlH1OfI
Wkrky8zrFtk
Lr-JwK4J1Uw
dRfPXj4wZcg
FsMFWiAwhho
_COeHpFEVfA
b7tRyQ36S8Q
KFX7xlqKeu4
a6olTZaiKHs
1N5mrqOsGoI
PH4A7_Q-TUo
DWtahGCKjK0
OWb9MeElJhc
GcbrZXO7Bbw
jqHWy0Sbcyc
19ld4QjJduE
bFq5tvCUOH8
eSTC5UaruFI
h-hI_1HDqnI
alDGvrg7dKA
_125EGAGx6Q
4WmDYWv8rFk
shvxCcbep7Y
Qa9YXSj34h4
rdnx2dlWiS8
4kk4bpC2Dzw
rIB9jlj5t14
Z3LQWj99rJI
iyforucadFM
l20FaAFtb4M
sCuatSJRkAo
ZdQ7yf37-UQ
qR-lmj9PhYQ
BHZTZcHN-TA
UqDRX9ul7ec
_yeA4o6JSLo
dtkymloqOIY
zorenF5M6pQ
ti0j2QqQoPY
hkqmCzHZNLo
KchJy9kAY_w
vUbJF8Zqxcs
0k1MAc5hN6w
SU_VlaJSQ7g
R2ZFoERvTqU
402yBUAGLRg
xvkmEV4bpUw
xlH1Yf6rRlU
gS00eQhjkxs
pQz-oswKdRE
zYrfoexE0Rs
ZoLJLHv5P3o
fmRMB00b9Ek
0Xo9ZlLb12o
oQAJxc462Ws
RctollXTnpE
c320qSwrStc
dKS12-2WQ3Q
fniICGM9KoY
BMD4CqKX-vg
IFjDXXNECuQ
TEYhHKRpYkg
hVoDimdg2Lg
0TWwbZ1FZNk
mVVu1wo1z80
P0_P3pjbOsE
KwhopDVUJAk
7SsEEX01ugk
qIkCZu5pkY4
bAfCV0nax5A
2DwCpSGd18E
EOXd7_HCVrc
FHjUI10GhLM
JpS6fgvEksc
ra8pw3xOXsU
yZgajM8k3sQ
FGu-kh5Lh4Q
rpHQ-zFjakk
biMyn2-HHCQ

187
download/DownloadUtil.py

@ -4,11 +4,15 @@ from youtube_transcript_api.formatters import SRTFormatter
from VideoService import VideoService
from ChannelService import ChannelService
from DownloadInfoService import DownloadService
from SrtFileService import SrtService
from LoggerUtils import Logger
import time
import os
from func_timeout import func_set_timeout
import operator
import pysrt
from pytubefix import YouTube
from pytubefix.cli import on_progress
class DownLoadUtil:
@ -17,6 +21,40 @@ class DownLoadUtil:
proxies = {"http": "http://127.0.0.1:7890",
"https": "https://127.0.0.1:7890"}
def iterateSrt(srtFilePath, videoId, channelId):
# 查询是否存在
if SrtService.checkByVideoId(videoId):
Logger.info("VideoId: {} 已收录", videoId)
return
subs = pysrt.open(srtFilePath)
ordinal = 1
for sub in subs:
srtStartTime = str(sub.start.to_time()).rstrip("0")
srtEndTime = str(sub.end.to_time()).rstrip("0")
SrtService.createOne(videoId, channelId, ordinal,
srtStartTime, srtEndTime, sub.text)
ordinal = ordinal + 1
def downLoadMP3(videoId):
video = VideoService.getOneByVideoId(videoId)
languages = str(video.videoLanguage)
channel = ChannelService.getOneByChannelId(str(video.channelId))
videoUrl = "https://www.youtube.com/watch?v={}".format(videoId)
yt = YouTube(videoUrl, on_progress_callback=on_progress)
ys = yt.streams.get_audio_only()
mp3OutPutPath = "/mnt/srt_file"
# TODO test
mp3OutPutPath = "D:/Work/Code/youtube_dev"
mp3OutPutPath = "{}/{}/{}-{}".format(
mp3OutPutPath, languages, channel.channelId, channel.channelTitle)
if not os.path.exists(mp3OutPutPath):
Logger.info("开始创建文件夹:" + mp3OutPutPath)
os.makedirs(mp3OutPutPath)
fileName = "{}.mp3".format(videoId)
ys.download(output_path=mp3OutPutPath, filename=fileName, mp3=True)
@func_set_timeout(60)
def downloadOne(videoId):
# 获取数据
@ -36,22 +74,37 @@ class DownLoadUtil:
videoPublishTime = str(videoPublishTime).split("T")[0]
# 开始下载
Logger.info("开始下载...{}".format(videoId))
cpPath = ""
try:
mainPath = "D:/Work/Code/youtube_dev/main"
tmpPath = "D:/Work/Code/youtube_dev/tmp"
# 获取字幕
languages = str(video.videoLanguage)
storePath = "/mnt/srt_file/" + str(channel.channelTitle)
cpPath = "/mnt/tmp_srt_file/" + str(channel.channelTitle)
storePath = "/mnt/srt_file"
cpPath = "/mnt/tmp_srt_file"
# TODO 测试代码删除
storePath = mainPath
cpPath = tmpPath
storePath = "{}/{}/{}-{}".format(
storePath, languages, channel.channelId, channel.channelTitle)
cpPath = "{}/{}/{}-{}".format(
cpPath, languages, channel.channelId, channel.channelTitle)
1
if not os.path.exists(storePath):
Logger.info("开始创建文件夹:" + storePath)
os.makedirs(storePath)
if not os.path.exists(cpPath):
Logger.info("开始创建文件夹:" + cpPath)
os.makedirs(cpPath)
storePath = storePath + "/" + videoPublishTime + \
"-" + languages + "-" + videoTitle + ".srt"
cpPath = cpPath + "/" + videoPublishTime + \
"-" + languages + "-" + videoTitle + ".srt"
storePath = "{}/{}.srt".format(storePath, videoId)
cpPath = "{}/{}.srt".format(cpPath, videoId)
# 判断文件是否存在
if os.path.exists(storePath):
Logger.info("{}已存在",storePath)
return
if len(cpPath) > 120:
storePath = storePath[:-20] + ".srt"
cpPath = cpPath[:-20] + ".srt"
@ -70,103 +123,29 @@ class DownLoadUtil:
if downloadInfo is not None:
DownloadService.updateInfoByVideoId(
videoId, downloadInfo.tryTime + 1, 1, 1)
except Exception as e:
Logger.error("下载失败...{}".format(videoId))
logStr = "Exception...{}".format(e)
Logger.error(logStr)
downloadInfo = DownloadService.getOneByVideoId(videoId, 1)
if operator.contains(logStr, "No transcripts"):
Logger.error("VideoId:{},不存在字幕文件".format(videoId))
if downloadInfo is not None:
DownloadService.changeDownloadType(
videoId, 0, 0, 1, 2)
elif operator.contains(logStr, "File name too long"):
# 文件名过长
languages = str(video.videoLanguage)
videoSrt = YouTubeTranscriptApi.get_transcript(
videoId, languages=[languages])
srt_formatted = DownLoadUtil.formatter.format_transcript(videoSrt)
storePath = "/mnt/srt_file/" + str(channel.channelTitle) + "/" + \
videoPublishTime + "-" + languages + "-" + videoId + ".srt"
cpPath = "/mnt/tmp_srt_file/" + str(channel.channelTitle) + "/" + \
videoPublishTime + "-" + languages + "-" + videoId + ".srt"
if len(cpPath) > 120:
storePath = storePath[:-20] + ".srt"
cpPath = cpPath[:-20] + ".srt"
Logger.info("文件名过长,文件地址...{}".format(storePath))
with open(storePath, 'w', encoding='utf-8') as srt_file:
srt_file.write(srt_formatted)
Logger.info("下载完成...{}".format(videoId))
copyfile(storePath, cpPath)
# 修改video数据
VideoService.updateIsDownloadByVideoId(videoId, 1)
# 修改downloadInfo
downloadInfo = DownloadService.getOneByVideoId(videoId, 1)
if downloadInfo is not None:
DownloadService.updateInfoByVideoId(
videoId, downloadInfo.tryTime + 1, 1, 1)
else:
if downloadInfo is not None:
Logger.info("VideoId:{}开始重试第{}".format(
videoId, downloadInfo.tryTime + 1))
DownloadService.updateInfoByVideoId(
videoId, downloadInfo.tryTime + 1, 0, 1)
# 按句读取字幕文件
DownLoadUtil.iterateSrt(storePath, videoId, video.channelId)
@func_set_timeout(60)
def downloadTwo(videoId):
# 获取数据
video = VideoService.getOneByVideoId(videoId, 2)
channel = ChannelService.getOneByChannelId(str(video.channelId))
# 格式化title
videoTitle = str(video.videoTitle)
videoTitle = str(videoTitle).replace("/", u"\u2215")
videoTitle = str(videoTitle).replace("?", "")
videoTitle = str(videoTitle).replace("\\", "")
videoTitle = str(videoTitle).replace("|", "")
videoTitle = str(videoTitle).replace("<", "")
videoTitle = str(videoTitle).replace(">", "")
videoTitle = str(videoTitle).replace(":", "")
# 获取发布时间
videoPublishTime = str(video.videoPublishTime)
videoPublishTime = str(videoPublishTime).split("T")[0]
# 开始下载
Logger.info("开始下载...{}".format(videoId))
try:
# 获取字幕
languages = str(video.videoLanguage)
storePath = "./download/" + str(channel.channelTitle)
if not os.path.exists(storePath):
Logger.info("开始创建文件夹:" + storePath)
os.makedirs(storePath)
storePath = storePath + "\\" + videoPublishTime + \
"-" + languages + "-" + videoTitle + ".srt"
videoSrt = YouTubeTranscriptApi.get_transcript(
videoId, languages=[languages])
srt_formatted = DownLoadUtil.formatter.format_transcript(videoSrt)
Logger.info("文件地址...{}".format(storePath))
with open(storePath, 'w', encoding='utf-8') as srt_file:
srt_file.write(srt_formatted)
Logger.info("下载完成...{}".format(videoId))
# 修改video数据
VideoService.updateIsDownloadByVideoId(videoId, 1)
# 修改downloadInfo
downloadInfo = DownloadService.getOneByVideoId(videoId, 2)
if downloadInfo is not None:
DownloadService.updateInfoByVideoId(
videoId, downloadInfo.tryTime + 1, 1, 2)
except Exception as e:
Logger.error("下载失败...{}".format(videoId))
logStr = "Exception...{}".format(e)
Logger.error(logStr)
downloadInfo = DownloadService.getOneByVideoId(videoId, 2)
if operator.contains(logStr, "No transcripts"):
Logger.error("VideoId:{},不存在字幕文件".format(videoId))
if downloadInfo is not None:
DownloadService.changeDownloadType(
videoId, 6, 0, 2, 3)
else:
if downloadInfo is not None:
Logger.info("VideoId:{}开始重试第{}".format(
videoId, downloadInfo.tryTime + 1))
DownloadService.updateInfoByVideoId(
videoId, downloadInfo.tryTime + 1, 0, 2)
# logStr = "Exception...{}".format(e)
# Logger.error(logStr)
# downloadInfo = DownloadService.getOneByVideoId(videoId, 1)
# if operator.contains(logStr, "No transcripts"):
# Logger.error("VideoId:{},不存在字幕文件".format(videoId))
# 下载音频文件
# DownLoadUtil.downLoadMP3(videoId)
# DownloadService.updateInfoByVideoId(
# videoId, downloadInfo.tryTime, 1, 1)
# else:
# if downloadInfo is not None:
# if downloadInfo.tryTime >= 5:
# 下载音频文件
# DownLoadUtil.downLoadMP3(videoId)
# DownloadService.updateInfoByVideoId(
# videoId, downloadInfo.tryTime, 1, 1)
# else:
# Logger.info("VideoId:{}开始重试第{}次".format(
# videoId, downloadInfo.tryTime + 1))
# DownloadService.updateInfoByVideoId(
# videoId, downloadInfo.tryTime + 1, 0, 1)

14
download/Orm.py

@ -15,6 +15,7 @@ def ormInit():
Channel.create_table()
Video.create_table()
DownloadInfo.create_table()
SrtFile.create_table()
class BaseModel(Model):
@ -52,8 +53,6 @@ class Video(BaseModel):
db_table = 'Vidoes'
# 下载信息
class DownloadInfo(BaseModel):
id = PrimaryKeyField()
videoId = CharField()
@ -63,3 +62,14 @@ class DownloadInfo(BaseModel):
class Meta:
db_table = 'Download_info'
# 字幕文件信息
class SrtFile(BaseModel):
id = PrimaryKeyField()
videoId = CharField(null=False)
channelId = CharField(null=False)
ordinal = IntegerField()
srtStartTime = CharField()
srtEndTime = CharField()
srtText = CharField()
isScan = IntegerField()

16
download/SrtFileService.py

@ -0,0 +1,16 @@
from Orm import SrtFile
class SrtService:
def createOne(videoId, channelId, ordinal, srtStartTime, srtEndTime, srtText):
SrtFile.create(videoId=videoId,
channelId=channelId,
ordinal=ordinal,
srtStartTime=srtStartTime,
srtEndTime=srtEndTime,
srtText=srtText,
isScan=0)
def checkByVideoId(videoId):
list = SrtFile.select().where(SrtFile.videoId == videoId).limit(10).execute()
return len(list) > 0

BIN
download/download.zip

Binary file not shown.

106
download/main_download.py

@ -4,6 +4,7 @@ import time
import Contant
from LoggerUtils import Logger, initLogger
import Orm
from Orm import Video,DownloadInfo
from VideoService import VideoService
from ChannelService import ChannelService
from DownloadInfoService import DownloadService
@ -22,28 +23,83 @@ if __name__ == "__main__":
Contant.logDir = args.logDir
initLogger()
Orm.ormInit()
list = DownloadService.findNotFinishList()
Logger.info("list size:{}".format(len(list)))
while (len(list) > 0):
for info in list:
try:
DownLoadUtil.downloadOne(info.videoId)
restTime = random.randint(1, 3)
Logger.info("间隔{}秒后继续...".format(restTime))
time.sleep(restTime)
except func_timeout.exceptions.FunctionTimedOut as e:
Logger.error("执行下载方法超时错误:{}".format(e))
loopRestTime = random.randint(1, 3)
Logger.info("循环间隔{}秒后继续...".format(loopRestTime))
time.sleep(loopRestTime)
list = DownloadService.findNotFinishList()
# 发送钉钉消息
webhook = "https://oapi.dingtalk.com/robot/send?access_token=c8c8d7d42c4eecd449dd303025ef968f647d1d8e8694e3fabc0ab5770d646dcb"
jsonData = {
"msgtype": "text",
"text": {
"content": "[Youtube]download finished"
}
}
requests.post(webhook, json=jsonData)
Logger.info("download发送钉钉消息成功...")
# channelIds = ["UCUopc5tlSTMgBsZaP4PItRA",
# "UC25CsqDNQv6CdzDq_hsazIw",
# "UC4douYiP0O4ABtxoMuo9yNA",
# "UCaT01FqK7SuPyqR8d2gvuiQ",
# "UCA_hK5eRICBdSOLlXKESvEg",
# "UCrZzlE9f9aR6yjvIy6-hggg",
# "UCrm095p7ZHRS1njmQ1wkgCg",
# "UCDDneQi63kJAdr3i5VCPzHg",
# "UCwWXGnvVmi-6Sfx2wf8S8tQ",
# "UCuzqko_GKcj9922M1gUo__w",
# "UCwIdAI4fCV4lisP3TZzOGuw",
# "UCYDaGPmMfSXViITpPYDKIcw",
# "UCqULpqYsoBDTc_QswJOwMdQ",
# "UC3GeULpLgXi1TNDAv0nyN5Q",
# "UCYIVkruUoN04UjV9pkBTswg",
# "UCya5E2GyEep6HuEsmLUcyWA",
# "UC26mgnC13yyRANhG8bEf26g",
# "UCJcPWs0gpYMx_CghPdELUhw",
# "UCyF2mDq-XtPbhgTXwz1p93A"]
# channelIds_hk = ["UC7v5yfvZhs-d5opF575AEhA",
# "UCCHUPcdmSP-jqAkh4eh96yg",
# "UC4G8Si5IBGy9k_1Oo04DMVg",
# "UCAwfc603xR0xXQN58x4uWeA",
# "UCHOLdIRhuGvY6EcpmDno3Iw",
# "UChQ2W327SnjTlYZwCijCFYw",
# "UCOjQAwkxNOY76-_zPqOWziA",
# "UCkx8tfePUl__VGvNDNOKqRw",
# "UCGAbl3E1aqqgrjwIaiDDdqQ",
# "UC15Qrw0HKAMf2RG9PMNRPLg",
# "UCilwQlk62k1z7aUEZPOB6yw",
# "UCNRdj1WX-bxm5GPJtR2cM5Q",
# "UCdWNwPuaS1o2dIzugNMXWtw"]
# query = (Video.select().where(Video.channelId.in_(channelIds_hk)))
# videos = query.execute()
# Logger.info(len(videos))
# count = 0
# for video in videos:
# videoId = video.videoId
# downLoadInfo = DownloadInfo.get(DownloadInfo.videoId == videoId)
# if downLoadInfo.isFinished == 1:
# Logger.info(videoId)
# count = count + 1
# DownLoadUtil.downloadOne(videoId)
# time.sleep(2)
# Logger.info("间隔两秒")
# Logger.info(count)
for line in open("2.txt"):
line = line.strip('\n')
Logger.info(line)
DownLoadUtil.downloadOne(line)
# testVideoId = "5RbZgn3Ql5c"
# DownLoadUtil.downloadOne(testVideoId)
# list = DownloadService.findNotFinishList()
# Logger.info("list size:{}".format(len(list)))
# while (len(list) > 0):
# for info in list:
# try:
# DownLoadUtil.downloadOne(info.videoId)
# restTime = random.randint(1, 3)
# Logger.info("间隔{}秒后继续...".format(restTime))
# time.sleep(restTime)
# except func_timeout.exceptions.FunctionTimedOut as e:
# Logger.error("执行下载方法超时错误:{}".format(e))
# loopRestTime = random.randint(1, 3)
# Logger.info("循环间隔{}秒后继续...".format(loopRestTime))
# time.sleep(loopRestTime)
# list = DownloadService.findNotFinishList()
# # 发送钉钉消息
# webhook = "https://oapi.dingtalk.com/robot/send?access_token=c8c8d7d42c4eecd449dd303025ef968f647d1d8e8694e3fabc0ab5770d646dcb"
# jsonData = {
# "msgtype": "text",
# "text": {
# "content": "[Youtube]download finished"
# }
# }
# requests.post(webhook, json=jsonData)
# Logger.info("download发送钉钉消息成功...")

12
src/KeyWordService.py

@ -0,0 +1,12 @@
from Orm import KeyWord
from LoggerUtils import Logger
class KeyWordService:
def createOne(region, word):
keyWord = KeyWord.get_or_none(
KeyWord.region == region, KeyWord.word == word)
if keyWord is not None:
Logger.info("region:{},word:{} exist", region, word)
else:
KeyWord.create(region=region, word=word)

34
src/Orm.py

@ -9,6 +9,7 @@ parser.add_argument('--logDir', type=str, default='')
parser.add_argument("--start", type=str, default="")
parser.add_argument("--end", type=str, default="")
parser.add_argument("--channelId", type=str, default="")
parser.add_argument('--file', type=str, default='')
args = parser.parse_args()
Contant.db = args.db
db = SqliteDatabase(Contant.db)
@ -18,6 +19,9 @@ def ormInit():
Channel.create_table()
Video.create_table()
DownloadInfo.create_table()
SrtFile.create_table()
KeyWord.create_table()
WordResutlSet.create_table()
class BaseModel(Model):
@ -66,3 +70,33 @@ class DownloadInfo(BaseModel):
class Meta:
db_table = 'Download_info'
# 字幕文件信息
class SrtFile(BaseModel):
id = PrimaryKeyField()
videoId = CharField(null=False)
channelId = CharField(null=False)
ordinal = IntegerField()
srtStartTime = CharField()
srtEndTime = CharField()
srtText = CharField()
isScan = IntegerField()
# 关键字
class KeyWord(BaseModel):
id = PrimaryKeyField()
region = CharField()
word = CharField()
# 关键字和字幕对应
class WordResutlSet(BaseModel):
id = PrimaryKeyField()
keyWordId = IntegerField()
wordText = CharField()
srtId = IntegerField()
srtOrdinal = IntegerField()
srtText = CharField()
videoId = CharField()
class Meta:
db_table = 'World_Result_Set'

16
src/SrtFileService.py

@ -0,0 +1,16 @@
from Orm import SrtFile
class SrtService:
def createOne(videoId, channelId, ordinal, srtStartTime, srtEndTime, srtText):
SrtFile.create(videoId=videoId,
channelId=channelId,
ordinal=ordinal,
srtStartTime=srtStartTime,
srtEndTime=srtEndTime,
srtText=srtText,
isScan=0)
def checkByVideoId(videoId):
list = SrtFile.select().where(SrtFile.videoId == videoId).limit(10).execute()
return len(list) > 0

2179
src/hk_tw_names_20240703_v2.csv

File diff suppressed because it is too large

31
src/insert_keyword.py

@ -0,0 +1,31 @@
from LoggerUtils import Logger, initLogger
import argparse
import Contant
from Orm import ormInit, Channel
import operator
from bs4 import BeautifulSoup as bs
from urllib.request import urlopen, Request
import pandas as pd
from KeyWordService import KeyWordService
# python3 ./insert_keyword.py --db="../db/youtube_prod.db" --logDir="./logs" --file="./hk_tw_names_20240703_v2.csv"
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='')
parser.add_argument('--db', type=str, default='')
parser.add_argument('--logDir', type=str, default='')
parser.add_argument('--file', type=str, default='')
args = parser.parse_args()
Contant.db = args.db
Contant.logDir = args.logDir
csvFile = args.file
initLogger()
ormInit()
Logger.info("SqlLite存放地址:"+Contant.db)
Logger.info("日志文件存放地址:"+Contant.logDir)
Logger.info("开始初始化...")
# df = pd.read_csv(csvFile, encoding="utf-8")
# length = df.shape[0]
# for i in range(0, length):
# KeyWordService.createOne(df.iloc[i]["market"], str(df.iloc[i]["lname"]).strip())
# KeyWordService.createOne(df.iloc[i]["market"], str(df.iloc[i]["sname"]).strip())

82
src/main.py

@ -2,6 +2,7 @@ import argparse
import Contant
import LoggerUtils
import Orm
from Orm import Video
from VideoService import VideoService
from YouTubeUtils import YouTubeUtil
from ChannelService import ChannelService
@ -23,27 +24,64 @@ if __name__ == "__main__":
Contant.endTime = args.end
LoggerUtils.initLogger()
Orm.ormInit()
LoggerUtils.Logger.info("db:{},logDir:{}".format(Contant.db, Contant.logDir))
LoggerUtils.Logger.info("starTime:{},endTime:{}".format(Contant.startTime, Contant.endTime))
LoggerUtils.Logger.info(
"db:{},logDir:{}".format(Contant.db, Contant.logDir))
LoggerUtils.Logger.info("starTime:{},endTime:{}".format(
Contant.startTime, Contant.endTime))
channelIds = ["UCUopc5tlSTMgBsZaP4PItRA",
"UC25CsqDNQv6CdzDq_hsazIw",
"UC4douYiP0O4ABtxoMuo9yNA",
"UCaT01FqK7SuPyqR8d2gvuiQ",
"UCA_hK5eRICBdSOLlXKESvEg",
"UCrZzlE9f9aR6yjvIy6-hggg",
"UCrm095p7ZHRS1njmQ1wkgCg",
"UCDDneQi63kJAdr3i5VCPzHg",
"UCwWXGnvVmi-6Sfx2wf8S8tQ",
"UCuzqko_GKcj9922M1gUo__w",
"UCwIdAI4fCV4lisP3TZzOGuw",
"UCYDaGPmMfSXViITpPYDKIcw",
"UCqULpqYsoBDTc_QswJOwMdQ",
"UC3GeULpLgXi1TNDAv0nyN5Q",
"UCYIVkruUoN04UjV9pkBTswg",
"UCya5E2GyEep6HuEsmLUcyWA",
"UC26mgnC13yyRANhG8bEf26g",
"UCJcPWs0gpYMx_CghPdELUhw",
"UCyF2mDq-XtPbhgTXwz1p93A",
"UC7v5yfvZhs-d5opF575AEhA",
"UCCHUPcdmSP-jqAkh4eh96yg",
"UC4G8Si5IBGy9k_1Oo04DMVg",
"UCAwfc603xR0xXQN58x4uWeA",
"UCHOLdIRhuGvY6EcpmDno3Iw",
"UChQ2W327SnjTlYZwCijCFYw",
"UCOjQAwkxNOY76-_zPqOWziA",
"UCkx8tfePUl__VGvNDNOKqRw",
"UCGAbl3E1aqqgrjwIaiDDdqQ",
"UC15Qrw0HKAMf2RG9PMNRPLg",
"UCilwQlk62k1z7aUEZPOB6yw",
"UCNRdj1WX-bxm5GPJtR2cM5Q",
"UCdWNwPuaS1o2dIzugNMXWtw"]
query=(Video.select().where(Video.channelId.in_(channelIds)))
videos = query.execute()
LoggerUtils.Logger.info(len(videos))
# 执行查询
channelList = ChannelService.getChannelList()
LoggerUtils.Logger.info("list size:{}".format(len(channelList)))
for channel in channelList:
channelId = channel.channelId
LoggerUtils.Logger.info(
"channelId:{},startTime:{},endTime:{}".format(
channelId, Contant.startTime, Contant.endTime
)
)
YouTubeUtil.getByChannelId(channelId, Contant.startTime, Contant.endTime)
# 发送钉钉消息
webhook = "https://oapi.dingtalk.com/robot/send?access_token=c8c8d7d42c4eecd449dd303025ef968f647d1d8e8694e3fabc0ab5770d646dcb"
jsonData = {
"msgtype": "text",
"text": {
"content": "[Youtube]src finished"
}
}
requests.post(webhook, json=jsonData)
LoggerUtils.Logger.info("src发送钉钉消息成功...")
# channelList = ChannelService.getChannelList()
# LoggerUtils.Logger.info("list size:{}".format(len(channelList)))
# for channel in channelList:
# channelId = channel.channelId
# LoggerUtils.Logger.info(
# "channelId:{},startTime:{},endTime:{}".format(
# channelId, Contant.startTime, Contant.endTime
# )
# )
# YouTubeUtil.getByChannelId(channelId, Contant.startTime, Contant.endTime)
# # 发送钉钉消息
# webhook = "https://oapi.dingtalk.com/robot/send?access_token=c8c8d7d42c4eecd449dd303025ef968f647d1d8e8694e3fabc0ab5770d646dcb"
# jsonData = {
# "msgtype": "text",
# "text": {
# "content": "[Youtube]src finished"
# }
# }
# requests.post(webhook, json=jsonData)
# LoggerUtils.Logger.info("src发送钉钉消息成功...")

891
test/1.srt

@ -0,0 +1,891 @@
1
00:00:07,040 --> 00:00:13,519
[音楽]
2
00:00:17,780 --> 00:00:23,000
みなさんこんにちはバカでも稼げる米国株高配当投手の著者で
3
00:00:23,000 --> 00:00:27,530
ブログバフェット太郎の秘密のポートフォリオ書いているバフェットだろうです
4
00:00:27,530 --> 00:00:34,550
今回お話する内容というのは米国経済で起きた今週1週間のまとめとそして
5
00:00:34,550 --> 00:00:37,800
ダウ平均が強気相場入りしたことについて解説
6
00:00:37,800 --> 00:00:39,740
していきたいとおもいます
7
00:00:39,740 --> 00:00:46,580
最初にざっくりと大まかな流れを説明しておくと frb が量的緩和政策を無制限に
8
00:00:46,580 --> 00:00:48,260
することを発表しました
9
00:00:48,260 --> 00:00:51,740
またトランプ政権が過去最大となる
10
00:00:51,740 --> 00:00:55,970
2兆ドル規模の景気刺激策を実施することも決定しました
11
00:00:55,970 --> 00:00:59,730
通した中でつ業保険申請件数が過去
12
00:00:59,730 --> 00:01:04,290
最悪の328万人という数字が出ているわけなんですが
13
00:01:04,290 --> 00:01:08,790
株価が大きく反発していてダウ平均が強気相場入りしているんですね
14
00:01:08,790 --> 00:01:15,810
そのため個人投資家の中にはあれ底打ちしたのと底打ちしたのであれば何に投資すれば
15
00:01:15,810 --> 00:01:19,200
いいのと考えている人もいると思うんですけれども
16
00:01:19,200 --> 00:01:19,720
今回
17
00:01:19,720 --> 00:01:25,240
の動画では米国株が底打ちしたのかどうかといった先行き見通しや
18
00:01:25,240 --> 00:01:31,360
これから何に投資すべきかということについてわかりやすく解説していきますので是非
19
00:01:31,360 --> 00:01:34,950
最後までご覧くださいそれではよろしくお願いします
20
00:01:34,950 --> 00:01:42,329
まず前回の動画でも紹介した通り今週の初め付 rb が両手期間を制作における目標
21
00:01:42,329 --> 00:01:48,479
買い入れ額を当初予定の7000億ドルから無制限にすることを決定しました
22
00:01:48,479 --> 00:01:54,970
そもそも量的緩和政策というのは地上から大量の再建や mbs 住宅ローン
23
00:01:54,970 --> 00:02:00,130
担保証券などを購入して市場に資金を供給する政策のことです
24
00:02:00,130 --> 00:02:04,960
大量の資金が市場に流入すればドルが逼迫しなくなりますから
25
00:02:04,960 --> 00:02:11,160
金利が急騰したり流動性が低下したりするといったことが避けられるわけですまた
26
00:02:11,160 --> 00:02:14,960
cmbs 商業不動産担保証券
27
00:02:14,960 --> 00:02:19,550
も購入の対象として加えられたほか社債や etf
28
00:02:19,550 --> 00:02:26,360
さらに abs 資産担保証券も購入することが発表されました abs というのは
29
00:02:26,360 --> 00:02:32,390
自動車ローンや学生ローンなどの債権をそれを担保に証券化したものになります
30
00:02:32,390 --> 00:02:34,950
なんか難しくてよくわからないなっていう人のた
31
00:02:34,950 --> 00:02:37,140
目に簡単に説明しますと
32
00:02:37,140 --> 00:02:44,790
今というかこれから米国経済で起ころうとしている問題というのは銀行が企業や個人に
33
00:02:44,790 --> 00:02:47,970
お金を貸したがらなくなっているということなんですね
34
00:02:47,970 --> 00:02:51,540
そして企業に貸したお金を返して欲しいといった
35
00:02:51,540 --> 00:02:57,130
貸しはがしや貸し渋りといったことが起こりつつあるということなんです人
36
00:02:57,130 --> 00:03:02,860
こうは昔から晴れた日に傘を貸して雨の日に傘を取り上げるなんて揶揄されたりするん
37
00:03:02,860 --> 00:03:09,040
ですけれどもこれは大不況の中で銀行としての仕事を放棄することを非難してるんです
38
00:03:09,040 --> 00:03:09,370
39
00:03:09,370 --> 00:03:13,570
なぜ大不況の中で銀行が消灯しないのかというと
40
00:03:13,570 --> 00:03:17,150
大不況であるということは企業や個人の
41
00:03:17,150 --> 00:03:22,010
破産が増えるので貸したお金が返ってこないリスクがあるからなんですね
42
00:03:22,010 --> 00:03:28,760
銀行は貸したお金の利息で儲かっているので帰って来ないお金は貸せないんですよ
43
00:03:28,760 --> 00:03:33,590
そのため生き残るために貸し渋りをしたり貸しはがしをしたりして
44
00:03:33,590 --> 00:03:36,830
できるだけ手元に資金を置いておきたいわけです
45
00:03:36,830 --> 00:03:42,440
でもそれだと世の中にお金がで回らなくなるので経済が死んでしまうんです
46
00:03:42,440 --> 00:03:47,540
そこで中央銀行にあたる frb が最後の貸し手となって
47
00:03:47,540 --> 00:03:54,440
市中銀行に大量の資金を供給するわけですすると銀行の手元資金は潤沢になるので
48
00:03:54,440 --> 00:03:56,819
貸し渋りをしたり貸しはがしをした
49
00:03:56,819 --> 00:04:01,980
にすることがなくなりますし金利が急騰するといったことも避けられるんです
50
00:04:01,980 --> 00:04:08,700
そして2008年の金融危機の際は frb が7000億ドル規模の量的緩和政策を
51
00:04:08,700 --> 00:04:14,639
実施して衆生にガンガン資金を供給して危機を脱したわけなんですけれども今回も
52
00:04:14,639 --> 00:04:16,840
7000億ドルが予定されて入ったんで
53
00:04:16,840 --> 00:04:22,930
けれどもコロナショックによる経済活動への打撃が大きすぎるということで
54
00:04:22,930 --> 00:04:27,130
7000億ドルから無制限とすることが決定されました
55
00:04:27,130 --> 00:04:32,889
ちなみに frb のパウエル議長が26日の木曜日にですね
56
00:04:32,889 --> 00:04:36,830
これは異例のことなんですけれども nbc のニュース番組と
57
00:04:36,830 --> 00:04:44,180
全員に出演したんですねそこでパウェル議長は今回の資金供給に関しては弾薬が尽きる
58
00:04:44,180 --> 00:04:51,170
ことはないとして量的緩和政策が無制限であることを強調していますつまり frb は
59
00:04:51,170 --> 00:04:54,500
コロナショックに対する金融緩和策として
60
00:04:54,500 --> 00:05:01,250
躊躇することなくそして手段も選ばないという明確な姿勢を示しているんですただし
61
00:05:01,250 --> 00:05:05,510
金融緩和だけでは限界があるのも事実なんです
62
00:05:05,510 --> 00:05:10,640
なぜかというと frb ができることは金利を引き上げたり
63
00:05:10,640 --> 00:05:14,490
引き下げたりすることそして最近夜叉細胞
64
00:05:14,490 --> 00:05:21,599
購入することだけだからでつまり frb だけでなくて政府による景気刺激策も必要
65
00:05:21,599 --> 00:05:23,819
になってくるわけなんですね
66
00:05:23,819 --> 00:05:32,340
そして政府による2兆ドル規模の大型景気刺激策は25日に上院で採決されて207日
67
00:05:32,340 --> 00:05:33,660
に下院で採決
68
00:05:33,660 --> 00:05:34,480
同日に
69
00:05:34,480 --> 00:05:38,040
トランプ大統領が署名して成立しました
70
00:05:38,040 --> 00:05:44,550
大型景気刺激策の内訳をざっくり眺めると個人給付が300010億ドル
71
00:05:44,550 --> 00:05:50,580
失業給付が2500億ドル中小企業支援に3490億ドル
72
00:05:50,580 --> 00:05:57,480
大企業支援に5000億ドルという風になっています大型の景気刺激策の柱である個人
73
00:05:57,480 --> 00:05:58,030
給付と
74
00:05:58,030 --> 00:06:04,920
いうのは国民一人ひとりに現金が小切手で配られるというものなんですがその額は大人
75
00:06:04,920 --> 00:06:06,280
1200ドル
76
00:06:06,280 --> 00:06:12,850
子供500ドルになることが決まりましたまた失業給付というのは特例の失業給付とし
77
00:06:12,850 --> 00:06:18,050
て毎週600ドルが通常の失業保険に上乗せされて給付
78
00:06:18,050 --> 00:06:24,199
されるというものです今回の頃なショックでレストランやホテルでは大量の従業員が
79
00:06:24,199 --> 00:06:30,919
解雇されていて解雇された従業員の中には貯金がゼロという人も珍しくないんですね
80
00:06:30,919 --> 00:06:38,040
で彼らは翌月の家賃が払えないので大量のホームレスが発生してしまうんじゃないか
81
00:06:38,040 --> 00:06:44,070
といった懸念があったわけですしかし今回の法案が成立したことでそういった事態は
82
00:06:44,070 --> 00:06:48,160
回避できるんじゃないかということが期待されています
83
00:06:48,160 --> 00:06:55,360
また中小企業と大企業を合わせた企業支援策についてはおおよそ9000億ドル規模に
84
00:06:55,360 --> 00:06:56,920
なることが決定しました
85
00:06:56,920 --> 00:07:02,350
これは当初の予定額5000億ドルから大幅に増額されています
86
00:07:02,350 --> 00:07:06,820
内訳は飲食業やホテル業航空業など
87
00:07:06,820 --> 00:07:08,180
ポロなショックによるだ
88
00:07:08,180 --> 00:07:11,630
劇を最も受けたとみられる業界に5000億ドル
89
00:07:11,630 --> 00:07:19,400
そして中小企業の従業員の給与支払いを政府が肩代わりするのに3490億ドルという
90
00:07:19,400 --> 00:07:20,330
風になってます
91
00:07:20,330 --> 00:07:26,570
この政府が肩代わりする給与についてはコロナショック後も企業が従業員をリストラし
92
00:07:26,570 --> 00:07:28,169
たりあるいは令二
93
00:07:28,169 --> 00:07:34,800
一時的邂逅していなければ政府が肩代わりした給与は返還しなくてもよいとする優遇
94
00:07:34,800 --> 00:07:35,999
措置のことです
95
00:07:35,999 --> 00:07:39,840
ただしリストラや0養父をした場合は変化しなくてはなりません
96
00:07:39,840 --> 00:07:47,550
こうした企業支援策があれば企業の倒産件数も減りますし失業者も幾分抑制されること
97
00:07:47,550 --> 00:07:48,160
が期待
98
00:07:48,160 --> 00:07:54,910
できます特に労働者は一度失業してしまうと再び働き始めるのにものすごく時間が
99
00:07:54,910 --> 00:08:01,030
かかるので失業者はできるだけ少なくしなければならないんですたとえば彼らは失業
100
00:08:01,030 --> 00:08:02,950
保険を申請して
101
00:08:02,950 --> 00:08:10,060
失業保険を受給しながら次の職を探して企業に問い合わせをして面接の日程を調整して
102
00:08:10,060 --> 00:08:16,510
面接をして合否を待ってそしてようやく働き始めることができるわけですこれって
103
00:08:16,510 --> 00:08:22,940
すごくめんどくさいですしてまですよねこのように失業してから再び働き派
104
00:08:22,940 --> 00:08:28,280
滑るまですごく時間がかかるので生産性が一気に落ちてしまうんですね
105
00:08:28,280 --> 00:08:31,460
さらに収入も失業保険だけですから
106
00:08:31,460 --> 00:08:38,360
消費がガクンと落ち込みますですから通常の景気後退局面というのはそこから脱却する
107
00:08:38,360 --> 00:08:42,960
までに短くても半年長ければ1年半くらいかかるわけ
108
00:08:42,960 --> 00:08:49,350
でそのため今回のプロなショックでリセッション入りしても個人への手厚い給付金が
109
00:08:49,350 --> 00:08:55,410
あることを考えれば景気後退は幾分短期的なものになることが期待できるわけです
110
00:08:55,410 --> 00:09:02,950
実際パウエル frb 議長は幹線危機が終息すれば力強い回復が見られるという3
111
00:09:02,950 --> 00:09:05,450
見方を示しているんです
112
00:09:05,450 --> 00:09:11,030
このチャートが何度も紹介していますが s & p 500と frb のバランス
113
00:09:11,030 --> 00:09:17,300
シートの推移を眺めるとバランスシートの拡大に伴って株価が上昇していることが
114
00:09:17,300 --> 00:09:18,500
わかると思います
115
00:09:18,500 --> 00:09:25,440
今回 frb が量的緩和政策を無制限にするとしたということは貸借対照表
116
00:09:25,440 --> 00:09:31,260
が無限に拡大するだけじゃなくてドルの価値が目減りするということも意味するわけ
117
00:09:31,260 --> 00:09:37,649
ですそしてそれは同時に株価が大暴騰するという未来を予見させるものです
118
00:09:37,649 --> 00:09:44,399
企業業績や経済指標がこれから悪化するのに本当に株価は大坊とするのと不安に思って
119
00:09:44,399 --> 00:09:49,860
いる人も少なくないと思うんですけれどもそもそも強気相場というのは悲観の中に
120
00:09:49,860 --> 00:09:50,579
生まれ
121
00:09:50,579 --> 00:09:57,640
会議の中に育ちラッカーの中で成熟し幸福感の中で消えていくというふうに言われてい
122
00:09:57,640 --> 00:10:03,430
ようにまさに今のような悲観の中で強気相場というのは生まれてくるんですね
123
00:10:03,430 --> 00:10:09,580
ただやっぱり悲観の中で買うっていうのはなかなか難しいと思うんですよ
124
00:10:09,580 --> 00:10:16,660
例えば26日の木曜日に労働省が発表した失業保険申請件数は
125
00:10:16,660 --> 00:10:20,230
要素165万人に対して結果
126
00:10:20,230 --> 00:10:25,030
3208万3000人と予想を大きく上回る
127
00:10:25,030 --> 00:10:28,510
大量の失業者が発生しているんですね
128
00:10:28,510 --> 00:10:34,760
1967年以降の53年間の申請件数の推移をみていただくとわかると思うんです
129
00:10:34,760 --> 00:10:35,660
けれども
130
00:10:35,660 --> 00:10:40,940
今回の数字がいかに桁外れに悪い数値かがわかると思います
131
00:10:40,940 --> 00:10:45,710
労働市場はこんな状況ですから4月以降に発表される
132
00:10:45,710 --> 00:10:48,000
13月期の四半期決算は
133
00:10:48,000 --> 00:10:54,420
悲惨な数字が出てくるでしょうし経済指標もどんどん悪い数字が出てくると思います
134
00:10:54,420 --> 00:11:00,240
このように将来悪い数値が出てくることがわかっている中で株を買い増すというのは
135
00:11:00,240 --> 00:11:04,500
多くの個人投資家には難しいと思いますただし
136
00:11:04,500 --> 00:11:07,830
絶好の買い場であることにはほかならないので
137
00:11:07,830 --> 00:11:07,990
138
00:11:07,990 --> 00:11:13,089
ランプ相場に乗れなかった人たちがもう一度トランプ相場に乗れるチャンスでもある
139
00:11:13,089 --> 00:11:14,230
わけです
140
00:11:14,230 --> 00:11:20,440
ここで気をつけてほしいのは今回の暴落で米国 love は危ないとかかぶって
141
00:11:20,440 --> 00:11:24,420
ギャンブルだよねっていう風に考えてほしくないんですよ
142
00:11:24,420 --> 00:11:29,850
ポロナーショックによる暴落局面というのは2009年から始まった
143
00:11:29,850 --> 00:11:36,029
11年にわたる強気相場に乗れなかった人たちがもう一度途中からのれるぜー高の
144
00:11:36,029 --> 00:11:37,950
チャンスを意味するんです
145
00:11:37,950 --> 00:11:45,660
しかも次の強気相場ではゼロ金利政策と無制限の量的緩和政策を追い風にした強気相場
146
00:11:45,660 --> 00:11:46,530
ですから
147
00:11:46,530 --> 00:11:50,550
大坊とすることが期待できるんですねまた将来
148
00:11:50,550 --> 00:11:53,580
インフレが加速することが予想されますから
149
00:11:53,580 --> 00:11:57,660
預貯金の実質的な価値の減少も予想されるわけです
150
00:11:57,660 --> 00:11:57,970
2
151
00:11:57,970 --> 00:12:04,810
ありこの強気相場に乗って投資を始めた人といつまでたっても投資を始めない人との間
152
00:12:04,810 --> 00:12:06,250
では将来
153
00:12:06,250 --> 00:12:09,519
絶望的な格差が生まれるということです
154
00:12:09,519 --> 00:12:15,610
では具体的な今後の展開なんですけれどもこれからは二番底を目指して下落する公算が
155
00:12:15,610 --> 00:12:17,379
大きいと考えています
156
00:12:17,379 --> 00:12:17,960
実は
157
00:12:17,960 --> 00:12:23,870
ダウ平均はすでに強気相場入りしているなんて言われているんですけれどもこれは直近
158
00:12:23,870 --> 00:12:30,290
の安値から+20%の上昇を強気相場入りというふうに定義しているためです
159
00:12:30,290 --> 00:12:34,580
ちなみに直近の高値からマイナス10%なら
160
00:12:34,580 --> 00:12:37,950
調整局面入り-20%なら
161
00:12:37,950 --> 00:12:41,790
弱気相場入りというふうに定義されていますとはいえ
162
00:12:41,790 --> 00:12:44,579
金融危機のときもそうだったんですがいい
163
00:12:44,579 --> 00:12:48,839
一旦強気相場入りしてもそこから再び下げているので
164
00:12:48,839 --> 00:12:53,459
安値から+20%上昇したとしても必ずしも
165
00:12:53,459 --> 00:13:00,119
弱気相場から脱却したとは言えないんですねそして金曜日のマーケットでダウ平均が
166
00:13:00,119 --> 00:13:03,119
4%超下落していますから
167
00:13:03,119 --> 00:13:04,570
おそらく2番
168
00:13:04,570 --> 00:13:09,070
渡航目指す展開になるんじゃないのかなというふうに僕は考えています
169
00:13:09,070 --> 00:13:12,640
これはそもそも通常の弱気相場というのは
170
00:13:12,640 --> 00:13:16,240
二番底3番底とした音を少しずつ
171
00:13:16,240 --> 00:13:22,090
固めていくものだからです例えば底値を形成する典型的なパターンとして
172
00:13:22,090 --> 00:13:24,560
ダブルボトムやトリプルボトムある
173
00:13:24,560 --> 00:13:30,020
岩逆ヘッドアンドショルダーだまあ逆三尊とも言ったりしますがこの3つのパターンが
174
00:13:30,020 --> 00:13:34,970
上げられるわけなんですけれどもこういったパターンを形成することが予想されます
175
00:13:34,970 --> 00:13:41,960
そのため1本調子で反発する確率はゼロではないんですけれども低いのかなというふう
176
00:13:41,960 --> 00:13:43,980
に僕は考えています
177
00:13:43,980 --> 00:13:50,100
そしてさきほども言いましたが強気相場とは悲観の中で生まれるものなので
178
00:13:50,100 --> 00:13:57,300
4月から8月ごろに底打ちして先行き見通しが悪化するなかで株価は上昇を開始すると
179
00:13:57,300 --> 00:13:59,130
いう風に考えています
180
00:13:59,130 --> 00:14:03,150
つまり8月にかけて絶好の買い場だということです
181
00:14:03,150 --> 00:14:04,000
ちなみに
182
00:14:04,000 --> 00:14:10,270
なぜ4月から8月ごろに底打ちするのかということについては以前の動画でも説明し
183
00:14:10,270 --> 00:14:12,700
ましたのでそちらをご参照ください
184
00:14:12,700 --> 00:14:15,970
概要欄の方にもリンクを貼っておきます
185
00:14:15,970 --> 00:14:23,410
では8月にかけて絶好の買い場であるなら一体何に投資すればいいのと誰もが考えて
186
00:14:23,410 --> 00:14:25,240
いることだと思うんですけれども
187
00:14:25,240 --> 00:14:30,819
長期的な資産形成を考えているなら一握りの優良株や s & p 500
188
00:14:30,819 --> 00:14:34,449
インデックスファンドなどに投資するのがいいと思います
189
00:14:34,449 --> 00:14:35,840
一握りの有料化
190
00:14:35,840 --> 00:14:42,050
が具体的にどういった銘柄を指すのかというと例えば1つのアイデアとしてはダウ平均
191
00:14:42,050 --> 00:14:48,740
構成銘柄があると思いますそもそもダウン平均というのは米国の主要企業30社で構成
192
00:14:48,740 --> 00:14:51,980
されている株価指数のことなんですけれども
193
00:14:51,980 --> 00:14:55,860
どの銘柄も優良株なのでそこから比較的安定
194
00:14:55,860 --> 00:15:00,720
た業績が期待できる銘柄に投資するのがいいのかなというふうに思います
195
00:15:00,720 --> 00:15:04,140
例えばアップルやマイクロソフトコカコーラ
196
00:15:04,140 --> 00:15:07,529
プロクターアンドギャンブルジョンソンエンドジョンソンウォールマート
197
00:15:07,529 --> 00:15:14,670
ディズニナイキマグドナルドなどですこれらの優良株が割安に放置されることはあまり
198
00:15:14,670 --> 00:15:15,850
ないんですけれども
199
00:15:15,850 --> 00:15:21,310
暴落局面では投資家が他の投資の損失を埋めるために
200
00:15:21,310 --> 00:15:25,180
たとえそれが優良株であっても売らざるを得なくなって
201
00:15:25,180 --> 00:15:32,110
泣く泣く手放したりするので暴落局面っていうのは優良株を割安な価格で買う絶好の
202
00:15:32,110 --> 00:15:33,640
チャンスなんですね
203
00:15:33,640 --> 00:15:39,130
まとめると先週は将来の巨大な強気相場の子たちとなる
204
00:15:39,130 --> 00:15:45,200
無制限の量的緩和政策が決定したほか大型景気刺激策が成立し
205
00:15:45,200 --> 00:15:51,260
たことでリセッションが短期間で収束するのではといった期待感が高まりました
206
00:15:51,260 --> 00:15:55,910
そして今後の展開は先行き見通しが悪化するなかで
207
00:15:55,910 --> 00:16:02,570
二番底を目指して株価が再び下げ始めますがそれは長期的に見れば絶好の買い場である
208
00:16:02,570 --> 00:16:05,190
ということですさらにコロナ
209
00:16:05,190 --> 00:16:10,290
ウイルスの終息後に巨大な強気相場が始まることを考えれば今回の you were
210
00:16:10,290 --> 00:16:16,560
機相場をきっかけに投資を始めた人といつまでたっても投資を始めない人との間では
211
00:16:16,560 --> 00:16:20,889
将来絶望的な格差が生まれるということです
212
00:16:20,889 --> 00:16:24,850
最後に何に投資すればいいのかについてですが
213
00:16:24,850 --> 00:16:27,970
長期的な資産形成を考えるのであれば
214
00:16:27,970 --> 00:16:30,999
ダウ構成銘柄に採用されているような
215
00:16:30,999 --> 00:16:34,209
一握りの優良株がいいでしょうしあるいは
216
00:16:34,209 --> 00:16:38,799
s & p 500インデックスファンドなどの指数に連動したパッシブファンドに
217
00:16:38,799 --> 00:16:40,880
投資するのがいいと思います
218
00:16:40,880 --> 00:16:43,910
ということで今回の動画は以上になります
219
00:16:43,910 --> 00:16:46,420
good luck
220
00:16:46,430 --> 00:16:47,710
ていますん
221
00:16:47,710 --> 00:16:52,630
もし今回の動画がためになったという方はチャンネル登録良いねボタンコメントなど
222
00:16:52,630 --> 00:16:54,550
頂けたらとても嬉しいです
223
00:16:54,550 --> 00:16:59,280
あとツイッターもやってますので良ければフォローお願いします

25
test/test.py

@ -1,9 +1,16 @@
import requests
webhook = "https://oapi.dingtalk.com/robot/send?access_token=c8c8d7d42c4eecd449dd303025ef968f647d1d8e8694e3fabc0ab5770d646dcb"
jsonData = {
"msgtype": "text",
"text": {
"content": "[Youtube]aaaa"
}
}
requests.post(webhook, json=jsonData)
# import requests
# webhook = "https://oapi.dingtalk.com/robot/send?access_token=c8c8d7d42c4eecd449dd303025ef968f647d1d8e8694e3fabc0ab5770d646dcb"
# jsonData = {
# "msgtype": "text",
# "text": {
# "content": "[Youtube]aaaa"
# }
# }
# requests.post(webhook, json=jsonData)
import pysrt
srtFile = "E:/code/youtube_prod/test/1.srt"
subs = pysrt.open(srtFile)
for sub in subs:
print("Text: {} duration: {}-{}".format(sub.text,
str(sub.start.to_time()).rstrip("0"), str(sub.end.to_time()).rstrip("0")))

11
test/test3.py

@ -0,0 +1,11 @@
from pytubefix import YouTube
from pytubefix.cli import on_progress
url = "https://www.youtube.com/watch?v=PKHQuQF1S8k"
yt = YouTube(url, on_progress_callback=on_progress)
print(yt.title)
ys = yt.streams.get_audio_only()
ys.download(mp3=True) # pass the parameter mp3=True to save in .mp3
Loading…
Cancel
Save