def download(mod_id, mod_name, version): mod = Mod.query.filter(Mod.id == mod_id).first() if not mod: abort(404) if not mod.published and (not current_user or current_user.id != mod.user_id): abort(401) version = ModVersion.query.filter(ModVersion.mod_id == mod_id, \ ModVersion.friendly_version == version).first() if not version: abort(404) download = DownloadEvent.query\ .filter(DownloadEvent.mod_id == mod.id and DownloadEvent.version_id == version.id)\ .order_by(desc(DownloadEvent.created))\ .first() if not os.path.isfile(os.path.join(_cfg('storage'), version.download_path)): abort(404) # Events are aggregated hourly if not download or ((datetime.now() - download.created).seconds / 60 / 60) >= 1: download = DownloadEvent() download.mod = mod download.version = version download.downloads = 1 mod.downloads.append(download) db.add(download) else: download.downloads += 1 mod.download_count += 1 return send_file(os.path.join(_cfg('storage'), version.download_path), as_attachment = True)
def download(mod_id, mod_name, version): mod = Mod.query.filter(Mod.id == mod_id).first() if not mod: abort(404) if not mod.published and (not current_user or current_user.id != mod.user_id): abort(401) version = ModVersion.query.filter(ModVersion.mod_id == mod_id, \ ModVersion.friendly_version == version).first() if not version: abort(404) download = DownloadEvent.query\ .filter(DownloadEvent.mod_id == mod.id and DownloadEvent.version_id == version.id)\ .order_by(desc(DownloadEvent.created))\ .first() if not os.path.isfile(os.path.join(_cfg('storage'), version.download_path)): abort(404) if not 'Range' in request.headers: # Events are aggregated hourly if not download or ((datetime.now() - download.created).seconds / 60 / 60) >= 1: download = DownloadEvent() download.mod = mod download.version = version download.downloads = 1 db.add(download) db.flush() db.commit() mod.downloads.append(download) else: download.downloads += 1 mod.download_count += 1 if _cfg("cdn-domain"): return redirect("http://" + _cfg("cdn-domain") + '/' + version.download_path, code=302) response = None if _cfg("use-x-accel") == 'nginx': response = make_response("") response.headers['Content-Type'] = 'application/zip' response.headers['Content-Disposition'] = 'attachment; filename=' + os.path.basename(version.download_path) response.headers['X-Accel-Redirect'] = '/internal/' + version.download_path if _cfg("use-x-accel") == 'apache': response = make_response("") response.headers['Content-Type'] = 'application/zip' response.headers['Content-Disposition'] = 'attachment; filename=' + os.path.basename(version.download_path) response.headers['X-Sendfile'] = os.path.join(_cfg('storage'), version.download_path) if response is None: response = make_response(send_file(os.path.join(_cfg('storage'), version.download_path), as_attachment = True)) return response
def download(mod_id, mod_name, version): mod = Mod.query.filter(Mod.id == mod_id).first() if not mod: abort(404) if not mod.published and (not current_user or current_user.id != mod.user_id): abort(401) version = ModVersion.query.filter(ModVersion.mod_id == mod_id, \ ModVersion.friendly_version == version).first() if not version: abort(404) download = DownloadEvent.query\ .filter(DownloadEvent.mod_id == mod.id and DownloadEvent.version_id == version.id)\ .order_by(desc(DownloadEvent.created))\ .first() if not os.path.isfile(os.path.join(_cfg('storage'), version.download_path)): abort(404) if not 'Range' in request.headers: # Events are aggregated hourly if not download or ( (datetime.now() - download.created).seconds / 60 / 60) >= 1: download = DownloadEvent() download.mod = mod download.version = version download.downloads = 1 db.add(download) db.flush() db.commit() mod.downloads.append(download) else: download.downloads += 1 mod.download_count += 1 response = make_response( send_file(os.path.join(_cfg('storage'), version.download_path), as_attachment=True)) if _cfg("use-x-accel") == 'true': response = make_response("") response.headers['Content-Type'] = 'application/zip' response.headers[ 'Content-Disposition'] = 'attachment; filename=' + os.path.basename( version.download_path) response.headers[ 'X-Accel-Redirect'] = '/internal/' + version.download_path return response
def download(mod_id, mod_name, version): mod = Mod.query.filter(Mod.id == mod_id).first() if not mod: abort(404) if not mod.published and (not current_user or current_user.id != mod.user_id): abort(401) version = ModVersion.query.filter(ModVersion.mod_id == mod_id, ModVersion.friendly_version == version).first() if not version: abort(404) download = ( DownloadEvent.query.filter(DownloadEvent.mod_id == mod.id and DownloadEvent.version_id == version.id) .order_by(desc(DownloadEvent.created)) .first() ) if not os.path.isfile(os.path.join(_cfg("storage"), version.download_path)): abort(404) if not "Range" in request.headers: # Events are aggregated hourly if not download or ((datetime.now() - download.created).seconds / 60 / 60) >= 1: download = DownloadEvent() download.mod = mod download.version = version download.downloads = 1 db.add(download) db.flush() db.commit() mod.downloads.append(download) else: download.downloads += 1 mod.download_count += 1 response = make_response(send_file(os.path.join(_cfg("storage"), version.download_path), as_attachment=True)) if _cfg("use-x-accel") == "true": response = make_response("") response.headers["Content-Type"] = "application/zip" response.headers["Content-Disposition"] = "attachment; filename=" + os.path.basename(version.download_path) response.headers["X-Accel-Redirect"] = "/internal/" + version.download_path return response
def download(mod_id, mod_name, version): mod = Mod.query.filter(Mod.id == mod_id).first() if not mod: abort(404) game = Game.query.filter(Game.id == mod.game_id).first() session['game'] = game.id session['gamename'] = game.name session['gameshort'] = game.short session['gameid'] = game.id if not mod or not game: ga = Game.query.filter(Game.short == 'kerbal-space-program').order_by( desc(Game.id)).first() session['game'] = ga.id session['gamename'] = ga.name session['gameshort'] = ga.short session['gameid'] = ga.id abort(404) else: session['game'] = game.id session['gamename'] = game.name session['gameshort'] = game.short session['gameid'] = game.id if not mod.published and (not current_user or current_user.id != mod.user_id): abort(401) version = ModVersion.query.filter(ModVersion.mod_id == mod_id, \ ModVersion.friendly_version == version).first() if not version: abort(404) download = DownloadEvent.query\ .filter(DownloadEvent.mod_id == mod.id and DownloadEvent.version_id == version.id)\ .order_by(desc(DownloadEvent.created))\ .first() if not os.path.isfile(os.path.join(_cfg('storage'), version.download_path)): abort(404) if not 'Range' in request.headers: # Events are aggregated hourly if not download or ( (datetime.now() - download.created).seconds / 60 / 60) >= 1: download = DownloadEvent() download.mod = mod download.version = version download.downloads = 1 db.add(download) db.flush() db.commit() mod.downloads.append(download) else: download.downloads += 1 mod.download_count += 1 if _cfg("cdn-domain"): return redirect("http://" + _cfg("cdn-domain") + '/' + version.download_path, code=302) response = None if _cfg("use-x-accel") == 'nginx': response = make_response("") response.headers['Content-Type'] = 'application/zip' response.headers[ 'Content-Disposition'] = 'attachment; filename=' + os.path.basename( version.download_path) response.headers[ 'X-Accel-Redirect'] = '/internal/' + version.download_path if _cfg("use-x-accel") == 'apache': response = make_response("") response.headers['Content-Type'] = 'application/zip' response.headers[ 'Content-Disposition'] = 'attachment; filename=' + os.path.basename( version.download_path) response.headers['X-Sendfile'] = os.path.join(_cfg('storage'), version.download_path) if response is None: response = make_response( send_file(os.path.join(_cfg('storage'), version.download_path), as_attachment=True)) return response