online-judge-tools / api-client

API client to develop tools for competitive programming
MIT License
62 stars 18 forks source link

Support downloading system cases from AtCoder #139

Closed kmyk closed 3 years ago

kmyk commented 3 years ago

close #60 cc @qryxip

とりあえず最低限の実装をしました。zip で丸ごとダウンロードする API を使った方が速い気がするし、問題によってはダウンロードできなくて問題が発生しそうだけど、それは後からなんとかしましょう。

qryxip commented 3 years ago
  1. files/list_folderの結果に"has_more": trueが含まれているならfiles/list_folder_continueで続きを読む、という動作をこの段階で入れた方がいい気がします。20か30くらいで「見切れ」てしまったような記憶があるのでこのままだと「一部のファイルだけがエラー無くダウンロードされる」という事態が発生しそうです。
  2. ZIPでダウンロードするのは現在でも多分無理なんじゃないかと思います。files/download_zipSharedLinkを渡す場所が無いので。Pythonの公式SDKにもありません。
  3. かなりnitですがSharedFileurlの他passwardも持つオブジェクトなのでshared_link: strの名前はshared_link_urlとかの方がいいかもしれません。今回の場合モジュールレベルの定数にしても良いと思います。
qryxip commented 3 years ago

ZIPでダウンロードするのは現在でも多分無理

いやよく見たら入力パラメータのpathidrevで指定できますね。まさかとは思いますがこれ入れたらなんとかなる...?

qryxip commented 3 years ago

あ、やっぱ無理ですね。idrevはストレージごとのそれっぽいです。

❯ envchain competitive ./venv/bin/python ./dropbox-zip.py
[INFO] Request to sharing/get_shared_link_metadata
[INFO] `id` for `/ABC100/A`: 'id:hjsYZQdnqVAAAAAAAADAuw'
[INFO] Request to files/download_zip
Traceback (most recent call last):
  File "/home/ryo/src/local/dropbox-zip/./dropbox-zip.py", line 51, in <module>
    main()
  File "/home/ryo/src/local/dropbox-zip/./dropbox-zip.py", line 30, in main
    dbx.files_download_zip_to_file('./abc100-a.zip', metadata_id)
  File "/home/ryo/src/local/dropbox-zip/venv/lib/python3.9/site-packages/dropbox/base.py", line 1365, in files_download_zip_to_file
    r = self.request(
  File "/home/ryo/src/local/dropbox-zip/venv/lib/python3.9/site-packages/dropbox/dropbox_client.py", line 346, in request
    raise ApiError(res.request_id,
dropbox.exceptions.ApiError: ApiError('96c5cdd52d3243c1b55f8478c9cefeda', DownloadZipError('path', LookupError('not_found', None)))
kmyk commented 3 years ago

しばらく放置してた (:bow:) のですが、ついに続きをやりました。システムテストが 60 ケースくらいある問題をテスト用に走らせたらかなり遅い (Dropbox の API の返事待ちが律速) のでびっくりしています。かなり不安になる。