10.08.2008

Google App Engine Üzerinden YouTube'a Nasıl Erişilir?

Bu yazıda Google App Engine kullanarak Türkiye’den erişilebilen YouTube proxy uygulaması nasıl oluşturulur, onu öğreneceğiz. Bu, ucuz reklamlar ve ‘ninja hakaretlerinin’ yer almadığı, sıfır maliyetli ve Google engellenmediği sürece varlığını sürdürecek basit bir uygulama olacak. İki tane çalışan YouTube uygulamasını şuradan (evet Türkiye’den de) görebilirsiniz:

Yazıya “Meet the Sniper” videosu eşliğinde devam ediyoruz :). App Engine YouTube uygulamanın nasıl çalıştığını merak ediyorsanız, okumaya devam edin.

Google App Engine Nedir?

Bildiğiniz gibi Google bir süre önce çok şık bir hareket yaptı, ve muhteşem altyapısının bazı parçalarını Google App Engine adıyla paketleyerek kamuoyuna sundu.

Google App Engine, Google mimarisinden faydalanarak web uygulamaları geliştirmenizi ve yayınlamanızı sağlayan bir platform. Üstelik bedava.

Bu sayede mesela kullanıcı zaten Google üyesi ise, bu kişiye ait kullanıcı adı, email gibi bilgileri kullanabiliyorsunuz, hatta Google Query Language (GQL) ile de erişebildiğiniz bir veritabanınız, imaj işlemleri yapabilmenizi sağlayan Images API‘ınız ve üstüne mail falan da yollamanızı sağlayan Mail API cabası.

Google App Engine sayesinde Google’ın hem CPU gücünden, hem depolama gücünden, etinden sütünden herşeyinden faydalanabilirsiniz. Bu henüz ilk sürüm, ileride bunu bir çeşit iş modeli haline getireceklerine kuşku yok. Hatta Users API ile uğraşırken, Google’ın internetin “kullanıcı veritabanı” olması gerektiğine bile karar verdim. Kesinlikle kullanıcı işini bu adamlar halletmeli. Bırakalım e-mailleri falan Google toplasın.

Google App Engine, arkasında Guido Von Rossum gibi bir idolün de bulunduğu, ‘internetin framework’ü olabilecek potansiyelde, Google ile birlikte nefes alan bir platform :).

Daha detaylı bilgi ve dökümantasyon için, http://code.google.com/appengine/docs/ adresine gözatın.

Hangi programlama dilleri destekleniyor

App Engine servisi şimdilik sadece Python ile kodlayabiliyorsunuz, ama Ruby, PHP gibi dilleri de implemente etmeleri an meselesi. (Bunun gibi bir Ruby on Rails servisine de heroku.com adresinden ulaşabilirsiniz.)

Görülen o ki, bir takım limitler koymuşlar. Mesela boyutu 1mb den fazla olan HTTP responselar bloklanıyor, günlük 2GB trafik limitiniz ve toplam 500MB dosya depolama izniniz var. Yine de appengine küçük ve orta ölçekli işler için uygun. Hatta büyük ölçekli işlerde de yardımcı bir backend olabilir.

App Engine YouTube uygulamsına başlamadan önce

Bu yazı zaten ‘derdinizi anlatacak kadar’ Python bildiğinizi ve bir appengine uygulaması kurmuş ve çalıştırmış olduğunuzu varsayarak yazıldı. Eğer bu konularda hiç bir fikriniz yoksa, önce Google App Engine indirin. Sonra 10 adımda nasıl appengine uygulaması çalıştırılır öğrenin ve buraya dönün. Bu işlem yaklaşık 20 dakikanızı alacak.

Python’a bir kaç saat içinde güzel bir başlangıç yapmak isterseniz, bedava dağıtılan “A Byte of Python” kitabına göz atabilirsiniz.

Başlıyoruz…

Öncelikle uygulamanıza ait dosyaları koyacağınız klasörü oluşturun, benimkinin adı “itube” olacak.

Başlangıç için bu itube klasörü altında “app.yaml” adinda bir dosya oluşturuyorum, bu dosya içerisinde uygulamam ile ilgili bir takım önemli bilgileri ve URL Handler ları tanımlıyorum.

app.yaml

application: itube
version: 1
runtime: python
api_version: 1

handlers:
- url: /assets
  static_dir: assets
- url: /.*
  script: itube.py

application kismini kendi uygulamanızın ID si ile değiştirin. /assets klasörü altındaki dosyalar statik dosyalar, geri kalan herşey itube.py dosyasının kontrolünde olacak.

Bakalım itube.py ne yapıyor.

itube.py

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import urlfetch
from urlparse import urlparse
import re

class MainPage(webapp.RequestHandler):

    def get(self):

        self.response.headers['Content-Type'] = 'text/html'

        baseurl = "http://www.youtube.com"
        requrl = urlparse(self.request.url)
        url = baseurl + requrl.path + "?" + requrl.query

        result = urlfetch.fetch(url, allow_truncated=True)

        if result.status_code == 200:
            s = result.content

            # regex işlemlerini şimdilik sadece video izleme sayfasında yapıyoruz
            if requrl.path == '/watch':

                # Video dosyasının gerçek adresini bulabilmek için uygulanan işlem
                yt_video_id = re.search("\"video_id\": \"((.*))\", \"l\"", result.content).group(1)
                yt_t = re.search("\"t\": \"((.*))\", \"hl\"", result.content).group(1)
                # Bu bilgi "assets/base.js" dosyasında, flashVars olarak atanmak üzere JS olarak da tanımlanıyor
                # swfArgs tanımlanmazsa SWF Object hata veriyor
                s = re.sub("swfArgs(.*)", "swfArgs = {};\nvar ytVideoId = '"+yt_video_id+"';\nvar ytT = '"+yt_t+"';\n", s)

                # YouTube'un kendi playerına harici FLV dosyalarını oynattıramayacağımız için,
                # YouTube playerı yerine kendi playerımızı yüklüyoruz
                s = re.sub("swfUrl(.*)", "swfUrl = 'http://itube.appspot.com/assets/player.swf';", s)

                # Aynı işlemi JS dosyası için de yapıyoruz ki, bu dosya üzerinde rahatlıkla hareket edebilelim
                # YouTube çoğu işlemi Ajax numaralar ile yapıyor, login falan yapılabilmesi için Javascript'e ince ayar çekmek gerekecek
                s = re.sub("type=\"text/javascript\" src=\"(.*)\"></","type=\"text/javascript\" src=\"http://itube.appspot.com/assets/base.js\"></", s)

            # Sonucu göster
            self.response.out.write(s)
        else:
            print 'ofmg'

application = webapp.WSGIApplication([('/', MainPage), ('/.*', MainPage)], debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

Önemli detayları kod üzerinde yorumlarla yazdım, itube.py dosyası kısaca, kendisine gelen tüm GET requestlerini aynı şekilde YouTube’a sorgulatıp sonucu dönüyor. Bu sırada eğer video izleme sayfasındaysak, gelen sonuç biraz değişiyor.

Buraya kadar yaptığımız işlem sonucunda, text/html dosyaları appengine üzerinden nasıl proksifiye edeceğimizi gördük. Eğer uygulamayı appengine üzerinde çalıştırırsanız, videoları izleyemediğinizi göreceksiniz :( Bunun sebebi YouTube’un video playerının dosyaları youtube.com üzerinden açmaya çalışması. Elimizde bu flash playerın açık kodu olmadığı için gerekli kısımları değiştiremiyoruz. O halde yeni bir player yazmak durumundayız. İşimizi görecek kadar özelliği olan bir flex video player kodunu itube kaynak kodunda assets klasörü altında bulabilirsiniz (assets/player.mxml)

Flash Video Oynatıcı nasıl çalışıyor?

Bu dosyayı incelerseniz FLV dosyalarının başka bir proxy sitesinden çekildiğini göreceksiniz. Bu aşamada böyle bir proxy sitesi desteği almak gerekiyordu. Zira appengine’ın limitlerinden bahsetmiştik. Appengine üzerinden video/flv dosyalar da indirmek mümkün, ama bu dosyaları YouTube’dan request edecek methodun çalışma süresi 10 sn olarak kısıtlanmış, eğer 10 sn içinde dosyayı alamazsa hata veriyor. 10 sn içinde alsa bile response limit 1048kb. Yani 1Mb ın üstünde videoları bu şekilde indirmek mümkün değil. Belki bir takım yöntemleri var, ama uygulamanın da en azından biraz kalıcı olmasını istediğimden video dosyalarının yükünü bir proxye aktaracağım.

Proxy nasıl dağıtık çalışıyor?

Bunun için tek bir proxy sitesini hedef almak yerine, genel olarak kullanılan bir “Proxy sitesi oluşturma sistemi” ni kurban seçmek daha akıllıca olurdu. Bu günlerde Glype adında PHP ile yazılmış sevimli bir proxy sitesi yapma uygulamasıyla tanıştım. Glype ile oluşturulmuş hakkaten çok-çok fazla proxy sitesi var mı bilemiyorum, ama bunların bir listesi var.

player.mxml dosyasında görecekleriniz bunlardan ibaret. Bu dosya aynı zamanda SWF derlenmiş olarak kaynak kod içerisinde bulunabilir (assets/player.swf)

Yeni video oynatıcımızı derledikten sonra, sıra bunu doğru değerlerle sayfaya yerleştirmeye geldi. Bunun için YouTube’un base javascript dosyasında bazı değişiklikler yapmak gerekiyor. Bu dosyayı daha iyi kontrol edebilmek için, daha önce kaydettim ve kaynak kod da “assets/base.js” altında bulunabilir. Orjinal dosya ile tek farkı 1575. satırdan başlayan writeMoviePlayer() fonksiyonu. Bu fonksiyonu, video player ile uyumlu olsun ve FLV dosyasını bulabilmek için gerekli bilgileri sağlasın diye şu şekilde değiştirdim:

function writeMoviePlayer(player_div,force){
var fo = new SWFObject(swfUrl,”movie_player”,”480″,”385″,”7″,”#000000″);
fo.addParam(‘flashvars’,'ytVideoId=’+ytVideoId+’&ytT=’+ytT);
fo.addParam(“allowfullscreen”, “true”);
player_written=fo.write(player_div);
return fo;
}

Gördüğünüz gibi bu işlemi de yaparken, YouTube’un SWFObject‘ inden faydalanmış olduk.

Uygulamayı nasıl çalıştıracaksınız?

Tüm bu aşamaları atlattıysanız, uygulamanızı appengine’e yüklediğinizde YouTube izleyebileceksiniz.

Henüz oldukça eksiği var, mesela POST requestlerine hiç yanıt vermiyor, bu yüzden Login falan olunamıyor. Ama Users API ile de login olma olasılığı var gibi. Hatta sırf YouTube’a özel bir API çıkarırlar diye düşünüyorum. Ajax fonksiyonların adam akıllı çalışabilmesi bir takım düzenlemeler yapılması gerekiyor. Bazı videolarda HTML yapısı da değişiyor, ona bakmak gerek.

Bana sadece “videoları aratayım bulayım ve izleyeyim” yettiği için, bir süre bu kadarıyla yetineceğim.

App Engine YouTube uygulaması kaynak kodu

Geliştirmek isterseniz kaynak koda http://code.google.com/p/itube-appengine/ adresinden ulaşabilirsiniz.

Eğer böyle bir işe kalkışırsanız bu başlığa bir yorum sallayarak, beni de gelişmelerden, isteklerden haberdar ederseniz sevinirim.

http://sansursensin.com/watch?v=hkb3r9filcM

İyi seyirler :)

Konuyla ilgili önceden düğümküme’de yazılanları hatırlayalım:

06.07.2008

Fotoğraf Sanatçısı Erdal Kınacı tutuklandı

Yeni nesil tutuklamalara bir yenisi de, 3 Temmuz 2008, perşembe günü eklendi.

Fotoğraf sanatçısı Dr. Erdal Kınacı -fotoğrafını çektiği kimselere belge imzalattığını ve durumun yasal olduğunu savunsa da- “Yol üstü Kerhaneleri” adlı çalışmasında, engelli kişilerden faydalanarak ‘fotoğraflarını çektiği’ ve bu fotoğraflara foto-montaj uygulayarak ‘hayat kadınlarını’ yerleştirdiği gerekçesiyle önce başkanlığını yaptığı Mersin-Anamur İlçe Sağlık Grubunda açığa alındı, ardından nöbetçi mahkemece tutuklu yargılanmak üzere cezaevine gönderildi.

Erdal Kınacı ismini ilk kez dün, bu vahim tutuklama haberi sebebiyle öğrendim. Başarılı bir doktor, ve hobi olarak başladığı fotoğraf sanatı işi bir süre sonra ona uluslararası yarışmalarda önemli ödüller de kazandırmış. Bu ödüllerin en bilineni 2006 yılında National Geographic‘in dünya çapında yaptığı ve 1 milyon fotoğrafın falan değerlendirildiği yarışmada ‘İnsan’ kategorisinde birincilik ödülü.

Portfolyosuna göz atarsanız, Türkiye’de fazla karşılaşamayacağınız türden bir sanatçı olduğunu anlayabilirsiniz. Türkiye’den bir Joel-Peter Witkin, Nobuyoshi Araki ya da Diane Arbus çıkamayacağını, bu tür *ağır* sanatçılara toplumsal olarak hazır olmadığımızı söylemek hiçbirimiz için güç değil, yine de olayın trajedisi, rezilliği altında ezilmemek de imkansız.

Yukarıda, kendisinin şu an *içeride* olmasına sebep olan fotoğraflardan bazıları var. Bundan böyle, Türkiye Cumhuriyetinde böyle fotoğraflar çekerseniz, tutuklanıyor ve cezaevine gönderiliyorsunuz.

Erdal Kınacı’nın daha önceki çalışmaları:
http://erdalkinaci.deviantart.com/

Erdal Kınacı’nın fotoritim.com’daki köşesinde, 30 Haziran 2008 günü yazdığı “Olağanaltı Hal Bölgesi” başlıklı yazı:
http://www.fotoritim.com/yazi/erdal-kinaci-bakis–olaganalti-hal-bolgesi

Bir bölümü sansürlenmiş ‘Yol üstü Kerhaneleri’ fotoğrafları:
http://www.ensonhaber.com/galeri/Yasam/1550/Yol-ustu-kerhaneleri.html?no=1