mirror of
https://github.com/Emersont1/itchio.git
synced 2026-03-11 08:54:39 +00:00
Trimmed Unused Dependencies
Reframed --verify into --no-verify and --no-verify-file Added --skip-library-load for only grabbing free titles when using --download-game Updated Readme
This commit is contained in:
parent
34d5b1ce14
commit
0de1742b46
4 changed files with 90 additions and 53 deletions
20
Readme.md
20
Readme.md
|
|
@ -37,8 +37,24 @@ itch-download -vf
|
|||
# skips downloads above a certain size in megabytes, supports decimals
|
||||
itch-download -sas 50.0
|
||||
|
||||
# verifies downloads and creates an additional .md5 file for each download
|
||||
itch-download -v
|
||||
# Disables file verification entirely, files with the same name are assumed to be the same file
|
||||
itch-download --no-verify
|
||||
|
||||
# Disables writing supplementary .md5 files, existing files will still be hashed against their download hashes
|
||||
# Does nothing if --no-verify is specified
|
||||
itch-download --no-verify-file
|
||||
|
||||
# Downloads all free titles from the specified publisher
|
||||
# Argument should be formatted 'https://{publisher}.itch.io'
|
||||
itch-download --download-publisher
|
||||
|
||||
# Checks if title is owned, then downloads all files for it
|
||||
# Argument should be formatted 'https://{publisher}.itch.io/{title}/'
|
||||
itch-download --download-game
|
||||
|
||||
# For the --download-game argument, skips the check to see if the title is currently owned
|
||||
# In practice this free files only
|
||||
itch-download --skip-library-load
|
||||
```
|
||||
|
||||
## Add All Games in a bundle to your library
|
||||
|
|
|
|||
|
|
@ -29,12 +29,21 @@ def main():
|
|||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--verify",
|
||||
"--no-verify",
|
||||
type=bool,
|
||||
default=False,
|
||||
const=True,
|
||||
nargs='?',
|
||||
help="Verifies each file downloaded and produces a supplementary checksum file"
|
||||
help="Disables file verification entirely, files with the same name are assumed to be the same file"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--no-verify-file",
|
||||
type=bool,
|
||||
default=False,
|
||||
const=True,
|
||||
nargs='?',
|
||||
help="Disables writing md5 hashes to a supplementary file, does nothing if --no-verify is specified"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
|
|
@ -62,7 +71,16 @@ def main():
|
|||
parser.add_argument(
|
||||
"--download-game",
|
||||
type=str,
|
||||
help="Download a specific game, should be in the format publisher.itch.io/game",
|
||||
help="Download a specific game, should be in the format 'https://%publisher%.itch.io/%game-title%'",
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--skip-library-load",
|
||||
type=bool,
|
||||
default=False,
|
||||
const=True,
|
||||
nargs='?',
|
||||
help="For the --download-game argument only, skips caching and checking the user library for an existing key"
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
|
@ -81,18 +99,20 @@ def main():
|
|||
if args.download_publisher:
|
||||
lib.load_games(args.download_publisher)
|
||||
elif args.download_game:
|
||||
lib.load_owned_games()
|
||||
for game in lib.games:
|
||||
if game.link == args.download_game:
|
||||
lib.games = [game]
|
||||
break
|
||||
if len(lib) > 1:
|
||||
print("Game Is Not In Library, Checking for Free Downloads")
|
||||
lib.games = []
|
||||
if not args.skip_library_load:
|
||||
lib.load_owned_games()
|
||||
for game in lib.games:
|
||||
if game.link == args.download_game:
|
||||
lib.games = [game]
|
||||
break
|
||||
if len(lib) > 1:
|
||||
print("Game Is Not In Library, Checking for Free Downloads")
|
||||
lib.games = []
|
||||
matches = re.match(r"https://(.+)\.itch\.io/(.+)", args.download_game)
|
||||
lib.load_game(matches.group(1), matches.group(2))
|
||||
else:
|
||||
matches = re.match(r"https://(.+)\.itch\.io/(.+)", args.download_game)
|
||||
lib.load_game(matches.group(1), matches.group(2))
|
||||
|
||||
|
||||
else:
|
||||
lib.load_owned_games()
|
||||
|
||||
|
|
|
|||
|
|
@ -15,26 +15,37 @@ class Game:
|
|||
"""Representation of a game download"""
|
||||
|
||||
def __init__(self, data):
|
||||
self.id = False
|
||||
self.game_id = None
|
||||
self.args = sys.argv[1:]
|
||||
if '-vf' or '--verbose-folders' in self.args:
|
||||
self.verbose = True
|
||||
else:
|
||||
self.verbose = False
|
||||
if '--verify' in self.args:
|
||||
self.verify = True
|
||||
|
||||
if '--no-verify-file' in self.args:
|
||||
self.verify_file = False
|
||||
else:
|
||||
self.verify_file = True
|
||||
|
||||
if '--no-verify ' in self.args:
|
||||
self.verify = False
|
||||
else:
|
||||
self.verify = True
|
||||
|
||||
if '-sas' in self.args:
|
||||
self.skipping_large_entries = True
|
||||
self.skipping_above_size_MB = float(self.args[(self.args.index('-sas')+1)])
|
||||
self.skipping_above_size_B = self.skipping_above_size_MB * 1000000
|
||||
self.skipping_above_size_B = abs(self.skipping_above_size_MB * 1000000)
|
||||
elif '--skip-above-size' in self.args:
|
||||
self.skipping_large_entries = True
|
||||
self.skipping_above_size_MB = float(self.args[(self.args.index('--skip-above-size')+1)])
|
||||
self.skipping_above_size_B = self.skipping_above_size_MB * 1000000
|
||||
self.skipping_above_size_B = abs(self.skipping_above_size_MB * 1000000)
|
||||
else:
|
||||
self.skipping_above_size = False
|
||||
|
||||
self.data = data["game"]
|
||||
|
||||
if self.verbose:
|
||||
self.name = itchiodl.utils.clean_path(self.data["title"])
|
||||
self.publisher = self.data.get("user").get("display_name")
|
||||
|
|
@ -70,15 +81,12 @@ class Game:
|
|||
)
|
||||
j = r.json()
|
||||
for d in j["uploads"]:
|
||||
try:
|
||||
if not self.skipping_large_entries:
|
||||
self.downloads.append(d)
|
||||
elif self.skipping_above_size_B > d.get("size"):
|
||||
self.downloads.append(d)
|
||||
else:
|
||||
print("!Skipping Large Item!")
|
||||
except:
|
||||
print("There was an Error")
|
||||
if not self.skipping_large_entries:
|
||||
self.downloads.append(d)
|
||||
elif self.skipping_above_size_B > d.get("size"):
|
||||
self.downloads.append(d)
|
||||
else:
|
||||
print(f"Skipping Large Item: {d.get('filename')}")
|
||||
|
||||
def download(self, token, platform):
|
||||
"""Download a singular file"""
|
||||
|
|
@ -114,48 +122,42 @@ class Game:
|
|||
|
||||
def do_download(self, d, token):
|
||||
"""Download a single file, checking for existing files"""
|
||||
print(f"Downloading {d['filename']}")
|
||||
print(f"Downloading `{d['filename']}`")
|
||||
|
||||
file = itchiodl.utils.clean_path(d["filename"] or d["display_name"] or d["id"])
|
||||
path = self.destination_path
|
||||
|
||||
if os.path.exists(f"{path}/{file}"):
|
||||
print(f"File Already Exists! {file}")
|
||||
if self.verify:
|
||||
print(f"! `{file}` Already Exists!")
|
||||
if os.path.exists(f"{path}/{file}.md5"):
|
||||
with open(f"{path}/{file}.md5", "r") as f:
|
||||
md5 = f.read().strip()
|
||||
|
||||
if md5 == d["md5_hash"]:
|
||||
print(f"Skipping {self.name} - {file}")
|
||||
print(f"MD5 Hash Matches {self.name} - `{file}`, Skipping")
|
||||
return
|
||||
print(f"MD5 Mismatch! {file}")
|
||||
|
||||
else:
|
||||
md5 = itchiodl.utils.md5sum(f"{path}/{file}")
|
||||
if md5 == d["md5_hash"]:
|
||||
print(f"Skipping {self.name} - {file}")
|
||||
|
||||
print(f"MD5 Matches {self.name} - `{file}`, Skipping")
|
||||
# Create checksum file
|
||||
with open(f"{path}/{file}.md5", "w") as f:
|
||||
f.write(d["md5_hash"])
|
||||
if self.verify_file:
|
||||
with open(f"{path}/{file}.md5", "w") as f:
|
||||
f.write(d["md5_hash"])
|
||||
return
|
||||
# Old Download or corrupted file?
|
||||
corrupted = False
|
||||
if corrupted:
|
||||
os.remove(f"{path}/{file}")
|
||||
return
|
||||
|
||||
if not os.path.exists(f"{path}/old"):
|
||||
os.mkdir(f"{path}/old")
|
||||
|
||||
print(f"Moving {file} to old/")
|
||||
timestamp = datetime.datetime.now().strftime("%Y-%m-%d")
|
||||
print(timestamp)
|
||||
shutil.move(f"{path}/{file}", f"{path}/old/{timestamp}-{file}")
|
||||
if not os.path.exists(f"{path}/old"):
|
||||
os.mkdir(f"{path}/old")
|
||||
print(f"Moving {file} to old/")
|
||||
timestamp = datetime.datetime.now().strftime("%Y-%m-%d")
|
||||
print(timestamp)
|
||||
shutil.move(f"{path}/{file}", f"{path}/old/{timestamp}-{file}")
|
||||
else:
|
||||
print(f"Skipping {self.name} - {file}")
|
||||
return
|
||||
print(f"File Already Exists! Skipping")
|
||||
|
||||
# Get UUID
|
||||
r = requests.post(
|
||||
|
|
@ -217,6 +219,7 @@ class Game:
|
|||
if itchiodl.utils.md5sum(f"{path}/{file}") != d["md5_hash"]:
|
||||
print(f"Failed to verify {file}")
|
||||
return
|
||||
# Create checksum file
|
||||
with open(f"{path}/{file}.md5", "w") as f:
|
||||
f.write(d["md5_hash"])
|
||||
# Create checksum file
|
||||
if self.verify_file:
|
||||
with open(f"{path}/{file}.md5", "w") as f:
|
||||
f.write(d["md5_hash"])
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
import re
|
||||
import sys
|
||||
import hashlib
|
||||
import requests
|
||||
import os
|
||||
|
||||
|
||||
class NoDownloadError(Exception):
|
||||
|
|
|
|||
Loading…
Reference in a new issue