webget-mirror 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3 -0
- data/Manifest.txt +16 -0
- data/README.md +19 -0
- data/Rakefile +34 -0
- data/lib/webget/mirror/collect_page_info.rb +107 -0
- data/lib/webget/mirror/database/models.rb +123 -0
- data/lib/webget/mirror/database/open.rb +63 -0
- data/lib/webget/mirror/database/schema.rb +67 -0
- data/lib/webget/mirror/download_page.rb +83 -0
- data/lib/webget/mirror/find_links.rb +222 -0
- data/lib/webget/mirror/mirror.rb +246 -0
- data/lib/webget/mirror/utils.rb +32 -0
- data/lib/webget/mirror/version.rb +22 -0
- data/lib/webget/mirror/website.rb +204 -0
- data/lib/webget/mirror.rb +55 -0
- data/lib/webget-mirror.rb +2 -0
- metadata +153 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
|
|
2
|
+
class Webget
|
|
3
|
+
class Mirror
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Website
|
|
7
|
+
def host
|
|
8
|
+
raise ArgumentError, "website.base_url not set" if @base_url.nil?
|
|
9
|
+
@base_url.host
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def base_url=( url )
|
|
13
|
+
@base_url = URI( url ) ## note URI() same as URI.parse()
|
|
14
|
+
end
|
|
15
|
+
def base_url
|
|
16
|
+
raise ArgumentError, "website.base_url not set" if @base_url.nil?
|
|
17
|
+
@base_url.to_s ## note - returns string NOT uri object!!!
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
## array of hash (table) records e.g.
|
|
23
|
+
## page, encoding
|
|
24
|
+
## /index.html, windows-1252
|
|
25
|
+
def start_pages=( config )
|
|
26
|
+
@start_pages = config
|
|
27
|
+
end
|
|
28
|
+
def start_pages
|
|
29
|
+
raise ArgumentError, "website.start_pages not set" if @start_pages.nil?
|
|
30
|
+
@start_pages
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def start_pages_path
|
|
35
|
+
## collect/build path for all start pages
|
|
36
|
+
## e.g. path: ['/curdom.html',
|
|
37
|
+
## '/curtour.html',
|
|
38
|
+
## '/histdom.html',
|
|
39
|
+
## '/intclub.html',
|
|
40
|
+
## '/intland.html']
|
|
41
|
+
path = []
|
|
42
|
+
start_pages.each do |config|
|
|
43
|
+
path << config['page']
|
|
44
|
+
end
|
|
45
|
+
path
|
|
46
|
+
end
|
|
47
|
+
alias_method :start_path, :start_pages_path
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
###
|
|
51
|
+
## give preference on schedule next page batch
|
|
52
|
+
## if path matches sql like term/str
|
|
53
|
+
## e.g. '/table%'
|
|
54
|
+
## => Page.where( 'path LIKE ?', '/table%' )
|
|
55
|
+
##
|
|
56
|
+
## note - sql (like) wildcard rules/syntax:
|
|
57
|
+
## %: Matches zero or more characters
|
|
58
|
+
## _: Matches exactly one character
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def boost_pages_path_like=(str) @boost = str; end
|
|
62
|
+
def boost_pages_path_like?() defined?( @boost ); end
|
|
63
|
+
def boost_pages_path_like() defined?( @boost ) ? @boost : nil; end
|
|
64
|
+
|
|
65
|
+
alias_method :boost_path_like=, :boost_pages_path_like=
|
|
66
|
+
alias_method :boost_path_like?, :boost_pages_path_like?
|
|
67
|
+
alias_method :boost_path_like, :boost_pages_path_like
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def default_page_encoding=( encoding )
|
|
74
|
+
@default_page_encoding = encoding
|
|
75
|
+
end
|
|
76
|
+
def _default_page_encoding
|
|
77
|
+
defined?( @default_page_encoding ) ? @default_page_encoding : 'UTF-8'
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
##
|
|
81
|
+
## use hash with custom (individual) defaults e.g.
|
|
82
|
+
## Hash.new { |h,key| h[key] = 'windows-1252' }
|
|
83
|
+
##
|
|
84
|
+
def page_encodings=( encodings ) ## hash (path => encoding)
|
|
85
|
+
@page_encodings = encodings
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
## default page encoding (lookup by path);
|
|
89
|
+
## change to windows-1256 if needed
|
|
90
|
+
def page_encoding( path )
|
|
91
|
+
if defined?( @page_encodings )
|
|
92
|
+
@page_encodings[ path ]
|
|
93
|
+
else
|
|
94
|
+
_default_page_encoding
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def errata_edits=(edits) @errata_edits = edits; end
|
|
101
|
+
|
|
102
|
+
### quick fix html w/ search & replace
|
|
103
|
+
## default: do nothing
|
|
104
|
+
def errata?() defined?( @errata_edits ); end
|
|
105
|
+
def errata( html, url: )
|
|
106
|
+
if defined?( @errata_edits )
|
|
107
|
+
|
|
108
|
+
## lookup edits by path e.g. /tablesp/poland-satrip77.html
|
|
109
|
+
## or /miscellaneous/torre-madrid.html
|
|
110
|
+
|
|
111
|
+
page_url = URI( url )
|
|
112
|
+
|
|
113
|
+
edits = @errata_edits[page_url.path]
|
|
114
|
+
|
|
115
|
+
## note - for now always use gsub (not sub)
|
|
116
|
+
## maybe add option later
|
|
117
|
+
if edits
|
|
118
|
+
edits.each do |search,replace|
|
|
119
|
+
html = html.gsub( search, replace )
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
html
|
|
123
|
+
else ## pass along as is (1:1)
|
|
124
|
+
html
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def autofix_href=( m )
|
|
130
|
+
raise ArgumentError,
|
|
131
|
+
"proc expected for autofix_href=; got #{m} #{m.class.name}" unless m.is_a?( Proc )
|
|
132
|
+
|
|
133
|
+
@autofix_href = m
|
|
134
|
+
end
|
|
135
|
+
def autofix_href() defined?( @autofix_href ) ? @autofix_href : nil; end
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
### kick-off mirror (pages) operation/run
|
|
140
|
+
def mirror
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
## add seed/start pages
|
|
144
|
+
start_pages.each do |config|
|
|
145
|
+
path = config['page']
|
|
146
|
+
encoding = config['encoding']
|
|
147
|
+
encoding = page_encoding( path ) if config['encoding'].nil? || config['encoding'].empty?
|
|
148
|
+
|
|
149
|
+
page_rec = MirrorDb::Model::Page.find_or_create_by!( path: path ) do |rec|
|
|
150
|
+
## note - block only called on create (NOT find!!)
|
|
151
|
+
puts " add page #{rec.path} (cached: false) to mirror.db"
|
|
152
|
+
|
|
153
|
+
rec.encoding = encoding
|
|
154
|
+
rec.cached = false
|
|
155
|
+
end
|
|
156
|
+
pp page_rec
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
## fix-fix-fix use Mirror.new( self )
|
|
161
|
+
## pass in site config on new!!!
|
|
162
|
+
mirror = Mirror.new
|
|
163
|
+
mirror._mirror_pages( site: self )
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end # class Website
|
|
167
|
+
end ## class Mirror
|
|
168
|
+
end ## class Webget
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
__END__
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
=begin
|
|
177
|
+
module Mirror
|
|
178
|
+
class Configuration
|
|
179
|
+
def host() @base_url.host; end
|
|
180
|
+
|
|
181
|
+
def base_url
|
|
182
|
+
raise ArgumentError, "config.base_url not set" if @base_url.nil?
|
|
183
|
+
@base_url
|
|
184
|
+
end
|
|
185
|
+
def base_url=( url )
|
|
186
|
+
@base_url = URI( url ) ## note URI() same as URI.parse()
|
|
187
|
+
end
|
|
188
|
+
end # class Configuration
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
## lets you use
|
|
192
|
+
## Webcache.configure do |config|
|
|
193
|
+
## config.root = './cache'
|
|
194
|
+
## end
|
|
195
|
+
def self.configure() yield( config ); end
|
|
196
|
+
def self.config() @config ||= Configuration.new; end
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
## add "high level" root convenience helpers
|
|
200
|
+
## use delegate helper - why? why not?
|
|
201
|
+
## def self.host() config.host; end
|
|
202
|
+
## def self.host=(value) config.host = value; end
|
|
203
|
+
end # module Mirror
|
|
204
|
+
=end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
$LOAD_PATH.unshift( '/sports/rubycocos/webclient/webclient/lib' )
|
|
2
|
+
$LOAD_PATH.unshift( '/sports/rubycocos/webclient/webget/lib' )
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
require 'cocos'
|
|
6
|
+
require 'webget' ## incl. webget, webcache, webclient, etc.
|
|
7
|
+
require 'nokogiri'
|
|
8
|
+
|
|
9
|
+
require 'active_record' ## todo: add sqlite3? etc.
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### our own
|
|
13
|
+
require_relative 'mirror/version' ## version first
|
|
14
|
+
|
|
15
|
+
require_relative 'mirror/database/schema'
|
|
16
|
+
require_relative 'mirror/database/models'
|
|
17
|
+
require_relative 'mirror/database/open'
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
require_relative 'mirror/download_page'
|
|
23
|
+
require_relative 'mirror/find_links' ## find_links helper 'n' more
|
|
24
|
+
require_relative 'mirror/collect_page_info'
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
require_relative 'mirror/mirror'
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
require_relative 'mirror/utils'
|
|
31
|
+
require_relative 'mirror/website'
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class Webget
|
|
36
|
+
class Mirror
|
|
37
|
+
|
|
38
|
+
## auto log errors (append to logs.txt)
|
|
39
|
+
def log( msg )
|
|
40
|
+
## append msg to ./logs.txt
|
|
41
|
+
## use ./errors.txt - why? why not?
|
|
42
|
+
File.open( './mirror_logs.txt', 'a:utf-8' ) do |f|
|
|
43
|
+
f.write( msg )
|
|
44
|
+
f.write( "\n" )
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end ## class Mirror
|
|
49
|
+
end ## class Webget
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
puts Webget::Mirror.banner ## say hello
|
metadata
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: webget-mirror
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Gerald Bauer
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2026-09-09 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: webget
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: nokogiri
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: activerecord
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: sqlite3
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rdoc
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ">="
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '4.0'
|
|
76
|
+
- - "<"
|
|
77
|
+
- !ruby/object:Gem::Version
|
|
78
|
+
version: '7'
|
|
79
|
+
type: :development
|
|
80
|
+
prerelease: false
|
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
82
|
+
requirements:
|
|
83
|
+
- - ">="
|
|
84
|
+
- !ruby/object:Gem::Version
|
|
85
|
+
version: '4.0'
|
|
86
|
+
- - "<"
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '7'
|
|
89
|
+
- !ruby/object:Gem::Dependency
|
|
90
|
+
name: hoe
|
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - "~>"
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '4.2'
|
|
96
|
+
type: :development
|
|
97
|
+
prerelease: false
|
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - "~>"
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: '4.2'
|
|
103
|
+
description: webget-mirror gem - addon to webget to mirror websites
|
|
104
|
+
email: gerald.bauer@gmail.com
|
|
105
|
+
executables: []
|
|
106
|
+
extensions: []
|
|
107
|
+
extra_rdoc_files:
|
|
108
|
+
- CHANGELOG.md
|
|
109
|
+
- Manifest.txt
|
|
110
|
+
- README.md
|
|
111
|
+
files:
|
|
112
|
+
- CHANGELOG.md
|
|
113
|
+
- Manifest.txt
|
|
114
|
+
- README.md
|
|
115
|
+
- Rakefile
|
|
116
|
+
- lib/webget-mirror.rb
|
|
117
|
+
- lib/webget/mirror.rb
|
|
118
|
+
- lib/webget/mirror/collect_page_info.rb
|
|
119
|
+
- lib/webget/mirror/database/models.rb
|
|
120
|
+
- lib/webget/mirror/database/open.rb
|
|
121
|
+
- lib/webget/mirror/database/schema.rb
|
|
122
|
+
- lib/webget/mirror/download_page.rb
|
|
123
|
+
- lib/webget/mirror/find_links.rb
|
|
124
|
+
- lib/webget/mirror/mirror.rb
|
|
125
|
+
- lib/webget/mirror/utils.rb
|
|
126
|
+
- lib/webget/mirror/version.rb
|
|
127
|
+
- lib/webget/mirror/website.rb
|
|
128
|
+
homepage: https://github.com/rubycocos/webclient
|
|
129
|
+
licenses:
|
|
130
|
+
- Public Domain
|
|
131
|
+
metadata: {}
|
|
132
|
+
post_install_message:
|
|
133
|
+
rdoc_options:
|
|
134
|
+
- "--main"
|
|
135
|
+
- README.md
|
|
136
|
+
require_paths:
|
|
137
|
+
- lib
|
|
138
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
139
|
+
requirements:
|
|
140
|
+
- - ">="
|
|
141
|
+
- !ruby/object:Gem::Version
|
|
142
|
+
version: 3.1.0
|
|
143
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
|
+
requirements:
|
|
145
|
+
- - ">="
|
|
146
|
+
- !ruby/object:Gem::Version
|
|
147
|
+
version: '0'
|
|
148
|
+
requirements: []
|
|
149
|
+
rubygems_version: 3.5.22
|
|
150
|
+
signing_key:
|
|
151
|
+
specification_version: 4
|
|
152
|
+
summary: webget-mirror gem - addon to webget to mirror websites
|
|
153
|
+
test_files: []
|