X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2Fwebsite.rb;h=75f5aa8907d4c6c8e3fa237172a3e02a1f80f71c;hb=898ac047794bd23c6a60929d484a7e898549752f;hp=dad226424738195706eef5d835fd393165772f65;hpb=168ef3b2ccf5b97d561a3c542a18e8e7587de291;p=dead%2Fwhatever-dl.git diff --git a/src/website.rb b/src/website.rb index dad2264..75f5aa8 100644 --- a/src/website.rb +++ b/src/website.rb @@ -16,31 +16,106 @@ # http://www.fsf.org/licensing/licenses/gpl.html # +# Needed for the default implementation of get_page_data. +require 'net/http' + +# Necessary in a lot of subclasses; plus, we need it +# to parse the server name out of our URL. +require 'uri' + +# Needed to download.. things. +require 'net/http' + # This class keeps track of all its subclasses # We use this to loop through every "website" in an # attempt to determine to which site a URL belongs. class Website + + protected; + + @url = nil + + def self.inherited(subclass) if superclass.respond_to? :inherited superclass.inherited(subclass) end + # Every time we're subclassed, add the new + # subclass to our list of subclasses. @subclasses ||= [] @subclasses << subclass end - def self.subclasses - @subclasses + + def server + # Get the HTTP server portion of our URI + uri = URI.parse(@url) + return uri.host end - # This should be overridden in any class that wants - # to claim ownership of a URL. - def self.owns_url?(url) - return false + + + def get_page_data(url) + # A naive implementation that just grabs the + # data from a page. + uri = URI.parse(url) + + response = Net::HTTP.start(uri.host, uri.port) do |http| + http.get(uri.request_uri) + end + + return response.body end - # Same here. We want to default to nil unless overridden. - def get_video_url(url) + + + public; + + def initialize(url) + @url = url + end + + + def self.create(url) + # Factory method returning an instance of + # the appropriate subclass. + + # Check the URL against each website's class. + # The class will know whether or not the URL + # "belongs" to its website. + @subclasses.each do |w| + if w.owns_url?(url) + return w.new(url) + end + end + + # If nothing matched, we don't return an instance + # of anything. return nil end + + + # Abstract definition. Each subclass of Website + # should support it on its own. + def self.owns_url?(url) + raise NotImplementedError + end + + + # Same here. Abstract. + def get_video_url() + raise NotImplementedError + end + + + # The website class should be responsible for determining the + # video's filename. By default, we can take the last component + # of the video URL, but in some cases, subclasses will want + # to override this behavior. + def get_video_filename() + # Use whatever comes after the final front slash. + return get_video_url().split('/').pop() + end + end