Jump to page: 1 2
Thread overview
ID3v1 bilgisi doğrulama
Feb 07, 2012
zafer
Feb 08, 2012
zafer
Feb 09, 2012
Salih Dinçer
Feb 09, 2012
Salih Dinçer
Feb 09, 2012
zafer
Feb 10, 2012
Salih Dinçer
Feb 10, 2012
zafer
Feb 12, 2012
zafer
Feb 13, 2012
zafer
Feb 13, 2012
zafer
Feb 14, 2012
Salih Dinçer
February 08, 2012

Bir süredir mp3 etiket bilgilerini okuyan bir sınıf geliştirme çabasındayım. Niyahetinde büyük kısmını Ali'nin geliştirdiği bir sınıfı hazırlayıp github deposuna aktarmayı başardım ilgilenenler bakabilirler.

Dosyada ID3v1 bilgisinin olup olmadığını sınamak için şöyle bir metot geliştirmeye çalışıyorum. Siz ne dersiniz?

import std.stdio;
import std.string;
import std.exception;
import std.conv;

void main()
{
   string dosyaYolu = "/home/zafer/DProje/Etiket/id3v1_001_basic.mp3";

   File dosya = File(dosyaYolu, "r");

   dosya.seek(-128, SEEK_END);

   byte[] buf = new byte[128];

   dosya.rawRead(buf);

   if (Kopyala(buf, 3) == "TAG")
   {
       writeln("Dosya ID3v1 bilgisi icerir.");
   }
   else
   {
       writeln("Dosyada ID3v1 bilgisi yoktur.");
   }
}

string Kopyala(byte[] buf, int adet)
{
   string deger;

   for (int i = 0; i < adet; ++i)
   {
       deger ~= cast(char)buf[i];
   }

   return deger;
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 08, 2012

Evet, onun gibi bir şey olmalı. Tabii önce dosyanın uzunluğunun en az 128 bayt olmasına bakmak gerek. Küçük bir olasılık olsa da, başka dosyalarda da tam orada "TAG" bulunabilir. Başka denetimler de gerekiyor. ID3 standardıyla ilgili bir site bulmuştuk hani...

Oradan hatırladıklarıma göre metin alanların sonlarında hep '\0' olurmuş. Ama bir tanesi dışında: galiba 'mesaj' alanının sonundaki özel bir bilgi onun bir başka ID3 sürümü olduğunu söylüyordu. O zaman bu bilgi dosyanın sonundaki 128 baytta bulunmuyordu galiba.

(Şimdi bakamıyorum; çıkmam gerekiyor. :))

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 09, 2012
string Kopyala2(byte[] buf, int adet)
{
   string deger = cast(string)buf[0..adet];

   return deger;
}

Kodu şu hale getirdim daha iyi oldu gibi.

ID3 sayfasını biliyorum. Orayı biraz daha detaylı araştırmakta fayda var. Ayrıca senin daha önce belirttiğin gibi bir arayüz (Interface) yapısı kurmak niyetindeyim. Bu arayüz üzerinden ID3v1 ve ID3v2 sınıflarını oluşturup yapıyı bu hale getirmeyi denemeyi düşünüyorum.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 09, 2012

Selamlar...

Bahsettiğiniz site şu sanırım?

http://www.multimediasoft.com/amp3dj/help/index.html?amp3dj_00003e.htm

Bu arada düzenli ifadeler (regexp) kullanmayı düşündünüz mü?

http://www.d-programming-language.org/phobos/std_regex.html

Başarılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 09, 2012

Teşekkürler...

Bu arada eksik inen MP3'lerin hataya yol açma olasılığını da değerlendirmek gerekir. Bilmiyorum bu standartların MD5 gibi bir şeyi var mı? Başlıkta böyle bir şey olsa bu sayede eksik inip inmediği hali hazırda bulundan D kütüphanesindeki algoritma kullanılabilir.

Gerçi eksik inme pek olmasa da eskilerden (dial-up zamanları) hatırladığım kadarıyla eksik inen MP3 çalmaya devam ediyor. Bir de bazı MP3'lere yerleşen virüslerin olasılığını da değerlendirsek bilmem nasıl olur bu iş...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 09, 2012

Evet, bu Kopyala2 daha güzel görünüyor. Kişisel tercih ama uzun süredin işlev baş harflerini küçük görmeye alıştığım için farklı görünüyor. ;)

Bir de, D dizgilerinin UTF kodları olduklarını unutmamak gerek. byte dizisi içinde yasal UTF-8 dizgisi olduğundan emin olunmadan cast(string) yapılmamalıdır.

Ek olarak, byte işaretli bir tür. Acaba ubyte daha mı uygun olur?

Salih, anladığım kadarıyla ID3 standartlarını belirleyen site şu:

http://www.id3.org/

Örneğin ID3v1 ve ID3v1.1 şuradalar:

http://www.id3.org/ID3v1?highlight=%28id3v1%29

ID3v1, bütün kullanılmayan baytların 0 olmalarını şart koşuyor. Ancak, eğer Comment'in sondan bir önceki baytı 0 ise ama son baytı başka bir değerse, o zaman ID3v1.1 oluyor ve o son bayt parçanın albümdeki sırasını belirliyor. Yani ID3v1.1 düzeninde Comment alanı 28'e inmiş oluyor.

Tabii bunların ikisi de eski. Artık ID3v2 kullanılıyor. (Galiba. :))

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 09, 2012

Alıntı (acehreli):

>

Bir de, D dizgilerinin UTF kodları olduklarını unutmamak gerek. byte dizisi içinde yasal UTF-8 dizgisi olduğundan emin olunmadan cast(string) yapılmamalıdır.

Kesinlikle doğru. Ancak ben Kopyala2() metodu ile sadece "TAG" değerini okumayı düşünerek ve bu değerinde standart olduğunu kabul ederek böyle kullandım ama haklısın bu kabulde geçersiz olabilir.

Burada dönüşüm için char tipini kullanmak ve olası bir ayrıcalıklı (istisnai) durum için bir hata fırlatmak daha mı doğru olur?

Alıntı:

>

Ek olarak, byte işaretli bir tür. Acaba ubyte daha mı uygun olur?

Acaba bile az olur, kesinlikle ubyte olmalı. Hatırladığım kadarıyla bayt sınırı 127 olmalı, dolayısıyla zatan şu durumda bile kod hatalı olmuş oluyor sanırım !

Alıntı:

>

Tabii bunların ikisi de eski. Artık ID3v2 kullanılıyor. (Galiba. :))

Aslında haklısın Ali artık çoğunlukla ID3v2 kullanılıyor ama winamp gibi programlarda tüm ID3 bilgilerini kullanabiliyorsun. Benimde nihai amacım bilgileri yazmak için ID3v2 formasyonunu kullanmak ama malum eski mp3 dosyalarının veya sadece ID3v1 bilgisine sahip dosyalarıda okuyabilmek adına tüm ID3 bilgilerini okuyabilecek durumda olmalıyız.

Bu arada bu ID3v2 sistemini çözmekte zor olacak sanırım :(, frame diye daha farklı bir yapıdan bahsediliyor. Artık senin başını biraz daha ağrıtacam gibi görünüyor Ali :)

Alıntı:

>

Gerçi eksik inme pek olmasa da eskilerden (dial-up zamanları) hatırladığım kadarıyla eksik inen MP3 çalmaya devam ediyor. Bir de bazı MP3'lere yerleşen virüslerin olasılığını da değerlendirsek bilmem nasıl olur bu iş...:)

Evet, o dönemlerde gerçekten mp3'lerde sorunlar olurdu. Yinede keyifli zamanlardı :) Şimdilerde bu tür sorunlar pek kalmadı sanırım olsa bile artık bir mp3 indirmek saniyeler sürüyor. Çok sıkıntı olmasa gerek ama şu ID3v2 sistemini çözmek gerçekten gözümü korkutuyor bu konuda yardımcı olursan hayır demem Salih ;-)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 10, 2012

Alıntı (Zafer Çelenk):

>

...şu ID3v2 sistemini çözmek gerçekten gözümü korkutuyor bu konuda yardımcı olursan hayır demem Salih ;-)
Tabi, elimden geleni yaparım inşaallah. Yeter ki anlayabileceğim şeyler olsun...:)

Gerçi şu sıralar zorlu bir proje üzerine çalışıyorum. Birlikte paslaşır her ikisinin de üstesinden geliriz inşaallah...

Sevgiler, saygılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 10, 2012

Alıntı (zafer):

>

Ancak ben Kopyala2() metodu ile sadece "TAG" değerini okumayı düşünerek ve bu değerinde standart olduğunu kabul ederek böyle kullandım ama haklısın bu kabulde geçersiz olabilir.

"TAG" bütünüyle ASCII olduğu için ve ASCII metinler de otomatik olarak UTF-8'e uydukları için o kabul geçerli. Belki de işlevin ismi Kopyala2 diye genel bir isim olduğu için herhangi byte dizisini string'e dönüştürmek için kullanılmasa diye düşünmüşümdür. :)

Alıntı:

>

Burada dönüşüm için char tipini kullanmak ve olası bir ayrıcalıklı (istisnai) durum için bir hata fırlatmak daha mı doğru olur?

(Ek: Bunları Zafer'in daha aşağıda yazdıklarını okumadan yazmışım.)

Evet, eğer işlev girişinin ASCII karakterlerden oluşmasını şart koşuyorsa 127 değerinden büyük değer gördüğünde hata atalibilir... diyeceğim ama... :) byte türü zaten 127'den büyük değer alamaz. O yüzden böyle bir denetim yapabilmek için giriş parametresini ubyte[] türünde almak daha doğru. Günlük konuşmadaki "bayt" sözünün karşılığı olarak ubyte daha uygun bir tür.

Alıntı:

>

Ek olarak, byte işaretli bir tür. Acaba ubyte daha mı uygun olur?

Ha ha! Yukarıdakini bunu okumadan yazdım! :)

Alıntı:

>

Acaba bile az olur, kesinlikle ubyte olmalı. Hatırladığım kadarıyla bayt sınırı 127 olmalı, dolayısıyla zatan şu durumda bile kod hatalı olmuş oluyor sanırım !

Evet! Evet! Evet! (Şu anda çok gülüyorum. :D)

Alıntı:

>

yazmak için ID3v2 formasyonunu kullanmak ama malum eski mp3 dosyalarının veya sadece ID3v1 bilgisine sahip dosyalarıda okuyabilmek adına tüm ID3 bilgilerini okuyabilecek durumda olmalıyız.

Çok mantıklı.

Alıntı:

>

Bu arada bu ID3v2 sistemini çözmekte zor olacak sanırım , frame diye daha farklı bir yapıdan bahsediliyor.

Farketmez. :) Sonuçta değişmez bir düzeni var. Bizim ID3v1Pakedi dediğimiz de basit bir frame zaten. Anlattıkları düzende adım adım okunur yazılır.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 11, 2012

Alıntı (acehreli):

>

Farketmez. :) Sonuçta değişmez bir düzeni var. Bizim ID3v1Pakedi dediğimiz de basit bir frame zaten. Anlattıkları düzende adım adım okunur yazılır.

Ali, bu sözleri duymak iyi geldi :) Bir an herşey çok basitmişte ben zorlaştırıyormusum gibi hissettim ve bu destekle çözemeyeceğimiz sorun olmadığına kanaat getirdim ;-)

Alıntı (Salih Dinçer):

>

Tabi, elimden geleni yaparım inşaallah. Yeter ki anlayabileceğim şeyler olsun...:)
Gerçi şu sıralar zorlu bir proje üzerine çalışıyorum. Birlikte paslaşır her ikisinin de üstesinden geliriz inşaallah...

Eğer yardımcı olabilirsem bende elimden geleni yapmak isterim tabi, bana yardımcı olabileceğin konu ise tabi ki frame denen yapıların hazırlanması, Ali'nin yazdıklaından da anladığıma göre bu frameler birer tapı şeklinde program içinde tamsil ediliyorlar. Şöyle bir liste var. (http://www.id3.org/id3v2.3.0#head-697d09c50ed7fa96fb66c6b0a9d93585e2652b0b)

Alıntı:

>

....
4.2.1 TALB [#TALB Album/Movie/Show title]
4.2.1 TBPM [#TBPM BPM (beats per minute)]
4.2.1 TCOM [#TCOM Composer]
4.2.1 TCON [#TCON Content type]
....

Bu yapıları oluşturma ve dosyadan okumada yardımcı olabilirsen çok sevinirim. Ben şöyle basit bir kod ile Frame ID değerini okumayı başardım ama bu aşamadan sonra Bu Id ile frameye basıl ulaşacağımı çözemedim. Tabi bu frame yapısınıda hazırlamak gerek sanırım.

module main;

import std.stdio;

struct ID3v2Frame
{
	char[4] frameId;
	char[4] size;
	char[2] flags;
}

void main()
{
   string dosyaYolu = "/home/zafer/DProje/SayiTest/Fading.mp3";

   File dosya = File(dosyaYolu, "r");

   dosya.seek(10, SEEK_SET);

   ID3v2Frame[1] kutular;
   dosya.rawRead(kutular);
   ID3v2Frame kutu = kutular[0];

   writefln("Frame ID: %s", kutu.frameId);
}

çıktısı :
Alıntı:

>

Frame ID: TALB

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

« First   ‹ Prev
1 2