Baidu Netdisk
A Ruby client to upload files to Baidu NetDisk (PCS). It'll auto-split big files and upload slices parallelly.
Installation
Install with bundler:
bundle add baidu-netdisk
Or install with ruby gem
gem install baidu-netdisk
Configuration
BaiduNetDisk.config do |c|
# Required configs
c.app_id = 'your_app_id'
c.app_key = 'your_app_key'
c.secret_key = 'your_secret_key'
# Max threads for uploading file slices, default to 1
c.max_uploading_threads = 4
# The following two are optional;
# Fill them in if you want to explicitly indicate uploading to someone else's storage space
c.access_token = 'your_access_token'
c.refresh_token = 'your_refresh_token'
end
Usage
This client is designed for the two following scenarios.
Scenario 1: Using Baidu NetDisk as a backup file storage
You always save files to your net disk storage. You don't need a callback to receive auth codes or tokens from Baidu; Instead, you can just get them from your Ruby console.
require 'baidu-netdisk'
# It opens a browser to ask for access to Baidu OAuth;
# you will get your auth code after you log in to your Baidu NetDisk
BaiduNetDisk::Auth.get_auth_code
# Pass the code as the argument your received from the previous step
BaiduNetDisk::Auth.get_token(auth_code)
uploader = BaiduNetDisk::Uploader.new(source_path, target_path)
uploader.execute
# => {"category"=>6, "ctime"=>1676019860, "from_type"=>1, "fs_id"=>121127634951625, "isdir"=>0, "md5"=>"79835de6btc0b3482f51b49088c8ccfb", "mtime"=>1676019860, "path"=>"<target_path>", "server_filename"=>"<file_name>", "size"=>76267, "errno"=>0, "name"=>"<target_path>"}
Scenario 2: Upload files to your clients' Baidu NetDisk
You should have a web server and need to implement your webhook to receive a callback from Baidu NetDisk after auth.
Say your callback URL is https://www.example.com/webhook
, you should have the:
BaiduNetDisk::Auth.get_auth_code('https://www.example.com/webhook')
# Auth code is fetched in your callbacks
BaiduNetDisk::Auth.get_token(auth_code, 'https://www.example.com/webhook')
uploader = BaiduNetDisk::Uploader.new(source_path, target_path,
{ access_token: 'client.access_token', refresh_token: 'client.refresh_token' })
uploader.execute
It provides a hook after token refreshed so you can save tokens after refreshing.
BaiduNetDisk.config do |c|
c.after_token_refreshed = -> (access_token, refresh_token) {
user.update access_token: access_token, refresh_token: refresh_token
}
end
Development
Copy the env file
It reads ENV from .env for testing.
cp .env.example .env
Run tests
bundle install
bundle exec rake
Todo
-
Improve MAINTAINABILITY
-
To use other HTTP clients instead of RestClient:
-
RestClient can't catch response body when response is
400 BadRequest
. -
Currently, we implemented multi-threaded uploading by hands. Consider to use typhoeus with its native hydra to run HTTP requests in parallel.