popflash_match_downloader 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8cd58dd4c0ed2752d1e935bf588c1fc67d292ff6
4
+ data.tar.gz: 8daca61a1959c87d8426ec1b0c2b3e1592759232
5
+ SHA512:
6
+ metadata.gz: 38d50c94bf6701ba41a51b1beaaef622d7b497e42101dc187517336ed3208cafab3956175365ca1a48b797311f3bf72cf06d2064ae349a2b0b5b607f28eb3820
7
+ data.tar.gz: 415996f54f16727742faf0dc3149e4960d755c9529875e81d628649072f5cc472003da6ff1768415f5a84a886ccd45f8da4fe13bb77af9d716a2a7bf43931f32
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Lukas Stabe
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,7 @@
1
+ # popflash_match_downloader
2
+
3
+ > This tool is a wip and does not have configuration files etc yet.
4
+
5
+ This gem contains a utility to download demos of your recent matches from [popflash.site](https://popflash.site).
6
+
7
+ It works by scraping your user page, which contains a list of your five most recent matches. It then finds the match download link on each matches page and downloads the demo, if it hasn't already been downloaded.
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ require 'thor'
3
+ require 'popflash_match_downloader'
4
+
5
+ class PopflashMatchDownloaderCli < Thor
6
+ desc 'download USER_ID', 'Downloads the most recent five matches for the given user id'
7
+ method_option :download_dir, aliases: '-d', desc: 'The download target directory', default: './'
8
+ def download(user_id)
9
+ e = PopflashMatchDownloader::RecentMatchesExtractor.new(user_id)
10
+ files = e.find_match_ids.map do |id|
11
+ PopflashMatchDownloader::MatchFileNameExtractor.new(id).extract_file_name
12
+ end
13
+
14
+ loader = PopflashMatchDownloader::Downloader.new options[:download_dir]
15
+ files.each do |f|
16
+ loader.download_file_if_needed f
17
+ end
18
+ end
19
+ end
20
+
21
+ PopflashMatchDownloaderCli.start
@@ -0,0 +1,13 @@
1
+ require 'nokogiri'
2
+ require 'open-uri'
3
+
4
+ module PopflashMatchDownloader
5
+ POPFLASH_SITE_URL = 'https://popflash.site/'
6
+
7
+ class UnexpectedContentError
8
+ end
9
+ end
10
+
11
+ require 'popflash_match_downloader/match_file_name_extractor'
12
+ require 'popflash_match_downloader/recent_matches_extractor'
13
+ require 'popflash_match_downloader/downloader'
@@ -0,0 +1,49 @@
1
+ require 'net/http'
2
+
3
+ module PopflashMatchDownloader
4
+ class Downloader
5
+ def initialize download_directory
6
+ @download_directory = File.expand_path(download_directory)
7
+ end
8
+
9
+ def file_path name
10
+ File.join @download_directory, name
11
+ end
12
+
13
+ def is_file_downloaded? name
14
+ File.exist? file_path(name)
15
+ end
16
+
17
+ def download_file name
18
+ file_location = '/' + name
19
+
20
+ Net::HTTP.start('s3.popflash.site') do |http|
21
+ http.request_get file_location do |response|
22
+ while response.is_a? Net::HTTPRedirection
23
+ location = response['location']
24
+ puts "redirecting to #{location}"
25
+ response = http.request_get location
26
+ end
27
+
28
+ if response.is_a? Net::HTTPSuccess
29
+ File.open file_path(name), 'wb' do |f|
30
+ response.read_body { |seg| f.write seg }
31
+ end
32
+ else
33
+ puts "couldn't donwload demo. error: #{response.message}"
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ def download_file_if_needed name
40
+ if is_file_downloaded? name
41
+ puts "already downloaded #{name}"
42
+ return
43
+ end
44
+
45
+ puts "downloading #{name}"
46
+ download_file name
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,24 @@
1
+ module PopflashMatchDownloader
2
+ class MatchFileNameExtractor
3
+ def initialize match_id
4
+ @match_id = match_id
5
+ end
6
+
7
+ DEMO_LINK_REGEX = %r{^http://s3.popflash.site/([[:graph:]]+.dem)$}
8
+ MATCH_URL_PREFIX = POPFLASH_SITE_URL + 'match/'
9
+
10
+ def extract_file_name
11
+ match_url = MATCH_URL_PREFIX + @match_id
12
+
13
+ doc = Nokogiri::HTML open(match_url)
14
+
15
+ link = doc.css('a.demo-download').first
16
+ raise UnexpectedContentError if link == nil
17
+
18
+ match_id_match = link['href'].match(DEMO_LINK_REGEX)
19
+ raise UnexpectedContentError if match_id_match == nil
20
+
21
+ match_id_match.captures.first
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,25 @@
1
+ module PopflashMatchDownloader
2
+ class RecentMatchesExtractor
3
+ def initialize user_id
4
+ @user_id = user_id
5
+ end
6
+
7
+ MATCH_LINK_REGEX = %r{^/match/([[:graph:]&&[^/]]+)$}
8
+ USER_URL_PREFIX = POPFLASH_SITE_URL + 'user/'
9
+
10
+ class MatchLinkCssFilter
11
+ def isMatchLink node_set
12
+ node_set.find_all { |n| n['href'] =~ RecentMatchesExtractor::MATCH_LINK_REGEX }
13
+ end
14
+ end
15
+
16
+ def find_match_ids
17
+ profile_url = USER_URL_PREFIX + @user_id
18
+
19
+ doc = Nokogiri::HTML open(profile_url)
20
+ doc.css('a:isMatchLink', MatchLinkCssFilter.new).map do |l|
21
+ l['href'].match(MATCH_LINK_REGEX).captures.first
22
+ end
23
+ end
24
+ end
25
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: popflash_match_downloader
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Lukas Stabe
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-10-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.19'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.19.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.19'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.19.1
33
+ description:
34
+ email: lukas@stabe.de
35
+ executables:
36
+ - popflash_match_downloader
37
+ extensions: []
38
+ extra_rdoc_files: []
39
+ files:
40
+ - LICENSE
41
+ - README.md
42
+ - bin/popflash_match_downloader
43
+ - lib/popflash_match_downloader.rb
44
+ - lib/popflash_match_downloader/downloader.rb
45
+ - lib/popflash_match_downloader/match_file_name_extractor.rb
46
+ - lib/popflash_match_downloader/recent_matches_extractor.rb
47
+ homepage: https://github.com/Ahti/popflash_match_downloader
48
+ licenses:
49
+ - MIT
50
+ metadata: {}
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 2.2.2
68
+ signing_key:
69
+ specification_version: 4
70
+ summary: A tool to download match demos from popflash.site
71
+ test_files: []