Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
mycard
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
syntax_j
mycard
Commits
9b40d56c
Commit
9b40d56c
authored
Sep 16, 2013
by
神楽坂玲奈
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
iduel-images-downloader
parent
ec791ff3
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
260 additions
and
6 deletions
+260
-6
README.md
README.md
+5
-1
config.json
config.json
+0
-1
iduel-images-downloader.rb
iduel-images-downloader.rb
+135
-0
main.rb
main.rb
+120
-4
No files found.
README.md
View file @
9b40d56c
mkexy
--encoding=utf-8
main.rb
mkexy main.rb
exerb -c gui -k utf8 main.exy
upx main.exe
unicode.data:
file: E:/Ruby200/lib/ruby/gems/2.0.0/gems/addressable-2.3.5/data/unicode.data
resource:
icon:
-
width: 256
...
...
config.json
deleted
100644 → 0
View file @
ec791ff3
{
"port"
:
9998
,
"ygopro"
:{
"path"
:
"e:/zh99998/Documents/GitHub/mycard-lite"
,
"textfont"
:
"c:/windows/fonts/simsun.ttc"
,
"numfont"
:
"c:/windows/fonts/arialbd.ttf"
},
"url"
:
"http://my-card.in/rooms"
}
\ No newline at end of file
iduel-images-downloader.rb
0 → 100644
View file @
9b40d56c
#encoding: UTF-8
if
!
File
.
file?
'data/allcards.dll'
puts
"请放到iDuel目录下运行"
exit
end
cards
=
IO
.
readlines
(
'data/allcards.dll'
).
size
/
2
puts
"卡片总计
#{
cards
}
张"
if
File
.
file?
'data/config.ini'
require
'inifile'
config
=
IniFile
.
new
IO
.
read
(
'data/config.ini'
,
mode:
'rb:BOM|UTF-16LE:UTF-8'
)
path
=
config
[
'Config'
]
&&
config
[
'Config'
][
'CardImagePath'
]
end
if
!
path
or
!
File
.
directory?
path
require
'win32/registry'
path
=
Win32
::
Registry
::
HKEY_CURRENT_USER
.
open
(
'Software\OCGSOFT\Cards'
)
{
|
reg
|
reg
[
'Path'
]
}
rescue
''
path
.
force_encoding
(
Encoding
::
GBK
).
encode!
(
Encoding
::
UTF_8
)
end
if
!
path
or
!
File
.
directory?
path
Dir
.
mkdir
'data'
unless
File
.
directory?
'data'
path
=
'data/image'
end
puts
"本地卡图路径
#{
path
}
"
Dir
.
mkdir
path
unless
File
.
directory?
path
def
batch_download
(
main_url
,
files
,
content_type
=
nil
)
connections
=
{}
count
=
{
total:
files
.
size
,
error:
0
}
[
10
*
100
,
files
.
size
].
min
.
times
{
do_download
(
main_url
,
files
,
content_type
,
count
,
connections
)
}
end
def
do_download
(
main_url
,
files
,
content_type
,
count
,
connections
)
if
connections
.
size
<
10
connection
=
EventMachine
::
HttpRequest
.
new
(
main_url
)
connections
[
connection
]
=
0
else
connection
=
connections
.
min_by
{
|
key
,
value
|
value
}
if
connection
[
1
]
>=
100
return
else
connection
=
connection
[
0
]
end
end
remote_path
,
local_path
=
files
.
shift
connections
[
connection
]
+=
1
connection
.
get
(
path:
remote_path
,
keepalive:
connections
[
connection
]
!=
100
).
callback
{
|
http
|
puts
File
.
basename
local_path
count
[
:error
]
=
0
count
[
:total
]
-=
1
if
http
.
response_header
[
'CONNECTION'
]
!=
'keep-alive'
connection
.
close
connections
.
delete
(
connection
)
do_download
(
main_url
,
files
,
content_type
,
count
,
connections
)
while
!
files
.
empty?
and
(
connections
.
size
<
10
or
connections
.
values
.
min
<
100
)
end
if
http
.
response_header
.
status
==
200
and
(
!
content_type
or
http
.
response_header
[
'CONTENT_TYPE'
]
==
content_type
)
IO
.
binwrite
local_path
,
http
.
response
else
puts
http
.
response_header
.
http_status
end
if
count
[
:total
].
zero?
connections
.
each_key
{
|
connection
|
connection
.
close
}
connections
.
clear
puts
'all done'
EM
.
stop
end
}.
errback
{
|
http
|
puts
http
.
error
connection
.
close
connections
.
delete
(
connection
)
files
[
remote_path
]
=
local_path
count
[
:error
]
+=
1
if
count
[
:error
]
<=
10
*
100
do_download
(
main_url
,
files
,
content_type
,
count
,
connections
)
while
!
files
.
empty?
and
(
connections
.
size
<
10
or
connections
.
values
.
min
<
100
)
else
connections
.
each_key
{
|
connection
|
connection
.
close
}
connections
.
clear
puts
'network error'
EM
.
stop
end
}
end
cards_to_download
=
(
1
..
cards
).
to_a
-
Dir
.
glob
(
File
.
expand_path
'*.jpg'
,
path
).
collect
{
|
file
|
File
.
basename
(
file
,
'.jpg'
).
to_i
}
puts
"需要下载
#{
cards_to_download
.
size
}
张"
exit
if
cards_to_download
.
empty?
#monkey patch for exerb & addressable
if
defined?
ExerbRuntime
require
'stringio'
module
Addressable
module
IDNA
module
File
class
<<
self
def
join
(
*
args
)
end
def
expand_path
(
*
args
)
end
def
dirname
(
*
args
)
end
def
open
(
*
args
)
result
=
ExerbRuntime
.
open
(
'unicode.data'
)
if
block_given?
begin
yield
result
ensure
result
.
close
end
end
end
end
end
end
end
end
require
'em-http-request'
EventMachine
.
run
do
http
=
EventMachine
::
HttpRequest
.
new
(
'http://p.ocgsoft.cn/:osid.jpg'
).
get
redirects:
10
http
.
callback
{
|
http
|
main_url
=
http
.
last_effective_url
puts
"获取卡图下载地址:
#{
main_url
}
"
files
=
{}
cards_to_download
.
each
{
|
card_id
|
files
[
main_url
.
path
.
gsub
(
':osid'
,
card_id
.
to_s
)]
=
File
.
join
(
path
,
card_id
.
to_s
+
'.jpg'
)
}
batch_download
(
main_url
.
to_s
,
files
,
'image/jpeg'
)
}
end
\ No newline at end of file
main.rb
View file @
9b40d56c
...
...
@@ -6,16 +6,23 @@ if defined?(Ocra) or defined?(Exerb)
require
'fileutils'
require
'uri'
require
'open-uri'
require
'net/http'
require
'win32api'
require
'win32ole'
require
'win32/registry'
require
'websocket-eventmachine-server'
require
'em-http'
require
'rb-notifu'
require
'sqlite3'
require
'socket'
require
'net/http'
exit
end
# = Runtime
begin
# == initialize
Version
=
"0.1.0"
Platform
=
(
RUBY_PLATFORM
[
'mswin'
]
||
RUBY_PLATFORM
[
'mingw'
])
?
:
win32
:
:linux
System_Encoding
=
Encoding
.
find
(
"locale"
)
rescue
Encoding
.
find
(
Encoding
.
locale_charmap
)
...
...
@@ -154,9 +161,10 @@ begin
def
service
require
'socket'
TCPServer
.
new
(
'0.0.0.0'
,
Config
[
'port'
]).
close
rescue
return
#check port in use, seems eventmachine enabled IP_REUSEADDR.
require
'websocket-eventmachine-server'
EventMachine
.
run
do
WebSocket
::
EventMachine
::
Server
.
start
(
:host
=>
"0.0.0.0"
,
:port
=>
Config
[
'port'
])
do
|
ws
|
ws
.
onopen
do
ws
.
send
({
'version'
=>
Version
}.
to_json
)
...
...
@@ -170,7 +178,86 @@ begin
puts
"Client disconnected"
end
end
if
File
.
file?
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'cards.cdb'
)
require
'sqlite3'
db
=
SQLite3
::
Database
.
new
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'cards.cdb'
)
cards
=
db
.
execute
(
'select id from datas'
).
flatten
images_to_download
=
cards
-
Dir
.
glob
(
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'pics'
,
'*.jpg'
)).
collect
{
|
file
|
File
.
basename
(
file
,
'.jpg'
).
to_i
}
thumbnails_to_download
=
cards
-
Dir
.
glob
(
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'pics'
,
'thumbnail'
,
'*.jpg'
)).
collect
{
|
file
|
File
.
basename
(
file
,
'.jpg'
).
to_i
}
end
unless
images_to_download
.
empty?
and
thumbnails_to_download
.
empty?
require
'em-http'
require
'uri'
http
=
EM
::
HttpRequest
.
new
(
'https://my-card.in/cards/image.json'
).
get
http
.
callback
{
response
=
JSON
.
parse
http
.
response
p
response
image_url
=
URI
(
response
[
'url'
])
thumbnail_url
=
URI
(
response
[
'thumbnail_url'
])
Dir
.
mkdir
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'pics'
)
unless
File
.
directory?
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'pics'
)
Dir
.
mkdir
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'pics'
,
'thumbnail'
)
unless
File
.
directory?
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'pics'
,
'thumbnail'
)
files
=
{}
thumbnails_to_download
.
each
{
|
card_id
|
files
[
thumbnail_url
.
path
.
gsub
(
':id'
,
card_id
.
to_s
)]
=
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'pics'
,
'thumbnail'
,
card_id
.
to_s
+
'.jpg'
)
}
images_to_download
.
each
{
|
card_id
|
files
[
image_url
.
path
.
gsub
(
':id'
,
card_id
.
to_s
)]
=
File
.
join
(
File
.
dirname
(
Config
[
'ygopro'
][
'path'
]),
'pics'
,
card_id
.
to_s
+
'.jpg'
)
}
batch_download
(
image_url
.
to_s
,
files
,
'image/jpeg'
)
}
require
'rb-notifu'
Notifu
::
show
:message
=>
"缩略:
#{
thumbnails_to_download
.
size
}
, 完整:
#{
images_to_download
.
size
}
"
.
encode
(
System_Encoding
),
:baloon
=>
false
,
:type
=>
:info
,
:title
=>
"正在下载卡图"
.
encode
(
System_Encoding
)
do
|
status
|
if
status
==
3
System
.
web
'http://my-card.in/rooms/'
end
end
end
end
end
def
batch_download
(
main_url
,
files
,
content_type
=
nil
)
connections
=
{}
retried
=
[
0
]
#pass by reference
[
1
*
100
,
files
.
size
].
min
.
times
{
do_download
(
main_url
,
files
,
content_type
,
retried
,
connections
)
}
end
def
do_download
(
main_url
,
files
,
content_type
,
retried
,
connections
)
if
connections
.
size
<
1
connection
=
EventMachine
::
HttpRequest
.
new
(
main_url
)
connections
[
connection
]
=
0
else
connection
=
connections
.
min_by
{
|
key
,
value
|
value
}
if
connection
[
1
]
>=
100
return
else
connection
=
connection
[
0
]
end
end
remote_path
,
local_path
=
files
.
shift
connections
[
connection
]
+=
1
connection
.
get
(
path:
remote_path
,
keepalive:
connections
[
connection
]
!=
100
).
callback
{
|
http
|
puts
local_path
retried
[
0
]
=
0
if
http
.
response_header
[
'CONNECTION'
]
!=
'keep-alive'
connection
.
close
connections
.
delete
(
connection
)
do_download
(
main_url
,
files
,
content_type
,
retried
,
connections
)
while
!
files
.
empty?
and
(
connections
.
size
<
1
or
connections
.
values
.
min
<
100
)
elsif
files
.
empty?
connection
.
close
connections
.
delete
(
connection
)
end
if
http
.
response_header
.
status
==
200
and
(
!
content_type
or
http
.
response_header
[
'CONTENT_TYPE'
]
==
content_type
)
IO
.
binwrite
local_path
,
http
.
response
else
puts
http
.
response_header
.
http_status
end
}.
errback
{
|
http
|
puts
http
.
error
connection
.
close
connections
.
delete
(
connection
)
files
[
remote_path
]
=
local_path
retried
[
0
]
+=
1
if
retried
[
0
]
<=
10
*
100
do_download
(
main_url
,
files
,
content_type
,
retried
,
connections
)
while
!
files
.
empty?
and
(
connections
.
size
<
1
or
connections
.
values
.
min
<
100
)
end
}
end
def
load_system_conf
...
...
@@ -276,7 +363,7 @@ begin
when
'registed'
registed?
when
'mycard:///'
#
service
service
when
/mycard:\/\/(.*)/
parse_uri
(
command
)
when
/.*\.(?:ydk|yrp)$/
...
...
@@ -349,7 +436,36 @@ begin
end
end
#monkey patch for exerb & addressable
if
defined?
ExerbRuntime
module
Addressable
module
IDNA
module
File
class
<<
self
def
join
(
*
args
)
end
def
expand_path
(
*
args
)
end
def
dirname
(
*
args
)
end
def
open
(
*
args
)
result
=
ExerbRuntime
.
open
(
'unicode.data'
)
if
block_given?
begin
yield
result
ensure
result
.
close
end
end
end
end
end
end
end
end
save_config
if
ARGV
.
first
parse
ARGV
.
first
.
dup
.
force_encoding
(
System_Encoding
).
encode!
(
Encoding
::
UTF_8
)
else
...
...
@@ -359,7 +475,7 @@ begin
else
System
.
web
(
Config
[
'url'
])
end
#
service
service
end
rescue
=>
exception
error
=
"程序出现了错误,请把你的操作及以下信息发送至zh99998@gmail.com来帮助我们完善程序
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment