3 # whatever-dl, a script to download online (web-based) videos.
5 # Copyright Michael Orlitzky
7 # http://michael.orlitzky.com/
9 # This program is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 3 of the License, or
12 # (at your option) any later version.
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
19 # http://www.fsf.org/licensing/licenses/gpl.html
22 # We need Pathname to get the real filesystem path
23 # of this script (and not, for example, the path of
24 # a symlink which points to it.
27 # This bit of magic adds the parent directory (the
28 # project root) to the list of ruby load paths.
29 # Thus, our require statements will work regardless of
30 # how or from where the script was run.
31 executable
= Pathname
.new(__FILE__
).realpath
.to_s
32 $
: << File
.dirname(executable
) +
'/../'
34 # We require the UriUtilities class to handle
35 # the download of the video URL.
36 require 'src/uri_utilities'
39 # The Dir.glob that's coming up doesn't use the
40 # Ruby library path so we need to tell it where to
42 websites_pattern
= File
.dirname(executable
) +
'/../src/websites/*.rb'
44 # All of the website classes are located in one
45 # directory, so we can 'require' them automatically.
46 Dir
.glob(websites_pattern
).each
do |r
|
54 EXIT_COULDNT_GET_VIDEO_URL
= 3
55 EXIT_OUTPUT_FILE_ALREADY_EXISTS
= 4
56 EXIT_ERROR_READING_FROM_VIDEO_URL
= 5
57 EXIT_CONNECTION_REFUSED
= 6
59 EXIT_ACCESS_DENIED
= 8
61 # Only actually do something if this script was called
62 # directly (i.e. not from the tests).
63 if (__FILE__
== $0) then
64 if (ARGV.length
< 1) then
65 # If the user didn't give us a URL, yell
67 puts
'Usage: whatever-dl <url>'
68 Kernel
.exit(EXIT_NO_URL
)
72 site
= Website
.create(ARGV[0])
76 exit(EXIT_INVALID_URL
)
79 video_url
= site
.get_video_url()
82 puts
'Error retrieving video URL.'
83 exit(EXIT_COULDNT_GET_VIDEO_URL
)
86 video_uri
= URI
.parse(video_url
)
87 uu
= UriUtilities
.new()
89 if File
.exists
?(site
.get_video_filename())
90 puts
"Error: output file already exists. Please remove #{site.get_video_filename()}, and try again."
91 Kernel
.exit(EXIT_OUTPUT_FILE_ALREADY_EXISTS
)
95 # Attempt to download the file, and rescue and report
96 # any (predictable) exceptions.
98 puts
"Fetching #{video_url}"
99 puts
"Saving as #{site.get_video_filename()}."
101 uu
.download_with_progress_bar(video_uri
, site
.get_video_filename())
102 rescue Errno
::ECONNREFUSED => e
103 puts
'The connection to the server (to download the video file) was refused. Check your connection, and try again later.'
104 Kernel
.exit(EXIT_CONNECTION_REFUSED
)
105 rescue Errno
::EACCES => e
106 puts
"Access denied. Check that you have write permission to the output file/directory. Details: #{e.message}."
107 rescue OpenURI
::HTTPError => e
108 puts
"An HTTP error occurred while downloading the video file: #{e.message}."
109 Kernel
.exit(EXIT_HTTP_ERROR
)
112 # Write an empty line at the end for aesthetic reasons.
115 Kernel
.exit(EXIT_SUCCESS
)