|
@@ -38,7 +38,14 @@ def getargs(): |
|
|
parser = argparse.ArgumentParser()
|
|
|
parser = argparse.ArgumentParser()
|
|
|
parser.add_argument('-dir', '--directory', help='Initiate upload on directory', nargs='?', required=True)
|
|
|
parser.add_argument('-dir', '--directory', help='Initiate upload on directory', nargs='?', required=True)
|
|
|
parser.add_argument("-f", "--freeleech", help="Enables freeleech", action="store_true")
|
|
|
parser.add_argument("-f", "--freeleech", help="Enables freeleech", action="store_true")
|
|
|
|
|
|
parser.add_argument("-a", "--artist", help='Set the artists. (Romaji\English)', nargs='?')
|
|
|
|
|
|
parser.add_argument("-ti", "--title", help='Set the title. (Romaji\English)', nargs='?')
|
|
|
|
|
|
parser.add_argument("-rt", "--releasetype", help='Set the release type. (Album, Single)', nargs='?')
|
|
|
parser.add_argument("-t", "--tags", help="Add additional tags to the upload", nargs='?')
|
|
|
parser.add_argument("-t", "--tags", help="Add additional tags to the upload", nargs='?')
|
|
|
|
|
|
parser.add_argument("-eti", "--editiontitle", help='Set the edition title', nargs='?')
|
|
|
|
|
|
parser.add_argument("-ey", "--editionyear", help='Set the torrent edition year (YYYYMMDD or YYYY).', nargs='?')
|
|
|
|
|
|
parser.add_argument("-tdes", "--torrentdescription", help='Add a torrent description', nargs='?')
|
|
|
|
|
|
parser.add_argument("-im", "--imageURL", help='Set the torrent cover URL.', nargs='?')
|
|
|
parser.add_argument('-d', '--debug', help='Enable debug mode', action='store_true')
|
|
|
parser.add_argument('-d', '--debug', help='Enable debug mode', action='store_true')
|
|
|
parser.add_argument("-dry", "--dryrun", help="Dryrun will carry out all actions other than the actual upload to JPS.", action="store_true")
|
|
|
parser.add_argument("-dry", "--dryrun", help="Dryrun will carry out all actions other than the actual upload to JPS.", action="store_true")
|
|
|
|
|
|
|
|
@@ -93,7 +100,11 @@ def createtorrent(authkey, directory, filename, releasedata): |
|
|
# Reads FLAC file and returns metadata.
|
|
|
# Reads FLAC file and returns metadata.
|
|
|
def readflac(filename):
|
|
|
def readflac(filename):
|
|
|
read = FLAC(filename)
|
|
|
read = FLAC(filename)
|
|
|
|
|
|
|
|
|
|
|
|
# get some audio info
|
|
|
|
|
|
audio_info={
|
|
|
|
|
|
"SAMPLE_RATE": read.info.sample_rate,
|
|
|
|
|
|
"BIT_DEPTH": read.info.bits_per_sample
|
|
|
|
|
|
}
|
|
|
# Create dict containing all meta fields we'll be using.
|
|
|
# Create dict containing all meta fields we'll be using.
|
|
|
tags={
|
|
|
tags={
|
|
|
"ALBUM": read.get('album'),
|
|
|
"ALBUM": read.get('album'),
|
|
@@ -121,7 +132,7 @@ def readflac(filename): |
|
|
print(f"{k} has returned {v}, this is a required tag")
|
|
|
print(f"{k} has returned {v}, this is a required tag")
|
|
|
sys.exit()
|
|
|
sys.exit()
|
|
|
|
|
|
|
|
|
return tags
|
|
|
|
|
|
|
|
|
return tags, audio_info
|
|
|
|
|
|
|
|
|
# Reads MP3 file and returns metadata.
|
|
|
# Reads MP3 file and returns metadata.
|
|
|
def readmp3(filename):
|
|
|
def readmp3(filename):
|
|
@@ -313,6 +324,18 @@ def translate(string, category, result=None, output=None): |
|
|
|
|
|
|
|
|
return output
|
|
|
return output
|
|
|
|
|
|
|
|
|
|
|
|
def determine_flac_bitdepth_and_samplerate(audio_info):
|
|
|
|
|
|
if audio_info['BIT_DEPTH'] == 16:
|
|
|
|
|
|
return "Lossless"
|
|
|
|
|
|
elif audio_info['BIT_DEPTH'] == 24 and audio_info['SAMPLE_RATE'] == 96000:
|
|
|
|
|
|
return "24bit/96Khz"
|
|
|
|
|
|
elif audio_info['BIT_DEPTH'] == 24 and audio_info['SAMPLE_RATE'] == 48000:
|
|
|
|
|
|
return "24bit/48Khz"
|
|
|
|
|
|
elif audio_info['BIT_DEPTH'] == 24 and audio_info['SAMPLE_RATE'] == 44100:
|
|
|
|
|
|
return "24bit/44.1Khz"
|
|
|
|
|
|
else:
|
|
|
|
|
|
return "24bit"
|
|
|
|
|
|
|
|
|
def gatherdata(directory):
|
|
|
def gatherdata(directory):
|
|
|
# Lists for storing some
|
|
|
# Lists for storing some
|
|
|
list_album_artists = []
|
|
|
list_album_artists = []
|
|
@@ -335,7 +358,7 @@ def gatherdata(directory): |
|
|
file_location = os.path.join(directory, file)
|
|
|
file_location = os.path.join(directory, file)
|
|
|
if file.endswith(".flac"):
|
|
|
if file.endswith(".flac"):
|
|
|
# Read FLAC file to grab meta
|
|
|
# Read FLAC file to grab meta
|
|
|
tags = readflac(file_location)
|
|
|
|
|
|
|
|
|
tags, audio_info = readflac(file_location)
|
|
|
flac_present = True
|
|
|
flac_present = True
|
|
|
# If Discnumber isn't present then we omit it from the tracklist entry
|
|
|
# If Discnumber isn't present then we omit it from the tracklist entry
|
|
|
if tags['DISCNUMBER'] == None:
|
|
|
if tags['DISCNUMBER'] == None:
|
|
@@ -380,7 +403,7 @@ def gatherdata(directory): |
|
|
# Check files to make sure there's no multi-format.
|
|
|
# Check files to make sure there's no multi-format.
|
|
|
if flac_present:
|
|
|
if flac_present:
|
|
|
format = 'FLAC'
|
|
|
format = 'FLAC'
|
|
|
bitrate = 'Lossless'
|
|
|
|
|
|
|
|
|
bitrate = determine_flac_bitdepth_and_samplerate(audio_info)
|
|
|
if mp3_present:
|
|
|
if mp3_present:
|
|
|
format = 'MP3'
|
|
|
format = 'MP3'
|
|
|
bitrate = '320'
|
|
|
bitrate = '320'
|
|
@@ -440,15 +463,15 @@ def gatherdata(directory): |
|
|
|
|
|
|
|
|
## If release description is enabled we apply comments to the bugs album url
|
|
|
## If release description is enabled we apply comments to the bugs album url
|
|
|
# Note that this is dependant on the album being sourced from bugs so should be changed per user.
|
|
|
# Note that this is dependant on the album being sourced from bugs so should be changed per user.
|
|
|
if cfg['local_prefs']['enable_release_description']:
|
|
|
|
|
|
try:
|
|
|
|
|
|
release_description = f"Sourced from [url=https://music.bugs.co.kr/album/{tags['COMMENT'][0]}]Bugs[/url]"
|
|
|
|
|
|
# If any exceptions occur we will return to no release description
|
|
|
|
|
|
except:
|
|
|
|
|
|
release_description = ""
|
|
|
|
|
|
# If release description is not enabled we will use no release description
|
|
|
|
|
|
else:
|
|
|
|
|
|
release_description = ""
|
|
|
|
|
|
|
|
|
# if cfg['local_prefs']['enable_release_description']:
|
|
|
|
|
|
# try:
|
|
|
|
|
|
# release_description = f"Sourced from [url=https://music.bugs.co.kr/album/{tags['COMMENT'][0]}]Bugs[/url]"
|
|
|
|
|
|
# # If any exceptions occur we will return to no release description
|
|
|
|
|
|
# except:
|
|
|
|
|
|
# release_description = ""
|
|
|
|
|
|
# # If release description is not enabled we will use no release description
|
|
|
|
|
|
# else:
|
|
|
|
|
|
# release_description = ""
|
|
|
|
|
|
|
|
|
## Assign all our unique values into releasedata{}. We'll use this later down the line for POSTING.
|
|
|
## Assign all our unique values into releasedata{}. We'll use this later down the line for POSTING.
|
|
|
# POST values can be found by inspecting JPS HTML
|
|
|
# POST values can be found by inspecting JPS HTML
|
|
@@ -456,21 +479,21 @@ def gatherdata(directory): |
|
|
|
|
|
|
|
|
# List of accepted upload types
|
|
|
# List of accepted upload types
|
|
|
accepted_types = ['Album', 'Single']
|
|
|
accepted_types = ['Album', 'Single']
|
|
|
# If type errors then we ask for user input
|
|
|
|
|
|
try:
|
|
|
|
|
|
releasedata['type'] = translate(tags['GROUPING'][0], "release_types")[0]
|
|
|
|
|
|
except TypeError:
|
|
|
|
|
|
releasedata['type'] = input("\n" + "_" * 100 + "\nGrouping is empty or has received an error, please enter manually (Album/Single)\n")
|
|
|
|
|
|
|
|
|
|
|
|
# If type is still not in accepted_types we ask for user input again and do not break loop until correct
|
|
|
|
|
|
if releasedata['type'] not in accepted_types:
|
|
|
|
|
|
while True:
|
|
|
|
|
|
releasedata['type'] = input("\n" + "_" * 100 + "\nGrouping tag did not return an album type, please enter manually (Album/Single)\n")
|
|
|
|
|
|
|
|
|
|
|
|
if releasedata['type'] not in accepted_types:
|
|
|
|
|
|
continue
|
|
|
|
|
|
else:
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
if releasetype not in accepted_types:
|
|
|
|
|
|
if releasetype:
|
|
|
|
|
|
releasedata['type'] = releasetype
|
|
|
|
|
|
else:
|
|
|
|
|
|
while(True):
|
|
|
|
|
|
input_releasetype = input("\n" + "_" * 100 + "\nEnter a number to choose the release type. \n1=Album\n2=Single\n")
|
|
|
|
|
|
if input_releasetype == "1":
|
|
|
|
|
|
releasedata["type"] = "Album"
|
|
|
|
|
|
break
|
|
|
|
|
|
elif input_releasetype == "2":
|
|
|
|
|
|
releasedata["type"] = "Single"
|
|
|
|
|
|
break
|
|
|
|
|
|
print("Invalid choice.")
|
|
|
|
|
|
else:
|
|
|
|
|
|
releasedata['type'] = releasetype
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
releasedata['title'] = tags['ALBUM'][0]
|
|
|
releasedata['title'] = tags['ALBUM'][0]
|
|
@@ -481,10 +504,16 @@ def gatherdata(directory): |
|
|
#re.sub removes any date separators, jps doesn't accept them
|
|
|
#re.sub removes any date separators, jps doesn't accept them
|
|
|
releasedata['releasedate'] = re.sub(r"[^0-9]", "", tags['DATE'])
|
|
|
releasedata['releasedate'] = re.sub(r"[^0-9]", "", tags['DATE'])
|
|
|
releasedata['format'] = format
|
|
|
releasedata['format'] = format
|
|
|
releasedata['bitrate'] = bitrate
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if bitrate != "Lossless":
|
|
|
|
|
|
releasedata['bitrate'] = "Other"
|
|
|
|
|
|
releasedata['other_bitrate'] = bitrate
|
|
|
|
|
|
else:
|
|
|
|
|
|
releasedata['bitrate'] = bitrate
|
|
|
releasedata['media'] = media
|
|
|
releasedata['media'] = media
|
|
|
releasedata['album_desc'] = album_description
|
|
|
releasedata['album_desc'] = album_description
|
|
|
releasedata['release_desc'] = release_description
|
|
|
|
|
|
|
|
|
# releasedata['release_desc'] = release_description
|
|
|
|
|
|
releasedata['release_desc'] = torrentdescription
|
|
|
releasedata['tags'] = unique_genre
|
|
|
releasedata['tags'] = unique_genre
|
|
|
|
|
|
|
|
|
# Enable freeleech if arg is passed
|
|
|
# Enable freeleech if arg is passed
|
|
@@ -509,10 +538,25 @@ def gatherdata(directory): |
|
|
if debug:
|
|
|
if debug:
|
|
|
print(f"{releasedata['artist']} < English = {en}")
|
|
|
print(f"{releasedata['artist']} < English = {en}")
|
|
|
if en == False:
|
|
|
if en == False:
|
|
|
input_english_artist = input("\n" + "_" * 100 + "\nKorean/Japanese Detected. Please enter the romaji/english artist name:\n")
|
|
|
|
|
|
# Create new key called titlejp and assign the old title to it
|
|
|
|
|
|
# Replace title with the user input.
|
|
|
|
|
|
releasedata['artist'] = input_english_artist
|
|
|
|
|
|
|
|
|
if artists:
|
|
|
|
|
|
input_english_artist = artists
|
|
|
|
|
|
else:
|
|
|
|
|
|
input_english_artist = input("\n" + "_" * 100 + "\nPlease enter the romaji/english artist name. Separate multiple main artists with \",\".\n")
|
|
|
|
|
|
input_english_artist = [x.strip() for x in input_english_artist.split(',')]
|
|
|
|
|
|
releasedata['idols[]'] = input_english_artist
|
|
|
|
|
|
|
|
|
|
|
|
if editiontitle:
|
|
|
|
|
|
releasedata['remaster_title'] = editiontitle
|
|
|
|
|
|
else:
|
|
|
|
|
|
input_editiontitle = input("\n" + "_" * 100 + "\nEnter the edition TITLE. Press enter to skip.\n")
|
|
|
|
|
|
print(input_editiontitle)
|
|
|
|
|
|
if input_editiontitle != "":
|
|
|
|
|
|
if editionyear:
|
|
|
|
|
|
releasedata["remaster_year"] = editionyear
|
|
|
|
|
|
else:
|
|
|
|
|
|
input_editionyear = input("\n" + "_" * 100 + "\nEnter the edition year as YYYY.\n")
|
|
|
|
|
|
releasedata["remaster_year"] = input_editionyear
|
|
|
|
|
|
releasedata['remaster_title'] = input_editiontitle
|
|
|
|
|
|
|
|
|
return releasedata
|
|
|
return releasedata
|
|
|
|
|
|
|
|
@@ -546,6 +590,8 @@ def uploadtorrent(torrent, cover, releasedata): |
|
|
|
|
|
|
|
|
# Dataset containing all of the information obtained from our FLAC files.
|
|
|
# Dataset containing all of the information obtained from our FLAC files.
|
|
|
data = releasedata
|
|
|
data = releasedata
|
|
|
|
|
|
if imageURL:
|
|
|
|
|
|
data['image'] = imageURL
|
|
|
|
|
|
|
|
|
if debug:
|
|
|
if debug:
|
|
|
print('_' * 100)
|
|
|
print('_' * 100)
|
|
@@ -647,10 +693,27 @@ if __name__ == "__main__": |
|
|
args = getargs()
|
|
|
args = getargs()
|
|
|
|
|
|
|
|
|
# TODO consider calling args[] directly, we will then not need this line
|
|
|
# TODO consider calling args[] directly, we will then not need this line
|
|
|
dryrun = freeleech = tags = directory = debug = None
|
|
|
|
|
|
|
|
|
dryrun = freeleech = tags = directory = editiontitle = editionyear = artist = torrentdescription = releasetype = debug = audio_info = None
|
|
|
|
|
|
|
|
|
directory = args.directory
|
|
|
directory = args.directory
|
|
|
additional_tags = args.tags
|
|
|
additional_tags = args.tags
|
|
|
|
|
|
if torrentdescription:
|
|
|
|
|
|
torrentdescription = args.torrentdescription
|
|
|
|
|
|
|
|
|
|
|
|
if args.editiontitle:
|
|
|
|
|
|
editiontitle = args.editiontitle
|
|
|
|
|
|
|
|
|
|
|
|
if args.editionyear:
|
|
|
|
|
|
editionyear = args.editionyear
|
|
|
|
|
|
|
|
|
|
|
|
if args.imageURL:
|
|
|
|
|
|
imageURL = args.imageURL
|
|
|
|
|
|
|
|
|
|
|
|
if args.releasetype:
|
|
|
|
|
|
releasetype = args.releasetype
|
|
|
|
|
|
|
|
|
|
|
|
if args.artist:
|
|
|
|
|
|
artists = args.artist
|
|
|
|
|
|
|
|
|
if args.dryrun:
|
|
|
if args.dryrun:
|
|
|
dryrun = True
|
|
|
dryrun = True
|
|
|