Module: ArtQ
- Defined in:
- lib/artq.rb,
lib/artq/layers.rb,
lib/artq/tokens.rb,
lib/artq/version.rb,
lib/artq/contract.rb
Defined Under Namespace
Constant Summary collapse
- JPGSIG =
use alternate Encoding::BINARY - why? why not?
or just use .b e.g. "GIF87".b or such !!!
"\xFF\xD8\xFF".force_encoding( Encoding::ASCII_8BIT )
- PNGSIG =
"\x89PNG".force_encoding( Encoding::ASCII_8BIT )
- GIF87SIG =
"GIF87".force_encoding( Encoding::ASCII_8BIT )
- GIF89SIG =
"GIF89".force_encoding( Encoding::ASCII_8BIT )
- VERSION =
'0.3.1'
Class Method Summary collapse
- .download_layers(contract_address, outdir: "./#{contract_address}") ⇒ Object
-
.download_tokens(contract_address, outdir: "./#{contract_address}", ids: (0..99)) ⇒ Object
download on-blockchain token metadata and (inline) images.
Class Method Details
.download_layers(contract_address, outdir: "./#{contract_address}") ⇒ Object
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/artq/layers.rb', line 14 def self.download_layers( contract_address, outdir: "./#{contract_address}" ) puts "==> download layers for art collection contract @ >#{contract_address}<:" c = Contract.new( contract_address ) ## get some metadata - why? why not? name = c.name symbol = c.symbol totalSupply = c.totalSupply traitDetails = [] n=0 loop do m=0 loop do rec = c.traitDetails( n, m ) break if rec == ['','',false] ## note: assume end-of-list if all values are zeros / defaults. traitDetails << [[n,m], rec ] m += 1 sleep( 0.5 ) end break if m==0 n += 1 end ## todo/check: include or drop hide (of any use?) - why? why not? headers = ['index', 'name', 'type', 'hide'] recs = [] traitDetails.each do |t| recs << [ t[0].join('/'), t[1][0], t[1][1], t[1][2].to_s] end buf = String.new('') buf << headers.join( ', ' ) buf << "\n" recs.each do |rec| buf << rec.join( ', ' ) buf << "\n" end write_text( "#{outdir}/cache/layers.csv", buf ) ##### # try to download all images traitDetails.each_with_index do |t,i| puts " [#{i+1}/#{traitDetails.size}] downloading #{t[1][1]} >#{t[1][0]}<..." n,m = t[0] data = c.traitData( n, m ) basename = "#{n}_#{m}" if data.start_with?( PNGSIG ) puts "BINGO!! it's a png blob - #{data.size} byte(s)" write_blob( "#{outdir}/cache/#{basename}.png", data ) elsif data.start_with?( GIF87SIG ) || data.start_with?( GIF89SIG ) puts "BINGO!! it's a gif blob - #{data.size} byte(s)" write_blob( "#{outdir}/cache/#{basename}.gif", data ) elsif data.start_with?( JPGSIG ) puts "BINGO!! it's a jpg blob - #{data.size} byte(s)" write_blob( "#{outdir}/cache/#{basename}.jpg", data ) elsif data.index( /<svg[^>]*?>/i ) ## add more markers to find - why? why not? puts "BINGO!! it's a svg (text) blob - #{data.size} byte(s)" ## todo/check - save text as binary blob 1:1 - why? why not? write_blob( "#{outdir}/cache/#{basename}.svg", data ) else puts "!! ERROR - unknown image format; sorry" exit 1 end sleep( 0.5 ) end puts " name: >#{name}<" puts " symbol: >#{symbol}<" puts " totalSupply: >#{totalSupply}<" puts puts " traitDetails:" pp traitDetails end |
.download_tokens(contract_address, outdir: "./#{contract_address}", ids: (0..99)) ⇒ Object
download on-blockchain token metadata and (inline) images
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/artq/tokens.rb', line 51 def self.download_tokens( contract_address, outdir: "./#{contract_address}", ids: (0..99) ) puts "==> download token (on-blockchain) metadata and (inline) images for art collection contract @ >#{contract_address}<:" c = Contract.new( contract_address ) ## get some metadata - why? why not? name = c.name symbol = c.symbol totalSupply = c.totalSupply warns = [] ## collect all warnings tokenIds = ids tokenIds.each do |tokenId| tokenURI = c.tokenURI( tokenId ) sleep( 0.5 ) puts " tokenId #{tokenId}:" = Meta.parse( tokenURI ) if .data.empty? ## todo/check: raise TypeError or such or return nil - why? why not? warns << "token no. #{tokenId} metadata not 'on-blockchain'? expected json base64-encoded; got:" puts "!! WARN - " + warns[-1] pp tokenURI else path = "#{outdir}/token/#{tokenId}.json" write_json( path, .data ) if .image_data ## assume svg for now - always - why? why not? path = "#{outdir}/token-i/#{tokenId}.svg" write_text( path, .image_data ) else warns << "token no. #{tokenId} (inline) image data not found in 'on-blockchain' metadata; got:" puts "!! WARN - " + warns[-1] pp .data end end end if warns.size > 0 puts "!!! #{warns.size} WARNING(S):" pp warns end puts puts " name: >#{name}<" puts " symbol: >#{symbol}<" puts " totalSupply: >#{totalSupply}<" end |