Python + Mencoder betiği ile altyazılı filmleri cep telefonuza uygun çevirin

Dün akşam bash kabuğundan halletiğim bazı mencoder işlemleri için küçük bir Python betiği yazdım. Bu betik belirlediğim bir divx filmin içine altyazıyı gömerek bunu MPEG-4(.mp4) formatına çeviriyor. Daha önce mencoder ile bir iki şey yazmıştım hatırlarsanız fakat onların bazı eksiklikler vardı.

  • Birinci yazımda komut için telefona codec yüklenmeli ve divx player veya smartmovie gibi programlar ile izlenmesi gerekiyordu
  • İkinci yazımda artık herhangi bir codec yüklemenizde gerek yoktu, fakat hala divx player yüklememiz gerekiyordu.

Peki nasıl telefonumuza hiç bir ek uygulama yüklemeden dahili oynatıcımızdan oynatabileceğiz ? N95′in desteklediği video formatları arasında şunlar var:

3GPP formats (H.263)
H.264/AVC
MPEG-4
RealVideo 7,8,9/10

Bizim yapmamız gereken bu formatlardan birini kullanmak. Biraz daha araştırınca web’de bu konu hakkında iki tane belge buldum. Ben de birine göre daha önce yazdığım betiklerden de faydalanarak aşağıdaki betiği yazdım. Ayrıca şöyle bir şey var, N95 ve diğer N-serisi telefonların bazı multimedya tuşları olabiliyor. Bu tuşlar da sadece içindeki dahili Realplayer oynatıcı ile çalışıyordu. Artık oluşturduğumuz bu video’lar bu tuşlarla da uyumlu olacak.

Yazdığım betik şu şekilde, neler yaptığını sonrasında anlattım:

Okumaya devam edin »

Python ile dosya karşılaştırması yapmak

Pınar ile Jabber’den konuşurken Pardus için küçük bir iş olduğunu söylemişti. Kendisine eğer ufak tefek şeyler olursa yapmaya çalışırım demiştim zamanında. Kendisi de Fatih Aşıcı’nın küçük bir işini bana söylemişti. Fatih ile de konuştuk sonra bu işi. Gerçi sonra farklı bir yol izledik, ama ben yine de öğrendiğim ve yazdığım bu betiği paylaşayım. Bu gibi yazılar çokça görebilirsiniz şimdiden diyeyim :) Gelelim işin nasıl bir şey olduğuna.

Şimdi elimizde iki tane liste var. Bu listelerde her ekran markasının hangi frekanslarda çalışması gerektiği yazar. Bir tanesi Fedora’ya ait, diğeri de Pardus’un kendi listesi. Fedora’da yaklaşık 5200 tane Pardus’ta ise yaklaşık 4400 tane girdi var. Şimdi sorun şu, Fedora’da olup ama Pardus’ta olmayan belki yüzlerce model var. Fedora’da her model için Pardus’ta olup olmadığına bakıp eklememiz lazım. Hal öyle olunca binlerce satır’a teker teker bakmak zor oluyor. Ben de bunu bir Python betiği ile halletim. İlk önce betiğinin kendisini vereyim ve ardından betik hakkında bilgileri veririm:

Okumaya devam edin »

Qt hakkında yeni bir Python kitabı siparişi

Rapid Gui Programming with Python and QtKredi Kartı kullanmadığım için genellikle yurt dışı alışverişleri mümkün olmuyor. Bildiğiniz gibi Paypal hesabınız varsa bile ona para aktarmak için yine kredi kartı ihtiyacı doğuyor. Geriye de iki seçenek kalıyor: Ya Garanti bankasının uyguladığı sanal kart gibi bir kart ile alışveriş yapmak(ki bende kapattım garanti hesabımı) ya da bir arkadaşınız vasıtasıyla almak. Ben de öyle oldu nitekim, Irc’de Serkan abi sağ olsun alabileceğini söyledi ve bu akşam da alımı gerçekleştirdi. Ona da buradan teşekkür ederim.

Hatırlarsanız bundan yaklaşık 1 sene öne Learning Python kitabını sipariş vermiştim. Zamanımı iyi kullanabilseydim belki farklı olabilirdi, her neyse Learning Python kitabı bitti gibi bir şey. Kitap güzeldi ve bir çok şeyi öğretti, tabi yine buna rağmen bol bol alıştırma yapmak lazım yoksa bir dili iyi bir şekilde öğrenmek mümkün değil. Başka şeyleri yazarken de zaten bol bol açıp bakıyorum. Kitabın üçüncü sürümü de çıktı hatta, almak isteyenlere tavsiye edebilirim.

Artık yavaş yavaş Gui programlama hakkında bilgi edinirken Qt ilgimi çekmeye başladı. Bu yüzden Google’da belgeler aramaya başladım, başlangıç için güzel belgeler edindim. Fakat bir kitap aşığı olarak bir kitap alıp onunla çalışsam çok daha iyi olur diye düşündüm. Biraz araştırmadan sonra “Rapid GUI Programming with Python and Qt” kitabına karar verdim. Başlangıç için herkes tarafından tavsiye edilen, ve Qt4 gibi yeni kütüphaneler hakkında bilgiler içeren bir kitaptı. Tahminen 1 ay sonra kitap ellime ulaşır, çünkü diğer kitap da 1 ay sonra gelmişti.

Python ile klasör isimlerini topluca değiştirin

2-3 haftadır Python çalışıyorum tekrardan ve bu sefer bir çok şey öğrendim. Öğrendiğim yeni bilgileri sizlerle paylaşayım dedim. Uzun zamandır aklımı meşgul eden bir konu vardı onu Python sayesinde halletim bu sayede. Şimdi kısaca bilgisayarımda fotoğraflarla dolu 20-30 tane klasör var, bunları da hep şu şekilde yazmıştım:

Almanya_ekim_2007
Bolum_temmuz_2006
Bilmemne_hede_höde_2008

Fakat sonraları baktım ki bu biçim bana uygun değil,sondaki yıl ibarelerini en başa getirirsem çok daha uygun olacağını anladım, yani şu şekilde bir şey:

2007_almanya_ekim
2006_bolum_temmuz
2008_bilmemne_hede_höde

Haliyle bir sürü klasör olunca hepsini elle teker teker yapmak yerine bir tane küçük Python betiği yazayım ve kendisi hepsini değiştirsin dedim. İlk önce yazdığım betik aşağıdaki gibi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/python
# -*- coding: utf-8 -*-

import os, re

def renamer():
    for filename in os.listdir(os.curdir):    
        if re.search('(\w)_(\d)', filename):
            m = re.compile('([a-z_]*)_([0-9]*)', re.IGNORECASE)
            names  = m.search(filename)
            newfilename = names.group(2) + '_' + names.group(1).lower()
            print newfilename
            #os.rename(filename, newfilename)

if __name__ == '__main__':
    renamer()

Betiği klasörleri değiştirmek istediğimiz klasörün içinde çalıştırmamız lazım. Kısaca yaptığı adımlar şunlar(satır numaralarına göre):

  • Satır 7: Klasörün içindeki klasörlerin bir listesini çıkartıyor, ve teker teker isimleri alıyor
  • Satır 8: Eğer klasörlerin sonunda sayılar varsa devam et, yoksa hiç bir şey yapma
  • Satır 9: Klasör isimlerini için bir tane regex ifadesi yazıyoruz.
  • Satır 10:Ardından bu regex ifadesi için bizim klasör’ler aranıyor ve ona göre bulunuyor
  • Satır 11:Bulunduktan sonra names.group() şeklinde bunlara ulaşabiliyoruz, bunlarla da istediğimiz şekildeki yeni dosyamızı oluşturuyoruz, ben 2008 + _ + dosya_deneme şeklinde yaptım, sizler farklı yapabilirsiniz tabi.
  • Satır 12:İstediğimi ifadeler doğru çıkıyor mu, çıktısına bakalım
  • Satır 13:Eğer doğru ise bu satırın önünde # ifadesini kaldıralım.

Öğrendiklerim bazı noktalar var, örneğin regex ifadelerini kesinlikle çok iyi bilmek lazım. Örneğin 9′uncu satırdaki ifade’yi irc’de acemi’den aldım. Ondan önce re.split ile bir yöntem denemiştim fakat tam istediğim gibi olmadı. O yüzden bu gibi işlemler için regex ile aranız ne kadar iyi olursa sizin için daha iyi olacaktır. Örneğin 8′inci satırdaki if durumunu kitaptan bakarak yaptım ve istediğim şekilde çalıştı. \w tüm alfabetik harfler demek, \d ise tüm sayılar demek. Yani eğer harfler_sayılar şeklinde bir dosya ismi var ise filename içinde o zaman devam edecek, yoksa betik hiç bir şey yapmayacak. Ayrıca büyük harfleri küçük harflere dönüştürmek için sadece .lower() ifadesini ekledim, aynı şekilde yeni bir isim oluşturmak tıpkı lego taşları ile oynamak kadar kolay. Gerçekten sevilesi bir dil Python.

Betiği düzgün bir şekilde çalıştıdıktan sonra, sonuçlar da şu şekilde olacaktır:

Python Betik

Ayrıca bu betik yazdığım ilk Python betiği özelliğini taşıyor. O yüzden ki bir sürü hata ya da gereksiz kod parçası olma olasılığı çoktur. Onun dışında Python ile cidden kısa zamanda güzel işler yapabilirsiniz, zaten kullandıkça yeni şeyler öğrenmemek elde değil. Bakalım zaman ne gösterecek inşallah zamanla çok daha farklı şeyler öğrenmiş oluruz.

Python’da X += Y ve X = X + Y arasındaki fark

Bir nesneyi başka bir nesneye eklemek için genellikle şu ifade kullanılır

1
X = X + Y

Burada X’deki değeri alıp Y ile beraber yine X’e kayıt ediyor. Bu yöntem çokca kullanıldığı için C,Python gibi dillerde şu ifade de kullanılabiliyor

1
X += Y

Bu yukarıdaki ifade ile aynı. Velakin Python’da örneğin listeler ile uğraşırken bunu kullanmak yerine list komutunun kendi içinde barındırdığı özellikleri kullanabiliriz, örneğin .append veya .extend gibi. L = [1,2] ifadesi için şu örneği ele alalım

1
L = L + [3]

Burada 3 sayısını L listesine ekliyebiliyoruz. Aynı işlemi şu şekilde de yapmamız mümkün

1
L.append(3)

Gördüğünüz gibi ikiside aynı işlemi yapıyor. Fakat yukarıdaki örnekte, yani + kullandığımı örnek diğerine göre çok daha yavaş. Çünkü ekleme yapılırken yeni bir nesne oluşturuluyor, soldaki L listesine kopyalanıyor, bu da sağ tarafdaki L listesine kopyalanıyor. Halbuki L.append yaparken var olan L listesine 3 sayısı ekleniyor.

Şimdi Python’da şöyle bir özellik var. Kitabı okurken gördüm. Eğer siz L listesine 3 sayısını şu şekilde

1
L += [3]

eklerseniz, aynı L.append() şeklinde ekliyor. Yani bizim için daha avantajlı oluyor(daha hızlı olduğu için). Bu demek ki, Python’da eklemeler yapılırken kesinlikle +=(-=,*=,..) gibi ifadeler(Ingilizce’de: augmented assignment) kullanmamız bizim için daha iyi olacaktır.

Not:(Python öğrenirken bana göre ilginç ve işe yarayan ipuçları sizlerle bu şekilde paylaşmayı düşünüyorum)

Vim içinden Python kodu çalıştırmak

Kitabı yavaş yavaş okumaya başladım. Örnekleri daha önce C kodlarını yazdığım Vim ile başladım, fakat C’deki gibi F9′a basınca derlemiyor(yorumlamıyor). Vim içinde Python için bir çok destek mevcut, bunları okumak için

1
:help python

yazmanız yeterlidir. Burada bir çok örnek verilmiş de zaten(çok ayrıntılı şeyler mevcut ileriki zamanlarda tekrar gözden geçirmem gerekecek). Ben bunların bir çoğunu denedim ama hiç biri istediğim gibi olmadı. :pyfile komutu var fakat bu da sadece çıktının son satırını gösteriyor. :!terminal -e ‘python %’ denedim fakat bu da terminalı açtıktan sonra hemen kapatıyordu.

Arch forumlarını biraz gezindim ve en sonunda birinin kullandığı komutu gördüm, çok basit fakat istediğim gibiydi. Vim içerisinden Python’u çalıştırıyor, ve kullandığım dosyayı yorumluyor. Komut ise şu :

1
:!python %

Burada % bizim dosyamız olur. Ben bunu daha da kolaylaştırmak için, .vimrc‘ye şu ibareyi ekledim

1
map <F8> :!python % <enter>

Evet hepsi bu kadar, artık F8 basınca anında vim içinde dosyam yorumlanıyor. Hata varsa düzeltiyorum yoksa yazmaya devam ediyorum. Vim ile daha çok şey öğreneceğiz gibi.

Ekleme: myavuzselim enter tuşuna çare buldu, onu da yukarıda ekledim teşekkürler

Sonraki Sayfa »