diff --git a/.gitignore b/.gitignore index e69de29..eab3ded 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,6 @@ +out/** +.api_token* +.vscode +Pipfile.lock +**/__pycache__/** +**.pyc \ No newline at end of file diff --git a/twitchify-slack.py b/twitchify-slack.py index af31314..16e50e0 100644 --- a/twitchify-slack.py +++ b/twitchify-slack.py @@ -1,55 +1,122 @@ #!/usr/bin/python3 -import json -import requests -import slack from os import mkdir, environ from os.path import exists +import requests +import slack +import json -emote_api_link = 'https://api.twitchemotes.com/api/v4/channels/0' -emote_file_tmpl = 'https://static-cdn.jtvnw.net/emoticons/v1/' +# Twitch emote api link for emote metadata +twitch_emote_api_link = 'https://api.twitchemotes.com/api/v4/channels/0' +# Twitch emote link for emote images +twitch_emote_file_tmpl = 'https://static-cdn.jtvnw.net/emoticons/v1/' + +# BTTV emote api link for emote metadata +bttv_emote_api_link = 'https://api.betterttv.net/2/emotes' +# BTTV emote link for emote images +bttv_emote_file_tmpl = 'https://cdn.betterttv.net/emote/' def grab_id(n): + """Map function to extract the id and code from each dictionary entry + + Arguments: + n {int} -- Current dictionary object + + Returns: + arr -- Array containing the id and code + """ return [f'{n["id"]}', f'{n["code"]}'] -def request_twitch_emote_ids(): - headers = { - 'accept': 'application/vnd.twitchtv.v5+json', - 'Client-ID': 'x9pe1nhx03034xssm1kcla36unubrc' - } - req = requests.get(emote_api_link, headers=headers) - req_dict = json.loads(req.content) - req.close() +def request_twitch_emote_ids(service): + """Send the request for a json of the Twitch emote metadata + + Arguments: + service {str} -- String containing either "Twitch" or "BTTV" to determine which code to use + + Returns: + list -- List iterable of the ids and codes for the emotes returned by the request json + """ + + req_dict = {} + + if(service.lower() == 'twitch'): + headers = { + 'accept': 'application/vnd.twitchtv.v5+json', + 'Client-ID': 'x9pe1nhx03034xssm1kcla36unubrc' + } + req = requests.get(twitch_emote_api_link, headers=headers) + req_dict = json.loads(req.content) + req.close() + elif(service.lower() == 'bttv'): + req = requests.get(bttv_emote_api_link) + req_dict = json.loads(req.content) + req.close() + return list(map(grab_id, req_dict['emotes'])) def save_twitch_emotes_metadata(dirpath, emote_array): - metadata_file = open(f'{dirpath}/emote_metadata.txt') + """Save the emote_array metadata to a text file to refer to later + + Arguments: + dirpath {str} -- String containing the directory path for output + emote_array {list} -- List iterable of the ids and code for the emotes returned by the original request json + """ + + if(not exists(f'{dirpath}/emote_metadata.txt')): + metadata_file = open(f'{dirpath}/emote_metadata.txt', 'w+') + else: + metadata_file = open(f'{dirpath}/emote_metadata.txt', 'a') + for x in emote_array: metadata_file.write(f'id:{x[0]}\tcode:{x[1]}\n') metadata_file.close() -def save_twitch_emotes_images(dirpath, emote_array): +def save_twitch_emotes_images(service, dirpath, emote_array): + """Send a request for the emote images and save them locally to a specified directory + + Arguments: + service {str} -- String contianing either "Twitch" or "BTTV" to determine which code to use + dirpath {str} -- String containing the directory path for output + emote_array {list} -- List iterable of the ids and codes for the emotes returned by the original request json + """ + if(not exists(dirpath)): mkdir(dirpath) - for emote_index in emote_array: - headers = { - 'accept': 'application/vnd.twitchtv.v5+json', - 'Client-ID': 'x9pe1nhx03034xssm1kcla36unubrc' - } - req = requests.get(f'{emote_file_tmpl}{emote_index[0]}/1.0', headers=headers) - emote_file = open(f'{dirpath}/{emote_index[0]}.png', 'bw+') - emote_file.write(req.content) - emote_file.close() + if(service.lower() == 'twitch'): + for emote_index in emote_array: + if(not exists(f'{dirpath}/{emote_index[0]}.png')): + headers = { + 'accept': 'application/vnd.twitchtv.v5+json', + 'Client-ID': 'x9pe1nhx03034xssm1kcla36unubrc' + } + req = requests.get( + f'{twitch_emote_file_tmpl}{emote_index[0]}/1.0', headers=headers) + emote_file = open(f'{dirpath}/{emote_index[0]}.png', 'bw+') + emote_file.write(req.content) + emote_file.close() + elif(service.lower() == 'bttv'): + for emote_index in emote_array: + if(not exists(f'{dirpath}/{emote_index[0]}.png')): + req = requests.get( + f'{bttv_emote_file_tmpl}{emote_index[0]}/1x') + emote_file = open(f'{dirpath}/{emote_index[0]}.png', 'bw+') + emote_file.write(req.content) + emote_file.close() def main(): - print("Hello, world!") - emotes_array = request_twitch_emote_ids() - save_twitch_emotes_images('out', emotes_array) + # Grab the Twitch official emotes + emotes_array = request_twitch_emote_ids('twitch') + save_twitch_emotes_images('twitch', 'out', emotes_array) + save_twitch_emotes_metadata('out', emotes_array) + + # Grab the BTTV emotes + emotes_array = request_twitch_emote_ids('bttv') + save_twitch_emotes_images('bttv', 'out', emotes_array) save_twitch_emotes_metadata('out', emotes_array)