server: add import LCSC feature

This commit is contained in:
King Kévin 2023-01-29 09:56:49 +01:00
parent 35a865e2db
commit 2ef85a2008
2 changed files with 51 additions and 0 deletions

View File

@ -11,6 +11,8 @@ Distributors also need to be managed directly in the database.
Since this does change very often, it isn't too much of a hassle.
An example is in `populate.sql`, also with some other entries.
To import an LCSC part, simply go to the `/import/lcsc/Cxxxx` page and the part will be added to the database.
goals
=====

View File

@ -15,6 +15,8 @@ require 'set'
require 'mysql2'
require 'json'
require 'sinatra'
require 'uri'
require 'net/http'
# allow dumping crashes in browser
DEBUG = false
@ -365,3 +367,50 @@ post '/part' do
end
return 200
end
get '/import/lcsc/:lcsc' do
halt 401 unless params['lcsc'] and params['lcsc'] =~ /^C\d+$/i
uri = URI("https://wmsc.lcsc.com/wmsc/product/detail?productCode=#{params['lcsc']}")
res = Net::HTTP.get_response(uri)
halt 401, "could not get part" unless res.is_a?(Net::HTTPSuccess)
json = JSON.parse(res.body)
#puts json
halt 401, "part not found" unless 200 == json["code"] and json["result"]
result = json["result"]
part = {}
part["name"] = result["productModel"]
part["mpn"] = result["productModel"]
part["description"] = result["productDescEn"]
part["details"] = result["productIntroEn"]
part["manufacturer"] = result["brandNameEn"]
part["package"] = result["encapStandard"] # also includes pin count
part["distributors"] = {"LCSC" => result["productCode"]}
part["attachments"] = result["productImages"]
part["datasheet"] = result["pdfUrl"]
existing = get_part_by_name(part["name"])
halt 401, "part name already exists" if existing
puts part
begin
add_part(part)
rescue StandardError => e
halt 401, e.message
end
i = 0
(part["attachments"] + [part["datasheet"]]).each do |attachement|
file = attachement.split("/")[-1]
dir = PUBLIC + "/" + ATTACHMENTS + "/" + part["name"]
path = "#{dir}/#{i}_#{file}"
i += 1
unless File.file?(path) then
uri = URI(attachement)
res = Net::HTTP.get_response(uri)
if (res.is_a?(Net::HTTPSuccess)) then
Dir.mkdir(dir) unless File.directory?(dir)
File.open(path, "wb") do |f|
f.write res.body
end
end
end
end
return 200
end