├── README.md └── mediafire-dl.py /README.md: -------------------------------------------------------------------------------- 1 | Installation: 2 | 3 | $ pip install bs4 requests tqdm 4 | $ git clone https://github.com/mohamed-elsaka/mediafire-dl.git 5 | 6 | Usage: 7 | 8 | python mediafire-dl.py mediafire_link_1 mediafire_link_2 mediafire_link_3 9 | 10 | 11 | Add to PATH on Linux: 12 | 13 | 1. Open the terminal & Navigate to the folder containing mediafire-dl.py 14 | 15 | 2. $ sudo cp mediafire-dl.py /usr/bin/mediafire-dl.py 16 | 17 | 3. $ sudo chmod a+rx /usr/bin/mediafire-dl 18 | 19 | 20 | Now you can call the app anywhere without the need to enter its full path :) 21 | -------------------------------------------------------------------------------- /mediafire-dl.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | import requests 4 | from bs4 import BeautifulSoup 5 | from tqdm import tqdm 6 | import sys 7 | import os 8 | import errno 9 | import time 10 | 11 | chunk_size = 1024 # 32KB 12 | os_path_separator = os.path.sep 13 | 14 | 15 | 16 | def make_sure_path_exists(path): 17 | try: 18 | os.makedirs(path) 19 | except OSError as exception: 20 | if exception.errno != errno.EEXIST: 21 | raise 22 | 23 | 24 | class MediafireDownloader: 25 | dl_file_name = '' 26 | dl_file_full_path = '' 27 | dl_total_file_size = 0 28 | dl_existing_file_size = 0 29 | 30 | dl_page_url = '' 31 | dl_file_url = '' 32 | 33 | def __init__(self): 34 | pass 35 | 36 | def get_subfolders_from_folder(self, folder_key, parent): 37 | api_call_link = "http://mediafire.com/api/1.5/folder/get_content.php?folder_key=" + folder_key + \ 38 | "&content_type=folders&chunk_size=1000&response_format=json" 39 | resp_json = requests.get(api_call_link).json() 40 | subfolders_in_folder = resp_json['response']['folder_content']['folders'] 41 | 42 | if subfolders_in_folder == []: 43 | # No subfolders >> don't request it again 44 | return False 45 | 46 | for subfolder in subfolders_in_folder: 47 | subfolder_name = subfolder['name'] 48 | subfolder_parent = parent + subfolder_name + os_path_separator 49 | subfolder_key = subfolder['folderkey'] 50 | 51 | print('----------------------------') 52 | print('Downloading folder: ' + subfolder_parent) 53 | self.download_folder(subfolder_key, subfolder_parent) 54 | 55 | 56 | def download_files_in_folder(self, folder_key, parent): 57 | api_call_link = "http://mediafire.com/api/1.5/folder/get_content.php?folder_key=" + folder_key \ 58 | + "&content_type=files&chunk_size=1000&response_format=json" 59 | resp_json = requests.get(api_call_link).json() 60 | files_in_folder = resp_json['response']['folder_content']['files'] 61 | 62 | for file in files_in_folder: 63 | file_page_url = file['links']['normal_download'] 64 | self.download_file(file_page_url, parent) 65 | 66 | 67 | def download_folder(self, folder_key, parent): 68 | # Get files in current folder 69 | cur_folder_files = self.download_files_in_folder(folder_key, parent) 70 | 71 | # Get files in subfolders 72 | self.get_subfolders_from_folder(folder_key, parent) 73 | 74 | 75 | 76 | 77 | def download(self, mediafire_link): 78 | mediafire_folder_key = "mediafire.com/folder/" 79 | folder_slug_start = mediafire_link.find(mediafire_folder_key) + len(mediafire_folder_key) 80 | if folder_slug_start < 0: 81 | self.download_file(mediafire_link) 82 | else: 83 | hash_pos = mediafire_link.rfind('#') + 1 84 | if hash_pos > 0: 85 | # Folder is after # 86 | folder_key = mediafire_link[hash_pos:] 87 | else: 88 | folder_slug_end = mediafire_link.find('/', folder_slug_start) 89 | if folder_slug_end < 0: 90 | folder_slug_end = len(mediafire_link) 91 | folder_key = mediafire_link[folder_slug_start:folder_slug_end] 92 | self.download_folder(folder_key, '') 93 | 94 | 95 | def download_file1111(self, mediafire_file_link, parent, file_name=''): 96 | print('Downloading ' + mediafire_file_link) 97 | 98 | 99 | #@staticmethod 100 | def download_file(self, mediafire_file_link, parent, file_name=''): 101 | cwd = os.getcwd() 102 | self.dl_page_url = mediafire_file_link 103 | print('----------------') 104 | print('Getting link from ' + self.dl_page_url) 105 | 106 | # Get download element 107 | r_download_page = requests.get(self.dl_page_url) 108 | soup_download_page = BeautifulSoup(r_download_page.text, 'lxml') 109 | download_link_element = soup_download_page.select_one('.download_link') 110 | download_link_element_str = str(download_link_element) 111 | 112 | # Get download link from download element 113 | link_start = download_link_element_str.find('"http://') +1 114 | link_end = download_link_element_str.find('";', link_start) 115 | self.dl_file_url = download_link_element_str[link_start:link_end] 116 | 117 | # Get file_name & file_size from HTTP head request 118 | header_request = requests.head(self.dl_file_url) 119 | self.dl_total_file_size = int(header_request.headers['Content-Length']) 120 | if file_name != '': 121 | self.dl_file_name = file_name 122 | else: 123 | cd = header_request.headers['content-disposition'] 124 | file_name_key = 'filename="' 125 | fn_start = cd.find(file_name_key) + len(file_name_key) 126 | fn_end = cd.find('"', fn_start) 127 | self.dl_file_name = cd[fn_start:fn_end] 128 | ss = os.path.join(cwd, parent) 129 | make_sure_path_exists(ss) 130 | self.dl_file_full_path = os.path.join(cwd, parent, self.dl_file_name) 131 | 132 | #print('download link: ' + self.dl_file_url) 133 | #print('[' + str(self.dl_total_file_size) + ']' + 'File: ' + self.dl_file_name) 134 | 135 | # If file already exist, resume. Otherwise create new file 136 | if os.path.exists(self.dl_file_full_path): 137 | output_file = open(self.dl_file_full_path, 'ab') 138 | self.dl_existing_file_size = int(os.path.getsize(self.dl_file_full_path)) 139 | else: 140 | output_file = open(self.dl_file_full_path, 'wb') 141 | 142 | if self.dl_existing_file_size == self.dl_total_file_size: 143 | print('File "' + str(os.path.join(parent, self.dl_file_name)) + '" Already downloaded.') 144 | print('-------------------------') 145 | time.sleep(2) 146 | else: 147 | print('Resuming "' + self.dl_file_full_path + '".') 148 | # Add header to resume download 149 | headers = {'Range': 'bytes=%s-' % self.dl_existing_file_size} 150 | r = requests.get(self.dl_file_url, headers=headers, stream=True) 151 | #try: 152 | # for chunk in tqdm(r.iter_content(32*1024), total=self.dl_total_file_size, \ 153 | # unit='KB', unit_scale=True): 154 | pbar = tqdm(total=self.dl_total_file_size, initial=self.dl_existing_file_size, 155 | unit='B', unit_scale=True) 156 | for chunk in r.iter_content(chunk_size): 157 | output_file.write(chunk) 158 | pbar.update(chunk_size) 159 | 160 | output_file.close() 161 | pbar.close() 162 | pbar.refresh() 163 | 164 | print('Finished Downloading "' + self.dl_file_full_path + '".') 165 | print('-------------------------') 166 | # except: 167 | # output_file.close() 168 | 169 | 170 | def main(): 171 | #print(sys.argv) 172 | if len(sys.argv) < 2: 173 | print('Use: mediafire.py mediafre_link_1 mediafire_link_2') 174 | exit() 175 | 176 | mf = MediafireDownloader() 177 | 178 | for mediafire_link in sys.argv[1:]: 179 | mf.download(mediafire_link) 180 | #mf.download(mf_folder_url) 181 | 182 | if __name__ == "__main__": 183 | main() 184 | 185 | --------------------------------------------------------------------------------