İçeriğe geç
Batuhan YAZICI

Senior Cyber Security Specialist

Senior System and Network Admin

Batuhan YAZICI

Senior Cyber Security Specialist

Senior System and Network Admin

Finansal sistemlerde güvenlik,
altyapıda süreklilik.

  • Fortinet
  • SIEM
  • PCI DSS
  • ISO/IEC 27001
← Teknik blog
MagicMirror Projesi · Otomasyon

MagicMirror Projesi: YouTube Shorts listesi ve kesintiye dayanıklı oynatıcı

Batuhan YAZICI · · 11 dk okuma
MagicMirror Projesi: YouTube Shorts listesi ve kesintiye dayanıklı oynatıcı — Batuhan YAZICI
Batuhan YAZICI · batuhanyazici.com

YouTube liste üreticisi, sürüm bildiren modül yardımcısı ve hata durumunda ilerleyen oynatıcı için yaptığımız çalışmaları anlatan proje notu.

MagicMirror Projesi’nde dikey video alanını yalnız bir sayfaya gömülü oynatıcı olarak bırakmadık. Video listesini hazırlayan görev, bu listeyi okuyan modül yardımcısı ve tarayıcı oynatıcısını ayrı sorumluluklara böldük. Burada kişisel izleme geçmişi, tercih listesi veya gerçek video kimlikleri paylaşılmıyor. Anlatım sürümlü kaynakta bulunan uygulamaya dayanıyor; bütün videoların fiziksel ekranda tek tek izlendiği iddia edilmiyor.

Liste üretimini oynatmadan ayırdık

Liste hazırlayıcıda arama sonuçlarını toplama, tekrarları ayıklama ve video özelliklerini kontrol etme adımları bulunuyor. Her arama sonucunun gömülü oynatmaya uygun olduğunu varsaymak yerine ilgili özellikleri inceleyen bir seçim hattı ekledik. Seçilen öğelerde video kimliği ve süre gibi oynatıcı için gerekli alanlar tutuluyor. Kullanıcıya ait gerçek arama tercihleri bu teknik anlatımın parçası değil.

Üreticinin aynı anda iki kez çalışmasını önleyen kilit ve dosyayı geçici ad üzerinden değiştirerek tamamlayan atomik yazma adımı ekledik. Böylece tarayıcının yarım yazılmış JSON dosyasını okuma olasılığını azaltmayı amaçladık. Kaynakta kota veya günlük sınır hatalarında yeni aramalarla devam etmeyen ve geçici hata durumunu ayrı yöneten yollar var. Kota değerlerini sabit evrensel rakam gibi yazmak yerine güncel Google belgesinden kontrol etmek gerekiyor.

Liste üretimiyle tarayıcı oynatımı ayrı işlerdir. Eski oynatıcının gecikmiş olayı yeni videonun durumunu değiştiremez.

  1. Listeyi ayrı üret
  2. İçeriği ve sürümü doğrula
  3. Oynatıcı olaylarını izle
  4. Hatalı kaydı atla
  5. Yeni listeyi kontrollü devral
Liste üretimiyle tarayıcı oynatımı ayrı işlerdir. Eski oynatıcının gecikmiş olayı yeni videonun durumunu değiştiremez.

Modül yardımcısına sürüm ve son sağlam liste ekledik

Arka uç yardımcısı liste dosyasındaki değişimi izliyor, veriyi ayrıştırıyor ve kullanılabilir öğelerden bir sürüm özeti oluşturuyor. İçerik değişmemişse aynı listeyi gereksiz yere yeniden göndermiyor. Okuma sürerken yeni talep gelmesi için de ayrı bir bekleyen istek durumu bulunuyor. Bu, yalnız dosya tarihinin değişmesini bütün oynatıcıyı yeniden kurma talimatı saymaktan daha kontrollü bir akış sağlıyor.

Dosya boş veya geçersiz olduğunda son sağlam yükü geri gönderen bir hata yolu ekledik. Bu eski listenin her koşulda güncel veya bütün videoların hâlâ erişilebilir olduğu anlamına gelmez. Arayüz, liste sürümüyle oynatma durumunu ayrı değerlendirmeli. Resmî MagicMirror belgesindeki yardımcı modül iletişimini kullanırken birden fazla ön yüz örneğinin aynı yardımcıdan bildirim alabileceğini de hesaba katmak gerekiyor.

Oynatıcıyı olay ve tur kimliğiyle yönettik

Tarayıcı tarafında yüklenme, hazır olma, oynatma bitişi ve hata olaylarını ayrı işledik. Her yeni oynatıcı nesline bir kimlik veriliyor; eski oynatıcıdan geç gelen olayın yeni videoyu etkilemesi engelleniyor. Başlangıç bekçisi, video hiç başlamadığında sonsuza kadar aynı ekranda kalmamak için devreye giriyor. Normal bitişle zaman aşımı aynı olay gibi kaydedilmiyor.

Belirli hata kodlarında sorunlu video kimliği geçici dışlama kümesine alınıyor ve uygun başka öğeye geçiliyor. Yakın zamanda oynatılanlar için ayrı liste bulunuyor. Bunlar platform kısıtlarını aşma yöntemi değil; izin verilen oynatım başarısız olduğunda uygulamanın kontrollü davranması için eklenen adımlar. Google'ın oynatıcı boyutu, olay ve kullanım koşulları ayrıca korunmalıdır; arayüzü gizlemek için gerekli platform öğeleri kaldırılmamalıdır.

Doğrulanan kapsam ve geri dönüş

Proje işletim kaydı liste güncellemesini ve listenin sunulmasını gözlemliyor; her videonun sonuna kadar oynayıp sonraki kayda geçtiğini bütün liste için doğrulamıyor. Bu ayrım yayında korunuyor. İncelenecek kabul senaryoları geçersiz liste, silinmiş video, ağ kesintisi ve eski olayın geç gelmesidir. Bunları burada yeniden çalıştırılmış veya eksiksiz geçmiş testler olarak sunmuyoruz.

Geri dönüşte üretici, yardımcı ve tarayıcı modülünün birbiriyle uyumlu sürümleri birlikte korunmalı. Sağlam listeyi yeni üretim başarılı olmadan boşaltmayın. Deneme listesinde özel izleme geçmişi kullanmak gerekmez; paylaşılabilir sentetik öğelerle veri sözleşmesi kontrol edilebilir. Bu çalışmanın sonucu, her bağlantıda kesintisiz video sözü değil; hatanın hangi aşamada oluştuğunu ayıran ve sınırlı biçimde toparlanan bir modül yapısıdır.

Serinin bütün çalışmaları: MagicMirror Projesi.

Nasıl yapılır: ayrıntılı uygulama

Ortam ve ön koşullar: Yerel HTTP test sayfası ve YouTube IFrame Player API — Python HTTP sunucusu, API’ye ağ erişimi, embedding izni olan video ID’leri ve kullanıcının oynatma eylemi gerekir.

  1. Video listesi ile player görevini ayırın
  2. Tam test sayfasını kaydedin
  3. Sayfayı yerel HTTP üzerinden açın
  4. Hata, bitiş ve liste değişimini kabul edin
  5. Backend kota ve geri dönüşünü tamamlayın

1. Video listesi ile player görevini ayırın

Projedeki server helper API kota/önbellek ve liste üretimini, frontend IFrame Player oynatmayı yönetir. Aşağıdaki bağımsız laboratuvar örneği elle girilen video ID listesiyle çalışır; API key istemez ve özel proje modülünün dağıtımı değildir.

2. Tam test sayfasını kaydedin

Aşağıdaki HTML’yi youtube-test.html olarak kaydedin. Listede yalnız biçimi geçerli 11 karakterli kimlikler tutulur. Biçim doğrulaması video varlığı, bölge/yaş veya embedding iznini kanıtlamaz. Kullanıcı Play’e basmadan otomatik başlamaz.

<!doctype html>
<html lang="tr"><meta charset="utf-8"><title>batuhanyazici.com player testi</title>
<label>İzinli video ID listesi <input id="ids" placeholder="Virgülle ayrılmış video kimlikleri"></label>
<button id="load">Listeyi yükle</button><button id="play">Oynat</button><button id="stop">Durdur</button>
<p id="status" role="status">API bekleniyor</p><div id="player"></div>
<script>
let player, ids=[], index=0, failed=new Set();
const status=document.getElementById("status");
function next(){
  if(!ids.length || failed.size>=ids.length){status.textContent="Oynatılabilir öğe kalmadı";return;}
  for(let n=0;n<ids.length;n++){
    index=(index+1)%ids.length;
    if(!failed.has(ids[index])){player.cueVideoById(ids[index]);return;}
  }
}
window.onYouTubeIframeAPIReady=()=>{
  player=new YT.Player("player",{height:360,width:640,playerVars:{autoplay:0,origin:location.origin},events:{
    onReady:()=>status.textContent="Liste ve kullanıcı eylemi bekleniyor",
    onStateChange:e=>{if(e.data===YT.PlayerState.ENDED)next();},
    onError:()=>{if(ids[index])failed.add(ids[index]);next();}
  }});
};
document.getElementById("load").onclick=()=>{
  if(!player?.cueVideoById)return;
  ids=[...new Set(document.getElementById("ids").value.split(",").map(x=>x.trim()).filter(x=>/^[A-Za-z0-9_-]{11}$/.test(x)))].slice(0,30);
  index=0;failed.clear();player.stopVideo();
  if(ids.length)player.cueVideoById(ids[0]);
  status.textContent=ids.length+" geçerli biçimli kimlik";
};
document.getElementById("play").onclick=()=>{if(ids.length)player?.playVideo();};
document.getElementById("stop").onclick=()=>player?.stopVideo();
window.addEventListener("pagehide",()=>player?.destroy());
</script><script src="https://www.youtube.com/iframe_api"></script></html>

3. Sayfayı yerel HTTP üzerinden açın

Dosyanın bulunduğu özel test klasöründe yeni terminal açın; sunucu yalnız localhost’a bağlanır. Tarayıcıda http://localhost:8090/youtube-test.html açın ve embedding izni olan kendi video ID’lerinizi girin. İş bitince Ctrl+C ile durdurun.

python3 -m http.server 8090 --bind localhost

4. Hata, bitiş ve liste değişimini kabul edin

Boş liste, geçersiz ID, gömme reddi, video bitişi, kullanıcı durdurma ve yeni liste yüklemeyi deneyin. Örnek next öğeyi cue eder; kesintisiz autoplay varsaymaz. Projede aynı anda yenilenen server listesi current ID’yi korumalı ve eski sonucu generation ile atmalıdır.

5. Backend kota ve geri dönüşünü tamamlayın

YouTube Data API kullanılıyorsa key server helper’da tutulur; refresh/TTL, quota error ve sınırlı retry gerçek helper sözleşmesinde uygulanır. Shorts URL’si videoId yerine doğrudan verilmez. Önceki frontend/helper/list cache takımına dönün; tüm videoların çalışacağı garantisi verilmez.

Beklenen sonuç: Geçerli ve gömülmesine izin verilen video yüklenir; yaş/bölge/gömme kısıtları ayrıca değerlendirilir.

Sonuç farklıysa: Kimliğin biçimi doğru olsa da video oynatılabilir olmayabilir; API hata sonucunu işleyin.

Geri dönüş: Önceki liste/oynatıcı sürümünü birlikte geri alın; kota anahtarını ön yüze taşımayın.

MagicMirror Projesi: YouTube Shorts listesi ve kesintiye dayanıklı oynatıcı için temsili uygulama ve kabul haritası
Temsili uygulama ve kabul haritası; gerçek ürün ekran görüntüsü değildir. Haritayı büyük aç.

Kaynaklar

Uygulama örnekleri teknik, kaynak ve mahremiyet incelemesinden geçti. Temsili haritalar üretici ekran görüntüsü veya canlı sistem testi olarak sunulmaz. Kullanılan ürün sürümü ve kapsam uygulama öncesinde doğrulanmalıdır.

Batuhan YAZICI

Senior Cyber Security Specialist · Altyapı ve güvenlik üzerine teknik notlar.

Okumaya devam edin

MagicMirror Projesi — Batuhan YAZICI