Eski bir NAS cihazın var, ARM işlemcisi var, Docker konteynerlerin çalışıyor — her şey harika. Ta ki bir gün bir uygulamayı güncellemek isteyene kadar.
Ben de böyle bir durumla karşılaştım. QNAP TS-431P2 modelim var; içinde ARM Cortex-A15 işlemcisi çalışıyor. Bu işlemci armv7l (ARM 32-bit) mimarisinde, yani modern Docker image'larının büyük çoğunluğu bu cihazda çalışmıyor. Ama neyse ki bazı geliştiriciler hâlâ ARM32v7 için özel build yayınlıyor.
Otomatik medya sistemimi şöyle kurmuştum: Plex izleme listesine bir film ekliyorum → Radarr otomatik buluyor ve torrent başlatıyor → qBittorrent indiriyor → Bazarr Türkçe altyazı çekiyor. Tam bir otomasyon. Yalnız Bazarr'ın kullandığım konteyner imajı ARM32v7 için v1.2.2-beta.6 sürümünde kalmış, yeni imaj yayınlanmıyor.
Problem: Konteyner güncellenemiyor, Bazarr eskide kalıyor
Kullandığım imaj: lscr.io/linuxserver/bazarr:arm32v7-development-v1.2.2-beta.6-ls500
Bu imaj için yeni bir sürüm yok. Bazarr'ın sitesine girince v1.5.6'nın çıktığını görüyorsunuz ama ARM32v7 için resmi bir Docker imajı yok. Çoğu insan burada pes eder ve eski sürümle devam eder.
Ben etmedim.
Çözüm: Konteyner içinde in-place upgrade
Konteyner imajı güncellenemiyorsa, Bazarr'ın kendi kodunu konteyner içinde güncelleyebiliriz. Mantık şu: Bazarr aslında bir Python uygulaması. GitHub'dan son sürümü indirip mevcut dosyaların üzerine yazarsak, konteyner aynı kalır ama Bazarr yeni sürümle çalışır.
Bunu daha önce yapmıştım ve çalışıyordu. Ancak konteyneri yeniden oluşturduğumda (recreate) her şey sıfırlandı ve tüm süreci baştan yapmak zorunda kaldım. Bu sefer hem nasıl yaptığımı hem de karşılaştığım beklenmedik hataları kayıt altına alıyorum.
Adım 1: Bazarr v1.5.6'yı indir ve yükle
Container Station üzerinden konteynerin bash konsoluna bağlanıyorum ve şu komutları çalıştırıyorum:
cd /tmp
wget -q https://github.com/morpheus65535/bazarr/releases/download/v1.5.6/bazarr.zip -O bazarr.zip
unzip -q bazarr.zip -d /tmp/bazarr_new
cp -r /tmp/bazarr_new/* /app/bazarr/bin/
Dikkat: libs/ klasörü zip dosyasının içinde gelmiyor, bu yüzden kopyalama sırasında mevcut libs/ klasörü bozulmuyor. Bu önemli bir detay çünkü ARM32v7'ye özel kütüphaneler burada.
Adım 2: Kütüphane uyumsuzlukları — asıl iş burada başlıyor
Yeni kodu yükledikten sonra Bazarr'ı test etmek için şunu çalıştırıyorum:
cd /app/bazarr/bin
python3 bazarr/main.py --no-update --config /config 2>&1 | head -30
Ve hata yağmuru başlıyor. ARM32v7 imajındaki libs/ klasörü eski subliminal kütüphanelerini içeriyor; yeni Bazarr kodu ise custom_libs/ klasöründeki yeni versiyonları bekliyor. Python önce libs/'e baktığı için eski kod yükleniyor ve çakışmalar çıkıyor.
Her hata için terminal çıktısını okuyup, ilgili dosyayı ya custom_libs/'ten kopyalayarak ya da pip ile ilgili paketi yükleyerek çözüyorum. Yedi farklı fix uyguladım, aşağıda hepsini açıklıyorum.
Fix 1 — language_equals hatası
SZProviderPool.__init__() got an unexpected keyword argument 'language_equals'
Eski core.py yeni parametreyi tanımıyor. Çözüm: custom_libs'teki yeni versiyonu kullan.
cp /app/bazarr/bin/custom_libs/subliminal_patch/core.py \
/app/bazarr/bin/libs/subliminal_patch/core.py
Fix 2 — tmdb_id AttributeError
AttributeError: 'Movie' object has no attribute 'tmdb_id'
Eski database.py'de Movie nesnesinin tmdb_id özelliğine doğrudan erişiliyor. Yeni Bazarr versiyonunda bu özellik her zaman mevcut değil. Güvenli erişime geçiyoruz:
sed -i 's/if data\.tmdbId and not video\.tmdb_id:/if data.tmdbId and not getattr(video, "tmdb_id", None):/' \
/app/bazarr/bin/bazarr/subtitles/refiners/database.py
Fix 3 — include_ai_translated TypeError
OpenSubtitlesComProvider.__init__() got an unexpected keyword argument 'include_ai_translated'
OpenSubtitles.com entegrasyonu için kullanılan dosya çok eski. custom_libs'ten yenisini alıyoruz:
cp /app/bazarr/bin/custom_libs/subliminal_patch/providers/opensubtitlescom.py \
/app/bazarr/bin/libs/subliminal_patch/providers/opensubtitlescom.py
Fix 4 — Eksik exception sınıfları
ImportError: cannot import name 'ForbiddenError' from 'subliminal_patch.exceptions'
ImportError: cannot import name 'ContentNotUsable' from 'pysubs2.exceptions'
İki farklı dosyada eksik sınıflar var. subliminal_patch/exceptions.py için custom_libs'ten kopyalıyorum, pysubs2/exceptions.py için ise eksik sınıfı elle ekliyorum:
cp /app/bazarr/bin/custom_libs/subliminal_patch/exceptions.py \
/app/bazarr/bin/libs/subliminal_patch/exceptions.py
grep -q "ContentNotUsable" /app/bazarr/bin/libs/pysubs2/exceptions.py || \
echo -e "\nclass ContentNotUsable(Pysubs2Error): pass" >> /app/bazarr/bin/libs/pysubs2/exceptions.py
Fix 5 — more_itertools yok
ModuleNotFoundError: No module named 'more_itertools'
ARM32v7 imajında bu paket hiç kurulmamış. inflect kütüphanesi bunu gerektiriyor. Doğrudan Bazarr'ın libs/ klasörüne kuruyorum ki sistem geneli etkilenmesin:
pip3 install more_itertools --target /app/bazarr/bin/libs/ -q
Fix 6 — typeguard versiyon çakışması
Bu fix beni en çok uğraştırdı. Hata şuydu:
ImportError: cannot import name 'NoExtraItems' from 'typing_extensions'
pip install typeguard yazınca pip otomatik olarak en yeni sürümü (4.x) kuruyor. Ancak typeguard 4.x, typing_extensions kütüphanesinden NoExtraItems adlı bir sınıf istiyor — bu sınıf ARM32v7'deki eski typing_extensions sürümünde yok.
Çözüm basit ama bulması zor: typeguard'ın eski bir sürümünü (2.13.3) kullanmak. Bu sürüm NoExtraItems'a ihtiyaç duymuyor ve inflect kütüphanesiyle sorunsuz çalışıyor.
# Önce yanlış kurulan 4.x sürümünü temizle
rm -rf /app/bazarr/bin/libs/typeguard /app/bazarr/bin/libs/typeguard-*.dist-info
# Doğru sürümü kur
pip3 install "typeguard==2.13.3" --target /app/bazarr/bin/libs/ -q
Fix 7 — typing_extensions güncelleme
Bazı durumlarda typing_extensions'ın kendisi de çok eski kalabiliyor. Güvenli tarafta kalmak için bunu da güncelliyorum:
pip3 install "typing_extensions>=4.5.0" --target /app/bazarr/bin/libs/ -q
Tüm fix'leri tek script'te
Konteyner yeniden oluşturulduğunda bu adımları tekrar yapmak gerekiyor (çünkü /app/bazarr/ kalıcı değil, sadece /config volume'u kalıcı). Bunun için hepsini tek bir script'te topladım:
cd /app/bazarr/bin
# 1. Bazarr v1.5.6 indir
cd /tmp
wget -q https://github.com/morpheus65535/bazarr/releases/download/v1.5.6/bazarr.zip -O bazarr.zip
unzip -q bazarr.zip -d /tmp/bazarr_new
cp -r /tmp/bazarr_new/* /app/bazarr/bin/
cd /app/bazarr/bin
# 2. Fix'leri uygula
cp custom_libs/subliminal_patch/core.py libs/subliminal_patch/core.py
sed -i 's/if data\.tmdbId and not video\.tmdb_id:/if data.tmdbId and not getattr(video, "tmdb_id", None):/' bazarr/subtitles/refiners/database.py
cp custom_libs/subliminal_patch/providers/opensubtitlescom.py libs/subliminal_patch/providers/opensubtitlescom.py
cp custom_libs/subliminal_patch/exceptions.py libs/subliminal_patch/exceptions.py
grep -q "ContentNotUsable" libs/pysubs2/exceptions.py || echo -e "\nclass ContentNotUsable(Pysubs2Error): pass" >> libs/pysubs2/exceptions.py
pip3 install more_itertools --target libs/ -q
rm -rf libs/typeguard libs/typeguard-*.dist-info
pip3 install "typeguard==2.13.3" --target libs/ -q
# 3. Yeniden başlat
find /app/bazarr/bin -name "*.pyc" -delete
kill -9 $(pgrep -f "bazarr.py")
echo "Bazarr yeniden başlatıldı — 2-3 dakika bekle"
Sonuç
Script tamamlanıp Bazarr yeniden başladıktan sonra http://NAS_IP:6767/system/status adresine giriyorum:
- Bazarr Version: 1.5.6 ✅
- System → Providers → opensubtitlescom: Good ✅
- Settings → Languages → Turkish aktif ✅
- Radarr bağlantısı aktif ✅
Artık Plex izleme listesine eklediğim filmler otomatik olarak inip Türkçe altyazısıyla geliyor. Eski bir NAS cihazı için fena değil.
Neden bu kadar zordu?
Asıl zorluk, fix'lerin birbirini gizlemesiydi. Her python3 bazarr/main.py çalıştırdığımda yalnızca ilk hata görünüyor, arkasındaki gizli kalıyor. Yedi hatayı birer birer aşmak gerekti.
Bir de pip install typeguard gibi masum görünen komutların en yeni (uyumsuz) sürümü kurması beklenmedik bir tuzaktı. ARM32v7 gibi eski mimariler için "en yeni" her zaman "en doğru" değil.
Umarım bu yazı aynı durumda olan birine zaman kazandırır.
Hiç yorum yok:
Yorum Gönder