MP3 Ayracı

Uygulama 1 veya 1'den fazla video dosyasını MP3'e çevirebiliyor. Videoların ses dosyasına çevrilmesinde moviepy, grafik arayüzünün oluşturulmasında PyQt5 kütüphanelerini kullandım. Çevirme işlemi yeni bir thread'de yapılıyor. Moviepy'da çevirme işlemi logger'ı proglog kütüphanesinin ProgressBarLogger sınıfı override edilerek ihtiyaca göre değiştirilebiliyor. Bunun nasıl yapıldığını bir stackoverflow konusunda gördüm, linkini ilgili başlığa ekleyeceğim. Kodun tamamını paylaşmayacağım fakat yazı bu tarz bir programın nasıl yazılabileceği hakkında fikir verecektir.

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.

ref.

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.

ref.

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()