|
1 | 1 | import PySimpleGUI as sg |
2 | 2 | import requests |
| 3 | +import tarfile |
3 | 4 |
|
4 | 5 | sg.theme("Reddit") |
5 | 6 | layout = [ |
6 | 7 | [sg.Text("Seleziona la versione da installare", justification='center')], |
7 | 8 | [[sg.Radio('Windows', "VERSION", default=True)], |
8 | 9 | [sg.Radio('Linux', "VERSION", default=False)]], |
9 | 10 | [sg.Text("Seleziona la cartella di installazione: ")], |
10 | | - [sg.In(size=(25, 1), enable_events=True, key='FOLDER'), sg.FolderBrowse()], |
| 11 | + [sg.In(size=(70, 1), enable_events=True, key='FOLDER'), sg.FolderBrowse()], |
11 | 12 | [sg.Button("Installa", key="OK", size=100, disabled=True)], |
12 | | - [sg.Multiline(size=(100, 10), key='OUT_LOG')] |
| 13 | + [sg.ProgressBar(max_value=10, orientation='h', size=(100, 20), key='PROGRESS')], |
| 14 | + [sg.Multiline(size=(100, 30), key='OUT_LOG', disabled=True, autoscroll=True)] |
13 | 15 | ] |
14 | | -window = sg.Window('Gestione Piastre Installer', layout, size=(300, 300)) |
| 16 | +window = sg.Window('Gestione Piastre Installer', layout, size=(600, 600)) |
15 | 17 | folder = "" |
16 | 18 | log = "" |
17 | | -release = "https://github.com/bozzelliandrea/kitchen-management/releases/download/v0.0.1-RC1/release.tgz" |
| 19 | +release_detail = "https://api.github.com/repos/bozzelliandrea/kitchen-management/releases/tags/v0.0.1-RC1" |
| 20 | +current_size = 0 |
| 21 | +file_total_size = 0 |
| 22 | +file_chunk_size = 500000 |
18 | 23 |
|
19 | 24 |
|
20 | | -def download_file(url, fil_path): |
21 | | - local_filename = fil_path + '/' + url.split('/')[-1] |
| 25 | +def logger(message): |
| 26 | + global log |
| 27 | + if log == "": |
| 28 | + log = message |
| 29 | + else: |
| 30 | + log = log + '\n' + message |
| 31 | + window['OUT_LOG'].update(value=log) |
| 32 | + |
| 33 | + |
| 34 | +def download_file(url, file_path): |
| 35 | + logger('Starting download file....') |
| 36 | + local_filename = file_path + '/' + url.split('/')[-1] |
22 | 37 | with requests.get(url, stream=True) as r: |
23 | 38 | r.raise_for_status() |
24 | 39 | with open(local_filename, 'wb') as f: |
25 | | - for chunk in r.iter_content(chunk_size=8192): |
| 40 | + for chunk in r.iter_content(chunk_size=file_chunk_size): |
| 41 | + update_progress_bar(file_chunk_size) |
26 | 42 | f.write(chunk) |
| 43 | + logger('Download Complete') |
27 | 44 | return local_filename |
28 | 45 |
|
29 | 46 |
|
30 | | -def get_remote_size(url): |
31 | | - response = requests.head(url) |
32 | | - print('\r\n'.join('{}: {}'.format(k, v) for k, v in response.headers.items())) |
33 | | - return response.headers['content-length'] |
34 | | - |
35 | | - |
36 | | -while True: |
37 | | - event, values = window.read() |
38 | | - if event == sg.WIN_CLOSED: |
39 | | - break |
40 | | - elif event == "FOLDER": |
41 | | - folder = values['FOLDER'] |
42 | | - if folder is not None: |
43 | | - window['OK'].update(disabled=False) |
44 | | - elif event == "OK": |
45 | | - log = folder |
46 | | - window['OUT_LOG'].update(value=log) |
47 | | - size = get_remote_size(release) |
48 | | - log = log + '\n' + 'File Size: ' + size |
49 | | - window['OUT_LOG'].update(value=log) |
50 | | - log = log + '\n' + 'Starting download file....' |
51 | | - window['OUT_LOG'].update(value=log) |
52 | | - local_file = download_file(release) |
53 | | - local_file = "bla bla" |
54 | | - log = log + '\n' + 'Download Complete' + '\n' + local_file |
55 | | - window['OUT_LOG'].update(value=log) |
56 | | - |
57 | | -window.close() |
| 47 | +def get_remote_size_and_url(url): |
| 48 | + response = requests.get(url) |
| 49 | + json_object = response.json() |
| 50 | + return [json_object['assets'][0]['size'], json_object['assets'][0]['browser_download_url']] |
| 51 | + |
| 52 | + |
| 53 | +def update_progress_bar(chunk): |
| 54 | + global current_size |
| 55 | + current_size += chunk |
| 56 | + logger(f'current: {current_size}, total: {file_total_size}') |
| 57 | + window['PROGRESS'].UpdateBar(current_size, file_total_size) |
| 58 | + |
| 59 | + |
| 60 | +def extract_tar(file_path): |
| 61 | + logger('Starting file installation') |
| 62 | + release_tar = tarfile.open(file_path) |
| 63 | + release_tar.extractall('./gestione_piastre') |
| 64 | + release_tar.close() |
| 65 | + logger('Installation Completed!') |
| 66 | + |
| 67 | + |
| 68 | +if __name__ == "__main__": |
| 69 | + while True: |
| 70 | + event, values = window.read() |
| 71 | + if event == sg.WIN_CLOSED: |
| 72 | + break |
| 73 | + elif event == 'FOLDER': |
| 74 | + folder = values['FOLDER'] |
| 75 | + if folder is not None: |
| 76 | + window['OK'].update(disabled=False) |
| 77 | + elif event.startswith('UPDATE_'): |
| 78 | + logger(f'event: {event}, value: {values[event]}') |
| 79 | + key_to_update = event[len('UPDATE_'):] |
| 80 | + window[key_to_update].update(values[event]) |
| 81 | + window.refresh() |
| 82 | + continue |
| 83 | + elif event == 'OK': |
| 84 | + logger(f'Selected folder: {folder}') |
| 85 | + download_info = get_remote_size_and_url(release_detail) |
| 86 | + file_total_size = download_info[0] |
| 87 | + logger(f'File Size: {download_info[0]}' + '\n' + f'Download remote from: {download_info[1]}') |
| 88 | + local_file = download_file(download_info[1], folder) |
| 89 | + extract_tar(local_file) |
0 commit comments