fronkin_bandcamp 0.3.0 → 0.4.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 +4 -4
- data/.github/workflows/test.yml +18 -0
- data/{.pryrc → .irbrc} +2 -1
- data/Gemfile.lock +28 -35
- data/README.md +0 -9
- data/fronkin_bandcamp.gemspec +6 -7
- data/lib/fronkin_bandcamp/artist.rb +5 -3
- data/lib/fronkin_bandcamp/format.rb +2 -2
- data/lib/fronkin_bandcamp/release.rb +22 -3
- data/lib/fronkin_bandcamp/scraper.rb +7 -7
- data/lib/fronkin_bandcamp/version.rb +1 -1
- metadata +28 -43
- data/.travis.yml +0 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4a08ddf83d87a1de4a6118401d81bf724ee8f8d7e7a3f240f3132e4f157fe033
|
|
4
|
+
data.tar.gz: 19e1f11e58fccc2ed87c82d139c4ad722781ad6015fc22f757f29bf10dd419d4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5985a16d7c260bc321beeea3d48f498e1f0623e089f71aa40e57604a0be63043bca7f8385a9feedc3ace6b29936e01b7ed08c9348aa64818f46aefb823954114
|
|
7
|
+
data.tar.gz: 2eb20dfac2c298a7a2721104f364726e9ebdaffcb62496e3016d78a84181e97a2873304319e259927e596519686ba98b67a454c2f06bfa881a2541df48c5dd5c
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
name: Run tests
|
|
2
|
+
on: [pull_request]
|
|
3
|
+
jobs:
|
|
4
|
+
test:
|
|
5
|
+
strategy:
|
|
6
|
+
fail-fast: true
|
|
7
|
+
matrix:
|
|
8
|
+
os: [ubuntu-latest, macos-latest]
|
|
9
|
+
# Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
|
|
10
|
+
ruby: ['3.3', '3.4', '4.0']
|
|
11
|
+
runs-on: ${{ matrix.os }}
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v6
|
|
14
|
+
- uses: ruby/setup-ruby@v1
|
|
15
|
+
with:
|
|
16
|
+
ruby-version: ${{ matrix.ruby }}
|
|
17
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
|
18
|
+
- run: bundle exec rake
|
data/{.pryrc → .irbrc}
RENAMED
data/Gemfile.lock
CHANGED
|
@@ -1,52 +1,45 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
fronkin_bandcamp (0.
|
|
5
|
-
nokogiri (
|
|
4
|
+
fronkin_bandcamp (0.4.1)
|
|
5
|
+
nokogiri (~> 1.19)
|
|
6
|
+
ostruct (~> 0.6)
|
|
6
7
|
|
|
7
8
|
GEM
|
|
8
9
|
remote: https://rubygems.org/
|
|
9
10
|
specs:
|
|
10
|
-
awesome_print (1.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
rspec (3.
|
|
26
|
-
rspec-core (~> 3.7.0)
|
|
27
|
-
rspec-expectations (~> 3.7.0)
|
|
28
|
-
rspec-mocks (~> 3.7.0)
|
|
29
|
-
rspec-core (3.7.1)
|
|
30
|
-
rspec-support (~> 3.7.0)
|
|
31
|
-
rspec-expectations (3.7.0)
|
|
11
|
+
awesome_print (1.9.2)
|
|
12
|
+
diff-lcs (1.6.2)
|
|
13
|
+
mini_portile2 (2.8.7)
|
|
14
|
+
nokogiri (1.19.3)
|
|
15
|
+
mini_portile2 (~> 2.8.2)
|
|
16
|
+
racc (~> 1.4)
|
|
17
|
+
ostruct (0.6.3)
|
|
18
|
+
racc (1.8.1)
|
|
19
|
+
rake (13.4.2)
|
|
20
|
+
rspec (3.13.2)
|
|
21
|
+
rspec-core (~> 3.13.0)
|
|
22
|
+
rspec-expectations (~> 3.13.0)
|
|
23
|
+
rspec-mocks (~> 3.13.0)
|
|
24
|
+
rspec-core (3.13.6)
|
|
25
|
+
rspec-support (~> 3.13.0)
|
|
26
|
+
rspec-expectations (3.13.5)
|
|
32
27
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
33
|
-
rspec-support (~> 3.
|
|
34
|
-
rspec-mocks (3.
|
|
28
|
+
rspec-support (~> 3.13.0)
|
|
29
|
+
rspec-mocks (3.13.8)
|
|
35
30
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
36
|
-
rspec-support (~> 3.
|
|
37
|
-
rspec-support (3.7
|
|
31
|
+
rspec-support (~> 3.13.0)
|
|
32
|
+
rspec-support (3.13.7)
|
|
38
33
|
|
|
39
34
|
PLATFORMS
|
|
40
35
|
ruby
|
|
41
36
|
|
|
42
37
|
DEPENDENCIES
|
|
43
|
-
awesome_print (~> 1.
|
|
44
|
-
bundler
|
|
38
|
+
awesome_print (~> 1.9)
|
|
39
|
+
bundler
|
|
45
40
|
fronkin_bandcamp!
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
rake (~> 10.0)
|
|
49
|
-
rspec (~> 3.7)
|
|
41
|
+
rake (~> 13.4)
|
|
42
|
+
rspec (~> 3.13)
|
|
50
43
|
|
|
51
44
|
BUNDLED WITH
|
|
52
|
-
|
|
45
|
+
2.5.17
|
data/README.md
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
[](https://travis-ci.org/FTLam11/fronkin_bandcamp_scraper)
|
|
3
|
-
|
|
4
1
|
# FronkinBandcamp
|
|
5
2
|
|
|
6
3
|
Maybe you thought you'd flop your way to a championship.
|
|
@@ -96,12 +93,6 @@ scraper.release.formats
|
|
|
96
93
|
|
|
97
94
|
## III. Miscellaneous
|
|
98
95
|
|
|
99
|
-
### TODO
|
|
100
|
-
|
|
101
|
-
* ~~Scrape release formats~~
|
|
102
|
-
* Scrape release fans
|
|
103
|
-
* Add CLI
|
|
104
|
-
|
|
105
96
|
### Development
|
|
106
97
|
|
|
107
98
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/fronkin_bandcamp.gemspec
CHANGED
|
@@ -21,12 +21,11 @@ Gem::Specification.new do |spec|
|
|
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
22
22
|
spec.require_paths = ['lib']
|
|
23
23
|
|
|
24
|
-
spec.add_dependency 'nokogiri', '
|
|
24
|
+
spec.add_dependency 'nokogiri', '~> 1.19'
|
|
25
|
+
spec.add_dependency 'ostruct', '~> 0.6'
|
|
25
26
|
|
|
26
|
-
spec.add_development_dependency 'bundler'
|
|
27
|
-
spec.add_development_dependency 'rake', '~>
|
|
28
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
|
29
|
-
spec.add_development_dependency '
|
|
30
|
-
spec.add_development_dependency 'pry-byebug', '~> 3.6'
|
|
31
|
-
spec.add_development_dependency 'awesome_print', '~> 1.8'
|
|
27
|
+
spec.add_development_dependency 'bundler'
|
|
28
|
+
spec.add_development_dependency 'rake', '~> 13.4'
|
|
29
|
+
spec.add_development_dependency 'rspec', '~> 3.13'
|
|
30
|
+
spec.add_development_dependency 'awesome_print', '~> 1.9'
|
|
32
31
|
end
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
module FronkinBandcamp
|
|
2
2
|
class Artist
|
|
3
|
-
|
|
3
|
+
attr_reader :name, :photo, :location
|
|
4
4
|
|
|
5
|
-
def initialize
|
|
6
|
-
|
|
5
|
+
def initialize(doc)
|
|
6
|
+
@name = doc.css('div#bio-container span.title').text
|
|
7
|
+
@photo = doc.css('div#bio-container div.bio-pic a.popupImage').attribute('href').value
|
|
8
|
+
@location = doc.css('div#bio-container span.location').text
|
|
7
9
|
end
|
|
8
10
|
end
|
|
9
11
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module FronkinBandcamp
|
|
2
|
-
module
|
|
2
|
+
module StringRefinement
|
|
3
3
|
refine String do
|
|
4
4
|
def kleanse
|
|
5
5
|
strip.gsub!(/\n\s+/, ' ')
|
|
@@ -7,7 +7,7 @@ module FronkinBandcamp
|
|
|
7
7
|
end
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
using
|
|
10
|
+
using StringRefinement
|
|
11
11
|
|
|
12
12
|
class Format
|
|
13
13
|
attr_reader :name, :product, :description, :product_images, :price, :is_available
|
|
@@ -3,21 +3,30 @@ require 'fronkin_bandcamp/format'
|
|
|
3
3
|
|
|
4
4
|
module FronkinBandcamp
|
|
5
5
|
class Release
|
|
6
|
-
|
|
6
|
+
attr_accessor :bandcamp_url, :artist_name
|
|
7
|
+
attr_reader :title, :date, :description, :credits, :cover, :tracks, :tags,
|
|
8
|
+
:release_id, :formats, :bandcamp_album_id
|
|
9
|
+
|
|
10
|
+
BARE_CREDITS_NODE_SIZE = 2
|
|
7
11
|
|
|
8
12
|
def initialize(doc)
|
|
9
13
|
@title = doc.css('div#name-section h2.trackTitle').text.strip
|
|
10
|
-
@date = doc.css('div.tralbumData.tralbum-credits
|
|
14
|
+
@date = Date.parse(doc.css('div.tralbumData.tralbum-credits').children[0].to_s.strip[9..-1]).strftime('%-m/%-d/%Y')
|
|
15
|
+
@description = doc.css('div.tralbumData.tralbum-about').text.strip.gsub(/\r/, "\n")
|
|
16
|
+
@credits = scrape_credits(doc)
|
|
11
17
|
@cover = doc.css('div#tralbumArt a.popupImage').attribute('href').value
|
|
12
18
|
@tracks = scrape_tracks(doc)
|
|
13
19
|
@tags = doc.css('div.tralbumData.tralbum-tags a.tag').map(&:text)
|
|
20
|
+
@release_id = tags.find { |tag| tag.match(/\Annr/) }&.upcase
|
|
14
21
|
@formats = scrape_formats(doc)
|
|
22
|
+
@bandcamp_album_id = doc.css('meta[property="og:video"]').attr("content").value.match(/album=(?<bandcamp_album_id>\d+)/).named_captures['bandcamp_album_id']
|
|
23
|
+
yield self if block_given?
|
|
15
24
|
end
|
|
16
25
|
|
|
17
26
|
private
|
|
18
27
|
|
|
19
28
|
def scrape_tracks(doc)
|
|
20
|
-
track_titles = doc.css('table#track_table td.title-col span
|
|
29
|
+
track_titles = doc.css('table#track_table td.title-col span.track-title').map(&:text)
|
|
21
30
|
track_durations = doc.css('table#track_table td.title-col span.time').map { |node| node.text.strip }
|
|
22
31
|
track_titles.zip(track_durations).map.with_index { |t, idx| Track.new(idx + 1, t[0], t[1]) }
|
|
23
32
|
end
|
|
@@ -26,5 +35,15 @@ module FronkinBandcamp
|
|
|
26
35
|
format_choices = doc.css('li.buyItem')
|
|
27
36
|
format_choices.map { |choice| Format.new(choice) }
|
|
28
37
|
end
|
|
38
|
+
|
|
39
|
+
def scrape_credits(doc)
|
|
40
|
+
child_nodes = doc.css('div.tralbumData.tralbum-credits').children
|
|
41
|
+
|
|
42
|
+
if child_nodes.size <= BARE_CREDITS_NODE_SIZE
|
|
43
|
+
''
|
|
44
|
+
else
|
|
45
|
+
child_nodes[4..-1].text.strip.gsub(/-\W/, '').split(/\r\n/)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
29
48
|
end
|
|
30
49
|
end
|
|
@@ -5,21 +5,21 @@ require 'fronkin_bandcamp/artist'
|
|
|
5
5
|
|
|
6
6
|
module FronkinBandcamp
|
|
7
7
|
class Scraper
|
|
8
|
-
attr_reader :doc, :release, :artist
|
|
8
|
+
attr_reader :doc, :release, :artist, :url
|
|
9
9
|
|
|
10
10
|
def initialize(url)
|
|
11
|
-
@
|
|
11
|
+
@url = url
|
|
12
|
+
@doc = Nokogiri::HTML.parse(URI.open(url), nil, 'utf-8') { |config| config.noblanks }
|
|
12
13
|
scrape
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
private
|
|
16
17
|
|
|
17
18
|
def scrape
|
|
18
|
-
@
|
|
19
|
-
@
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
artist.location = doc.css('div#bio-container span.location').text
|
|
19
|
+
@artist = Artist.new(doc)
|
|
20
|
+
@release = Release.new(doc) do |release|
|
|
21
|
+
release.artist_name = artist.name
|
|
22
|
+
release.bandcamp_url = url
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
25
|
end
|
metadata
CHANGED
|
@@ -1,113 +1,99 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fronkin_bandcamp
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Fronk Lom Lom
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-05-24 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: nokogiri
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - ">="
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: 1.10.4
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - ">="
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: 1.10.4
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: bundler
|
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
|
30
16
|
requirements:
|
|
31
17
|
- - "~>"
|
|
32
18
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '1.
|
|
34
|
-
type: :
|
|
19
|
+
version: '1.19'
|
|
20
|
+
type: :runtime
|
|
35
21
|
prerelease: false
|
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
23
|
requirements:
|
|
38
24
|
- - "~>"
|
|
39
25
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '1.
|
|
26
|
+
version: '1.19'
|
|
41
27
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
28
|
+
name: ostruct
|
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
|
44
30
|
requirements:
|
|
45
31
|
- - "~>"
|
|
46
32
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '
|
|
48
|
-
type: :
|
|
33
|
+
version: '0.6'
|
|
34
|
+
type: :runtime
|
|
49
35
|
prerelease: false
|
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
37
|
requirements:
|
|
52
38
|
- - "~>"
|
|
53
39
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '
|
|
40
|
+
version: '0.6'
|
|
55
41
|
- !ruby/object:Gem::Dependency
|
|
56
|
-
name:
|
|
42
|
+
name: bundler
|
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
|
58
44
|
requirements:
|
|
59
|
-
- - "
|
|
45
|
+
- - ">="
|
|
60
46
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '
|
|
47
|
+
version: '0'
|
|
62
48
|
type: :development
|
|
63
49
|
prerelease: false
|
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
51
|
requirements:
|
|
66
|
-
- - "
|
|
52
|
+
- - ">="
|
|
67
53
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: '
|
|
54
|
+
version: '0'
|
|
69
55
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
56
|
+
name: rake
|
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
|
72
58
|
requirements:
|
|
73
59
|
- - "~>"
|
|
74
60
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '
|
|
61
|
+
version: '13.4'
|
|
76
62
|
type: :development
|
|
77
63
|
prerelease: false
|
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
65
|
requirements:
|
|
80
66
|
- - "~>"
|
|
81
67
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '
|
|
68
|
+
version: '13.4'
|
|
83
69
|
- !ruby/object:Gem::Dependency
|
|
84
|
-
name:
|
|
70
|
+
name: rspec
|
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
|
86
72
|
requirements:
|
|
87
73
|
- - "~>"
|
|
88
74
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: '3.
|
|
75
|
+
version: '3.13'
|
|
90
76
|
type: :development
|
|
91
77
|
prerelease: false
|
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
79
|
requirements:
|
|
94
80
|
- - "~>"
|
|
95
81
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: '3.
|
|
82
|
+
version: '3.13'
|
|
97
83
|
- !ruby/object:Gem::Dependency
|
|
98
84
|
name: awesome_print
|
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
|
100
86
|
requirements:
|
|
101
87
|
- - "~>"
|
|
102
88
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: '1.
|
|
89
|
+
version: '1.9'
|
|
104
90
|
type: :development
|
|
105
91
|
prerelease: false
|
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
93
|
requirements:
|
|
108
94
|
- - "~>"
|
|
109
95
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: '1.
|
|
96
|
+
version: '1.9'
|
|
111
97
|
description: YO, this gem is a convenient web scraper for Bandcamp releases. Currently,
|
|
112
98
|
it scrapes artist and release information.
|
|
113
99
|
email:
|
|
@@ -116,10 +102,10 @@ executables: []
|
|
|
116
102
|
extensions: []
|
|
117
103
|
extra_rdoc_files: []
|
|
118
104
|
files:
|
|
105
|
+
- ".github/workflows/test.yml"
|
|
119
106
|
- ".gitignore"
|
|
120
|
-
- ".
|
|
107
|
+
- ".irbrc"
|
|
121
108
|
- ".rspec"
|
|
122
|
-
- ".travis.yml"
|
|
123
109
|
- CODE_OF_CONDUCT.md
|
|
124
110
|
- Gemfile
|
|
125
111
|
- Gemfile.lock
|
|
@@ -140,7 +126,7 @@ homepage: https://github.com/FTLam11/fronkin_bandcamp_scraper
|
|
|
140
126
|
licenses:
|
|
141
127
|
- MIT
|
|
142
128
|
metadata: {}
|
|
143
|
-
post_install_message:
|
|
129
|
+
post_install_message:
|
|
144
130
|
rdoc_options: []
|
|
145
131
|
require_paths:
|
|
146
132
|
- lib
|
|
@@ -155,9 +141,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
155
141
|
- !ruby/object:Gem::Version
|
|
156
142
|
version: '0'
|
|
157
143
|
requirements: []
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
signing_key:
|
|
144
|
+
rubygems_version: 3.5.14
|
|
145
|
+
signing_key:
|
|
161
146
|
specification_version: 4
|
|
162
147
|
summary: This gem is a convenient web scraper for Bandcamp releases.
|
|
163
148
|
test_files: []
|