copycasts 0.0.2 → 0.0.3
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/LICENSE.txt +1 -1
- data/README.md +20 -10
- data/VERSION +1 -1
- data/copycasts.gemspec +1 -0
- data/lib/copycasts.rb +30 -11
- metadata +15 -2
- data/lib/markdown +0 -122
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 7b869318d2c2200d35db29241d3e080d37c4dd71
         | 
| 4 | 
            +
              data.tar.gz: ef78807c096372e7e88e7404444f2482f6e1cdf8
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 6bda003314c3814ef3c84fbe0b4491a450e85604e5c492b28241a68e02ad3082fd449827680653839e0020c2ae8275fc1586f749ee4d1ca5c239345c4420749d
         | 
| 7 | 
            +
              data.tar.gz: 3e5a2663725679a812ddb197972c714e7f34fe5a0b29cc3cdcf5904388bb64c0049f617fcf794d7611fde4cc1c95f2adc8c4ba5f3d28fdc060e9e691dbe46256
         | 
    
        data/LICENSE.txt
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -1,18 +1,10 @@ | |
| 1 1 | 
             
            # Copycasts
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 3 | 
            +
            You are able to access railscast video offline now by downloading them. This gem will crawl railcast videos and download to your local storage.
         | 
| 4 4 |  | 
| 5 5 | 
             
            ## Installation
         | 
| 6 6 |  | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
                gem 'copycasts'
         | 
| 10 | 
            -
             | 
| 11 | 
            -
            And then execute:
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                $ bundle
         | 
| 14 | 
            -
             | 
| 15 | 
            -
            Or install it yourself as:
         | 
| 7 | 
            +
            Install it the gem globally as:
         | 
| 16 8 |  | 
| 17 9 | 
             
                $ gem install copycasts
         | 
| 18 10 |  | 
| @@ -29,3 +21,21 @@ Run using this command in your terminal: | |
| 29 21 | 
             
            3. Commit your changes (`git commit -am 'Add some feature'`)
         | 
| 30 22 | 
             
            4. Push to the branch (`git push origin my-new-feature`)
         | 
| 31 23 | 
             
            5. Create new Pull Request
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            ##Coming soon
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            1. Upload to aws storage
         | 
| 28 | 
            +
            2. Upload to dropbox
         | 
| 29 | 
            +
            3. Options to download different file type [zip, mp4, m4v, webm, ogv]
         | 
| 30 | 
            +
            4. Using resque / multithreading
         | 
| 31 | 
            +
            5. Any others ??
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            ##Thanks
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            Thanks to railcast providing free videos for our learning purpose.
         | 
| 36 | 
            +
            Reference: [RailsCasts, Ryan Bates](http://railscasts.com/)
         | 
| 37 | 
            +
             | 
| 38 | 
            +
            ## Anything I missed?
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            If there's anything at all that you need or want to know, please email either
         | 
| 41 | 
            +
            [Nicholas Ng](mailto:secret@live.com.my) and I ll get back to you soon. :D
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0.0. | 
| 1 | 
            +
            0.0.3
         | 
    
        data/copycasts.gemspec
    CHANGED
    
    | @@ -21,4 +21,5 @@ Gem::Specification.new do |spec| | |
| 21 21 | 
             
              spec.add_development_dependency "rake"
         | 
| 22 22 | 
             
              spec.add_development_dependency "nokogiri", "~> 1.5", ">= 1.5.6"
         | 
| 23 23 | 
             
              spec.add_development_dependency "open-uri", "~> 1.5", ">= 1.5.6"
         | 
| 24 | 
            +
              spec.add_development_dependency "progressbar", "~> 0.21.0"
         | 
| 24 25 | 
             
            end
         | 
    
        data/lib/copycasts.rb
    CHANGED
    
    | @@ -1,12 +1,12 @@ | |
| 1 1 | 
             
            require 'nokogiri'
         | 
| 2 2 | 
             
            require 'open-uri'
         | 
| 3 3 | 
             
            require 'net/http'
         | 
| 4 | 
            +
            require 'progressbar'
         | 
| 4 5 |  | 
| 5 6 | 
             
            module Copycasts
         | 
| 6 7 |  | 
| 7 8 | 
             
              class Crawling
         | 
| 8 9 | 
             
                TARGET_URL = 'http://railscasts.com'
         | 
| 9 | 
            -
                attr_accessor :page
         | 
| 10 10 |  | 
| 11 11 | 
             
                def initialize(options = {})
         | 
| 12 12 | 
             
                  @pages = options[:page] || maximum_page
         | 
| @@ -14,16 +14,18 @@ module Copycasts | |
| 14 14 |  | 
| 15 15 | 
             
                def get_links
         | 
| 16 16 | 
             
                  casts_list = []
         | 
| 17 | 
            -
                  puts "Start crawling | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 17 | 
            +
                  puts "Start crawling page "
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  for index in 1..2
         | 
| 20 | 
            +
                    print "#{index}"
         | 
| 21 | 
            +
                    print ", " if index != @pages
         | 
| 20 22 | 
             
                    target_page = Nokogiri::HTML(open(TARGET_URL + "/?type=free&page=#{index}"))
         | 
| 21 23 | 
             
                    target_page.css('.watch a:first').each do |link|
         | 
| 22 24 | 
             
                      link_without_autoplay = link['href'].to_s.sub('?autoplay=true','')
         | 
| 23 25 | 
             
                      casts_list << link_without_autoplay
         | 
| 24 26 | 
             
                    end
         | 
| 25 27 | 
             
                  end
         | 
| 26 | 
            -
                  puts " | 
| 28 | 
            +
                  puts "\n"
         | 
| 27 29 | 
             
                  casts_list
         | 
| 28 30 | 
             
                end
         | 
| 29 31 |  | 
| @@ -41,29 +43,46 @@ module Copycasts | |
| 41 43 | 
             
                end
         | 
| 42 44 |  | 
| 43 45 | 
             
                def mp4_video_links
         | 
| 46 | 
            +
                  count = 0
         | 
| 44 47 | 
             
                  mp4_links = []
         | 
| 45 | 
            -
                   | 
| 48 | 
            +
                  page_links = get_links
         | 
| 49 | 
            +
                  
         | 
| 50 | 
            +
                  puts "Start crawling for download target"
         | 
| 51 | 
            +
                  progress = ProgressBar.new("Crawling:", page_links.length)
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  page_links.each do |video_link|
         | 
| 46 54 | 
             
                    video_page = Nokogiri::HTML(open(TARGET_URL + "/" + video_link))
         | 
| 47 55 | 
             
                    link = video_page.css('.downloads li[3] a').first
         | 
| 48 56 | 
             
                    mp4_links << link.values.first
         | 
| 57 | 
            +
                    count += 1
         | 
| 58 | 
            +
                    progress.set(count)
         | 
| 49 59 | 
             
                  end
         | 
| 60 | 
            +
                  puts "\n"
         | 
| 50 61 | 
             
                  mp4_links
         | 
| 51 62 | 
             
                end
         | 
| 52 63 |  | 
| 53 64 | 
             
                def download_videos
         | 
| 65 | 
            +
                  downloaded = 0
         | 
| 54 66 | 
             
                  mp4_video_links.each do |video_link|
         | 
| 67 | 
            +
                    count = 0
         | 
| 55 68 | 
             
                    uri = URI.parse(video_link)
         | 
| 56 69 | 
             
                    file_name = video_link.split("/").last
         | 
| 57 70 |  | 
| 58 71 | 
             
                    Net::HTTP.start(uri.host) do |http|
         | 
| 59 | 
            -
                       | 
| 60 | 
            -
                       | 
| 61 | 
            -
                      open(file_name, "wb") do |file|
         | 
| 62 | 
            -
                         | 
| 72 | 
            +
                      response = http.request_head(uri.request_uri)
         | 
| 73 | 
            +
                      progress = ProgressBar.new("#{downloaded} downloaded", response['content-length'].to_i)
         | 
| 74 | 
            +
                      File.open(file_name, "wb") do |file|
         | 
| 75 | 
            +
                        http.get(uri.request_uri) do |request_return|
         | 
| 76 | 
            +
                          file.write(request_return)
         | 
| 77 | 
            +
                          count += request_return.length
         | 
| 78 | 
            +
                          progress.set(count)
         | 
| 79 | 
            +
                        end
         | 
| 63 80 | 
             
                      end
         | 
| 64 81 | 
             
                    end
         | 
| 65 | 
            -
                     | 
| 82 | 
            +
                    downloaded += 1
         | 
| 66 83 | 
             
                  end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                  puts "Downloaded all files successfully!"
         | 
| 67 86 | 
             
                end
         | 
| 68 87 | 
             
              end
         | 
| 69 88 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: copycasts
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Nicholas
         | 
| @@ -78,6 +78,20 @@ dependencies: | |
| 78 78 | 
             
                - - '>='
         | 
| 79 79 | 
             
                  - !ruby/object:Gem::Version
         | 
| 80 80 | 
             
                    version: 1.5.6
         | 
| 81 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 82 | 
            +
              name: progressbar
         | 
| 83 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 84 | 
            +
                requirements:
         | 
| 85 | 
            +
                - - ~>
         | 
| 86 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 87 | 
            +
                    version: 0.21.0
         | 
| 88 | 
            +
              type: :development
         | 
| 89 | 
            +
              prerelease: false
         | 
| 90 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 91 | 
            +
                requirements:
         | 
| 92 | 
            +
                - - ~>
         | 
| 93 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 94 | 
            +
                    version: 0.21.0
         | 
| 81 95 | 
             
            description: Offline watch free episode of railscast videos for personal usage.
         | 
| 82 96 | 
             
            email:
         | 
| 83 97 | 
             
            - secret@live.com.my
         | 
| @@ -95,7 +109,6 @@ files: | |
| 95 109 | 
             
            - bin/copycasts-start-crawl
         | 
| 96 110 | 
             
            - copycasts.gemspec
         | 
| 97 111 | 
             
            - lib/copycasts.rb
         | 
| 98 | 
            -
            - lib/markdown
         | 
| 99 112 | 
             
            homepage: https://github.com/nichthinkof30/copycasts
         | 
| 100 113 | 
             
            licenses:
         | 
| 101 114 | 
             
            - MIT
         | 
    
        data/lib/markdown
    DELETED
    
    | @@ -1,122 +0,0 @@ | |
| 1 | 
            -
            gem uninstall copycasts
         | 
| 2 | 
            -
            gem build copycasts.gemspec 
         | 
| 3 | 
            -
            gem install copycasts
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            require 'copycasts'
         | 
| 6 | 
            -
            a = CopyCasts.new({page: 1})
         | 
| 7 | 
            -
            a.download_videos
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            types = {}
         | 
| 10 | 
            -
            file_links = []
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            types[:zip] = 2 if options[:zip]
         | 
| 13 | 
            -
            types[:mp4] = 3 if options[:mp4]
         | 
| 14 | 
            -
            types[:m4v] = 4 if options[:m4v]
         | 
| 15 | 
            -
            types[:webm] = 5 if options[:webm]
         | 
| 16 | 
            -
            types[:ogv] = 6 if options[:ogv]
         | 
| 17 | 
            -
             | 
| 18 | 
            -
            types = { zip: 2, mp4: 3, m4v: 4, webm: 5, ogv: 6 } if options[:all]
         | 
| 19 | 
            -
             | 
| 20 | 
            -
            types.each_pair do |key, value|
         | 
| 21 | 
            -
              puts "Crawling "
         | 
| 22 | 
            -
              get_links.each do |link|
         | 
| 23 | 
            -
                file_link = Nokogiri::HTML(open(TARGET_URL + "/" + link))
         | 
| 24 | 
            -
                url = url.css('.downloads li[#{value}] a').first
         | 
| 25 | 
            -
                file_links << url.values.first
         | 
| 26 | 
            -
              end
         | 
| 27 | 
            -
            end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
            file_links
         | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
            Gem::Specification.new do |s|
         | 
| 34 | 
            -
              s.name        = "copycasts"
         | 
| 35 | 
            -
              s.version     = "0.0.2"
         | 
| 36 | 
            -
              s.authors     = ["Nicholas Ng"]
         | 
| 37 | 
            -
              s.email       = ["secret@live.com.my"]
         | 
| 38 | 
            -
              s.homepage    = ""
         | 
| 39 | 
            -
              s.summary     = %q{Offline watch free episode of railscast videos for personal usage.}
         | 
| 40 | 
            -
              s.description = %q{Download videos from video source}
         | 
| 41 | 
            -
              
         | 
| 42 | 
            -
              s.add_development_dependency "nokogiri", "~> 1.5", ">= 1.5.6"
         | 
| 43 | 
            -
              s.add_development_dependency "open-uri", "~> 1.5", ">= 1.5.6"
         | 
| 44 | 
            -
              s.add_development_dependency "rake", "~> 10.1", ">= 10.1.0"
         | 
| 45 | 
            -
             | 
| 46 | 
            -
              s.files = [
         | 
| 47 | 
            -
                "lib/copycasts.rb"
         | 
| 48 | 
            -
              ]
         | 
| 49 | 
            -
              s.require_paths = ["lib"]
         | 
| 50 | 
            -
            end
         | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
            require 'nokogiri'
         | 
| 57 | 
            -
            require 'open-uri'
         | 
| 58 | 
            -
            require 'net/http'
         | 
| 59 | 
            -
             | 
| 60 | 
            -
            class CopyCasts
         | 
| 61 | 
            -
              TARGET_URL = 'http://railscasts.com'
         | 
| 62 | 
            -
              attr_accessor :page
         | 
| 63 | 
            -
             | 
| 64 | 
            -
              def initialize(options = {})
         | 
| 65 | 
            -
                @pages = options[:page] || maximum_page
         | 
| 66 | 
            -
             | 
| 67 | 
            -
              end
         | 
| 68 | 
            -
             | 
| 69 | 
            -
              def get_links
         | 
| 70 | 
            -
                casts_list = []
         | 
| 71 | 
            -
                puts "Crawling casts list..."
         | 
| 72 | 
            -
                for index in 1..@pages
         | 
| 73 | 
            -
                  target_page = Nokogiri::HTML(open(TARGET_URL + "/?type=free&page=#{index}"))
         | 
| 74 | 
            -
                  target_page.css('.watch a:first').each do |link|
         | 
| 75 | 
            -
                    link_without_autoplay = link['href'].to_s.sub('?autoplay=true','')
         | 
| 76 | 
            -
                    casts_list << link_without_autoplay
         | 
| 77 | 
            -
                  end
         | 
| 78 | 
            -
                end
         | 
| 79 | 
            -
                puts "Finish crawling."
         | 
| 80 | 
            -
                casts_list
         | 
| 81 | 
            -
              end
         | 
| 82 | 
            -
             | 
| 83 | 
            -
              def maximum_page
         | 
| 84 | 
            -
                target_page = Nokogiri::HTML(open(TARGET_URL + "/?type=free"))
         | 
| 85 | 
            -
                ret = 0
         | 
| 86 | 
            -
                target_page.css('.pagination a').each do |a|
         | 
| 87 | 
            -
                  if !(a.content.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil) #not number
         | 
| 88 | 
            -
                    if a.content.to_i > 0
         | 
| 89 | 
            -
                      ret = a.content.to_i
         | 
| 90 | 
            -
                    end
         | 
| 91 | 
            -
                  end
         | 
| 92 | 
            -
                end
         | 
| 93 | 
            -
                ret
         | 
| 94 | 
            -
              end
         | 
| 95 | 
            -
             | 
| 96 | 
            -
              def file_links
         | 
| 97 | 
            -
                mp4_links = []
         | 
| 98 | 
            -
                get_links.each do |video_link|
         | 
| 99 | 
            -
                  video_page = Nokogiri::HTML(open(TARGET_URL + "/" + video_link))
         | 
| 100 | 
            -
                  link = video_page.css('.downloads li[3] a').first
         | 
| 101 | 
            -
                  mp4_links << link.values.first
         | 
| 102 | 
            -
                end
         | 
| 103 | 
            -
                mp4_links
         | 
| 104 | 
            -
              end
         | 
| 105 | 
            -
             | 
| 106 | 
            -
              def download_videos
         | 
| 107 | 
            -
                mp4_video_links.each do |video_link|
         | 
| 108 | 
            -
                  uri = URI.parse(video_link)
         | 
| 109 | 
            -
                  file_name = video_link.split("/").last
         | 
| 110 | 
            -
             | 
| 111 | 
            -
                  Net::HTTP.start(uri.host) do |http|
         | 
| 112 | 
            -
                    puts "Start downloading #{file_name}..."
         | 
| 113 | 
            -
                    response = http.get(uri.request_uri)
         | 
| 114 | 
            -
                    open(file_name, "wb") do |file|
         | 
| 115 | 
            -
                      file.write(response.body)
         | 
| 116 | 
            -
                    end
         | 
| 117 | 
            -
                  end
         | 
| 118 | 
            -
                  puts "Downloaded successfully!"
         | 
| 119 | 
            -
                end
         | 
| 120 | 
            -
              end
         | 
| 121 | 
            -
             | 
| 122 | 
            -
            end
         |