MP3 Ayracı
Observer ve Event sınıflarının yazılması
Daha sonrasında ana classımız Observer sınıfından kalıtım alacak. Moviepy kütüphanesinin loggerı normalde işlem yüzdesini kendisi konsolda gösteriyor. Moviepy dokümantasyonunda herhangi Proglog loggerının kullanılabileceği belirtilmiş. İşlem yüzdesini istediğimiz yerde gösterebilmemiz için ProgressBarLogger sınıfını override edip bir observer pattern kullanılması gerekiyor. Bu override edilen sınıfta işlem yüzdesi her elde edildiğinde bir Event(observable) oluşturulacak, Observer bunu algılayacak ve bu yüzde değeri grafik arayüzünde kullanıcıya gösterilecek.
class Observer():
_observers = []
def __init__(self):
self._observers.append(self)
self._observables = {}
def observe(self, event_name, callback):
self._observables[event_name] = callback
class Event():
def __init__(self, name, data, autofire = True):
self.name = name
self.data = data
if autofire:
self.fire()
def fire(self):
for observer in Observer._observers:
if self.name in observer._observables:
observer._observables[self.name](self.data)
Dosyaların sırayla dönüştürülmesi
Seçilen 1 veya 1'den fazla dosyanın dizini QFileDialog.getOpenFileNames() fonksiyonunun döndürdüğü Tuple() içinde tutuluyor. for döngüsüyle videonun ismi dosya formatından ve dosya yolundan ayrıştırılıp o videonun mp3 dosyasının isminde kullanılıyor. Yani C:/folder/subfolder/video.mp4'ten / ve . karakterleri arasındaki kısım alınıyor. write_audiofile() fonksiyonundaki bitrate değeri ise kullanıcıya bir comboBox'tan seçtiriliyor.
def cevir(self):
for i in self.secilenDosyaTuple[0]:
clip = VideoFileClip(i)
#Alttaki 3 satır; i değişkeninde mp4 dosyasının dizininden ismini ayırıp
#ismin başına kayıt yeri dizinini ve sonuna ".mp3" ekliyor
dosyaIsmiBasIndex = i[::-1].find("/")
turKoduYok = i[-dosyaIsmiBasIndex:].split(".")[0]
dosyaYoluVeIsmi=self.kayitDiziniStr +"/"+ turKoduYok + ".mp3"
audio = clip.audio
audio.write_audiofile(dosyaYoluVeIsmi, nbytes=4, bitrate=f"{self.kbps}k" ,logger=self.log)
clip.close()
Yeni logger classı
Bu sınıfta her değer değiştiğinde Event() ile observer'ı tetikliyoruz. Bu şekilde işlem yüzdesini grafik arayüzünde kullanıcıya gösteriyoruz.
class MyBarLogger(ProgressBarLogger):
def callback(self, **changes):
for (parameter, value) in changes.items():
print ('Parameter %s is now %s' % (parameter, value))
def bars_callback(self, bar, attr, value,old_value=None):
percentage = (value / self.bars[bar]['total']) * 100
print(int(percentage))
Event("progress", int(percentage))
Uygulamanın başlatılması
def program():
program = QtWidgets.QApplication(sys.argv)
win = App()
win.observe("progress", win.setProgress) #Gözlemleyici burada ayarlanıyor
win.show()
sys.exit(program.exec_())
program()