Spotify Kodlarını İnceleyelim
TikTok’ta gezerken insanların defterlerine rastgele Spotify kodu çizdikleri ve çalıştırdıkları akımı gördüm, bu akım ilgimi çekti. Rastgele Spotify kodlarından oluşan bir çalma listesi yapmak istedim ama kodları tek tek deftere çizmek istemedim, programını yapmayı düşündüm.
Videolarda kodu çizen kişilerin ilk olarak Spotify logosunu, ardından 23 tane çubuğu çizdiklerini gördüm. İlk denememde çubukların boylarını rastgele çizdim ve bir işe yaramadığını fark ettim. Ardından internetteki kodları inceleyip çubukların boylarına dikkat ettim, gözümle 6 farklı boyda çubuk olduğunu saydım ve 6 farklı boydaki çubuklardan 23 tane çizerek bir kod oluşturmayı denedim. Oluşturduğum rastgele kod yine çalışmayınca internette bulunan birçok Spotify kodunu incelemeye karar verdim ve incelemelerime göre kodların ilk ve son çubukları hep en küçük boydaydı. Bununla bir alakası olabilir mi diye düşünürken Spotify kodlarını benim gibi merak edip araştırmış yazılara denk geldim ve öğrendiklerimi sizlerle paylaşmaya karar verdim.
Bir Spotify Kodu Nasıl Çalışır?
Örnek olarak The Weeknd, Call Out My Name şarkısının Spotify kodunu ele alalım ve inceleyelim.

Bir Spotify kodu 23 adet çubuk içerir ve her kod Spotify logosuyla başlar. Spotify Codes websitesine göre, tarayıcının okuyabilmesi için ön tarafta Spotify logosunun olması gerekir.
Kodu incelersek çubukların yüksekliklerinin farklı olduğunu görürüz.
Peki çubukların yüksekliklerini nasıl ölçeriz?
Spotify yükseklikleri ölçmek için Gray kodunu kullanır.

Gray kodu, ikili bir sayıyı temsil etmenin alternatif bir yoludur. Yukarıdaki tabloya yakından bakarsanız, Gray kodunun bir seferde yalnızca bir bit değiştirerek çalıştığını görürsünüz.
Spotify neden Gray kodunu kullanır?
Gray kodda 3 ile 4 arasındaki fark sadece 1 bittir (010 -> 110). Normal ikili gösterimde bu fark 3 bittir (100 -> 011). Analogdan (belirli bir çubuğun yüksekliği) ikili gösterime geçerken Gray kodlarını kullanmak, yanlış yüksekliği hesaplarsak “yanlış” olan bit sayısını azaltır. Bir çubuğun yüksekliğinin 3 olması gerekir, ancak bunun 3.51 olduğunu hesaplarsak ve 4'e yuvarlarsak, Gray kodundaki bu sayının ikili (binary) gösteriminde yalnızca bir bit farkı olacaktır. Bu, ileride hata düzeltme işlemini daha kolay hale getirir.
Gelin The Weeknd, Call Out My Name şarkısının spotify kodunu daha iyi inceleyelim ve çubukların yüksekliklerini Skimage yardımıyla ölçelim.

Görüntümüzün kötü olma ihtimaline karşı iyileştirmemiz gerekir. Görüntüyü yüklemek, gri tonlama yapmak ve ardından ikili kodlamaya dönüştürmek için Skimage kullanırız.
Ardından, görüntüdeki çubukları algılamamız gerekir. İlk önce görüntüyü etiketleriz ve ardından etiketli görüntü bölgelerinin özelliklerini ölçeriz.
Tüm çubukların yüksekliklerini hesaplamak için maksimum yüksekliğe ihtiyaç duyarız, bu nedenle çubukların yüksekliklerini ölçüp sıralarız.
Çubuğun yükseklikleri 0 ile 7 arasında değişebilir; bu nedenle, sekiz (octal) olası değer olabileceğini görmüş oluruz.
Dilerseniz kodu ve yorum satırlarını inceleyebilirsiniz.
import matplotlib.pyplot as plt
import matplotlib.patches as mpatchesfrom skimage import io
from skimage.filters import threshold_otsu
from skimage.measure import label, regionprops
from skimage.color import rgb2gray, label2rgb# Spotify kodunu okuruz.
image = io.imread('code.jpg')
# Görüntü renkliyse diye gri tonlama yaparız.
im = rgb2gray(image)
# Gri tonlamalı bir görüntüden ikili bir görüntü oluşturmak için kullanılır.
thresh = im > threshold_otsu(im)
# Görüntüdeki çubukları algılamak için etiketleriz.
label_image = label(thresh)
image_label_overlay = label2rgb(label_image, image=image, bg_label=0)fig, ax = plt.subplots(figsize=(10, 6))
ax.imshow(image_label_overlay)# Görüntüdeki bölgelerin özelliklerini ölçeriz.
dimensions = []
heights = []
for region in regionprops(label_image):
dimensions.append(region.bbox)#Tüm çubukların boyutunu hesaplamak için maksimum yüksekliği buluruz.
max_height = dimensions[0][2] - dimensions[0][0]
dimensions.sort(key=lambda x: x[1], reverse=False)
for region in regionprops(label_image):
# Çubukların yüksekliklerini görselleştirerek sunarız.
minr, minc, maxr, maxc = region.bbox
rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr, fill=False, edgecolor='blue', linewidth=3)
label = int(((maxr - minr) / max_height) * 8) - 1
plt.text(minc, minr, label, color='white')
ax.add_patch(rect)
dimensions.append(region.bbox)
ax.set_axis_off()
plt.tight_layout()
plt.show()# Referans: https://iiaishwarya.medium.com/
Kodu çalıştıralım.

Sonucu inceleyince, maksimum çubuk yüksekliğinin 7 olduğunu görürüz. Ayrıca Spotify logosunun çapının yüksekliği de 7'dir ve bu durum, bütün çubukların yükseklik oranlarını oluşturmayı kolaylaştırmaktadır. Baştaki ve sondaki çubukların yükseklikleri 0'dır ve ortadaki çubuğun yüksekliği 7'dir.
Kısacası bir Spotify kodu 23 çubuktan oluşur. İlk ve son çubuğun yüksekliği her zaman 0'dır ve 11. indexteki, yani ortadaki, çubuğun yüksekliği her zaman 7'dir. Buna göre çubukların sadece 20 tanesi gerçekten bilgi içerir, bu da kodlanabilecek 8²⁰ bilgi parçası olduğu anlamına gelir.
Spotify Kodu Oluşturan Program Nasıl Yapılır?
The Weekend, Call Out My Name şarkısındaki çubukların yüksekliklerini öğrenmiştik.
Çubukların yükseklikleri 0'dan 7'ye kadar değiştiğinden görselleştirebilmek için 7'sine de ihtiyaç duyarız. Logonun çapı da 7 olmalı, yani en yüksek çubuğun yüksekliğiyle aynı olmalı, bu nedenle logonun çapını baz alarak 7 farklı yüksekliği buldum:

Ardından çubukların yüksekliklerinin olduğu listeyi yani kodu görselleştirebilmek için yukarıda kırptığım resimleri kullanmaya karar verdim.
Kodu görselleştirmek için Python’ın OpenCV kütüphanesini kullandım. Görselleştirmek için Numpy, Pandas, Matplotlib de kullanılabilir.
# OpenCV kütüphanesini yükleriz.
import cv2
import randomclass SpotifyCode:
# Çubukların resimlerini okuruz. Yüksekliklerine göre adlandırdım.
zero = cv2.imread('images/0.jpeg')
one = cv2.imread('images/1.jpeg')
two = cv2.imread('images/2.jpeg')
three = cv2.imread('images/3.jpeg')
four = cv2.imread('images/4.jpeg')
five = cv2.imread('images/5.jpeg')
six = cv2.imread('images/6.jpeg')
seven = cv2.imread('images/7.jpeg')
logo = cv2.imread('images/logo.jpeg') img_list = [logo]
random_lst = list() def __init__(self, song_name):
self.song_name = song_name# Listeyi görselleştirmek için gereken metot.
def visualize_list(self, code_list):
# Kod listesini resimlere göre görselleştirmeye yarayan döngü.
for item in code_list:
num = int(item)
if num == 0:
self.img_list.append(self.zero)
elif num == 1:
self.img_list.append(self.one)
elif num == 2:
self.img_list.append(self.two)
elif num == 3:
self.img_list.append(self.three)
elif num == 4:
self.img_list.append(self.four)
elif num == 5:
self.img_list.append(self.five)
elif num == 6:
self.img_list.append(self.six)
elif num == 7:
self.img_list.append(self.seven)
# Resimleri yatay olarak birleştirmek için hconcat'ı kullandım.
code = cv2.hconcat(self.img_list)
cv2.imshow('SpotifyCode.jpg', code)
cv2.waitKey(0)song = SpotifyCode("Call Out My Name")
# Call Out My Name şarkısının kodlarını girdim.
song.visualize_list([0, 4, 2, 5, 2, 5, 7, 3, 1, 3, 6, 7, 0, 4, 2, 2, 2, 3, 1, 3, 2, 4, 0])
Kodu çalıştırdığımızda telefondan okutabilirsiniz:

Rastgele Spotify Kodu Oluşturabilir Miyiz?
Aslında bu konuyu araştırma sebebim bu soruydu. TikTok’ta gördüğüm akımda insanların defterlerine rastgele kod çizdiklerini düşünmüştüm ancak bu konuyu araştırırken böyle olmadığını öğrendim.
Rastgele bir kod dizisi oluşturmak için SpotifyCode sınıfına şu metotu yazdım:
def create_random_code(self):
# 0-7 aralığında 20 random sayı oluştururuz ve oluşturduklarımızı random_lst isimli bir listeye ekleriz.
self.random_lst = [random.randint(0, 7) for x in range(20)]
# Listenin ilk ve son çubuklarının yükseklikleri 0 olmalıdır.
self.random_lst.insert(0, 0)
self.random_lst.append(0)
# Listenin 11. indexi 7 olmalıdır.
self.random_lst.insert(11, 7)
return self.random_lst
Ardından sınıf dışında bu metotu çalıştırdım.
song = SpotifyCode("Random Spotify Song")
random_code = song.create_random_code()
song.visualize_list(random_code)

Kurala uygun kod oluşturmama rağmen oluşturduğum kod herhangi bir şarkıyı ya da bir albümü açmadı. Bunu yaptıktan sonra rastgele bir kod yapmak için gereken tek şeyin bir sayı dizisi olmadığını, başka bilgilere de ihtiyaç olduğunu fark ettim. Kısacası çizerek rastgele bir kod oluşturmanın kolayca mümkün olmadığını gördüm.
Daha detaya girelim.
Spotify’da bir şarkıyı veya bir albümü URI’si ile taratabilirsiniz. Aynı zamanda bir şarkının veya bir albümün linkini tarattığınızda da bir URI’si olduğunu görürsünüz.
Örneğin Call Out My Name şarkısının URI’si şudur:
spotify:track:2pWvO4JL7WODQHLKV0WD3M
Ayrıca Call Out My Name şarkısının bulunduğu albümün de bir URI’si vardır.
Spotify URI’leri şu şekildedir:
spotify:<medya türü>:<22 karakter>.
22 karakter, 0–9 sayıları, a-z ve A-Z karakterleridir. Bu, her karakter için 10 + 26 + 26 = 62 olasılık olduğu anlamına gelir. Bu nedenle, Spotify URI’lerinin potansiyel sayısı 62²²’dir.
Yukarıda Spotify şarkılarının kodları hakkında konuşurken kodlanabilecek 8²⁰ bilgi parçası olduğundan bahsetmiştik. Peki 63²² bit URI’yi 8²⁰ bit barkoda nasıl dönüştürürsünüz?
URI’de barkodda olduğundan katbekat daha fazla bilgi vardır.
Bir Spotify URI’si girdiğinizde, Spotify tarafından bir “medya referansı” oluşturulur. Bu medya referansı 37 bit uzunluğundadır ve bir barkodu belirli bir URI’ye bağlayan anahtardır. Bir barkoddan bir medya referansını çıkardıktan sonra hangi URI’ye karşılık geldiğini belirlemek için Spotify’ın veritabanına bakılır.
Araştırmalarımdan sonra medya referansının nasıl oluşturulduğunu anlayamadım ama bunun veritabanında kullanılan bir yöntem olduğunu fark ettim.
Kendi Spotify kodumu oluşturmayı umuyordum, ancak tam olarak yapamadım. Rastgele de olsa bir kod oluşturmak için bir gruba karşılık gelen URI, medya referansı ve Spotify kodu üçlüsünü oluşturmak gerekiyor ancak ihtimallerin fazlalığını düşünürsek kolay bir iş değil.
Basit bir akımdan yola çıkarak çok fazla şey öğrendiğim için rastgele kod oluşturmayı araştırmaya devam edeceğim.
Kaynaklar:
https://boonepeter.github.io/posts/2020-11-10-spotify-codes/
https://levelup.gitconnected.com/spotify-codes-and-how-they-work-664f4e4b8489
https://stackoverflow.com/questions/62121301/encoding-spotify-uri-to-spotify-codes/63479041#63479041