Обновление K-LITE Codecs Pack

Я очень люблю эту сборку кодеков, которая позволяет в неправославном виндовсе воспроизводить практически любые аудио/видео файлы. Сборка Full и толще позволяет подменить убогий проигрыватель Windows Media player. Но будьте бдительны! При обновлении K-LITE Codecs Pack некоторые зеркала пытаются впарить вместо честного файла, у которого сходятся все суммы свои крифософты, которые якобы загрузят файл. Впрочем подобные выкрутасы происходят не только с кодеками.

По ходу уже давно пора писать скрипт для автоматической проверки загруженного файла на сходимость md5/sha256. Хотя, его наверняка уже написали.

P.S. Написал скрипт для сверки md5/sha256. Работает в python3 (можно python2, тогда в первой строке надо заменить или удалить цифирку), требует tkinter и hashlib. Проверен в Windows и cygwin (вероятна работа в сборках, порождённых от RedHat). Скрипт ориентирован на ленивых пользователей (ибо tkinter - это переносимый GUI по умолчанию для python3). К сожалению макспарк неправильно поддерживает HTML тэги. Так что пришлось проявить насилие:

#!/usr/bin/python3
import tkinter as tk
from tkinter import filedialog as tkFileDialog
import hashlib

class Application(tk.Frame):
        def __init__(self, master=None):
                tk.Frame.__init__(self, master)
                self.pack()
                self.createWidgets()

# create and place controls
        def createWidgets(self):
                root.title("Checksum match")
                self.sum_frame = tk.Frame(self)
                self.sum_frame.pack(fill = 'both')
                # MD5 label
                self.md5lbl = tk.Label(self.sum_frame, text="MD5:")
                self.md5lbl.grid(row = 1, column = 1, sticky=tk.NE)
                # MD5 edit box for given sum
                self.md5txt = tk.Text(self.sum_frame, width=33, height=1)
                self.md5txt.grid(row = 1, column = 2, sticky=tk.NW)
                # MD5 computed sum
                self.md5sum = tk.Label(self.sum_frame, text="?")
                self.md5sum["font"] = self.md5txt["font"]
                self.md5sum.grid(row = 2, column = 2, sticky=tk.NW)
                # SHA256 label
                self.shalbl = tk.Label(self.sum_frame, text="SHA256:")
                self.shalbl.grid(row = 3, column = 1, sticky=tk.NE)
                # SHA256 edit box for given sum
                self.shatxt = tk.Text(self.sum_frame, width=65, height=1)
                self.shatxt.grid(row = 3, column = 2)
                # SHA256 computed sum
                self.shasum = tk.Label(self.sum_frame, text="?")
                self.shasum["font"] = self.shatxt["font"]
                self.shasum.grid(row = 4, column = 2, sticky=tk.NW)
                # file name label
                self.fillbl = tk.Label(self.sum_frame, text="File:")
                self.fillbl.grid(row = 5, column = 1, sticky=tk.NE)
                # file name edit box
                self.filtxt = tk.Text(self.sum_frame, width=55, height=1)
                self.filtxt.grid(row = 5, column = 2, sticky=tk.NW)
                # file name browse button
                self.sel_file = tk.Button(self.sum_frame)
                self.sel_file["text"] = "..."
                self.sel_file["command"] = self.open_file
                self.sel_file.grid(row = 5, column = 2, sticky=tk.NE)
                # checksum compute button
                self.test_file = tk.Button(self.sum_frame)
                self.test_file["text"] = "Check sum"
                self.test_file["command"] = self.check_sum
                self.test_file.grid(row = 6, column = 2, sticky=tk.NW)

                # main exit button
                self.QUIT = tk.Button(self.sum_frame, text="QUIT", fg="red", command=root.destroy)
                self.QUIT.grid(row = 6, column = 2)

# get text value from tkinter.Text control
        def get_text(self, text_field):
                return text_field.get('1.0', 'end').rstrip()

# set text value to tkinter.Text control
        def set_text(self, text_field, str):
                text_field.delete('1.0', 'end')
                text_field.insert('1.0', str)

# compare given and computed checksums (md5, sha256) for file
        def set_caption(self, lbl, txt, cap):
                x = self.get_text(txt)
                if x != cap and len(x)>0:
                        self.md5sum["fg"] = "red"
                else:
                        self.md5sum["fg"] = "black"
                lbl["text"] = cap
# compare given and computed checksums (md5, sha256) for file
        def check_sum(self):
                f = open(self.filtxt.get('1.0', 'end').rstrip(), "rb")
                try:
                        chunksize = 4096
                        m = hashlib.md5()
                        s = hashlib.sha256()
                        chunk = f.read(chunksize)
                        while chunk:
                                m.update(chunk)
                                s.update(chunk)
                                chunk = f.read(chunksize)
                        d = m.hexdigest()
                        self.set_caption(self.md5sum, self.md5txt, d)
                        d = s.hexdigest()
                        self.set_caption(self.shasum, self.shatxt, d)
                finally:
                        f.close()

# select file name with file dialog
        def open_file(self):
                fn = self.get_text(self.filtxt)
                ofd = tkFileDialog.Open(root, initialfile=fn, title="Open file 2 check", filetypes = [('*.* all files', '.*')])
                fn = ofd.show()
                if fn == '':
                        return
                self.set_text(self.filtxt, fn)
        def check_file_sum(file_name, sum_array):
                f = open(self.filtxt.get('1.0', 'end').rstrip(), "rb")
                try:
                        chunksize = 4096
                        m = hashlib.md5()
                        s = hashlib.sha256()
                        chunk = f.read(chunksize)
                        while chunk:
                                m.update(chunk)
                                s.update(chunk)
                                chunk = f.read(chunksize)
                        sum_array = [d.hexdigest(), s.hexdigest()]
                finally:
                        f.close()

# main (startup) section
root = tk.Tk()
app = Application(master=root)
app.mainloop()