Anten
English

Geliştiriciler

Müzik botu

Hazır müzik botu, /çal yazanın sesli odasına girer ve şarkıları sırayla çalar. Sesi, odadaki konuşmalar gibi uçtan uca şifrelidir.

Kimin için
Sunucuyu işletenler
Süre
15 dakika
Gerekenler
Docker Compose ile çalışan Anten
Sonuç
Sesli odalarda şifreli müzik

Müzik botu, /çal yazan kişinin sesli odasına girer ve istenen şarkıyı çalar; sonra gelen istekler kuyruğa girer. Botun sesi de herkesinki gibi uçtan uca şifrelidir, sunucu dahil kimse araya girip dinleyemez.

Ne yapar

  • YouTube’da arar ya da YouTube, SoundCloud, Bandcamp ve Twitch bağlantılarını çalar (canlı yayınlar dahil).
  • Kuyruğu yönetir: sıraya ekleme, atlama, geri dönme, karıştırma, tekrar, şarkı içinde ileri geri gitme.
  • Her yeni şarkıda butonlu bir şimdi çalıyor paneli gösterir.
  • İsterseniz yalnızca bir grup yönetir; diğerleri şarkı geçmek için oy verir.

Bot, anten-bot kütüphanesiyle yazılmış sıradan bir bot hesabı. antend’in yanında kendi konteynerinde çalışır ve antend’e aynı makinedeki bir iç ağdan bağlanır, yani sesi makineden çıkmadan antend’e ulaşır.

Hız

Şarkıları bulan ve getiren kısım (anten-source) sürekli açık durur. yt-dlp (videoların sesini bulan araç) bir kez yüklenir ve bağlantılarını açık tutar. Aranan şarkılar hatırlanır. Sıradaki şarkının ilk 20 saniyesi kadarı, çalan şarkı sürerken getirilir. Şarkı önce indirilmez, geldikçe çalınır; YouTube’un sesi zaten Opus biçiminde olduğu için yeniden kodlanmadan gönderilir (ses düzeyi değiştirildiğinde kodlanır).

Ölçülen süreler, komut bota ulaştıktan sonra ilk sese kadar: sıradaki şarkıya geçiş yaklaşık 50 ms; bot yeni açılmışken ilk şarkı yaklaşık 1,5 saniye. Bir odaya ilk girişte ses bağlantısının kurulması ve şifreleme anahtarlarının değiş tokuşu da buna eklenir. Bot internete sunucunun bağlantısıyla çıkar; dinleyenlerin bağlantı hızı şarkının başlamasını etkilemez.

Çalarken botun tamamı yaklaşık 110 MB bellek ve bir çekirdeğin %2’si kadar işlemci kullanır; boştayken yaklaşık 65 MB bellek ve neredeyse hiç işlemci.

Kurulum

Bu adımlar, kurulum kılavuzundaki gibi Docker Compose ile çalışan bir Anten varsayar. Komutlar sunucuda, deploy klasöründe çalıştırılır.

  1. Bot hesabını oluşturun. Sunucu ayarları → Entegrasyonlar → Botlar bölümünde “Müzik” adıyla Bot oluştur’a basın ve gösterilen anahtarı kopyalayın. Anahtar yalnızca bir kez gösterilir; bunun için Botları yönetme izni gerekir.

  2. Anahtarı deploy/.env dosyasına yazın. Anahtar yalnızca bu dosyada dursun; bir depoya ya da sohbete koymayın.

    MUSIC_BOT_TOKEN=anten_bot_...
    
  3. Aynı dosyada müzik botunu COMPOSE_FILE satırının sonuna ekleyin. Satır yoksa ya da # ile başlıyorsa bu satırı yazın. İnternete açık, HTTPS ekiyle çalışan bir sunucuda:

    COMPOSE_FILE=docker-compose.yml:docker-compose.server.yml:docker-compose.music.yml
    

    Sunucunun kendi ters vekil sunucusu (reverse proxy) varsa docker-compose.server.yml yerine docker-compose.nginx.yml yazın. Kendi bilgisayarınızda deniyorsanız COMPOSE_FILE=docker-compose.yml:docker-compose.music.yml yeterlidir.

  4. Botu başlatın ve kayıtlarını izleyin. İlk derleme birkaç dakika sürer. Kayıtlarda hata yoksa bot bağlanmıştır.

    docker compose up -d --build
    docker compose logs -f music
    
  5. Botun nerede çalabileceğini gruplarıyla belirleyin. Bot her sunucuya varsayılan gruplarla üye olur. Çalacağı odalarda Görme gücü, Katılma gücü ve Konuşma gücü odanın istediğine yetmeli; cevap yazabilmesi için Mesaj gönderme izni de olmalıdır.

  6. Gerekiyorsa botu AFK taşımasından muaf tutun. Sunucunuz uzun süre sessiz kalanları AFK odasına taşıyorsa bota AFK odasına taşınmaz iznini verin.

  7. Deneyin. Bir sesli odaya girin, sonra mesaj kutusuna /çal ve bir şarkı adı yazın.

Kullanım

Komutlar sıradan mesajlar gibi yazılır. Mesaj kutusuna / yazınca odada kullanılabilecek komutlar ve seçenekleri listelenir. Bot aynı anda tek bir sesli odada çalar: komutu yazanın bulunduğu odada.

Komutlar

Tabloda Türkçe adlar var. Bot İngilizce çalışıyorsa (MUSIC_LANG=en, bkz. Dil) son sütundaki adlar kullanılır.

Komut Ne yapar MUSIC_LANG=en
/çal <şarkı> Adı ya da bağlantısı verilen şarkıyı çalar; bir şey çalıyorsa kuyruğun sonuna ekler /play
/ara <şarkı> Arar ve sonuçları bir menüde gösterir; seçtiğiniz şarkıyı çalar /search
/sıradaki <şarkı> Şarkıyı kuyruğun en başına ekler /playnext
/geç Sıradaki şarkıya geçer /skip
/önceki Bir önceki şarkıya döner /back
/dur, /devam Duraklatır; kaldığı yerden sürdürür /pause, /resume
/sar <süre> Şarkıda bir ana gider (1:30 ya da 90) /seek
/ileri [saniye], /geri [saniye] İleri ya da geri sarar (varsayılan 10 saniye) /forward, /rewind
/başa Şarkıyı baştan çalar /replay
/tekrar <kip> şarkı ya da kuyruk tekrarlanır; kapalı tekrarı kapatır /loop (song, queue, off)
/karıştır Kuyruğu karıştırır /shuffle
/kuyruk, /şimdi, /geçmiş Kuyruğu, çalan şarkıyı, son çalınanları gösterir /queue, /now, /history
/çıkar <sıra> Kuyruktan bir şarkı çıkarır /remove
/taşı <sıra> <yeni_sıra> Bir şarkının kuyruktaki yerini değiştirir /move
/temizle Kuyruğu boşaltır /clear
/otomatik <açık/kapalı> Kuyruk bitince son şarkıya benzer şarkılar çalar (YouTube’un karışık listesinden) /autoplay (on, off)
/söz [şarkı] Çalan ya da yazılan şarkının sözlerini gösterir /lyrics
/ses <düzey> Ses düzeyini yüzde olarak ayarlar (0–200) /volume
/bitir Müziği bitirir ve odadan ayrılır /stop

Çalanı değiştiren komutları yalnızca botla aynı sesli odada olanlar kullanabilir.

Şimdi çalıyor paneli

Her yeni şarkıda bot, şarkının adını, süresini, isteyeni ve kuyruktaki şarkı sayısını gösteren bir mesaj yazar; önceki panel silinir. Paneldeki butonlar: önceki, duraklat/sürdür, sonraki, bitir, kuyruk, Tekrar, Karıştır ve Sözler. Butonlar komutlarla aynı kurallara uyar; cevapları yalnızca basan kişi görür. Bot çalan şarkıyı adının yanında Dinliyor olarak da gösterir.

Arama

/ara ilk beş sonucu kanal adı ve süreyle bir menüde gösterir. Menüden yalnızca aramayı yapan kişi seçebilir; Vazgeç aramayı kapatır. Sonuçlar 10 dakika seçilebilir kalır.

Kaynaklar

  • Bağlantı olmayan her yazı bir YouTube aramasıdır.
  • YouTube, SoundCloud, Bandcamp ve Twitch bağlantıları doğrudan çalınır. Başka sitelerin bağlantıları reddedilir.
  • Spotify ve Apple Music’te yalnızca tek şarkı bağlantıları çalışır: bot sayfadan şarkının adını ve sanatçısını okur ve YouTube’da arar. Bu siteler sesi vermez; liste ve albüm bağlantıları desteklenmez.
  • Şarkı sözleri lrclib.net’ten gelir. Bu servis anahtar istemez; oraya yalnızca şarkının adı gider.

Ayarlar

Botun ayarları deploy/.env dosyasına yazılır. Değiştirdikten sonra docker compose up -d ile botu yeniden başlatın. Bütün değişkenlerin listesi Ayar başvurusu bölümündedir.

Dil

Komutlar ve cevaplar kurulumun diline (ANTEN_LANGUAGE) uyar; o da yoksa Türkçedir. MUSIC_LANG=tr ya da MUSIC_LANG=en ile botun dilini ayrıca seçebilirsiniz.

Ne zaman ayrılır

Bot, odada dinleyen kalmayınca 2 dakika, çalacak bir şey kalmayınca 5 dakika sonra kendiliğinden ayrılır. MUSIC_ALONE_MINUTES ve MUSIC_IDLE_MINUTES bu süreleri değiştirir; 0 verirseniz bot hiç ayrılmaz.

DJ grubu

MUSIC_DJ_GROUP bir sunucu grubunun adıysa, çalanı değiştiren komutları yalnızca o gruptakiler kullanabilir. Şarkı istemek (/çal, /ara) herkese açık kalır.

  • Gruptan olmayanlar /geç yazınca oy verir. Odadakilerin yarısından fazlası isteyince şarkı geçilir.
  • Şarkıyı isteyen kişi kendi şarkısını her zaman geçebilir.
  • Odada botla yalnız olan kişi her komutu kullanabilir.

Ayarlanmazsa herkes her komutu kullanabilir.

Panel, sözler ve kayıtlar

MUSIC_PANEL=0 şimdi çalıyor panelini kapatır. MUSIC_LYRICS=0 sözleri ve /söz komutunu kaldırır. MUSIC_DEBUG=1 her komutun müziği kaç milisaniyede başlattığını kayıtlara yazar.

YouTube engellerse

YouTube, veri merkezlerindeki sunucuları çoğu zaman bot sanır ve şarkıyı vermez. Bu durumda bot sohbette bunu söyler, kayıtlarda (docker compose logs music) da Sign in to confirm you're not a bot görünür. Aynı bot bir ev bağlantısında çalışabilir; sorun koddan değil, sunucunun adresinden kaynaklanır.

Üç yol var. Sırayla deneyin, biri yetmezse sonrakini ekleyin; birlikte de çalışırlar. Bot açılırken hangilerinin kurulu olduğunu kayıtlara against the bot check: ile başlayan bir satırla yazar.

1. PO token sağlayıcısı

Hesap gerektirmez; önce bunu deneyin. YouTube’un “bot değilim” jetonunu (PO token) üreten bir yardımcı, botun yanında kendi konteynerinde çalışır. Hiçbir anahtar tutmaz ve ona yalnızca bot ulaşır. Yaklaşık 100–200 MB bellek kullanır. Çoğu sunucuda yeterlidir, ama garantisi yoktur.

  1. Yardımcıyı COMPOSE_FILE satırının sonuna ekleyin.

    COMPOSE_FILE=...:docker-compose.music.yml:docker-compose.music-pot.yml
    
  2. Botu yeniden başlatın.

    docker compose up -d --build
    

2. Çerez dosyası

En kesin yoldur: bot YouTube’a bir Google hesabıyla girmiş gibi bağlanır.

  1. Bilgisayarınızda tarayıcının gizli penceresini açın ve yedek hesapla YouTube’a girin.

  2. Aynı sekmede https://www.youtube.com/robots.txt adresini açın ve çerezleri Netscape cookies.txt biçiminde dışa aktarın. Bunu bir tarayıcı eklentisiyle yapabilirsiniz; kaynak kodu açık olan bir eklenti seçin.

  3. Gizli pencereyi hemen kapatın. Pencere açık kalırsa YouTube çerezleri yeniler ve dosyadakiler geçersiz olur.

  4. Dosyayı sunucuda deploy/youtube-cookies.txt olarak kaydedin ve yalnızca botun okuyabileceği hâle getirin.

    sudo chown 1000:1000 youtube-cookies.txt && sudo chmod 600 youtube-cookies.txt
    
  5. COMPOSE_FILE satırının sonuna :docker-compose.music-cookies.yml ekleyin ve botu yeniden başlatın.

    docker compose up -d --build
    

Dosya başka bir yerdeyse .env dosyasına MUSIC_COOKIES_FILE=/yol/dosya.txt yazın. Bot dosyayı yalnızca okur ve kendi kopyasını /tmp içinde tutar; dosyanın kendisine hiç yazmaz. Çerezler zamanla geçersiz olur: bot yine engellendiğini söylerse adımları tekrarlayın.

3. Vekil sunucu

Bot YouTube’a sunucunun adresinden değil, başka bir adresten bağlanır; örneğin bir ev bağlantısından ya da bir vekil sunucu (proxy) hizmetinden. deploy/.env dosyasına adresini yazın:

MUSIC_PROXY=http://kullanici:parola@proxy.example.org:3128

Yalnızca http:// vekil sunucular desteklenir, çünkü canlı yayınları ffmpeg kendisi çeker ve SOCKS kullanamaz. https siteler vekil sunucunun içinden yine şifreli geçer. Şarkılar, aramalar ve canlı yayınlar bu adres üzerinden gider. Odadaki sesin şifrelemesi etkilenmez: vekil sunucu yalnızca YouTube’la yapılan konuşmayı görür.

Yaş sınırlı videolar

YouTube bazı videoları yalnızca giriş yapmış yetişkin hesaplara verir; kayıtlarda Sign in to confirm your age görünür. Bu bir bot engeli değildir, o videoya özgüdür. Bir aramanın ilk sonucu böyleyse bot sonraki sonuçları dener ve aynı şarkının sınırsız bir yüklemesini çalar; değiştirilmiş sürümleri en sona bırakır. Hiçbiri olmazsa ya da doğrudan böyle bir videonun bağlantısı verildiyse bot bunu söyler. Böyle bir videoyu çalmak için çerez dosyası (2. yol) gerekir.

Gizlilik ve güvenlik

Ses ve bağlantılar

  • Botun sesi uçtan uca şifrelidir. Anahtarı yokken hiç ses göndermez; şifresiz ses botun dışına çıkmaz.
  • Bot YouTube’a ve izin verilen sitelere sunucunuzdan bağlanır; bu siteler sunucunun adresini görür. Anten’in kendisi hiçbir dış adrese bağlanmaz; bu bağlantıları müzik botunu kurarak siz seçmiş olursunuz.
  • Sözler için lrclib.net’e yalnızca şarkının adı gider. İstemiyorsanız MUSIC_LYRICS=0 yazın.

Yazılanlar nereye gider

  • Yazılan metin hiçbir zaman bir kabuğa (shell) ya da bir program seçeneğine gitmez. Ya bir YouTube araması olur ya da izin verilen bir sitenin bağlantısı. Böylece kimse botu sunucunun kendi ağındaki adreslere istek göndermeye zorlayamaz.
  • YouTube, sayfasındaki JavaScript’in çalıştırılmasını ister. Bu kod Deno’da çalışır; dosyalara, ağa ve ortam değişkenlerine erişimi yoktur. Botun anahtarlarına erişebilecek Node sürecinde hiçbir zaman çalışmaz.

anten-source neyi yapabilir

  • anten-source yalnızca botun önceden denetlediği aramaları ve bağlantıları alır; kendisine verileni çalıştırmaz.
  • Botun anahtarını (token) hiç almaz: bot onu başlatırken ortam değişkenlerinden çıkarır.
  • Sesi yalnızca makinenin içinde (127.0.0.1) ve rastgele bir gizli adresle verir; dışarıdan ulaşılamaz.
  • Çerez dosyasını ve vekil sunucu adresini o kullanır; bu yüzden çerez dosyası yalnızca botun okuyabileceği hâlde durmalıdır.

Konteyner

Konteyner salt okunurdur, hiçbir ek yetkisi yoktur (cap_drop: ALL, no-new-privileges) ve root olmayan bir kullanıcıyla çalışır. Yalnızca anahtar birimine ve /tmp klasörüne yazar. yt-dlp ve Deno’nun sürümleri sabittir.

Çalınan içeriklerin telif hakları ve sitelerin kullanım koşulları sunucuyu işletenin sorumluluğundadır.

Bakım

YouTube çalışmayı bırakırsa

YouTube zaman zaman değişir ve yt-dlp’nin güncellenmesi gerekir. bots/music/Dockerfile içindeki YTDLP sürümünü (gerekirse YTDLP_EJS sürümünü de) yt-dlp’nin en yeni sürümüne çekin ve botu yeniden derleyin:

docker compose up -d --build music

Kendi ses botunuz

Müzik botu, anten-bot kütüphanesinin ses desteğiyle yazılmıştır (bots/music/src/main.js). VoiceHelper ses yardımcısını (bots/voice) başlatır, bot.joinVoice(guild, room, helper) odaya girer ve şifreleme anahtarları tarayıcılardaki yöntemle kendiliğinden anlaşılır. helper.play(...) bir dosyayı, bir akış adresini ya da bir indiricinin çıktısını çalar. Ayrıntılar bot kılavuzunun sesli odalar bölümündedir.

Ayar başvurusu

Değişken Varsayılan Anlamı
MUSIC_BOT_TOKEN Botun anahtarı (gerekli)
MUSIC_LANG ANTEN_LANGUAGE, yoksa tr Komutların ve cevapların dili: tr ya da en
MUSIC_SITES youtube.com,youtu.be,music.youtube.com,soundcloud.com,bandcamp.com,twitch.tv Bağlantıların gösterebileceği siteler (alt alan adları dahil)
MUSIC_MAX_MINUTES 180 En uzun şarkı, dakika
MUSIC_QUEUE 100 Kuyruktaki en fazla şarkı
MUSIC_VOLUME 100 Başlangıç ses düzeyi, yüzde (0–200)
MUSIC_IDLE_MINUTES 5 Çalacak şarkı kalmayınca kaç dakika sonra ayrılır; 0: ayrılmaz
MUSIC_ALONE_MINUTES 2 Odada dinleyen kalmayınca kaç dakika sonra ayrılır; 0: ayrılmaz
MUSIC_DJ_GROUP Çalanı yalnızca bu sunucu grubu değiştirir; diğerleri oyla geçer
MUSIC_PANEL 1 0: şimdi çalıyor paneli yok
MUSIC_LYRICS 1 0: sözler ve /söz yok
MUSIC_DEBUG 1: komuttan müziğe geçen süre kayıtlarda
MUSIC_PROXY YouTube engellerse kullanılacak http:// vekil sunucu
MUSIC_COOKIES_FILE ./youtube-cookies.txt Çerez dosyasının yeri (docker-compose.music-cookies.yml ile)