Merhaba,

Yakın bir zamanda @uintptr, Spotify'da Latin alfabesi dışındaki alfabelerden harf içeren şarkı başlıklarını kopyalamak için güzel bir site paylaşmıştı: Çözüm: Spotify'da şarkı başlığı nasıl kopyalanır?

Siteye buradan da ulaşabilmeniz için bağlantısını burada da paylaşayım: Copy Spotify song name.

Siteyi proje olarak çok beğendim. NextJS ile geliştirilmiş, yeterince küçük ve pratik bir proje. Bunun üstüne ben de sitenin bir klonunu geliştirmeye karar verdim ve şu an paylaşmaya hazır olmam mutlu ediyor. :)

Hazırladığım klon siteye buradan ulaşabilirsiniz: Spotify Viewer.

Klonunun aslına göre öne çıkan özelliklerinden biri Türkçe bağlantılar için de çalışabiliyor olması yani bağlantıda /intl-tr/ segmenti varsa bile çalışıyor. Diğer diller için de çalışıyor olmalı. Sanırım asıl sitede bunun kontrolünü bağlantının https://open.spotify.com/track/ ile başlayıp başlamadığına bakarak sağlamışlar, denemelerim sonucunda bulunduğum bir tahmin. Ben bağlantıya istek atma sonrası herhangi bir hata olursa ona göre bir şeyler yapıyorum, bağlantı formatına karışmıyorum.

Kullandığım teknolojiler​

  1. Öncelikle, T3 Stack'i kullandım. Dil olarak TypeScript kullandım.
    1. NextJS (App Router): React'i temel alan, projenin ana frameworkü bu.
    2. tRPC: API sistemini pratik bir şekilde kurabiliyorsunuz.
    3. Tailwind CSS: Kapsamlı bir CSS kütüphanesi.
    4. Zod: Validation kütüphanesi. Neredeyse hiç kullanmadım aslında.
  2. React Spring: Animasyon kütüphanesi. Temel düzeyde, geçişlerde şeffaflığı ayarlamada kullandım.
  3. Cheerio: NodeJS için bir HTML parser/scraper kütüphanesi. Spotify şarkı bağlantısına GET isteği attıktan sonra cevap olarak şarkı sayfasının HTML dokümanı bir string hâlinde geliyor, sonrasını Cheerio hallediyor.
  4. React Icons: 2-3 adet ikon kullandım bu kütüphaneden: yüklenme, kopyalama ve tik ikonları.

Nasıl çalışıyor bu site?​

Bir şarkı bağlantısını ele alalım, örneğin tam şu an dinlediğiminki: https://open.spotify.com/intl-tr/track/7yzFUknHiad4kRBfHq2ki1. Bu bağlantıya bir GET isteği attığınızda yukarıda da söylediğim gibi cevap olarak size sayfanın HTML dokümanı geliyor. İşin harika tarafı, ihtiyaç duyduğumuz tüm bilgilerin <head> kısmında, <meta> etiketleriyle sağlanıyor olması. Bu durum, scraping yani HTML dokümanından anlamlı veri çekme aşamasını acayip kolaylaştırdı. Bunu, bağlantıya tarayıcınızdan girip sayfanın kaynağını inceleyerek de görebilirsiniz. Sayfada sağ tıklayınca tarayıcı menüsü açılmadığı için bunu örneğin Chrome'da Ctrl + U ile yapabilirsiniz:

1707255148202.webp

Tam bir kaos, değil mi? İşte, bir şekilde inceleme yapmak gerekiyor. Ben yaptım ve dediğim gibi ihtiyaç duyulan tüm bilgilerin <meta>'larda tutuluyor olduğunu gözlemledim:
  • <meta name="music:duration" content="287"/>: Şarkının saniye cinsinden süresi. Bunu sitede kullanmıyor olduğumu fark ettim. API'ım aslında front-ende gönderiyor ama kullanmıyorum. Neyse, sonra bir şekilde kullanırım belki, çok önemli bir bilgi değil.
  • <meta name="music:album" content="https://open.spotify.com/album/0ApKaazNHf0gzjAYZauexq"/>: Albüm bağlantısı. Albüme yönlendirmek için kullanıyorum.
  • <meta name="music:album:track" content="6"/>: Şarkının albümdeki sırası. Kullanmadığım bir bilgi.
  • <meta name="music:release_date" content="2014-10-15"/>: Şarkının yayın tarihi.
  • al: ve twitter: ön ekli bilgiler de var fakat hiç kullanma ihtiyacı duymadım.
  • <meta name="music:musician" content="https://open.spotify.com/artist/05fG473iIaoy82BF1aGhL8"/>: Sanatçı bağlantısı. Kaç sanatçı varsa aynı name'e sahip o kadar <meta> oluyor. Bu şarkıda tek sanatçı olduğu için bir tane var.
  • <meta name="music:musician_description" content="Slipknot"/>: Sanatçı ismi. Birden fazla sanatçı varsa bile tek etikette, virgüllerle ayrılmış hâlde oluyor.
  • <meta property="og:title" content="Skeptic"/>: Şarkı ismi. Site, tam olarak bunu kopyalayabilmemizi sağlıyor.
  • <meta property="og:description" content="Slipknot · Song · 2014"/>: Şarkı açıklaması. Öylesine, güzel bir bilgi olarak kullandım.
  • <meta property="og:url" content="https://open.spotify.com/track/7yzFUknHiad4kRBfHq2ki1"/>: Şarkı bağlantısı.
  • Arada bir sürü og:restrictions:country:allowed'lular var. Bir sonraki için bunları geçmek gerekiyor.
  • <meta property="og:image" content="https://i.scdn.co/image/ab67616d0000b273eed722040c6810f7a7da93ea"/>: Şarkı kapak resminin bağlantısı.
Bunları parse edebilmek için Cheerio yardımıyla önce <head> kısmını aldım ve ardından ilgili name/property bilgisine sahip <meta>'ları aldım ve bunların content bilgilerini çektim, bu kadar. Bu işleri sunucuda yapıyor ve istemciye JSON formatında yolluyorum.



Site, Sosyal'de paylaşılmış olan harika bir şarkı için aşağıdaki şekilde görünüyor:

1707256500610.webp

Anlatımı olabildiğince kısa tutmaya çalıştım, yalnızca bazı kritik noktaları nasıl hallettiğimin üzerinde durdum. Aklınıza takılan herhangi bir yer olursa lütfen sormaktan asla çekinmeyin, tavsiyede bulunmak isterseniz tabii ki buyurun. :)

Bu arada projenin GitHub reposunu da paylaşayım: GitHub - spotifyviewer/spotify-viewer

Umarım beğenebileceğiniz bir içerik olmuştur. Okuduğunuz için teşekkürler ve...

İyi Sosyal'ler!
1707256767944.webp

 
Son düzenleyen: Moderatör:
Vanilla JS ile, hatta tek bir HTML dosyasında da yapılabilecek bam-basit bir proje. Tabii tecrübenizi ilerletmek için bu şekilde de geliştirebilirsiniz. Elinize sağlık.

Ayrıca, direkt fetch yerine niye Cheerio tercih ettiniz? Overhead'i oldukça yüksek bir proje olmuş, aşırı basit ve küçük bir projeye göre. Kullanılabilitesi tartışılır.
 
Nedense Spotify sitesine girip şarkı adını seçerken elim ayağım titriyor, yapamıyorum. Artık senin sayende şarkı isimlerini kopyalayabileceğim. Çok gerekli bir çalışma olmuş.
 
GitHub bağlantısız proje, tuzsuz çorbaya benzer.

Ellerinize sağlık.

Bunu düşüneceğim ve gerekeni yapmaya çalışacağım, oldukça haklı bir eleştiri. Teşekkür ederim.

Tuzsuz çorbanın da hiç tadı olmaz cidden.

Vanilla JS ile, hatta tek bir HTML dosyasında da yapılabilecek bam-basit bir proje. Tabii tecrübenizi ilerletmek için bu şekilde de geliştirebilirsiniz. Elinize sağlık.

Ayrıca, direkt fetch yerine niye Cheerio tercih ettiniz? Overhead'i oldukça yüksek bir proje olmuş, aşırı basit ve küçük bir projeye göre. Kullanılabilitesi tartışılır.

Teşekkür ederim. Aslında bazı noktalarda hak veriyorum çünkü teknolojilerin tam potansiyelini kullanmayan bir proje oldu ama avantaj olarak özelliklerin artırılabilmesinin kolaylığını öne sürebilirim. Atıyorum, bir şarkı aratıldığında şarkının URL'ini sitenin URL'ine yansıtabilirim. Bir başka durum olarak mesela şu an tRPC'nin avantajlarını tam kullanmıyorum çünkü tam olarak bir adet API endpoint var, o da şarkının bilgilerini çekmek için olan. Verdiğim örnekler hâlâ daha kolay bir yoldan halledilebilir belki ama umarım yeterli bahaneler olmuştur. :)

Fetch yerine Cheerio tercih etmedim, Spotify sayfasının HTML dokümanını fetch ile çekiyor ve sonrasında Cheerio'nun rahatlığından faydalanıyorum, kendim string işlemlerini elle halletmektense. Aslında çok hoş bir eleştiride bulundunuz, sağ olun. Düşününce sadece fetch aracılığıyla elde edilen string ile bir şeyler yapılabilir. Cheerio için tek bahanem, kullanışlılığı. Projeyi ne kadar ağırlaştırdığına hiç takmadım ama bu takmam gerekmediği anlamına gelmiyor.

Bunların yanı sıra işleri tek bir HTML dosyasında yapmaya kalksaydım oldukça çirkin ve anlaşılmaz bir kod yazardım diye düşünüyorum. Biraz düşündüm de ortaya iyi bir iş çıkaramazdım sanki. Aynı işi çıkarabilir miydim, o bile soru işareti. Arka planda rahatlık sağlayan ve alışık olduğum çok şey var aslında.

Nedense Spotify sitesine girip şarkı adını seçerken elim ayağım titriyor, yapamıyorum. Artık senin sayende şarkı isimlerini kopyalayabileceğim. Çok gerekli bir çalışma olmuş.

Tabii daha uygun bir üslup tercih edebilirdiniz fakat eleştirinize kısmen hak veriyorum. Eğlenceli bir üslup hatta, valla biraz da doğru. :D Uygulamadan kopyalanmıyor ya sanırım, o noktada işe yarıyor site. Ne var ki Spotify web sayfasından kopyalanabiliyormuş, sizin mesajınızdan sonra denedim. 😂 Hani bir avantajı şu ki siteden "tek tıkla" kopyalanabiliyor.

Bu projeyi yalnızca sağladığı işlev açısından düşünmeyin, uyguladığı yöntemler ve kullandığı teknolojiler bakımından da biraz olsun ufak bir örnek proje oldu. Şimdi diyeceksiniz ki: "Kodu nerede?"
Eh, çok haklısınız. Bunun için bir şey düşüneceğim, kusura bakmayın.

Hocam kaynak kodu veya repo linki verir misiniz?

Dediğim gibi buna bir çare bulacağım, haklısınız. Kişisel hesabımı paylaşmak istemedim, olay o aslında. Ayrı bir hesap açmak makul bir seçenek.
 
Fetch yerine Cheerio tercih etmedim, Spotify sayfasının HTML dokümanını fetch ile çekiyor ve sonrasında Cheerio'nun rahatlığından faydalanıyorum, kendim string işlemlerini elle halletmektense. Aslında çok hoş bir eleştiride bulundunuz, sağ olun. Düşününce sadece fetch aracılığıyla elde edilen string ile bir şeyler yapılabilir. Cheerio için tek bahanem, kullanışlılığı. Projeyi ne kadar ağırlaştırdığına hiç takmadım ama bu takmam gerekmediği anlamına gelmiyor.

Bunların yanı sıra işleri tek bir HTML dosyasında yapmaya kalksaydım oldukça çirkin ve anlaşılmaz bir kod yazardım diye düşünüyorum. Biraz düşündüm de ortaya iyi bir iş çıkaramazdım sanki. Aynı işi çıkarabilir miydim, o bile soru işareti. Arka planda rahatlık sağlayan ve alışık olduğum çok şey var aslında.
Sen de sağ ol :) Programlama maceranda yolun açık, uzun ve keyifli olur umarım. Ben oldum, ben iyiyim dersek bir yere varamayız. Bunu zaten fark etmiş görünüyorsun.

Tek HTML dosyası kısmında da ben olsaydım şöyle yapardım, Ayrı HTML, CSS ve JS dosyalarında çalışır sonra bir seferlik bir kopyala yapıştır işlemleriyle bunları birleştirirdim.

NextJS ve genel olarak MERN stack'in rahatlığı ve şahaneliği konusunda kesinlikle katılıyorum. Express ve NextJS de benim main stackim. Bu da benim şu anki projem bakmak istersen :) Supeer
 
Kaynak kodunun bulunduğu GitHub reposu: GitHub - spotifyviewer/spotify-viewer.

Bir ara ana yazıya da ekletirim, şimdilik hemen ulaşabilin diye buradan paylaştım. :)

Bu konudaki eleştiri ve istekler için teşekkür ederim. İleride reposuz paylaşım yapmayı düşünmeyeceğim büyük ihtimalle.



Programlama maceranda yolun açık, uzun ve keyifli olur umarım. Ben oldum, ben iyiyim dersek bir yere varamayız. Bunu zaten fark etmiş görünüyorsun.

Aynılarını sizin için de dilerim. 🙏 Çok haklısınız.

Tek HTML dosyası kısmında da ben olsaydım şöyle yapardım: Ayrı HTML, CSS ve JS dosyalarında çalışır sonra bir seferlik bir kopyala yapıştır işlemleriyle bunları birleştirirdim.

Ya şöyle diyeyim: Belki ön yargıdır benimkisi ama bu şekilde "düz" geliştirmeye kalksam hem proje kodumun çirkin olacağını düşünürdüm hem de dediğim gibi aynı projeyi çıkarabileceğimden şüphelenirdim. Kütüphane kullanımı büyük rahatlık oldu o açıdan, özellikle React altyapısı.

NextJS ve genel olarak MERN stack'in rahatlığı ve şahaneliği konusunda kesinlikle katılıyorum. Express ve NextJS de benim main stackim. Bu da benim şu anki projem bakmak istersen :) Supeer

Tabii kullanılan stack bu projede biraz farklı ama zaten stack kullanımının rahatlığı üzerinde durmuşsunuz, aynen öyle. Özellikle el alışınca mis gibi oluyor.

Projeniz için ellerinize ve emeğinize sağlık, geliştirme sürecinde bol eğlence ve kolaylık dilerim. 🌸

Express konusunda yorum yapmak istedim: tRPC'ye bir göz atmanızı tavsiye ederim. Kendisiyle tanıştığımdan beri elim Express'e gitmiyor.