qgyd2021 commited on
Commit
da2b2d2
·
1 Parent(s): 92c52ae
toolbox/bilibili/video/video_manager.py CHANGED
@@ -67,8 +67,8 @@ class BilibiliVideoUploader20200810(BilibiliClient):
67
  stop=stop_after_attempt(3),
68
  before_sleep=before_sleep_log(logger, logging.ERROR),
69
  )
70
- def get_upload_video_id(self, upos_uri, auth, **kwargs):
71
- url = f"https://upos-sz-upcdnbda2.bilivideo.com/{upos_uri}?uploads&output=json"
72
  response = requests.request(
73
  method="POST",
74
  url=url,
@@ -87,18 +87,7 @@ class BilibiliVideoUploader20200810(BilibiliClient):
87
  return js
88
 
89
  def upload_video_in_chunks(self, endpoint, upos_uri, auth, upload_id, fileio, filesize, chunk_size, chunks):
90
- """
91
- Upload the video in chunks.
92
- :param upos_uri: str, get from `pre_upload`
93
- :param auth: str, get from `pre_upload`
94
- :param upload_id: str, get from `get_upload_video_id`
95
- :param fileio: io.BufferedReader, the io stream of the video to be uploaded
96
- :param filesize: int, the size of the video to be uploaded
97
- :param chunk_size: int, the size of each chunk to be uploaded
98
- :param chunks: int, the number of chunks to be uploaded
99
- :return:
100
- """
101
- url = f"https://upos-sz-upcdnbda2.bilivideo.com/{upos_uri}"
102
  params = {
103
  "partNumber": None, # start from 1
104
  "uploadId": upload_id,
@@ -110,7 +99,7 @@ class BilibiliVideoUploader20200810(BilibiliClient):
110
  "total": filesize,
111
  }
112
 
113
- process_bar = tqdm(desc="bilibili_upload_video", total=chunks)
114
  for chunknum in range(chunks):
115
  start = fileio.tell()
116
  batchbytes = fileio.read(chunk_size)
@@ -139,8 +128,8 @@ class BilibiliVideoUploader20200810(BilibiliClient):
139
  stop=stop_after_attempt(3),
140
  before_sleep=before_sleep_log(logger, logging.ERROR),
141
  )
142
- def finish_upload(self, upos_uri, auth, filename, upload_id, biz_id, chunks):
143
- url = f"https://upos-sz-upcdnbda2.bilivideo.com/{upos_uri}"
144
  params = {
145
  "output": "json",
146
  "name": filename,
@@ -178,13 +167,6 @@ class BilibiliVideoUploader20200810(BilibiliClient):
178
  before_sleep=before_sleep_log(logger, logging.ERROR),
179
  )
180
  def publish_video(self, bilibili_filename, metadata: dict):
181
- """
182
- publish the uploaded video
183
- https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/creativecenter/upload.md
184
- :param bilibili_filename:
185
- :param metadata:
186
- :return:
187
- """
188
  url = f'https://member.bilibili.com/x/vu/web/add?csrf={self.cookies["bili_jct"]}'
189
 
190
  data = {
@@ -233,20 +215,25 @@ class BilibiliVideoUploader20200810(BilibiliClient):
233
  filesize = filename.stat().st_size
234
 
235
  js = self.pre_upload(filename=filename, filesize=filesize)
 
236
  upos_uri = js["upos_uri"].split("//")[-1]
237
  auth = js["auth"]
238
  biz_id = js["biz_id"]
239
  chunk_size = js["chunk_size"]
240
  chunks = math.ceil(filesize / chunk_size)
241
 
242
- upload_video_id_response = self.get_upload_video_id(upos_uri=upos_uri, auth=auth)
 
 
 
 
243
  upload_id = upload_video_id_response["upload_id"]
244
  key = upload_video_id_response["key"]
245
 
246
  bilibili_filename = re.search(r"/(.*)\.", key).group(1)
247
  fileio = filename.open(mode="rb")
248
  self.upload_video_in_chunks(
249
- endpoint="",
250
  upos_uri=upos_uri,
251
  auth=auth,
252
  upload_id=upload_id,
@@ -259,14 +246,15 @@ class BilibiliVideoUploader20200810(BilibiliClient):
259
 
260
  # notify the all chunks have been uploaded
261
  self.finish_upload(
 
262
  upos_uri=upos_uri, auth=auth, filename=filename,
263
  upload_id=upload_id, biz_id=biz_id, chunks=chunks
264
  )
265
-
266
- return biz_id, bilibili_filename
267
 
268
  def upload_video_and_publish(self, filename: str, metadata: dict):
269
- _, bilibili_filename = self.upload_video_file(filename)
 
270
  publish_video_response = self.publish_video(bilibili_filename=bilibili_filename, metadata=metadata)
271
 
272
  bvid = None
@@ -283,38 +271,6 @@ class BilibiliVideoUploader20200810(BilibiliClient):
283
  raise KeyError(f"publish_video failed; KeyError: {error}, publish_video_response: {publish_video_response}")
284
  return bvid
285
 
286
- @retry(
287
- wait=wait_fixed(10),
288
- stop=stop_after_attempt(3),
289
- before_sleep=before_sleep_log(logger, logging.ERROR),
290
- )
291
- def predict_tid(self, title: str, upload_id: str, bilibili_filename: str):
292
- csrf = self.cookies["bili_jct"]
293
- url = f"https://member.bilibili.com/x/vupre/web/archive/types/predict"
294
- params = {
295
- "csrf": csrf,
296
- }
297
- data = {
298
- "title": title,
299
- "upload_id": upload_id,
300
- "filename": bilibili_filename,
301
- }
302
- response = requests.request(
303
- method="POST",
304
- url=url,
305
- headers={
306
- "TE": "Trailers",
307
- **self.headers,
308
- },
309
- params=params,
310
- json=data,
311
- cookies=self.cookies,
312
- )
313
- if response.status_code != 200:
314
- raise AssertionError(f"request failed; status_code: {response.status_code}, text: {response.text}")
315
- js = response.json()
316
- return js
317
-
318
 
319
  class BilibiliVideoUploader20221109(BilibiliVideoUploader20200810):
320
  def __init__(self):
@@ -339,11 +295,6 @@ class BilibiliVideoUploader20221109(BilibiliVideoUploader20200810):
339
  "build": "2140000",
340
  "size": filesize,
341
  }
342
- # response = self.session.get(
343
- # url,
344
- # params=params,
345
- # headers={"TE": "Trailers"}
346
- # )
347
  response = requests.request(
348
  # method="GET",
349
  method="POST",
@@ -368,7 +319,8 @@ class BilibiliVideoUploader20221109(BilibiliVideoUploader20200810):
368
  stop=stop_after_attempt(3),
369
  before_sleep=before_sleep_log(logger, logging.ERROR),
370
  )
371
- def get_upload_video_id(self, endpoint, upos_uri, auth,
 
372
  filesize, chunk_size, biz_id,
373
  **kwargs
374
  ):
@@ -377,7 +329,6 @@ class BilibiliVideoUploader20221109(BilibiliVideoUploader20200810):
377
  "profile": "ugcfx/bup",
378
  "filesize": filesize,
379
  "partsize": chunk_size,
380
- # "biz_id": biz_id,
381
  }
382
  response = requests.request(
383
  method="POST",
@@ -397,43 +348,6 @@ class BilibiliVideoUploader20221109(BilibiliVideoUploader20200810):
397
  raise AssertionError(f"request failed;")
398
  return js
399
 
400
- def upload_video_in_chunks(self, endpoint, upos_uri, auth, upload_id, fileio, filesize, chunk_size, chunks):
401
- url = f"https:{endpoint}/{upos_uri}"
402
-
403
- params = {
404
- "partNumber": None, # start from 1
405
- "uploadId": upload_id,
406
- "chunk": None, # start from 0
407
- "chunks": chunks,
408
- "size": None, # current batch size
409
- "start": None,
410
- "end": None,
411
- "total": filesize,
412
- }
413
- process_bar = tqdm(desc="bilibili_upload_video", total=chunks)
414
- for chunknum in range(chunks):
415
- start = fileio.tell()
416
- batchbytes = fileio.read(chunk_size)
417
- params["partNumber"] = chunknum + 1
418
- params["chunk"] = chunknum
419
- params["size"] = len(batchbytes)
420
- params["start"] = start
421
- params["end"] = fileio.tell()
422
- response = requests.request(
423
- method="OPTIONS",
424
- url=url,
425
- headers={
426
- "X-Upos-Auth": auth,
427
- **self.headers,
428
- },
429
- params=params,
430
- data=batchbytes,
431
- cookies=self.cookies,
432
- )
433
- if response.status_code != 200:
434
- raise AssertionError(f"request failed; status_code: {response.status_code}, text: {response.text}")
435
- process_bar.update(1)
436
-
437
  @retry(
438
  wait=wait_fixed(10),
439
  stop=stop_after_attempt(3),
@@ -449,14 +363,12 @@ class BilibiliVideoUploader20221109(BilibiliVideoUploader20200810):
449
  "uploadId": upload_id,
450
  "biz_id": biz_id
451
  }
452
- print(params)
453
  data = {
454
  "parts": [
455
  {"partNumber": i+1, "eTag": "etag"}
456
  for i in range(chunks)
457
  ]
458
  }
459
- print(data)
460
  response = requests.request(
461
  method="POST",
462
  url=url,
@@ -481,14 +393,6 @@ class BilibiliVideoUploader20221109(BilibiliVideoUploader20200810):
481
  before_sleep=before_sleep_log(logger, logging.ERROR),
482
  )
483
  def publish_video(self, bilibili_filename, metadata: dict):
484
- """
485
- publish the uploaded video
486
-
487
- https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/creativecenter/upload.md
488
- :param bilibili_filename:
489
- :param metadata:
490
- :return:
491
- """
492
  url = f'https://member.bilibili.com/x/vu/web/add?csrf={self.cookies["bili_jct"]}'
493
 
494
  data = {
@@ -569,7 +473,6 @@ class BilibiliVideoUploader20221109(BilibiliVideoUploader20200810):
569
  )
570
  fileio.close()
571
 
572
- # notify the all chunks have been uploaded
573
  self.finish_upload(
574
  endpoint=endpoint,
575
  upos_uri=upos_uri, auth=auth, filename=filename.name,
@@ -578,30 +481,9 @@ class BilibiliVideoUploader20221109(BilibiliVideoUploader20200810):
578
 
579
  return biz_id, upload_id, bilibili_filename
580
 
581
- def upload_video_and_publish(self, filename: str, metadata: dict):
582
- _, upload_id, bilibili_filename = self.upload_video_file(filename)
583
- logger.info(f"finish uploading, upload_id: {upload_id}, bilibili_filename: {bilibili_filename}, filename: {filename}")
584
- tid = self.predict_tid(
585
- title=metadata["title"],
586
- upload_id=upload_id,
587
- bilibili_filename=bilibili_filename,
588
- )
589
- metadata["tid"] = tid
590
- logger.info(f"predict tid, tid: {tid}, filename: {filename}")
591
- publish_video_response = self.publish_video(bilibili_filename=bilibili_filename, metadata=metadata)
592
-
593
- bvid = None
594
- status_code = publish_video_response["code"]
595
- if status_code == 137022:
596
- message = publish_video_response["message"]
597
- logger.info(f"publish_video failed; code: {status_code}, message: {message}")
598
- else:
599
- bvid = publish_video_response["data"]["bvid"]
600
- return bvid
601
-
602
 
603
- BilibiliVideoUploader = BilibiliVideoUploader20200810
604
- # BilibiliVideoUploader = BilibiliVideoUploader20221109
605
 
606
 
607
  def get_args():
@@ -613,7 +495,7 @@ def get_args():
613
  )
614
  parser.add_argument(
615
  "--filename",
616
- default=(project_path / "data/tasks/chenjieshen_douyin_video_to_bilibili/video/douyin/陈杰森/7548332163859533083_20250910T170000_千万不要帮朋友担保!否则你可能背上一身债!.mp4").as_posix(),
617
  type=str
618
  )
619
  args = parser.parse_args()
 
67
  stop=stop_after_attempt(3),
68
  before_sleep=before_sleep_log(logger, logging.ERROR),
69
  )
70
+ def get_upload_video_id(self, endpoint, upos_uri, auth, **kwargs):
71
+ url = f"https:{endpoint}/{upos_uri}?uploads&output=json"
72
  response = requests.request(
73
  method="POST",
74
  url=url,
 
87
  return js
88
 
89
  def upload_video_in_chunks(self, endpoint, upos_uri, auth, upload_id, fileio, filesize, chunk_size, chunks):
90
+ url = f"https:{endpoint}/{upos_uri}"
 
 
 
 
 
 
 
 
 
 
 
91
  params = {
92
  "partNumber": None, # start from 1
93
  "uploadId": upload_id,
 
99
  "total": filesize,
100
  }
101
 
102
+ process_bar = tqdm(desc=f"bilibili_upload_video({endpoint})", total=chunks)
103
  for chunknum in range(chunks):
104
  start = fileio.tell()
105
  batchbytes = fileio.read(chunk_size)
 
128
  stop=stop_after_attempt(3),
129
  before_sleep=before_sleep_log(logger, logging.ERROR),
130
  )
131
+ def finish_upload(self, endpoint, upos_uri, auth, filename, upload_id, biz_id, chunks):
132
+ url = f"https:{endpoint}/{upos_uri}"
133
  params = {
134
  "output": "json",
135
  "name": filename,
 
167
  before_sleep=before_sleep_log(logger, logging.ERROR),
168
  )
169
  def publish_video(self, bilibili_filename, metadata: dict):
 
 
 
 
 
 
 
170
  url = f'https://member.bilibili.com/x/vu/web/add?csrf={self.cookies["bili_jct"]}'
171
 
172
  data = {
 
215
  filesize = filename.stat().st_size
216
 
217
  js = self.pre_upload(filename=filename, filesize=filesize)
218
+ endpoint = js["endpoint"]
219
  upos_uri = js["upos_uri"].split("//")[-1]
220
  auth = js["auth"]
221
  biz_id = js["biz_id"]
222
  chunk_size = js["chunk_size"]
223
  chunks = math.ceil(filesize / chunk_size)
224
 
225
+ upload_video_id_response = self.get_upload_video_id(
226
+ endpoint=endpoint,
227
+ upos_uri=upos_uri,
228
+ auth=auth,
229
+ )
230
  upload_id = upload_video_id_response["upload_id"]
231
  key = upload_video_id_response["key"]
232
 
233
  bilibili_filename = re.search(r"/(.*)\.", key).group(1)
234
  fileio = filename.open(mode="rb")
235
  self.upload_video_in_chunks(
236
+ endpoint=endpoint,
237
  upos_uri=upos_uri,
238
  auth=auth,
239
  upload_id=upload_id,
 
246
 
247
  # notify the all chunks have been uploaded
248
  self.finish_upload(
249
+ endpoint=endpoint,
250
  upos_uri=upos_uri, auth=auth, filename=filename,
251
  upload_id=upload_id, biz_id=biz_id, chunks=chunks
252
  )
253
+ return biz_id, upload_id, bilibili_filename
 
254
 
255
  def upload_video_and_publish(self, filename: str, metadata: dict):
256
+ _, upload_id, bilibili_filename = self.upload_video_file(filename)
257
+ logger.info(f"finish uploading, upload_id: {upload_id}, bilibili_filename: {bilibili_filename}, filename: {filename}")
258
  publish_video_response = self.publish_video(bilibili_filename=bilibili_filename, metadata=metadata)
259
 
260
  bvid = None
 
271
  raise KeyError(f"publish_video failed; KeyError: {error}, publish_video_response: {publish_video_response}")
272
  return bvid
273
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
274
 
275
  class BilibiliVideoUploader20221109(BilibiliVideoUploader20200810):
276
  def __init__(self):
 
295
  "build": "2140000",
296
  "size": filesize,
297
  }
 
 
 
 
 
298
  response = requests.request(
299
  # method="GET",
300
  method="POST",
 
319
  stop=stop_after_attempt(3),
320
  before_sleep=before_sleep_log(logger, logging.ERROR),
321
  )
322
+ def get_upload_video_id(self,
323
+ endpoint, upos_uri, auth,
324
  filesize, chunk_size, biz_id,
325
  **kwargs
326
  ):
 
329
  "profile": "ugcfx/bup",
330
  "filesize": filesize,
331
  "partsize": chunk_size,
 
332
  }
333
  response = requests.request(
334
  method="POST",
 
348
  raise AssertionError(f"request failed;")
349
  return js
350
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
351
  @retry(
352
  wait=wait_fixed(10),
353
  stop=stop_after_attempt(3),
 
363
  "uploadId": upload_id,
364
  "biz_id": biz_id
365
  }
 
366
  data = {
367
  "parts": [
368
  {"partNumber": i+1, "eTag": "etag"}
369
  for i in range(chunks)
370
  ]
371
  }
 
372
  response = requests.request(
373
  method="POST",
374
  url=url,
 
393
  before_sleep=before_sleep_log(logger, logging.ERROR),
394
  )
395
  def publish_video(self, bilibili_filename, metadata: dict):
 
 
 
 
 
 
 
 
396
  url = f'https://member.bilibili.com/x/vu/web/add?csrf={self.cookies["bili_jct"]}'
397
 
398
  data = {
 
473
  )
474
  fileio.close()
475
 
 
476
  self.finish_upload(
477
  endpoint=endpoint,
478
  upos_uri=upos_uri, auth=auth, filename=filename.name,
 
481
 
482
  return biz_id, upload_id, bilibili_filename
483
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
484
 
485
+ # BilibiliVideoUploader = BilibiliVideoUploader20200810
486
+ BilibiliVideoUploader = BilibiliVideoUploader20221109
487
 
488
 
489
  def get_args():
 
495
  )
496
  parser.add_argument(
497
  "--filename",
498
+ default=(project_path / "data/tasks/chenjieshen_douyin_video_to_bilibili/video/douyin/陈杰森/754766069892763162520250908_101827首富黄光裕王者归来携国美杀入AI社交赛道 资本新秀陈杰森对话商业传奇二资本市场背后首富眼中的.mp4").as_posix(),
499
  type=str
500
  )
501
  args = parser.parse_args()