Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 13 additions & 10 deletions CLAUDE.md → .claude/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
# MLC Player çalışma kuralları

Bu dosya yalnız kalıcı kuralları içerir. Güncel durum ve sıradaki iş için
`docs/CONTINUITY.md`, doğrulanmış sonuç için
`docs/VERIFICATION_LEDGER.json` dosyasını oku. Ortak agent başlangıç
sözleşmesi kökteki `AGENTS.md` dosyasıdır.
Bu dosya yalnız Claude'a özgü kalıcı kuralları içerir. Güncel durum ve
sıradaki iş için `docs/CONTINUITY.md`, doğrulanmış sonuç için
`docs/VERIFICATION_LEDGER.json` dosyasını oku. Belge haritası
`docs/README.md` içindedir. Ortak agent başlangıç sözleşmesi
`docs/process/AGENTS.md` dosyasıdır ve aşağıdaki satırla her oturumda
otomatik yüklenir; orada yazan kural burada tekrarlanmaz:

@../docs/process/AGENTS.md

Aşağıdaki kuralların üçü `.claude/settings.json` içindeki hook'larla
mekanik olarak da uygulanır: `git stash/reset/checkout/restore/clean` ile
Expand All @@ -14,14 +18,13 @@ kapatır.

## Başlangıç

1. `AGENTS.md`, `CLAUDE.md`, `docs/CONTINUITY.md` ve ilgili ledger kaydını oku.
1. `docs/process/AGENTS.md`, `.claude/CLAUDE.md`, `docs/CONTINUITY.md` ve ilgili ledger kaydını oku.
2. `git status --short --branch` çalıştır (oturum hook'u bunu zaten sunar).
3. Yalnız görevle ilgili kaynak, test ve diff bölümlerini incele. Tüm depoyu veya eski raporları baştan okuma.
4. Kaynak ile rapor çelişirse kaynak ve yeniden üretilen davranış esas alınır.

## Çalışma yöntemi

- Kullanıcıyla Türkçe ve açık konuş.
- Hata düzeltmesinde önce gerçek davranışı ölçen başarısız test yaz; sonra minimum ürün değişikliğini yap.
- Tek turda tek bağımsız sorunu çöz. İlgisiz refaktör veya görsel değişiklik yapma.
- Kirli çalışma ağacını koru; `stash`, `reset`, `checkout`, `restore`, `clean`
Expand Down Expand Up @@ -69,7 +72,7 @@ imzası olmayan release REDDEDİLİR. Bu yüzden:
Manifest `ready` değilse veya blocker listesi doluysa yayın kapısı kapalıdır.
Dinamik listeyi `packaging/fetch_sources.py`, bütünlüğü
`python packaging/prepublish.py --tag vX.Y` denetler. Kesin varlık ve komut
sözleşmesi yalnız `docs/RELEASE_PROCESS.md` içindedir.
sözleşmesi yalnız `docs/release/RELEASE_PROCESS.md` içindedir.
- Installer imzaları `packaging/sign_release.py` ve `.sig` zinciriyle
üretilir; bu uygulama imzası Windows Authenticode yerine geçmez.
- **Özel anahtar depoya GİRMEZ.** Konum: `%USERPROFILE%\.mlcplayer\release_ed25519.key`
Expand All @@ -85,7 +88,7 @@ imzası olmayan release REDDEDİLİR. Bu yüzden:
`v0.31` varken `v0.4` yayımlanamaz (`31 > 4`, istemciler göremez); büyük
adım için `v0.40`. `packaging/check_publishable.py` bunu zincirde durdurur.

- **YAYIN SÜRECİNİN TEK RESMÎ KAYNAĞI `docs/RELEASE_PROCESS.md`'DİR.**
- **YAYIN SÜRECİNİN TEK RESMÎ KAYNAĞI `docs/release/RELEASE_PROCESS.md`'DİR.**
Kesin sıra, her adımın giriş/çıkış şartı, dinamik varlık sözleşmesi ve
hata hâlinde nerede durulacağı ORADADIR; burada tekrarlanmaz.

Expand Down Expand Up @@ -171,15 +174,15 @@ Test kapsamı etki alanına göre nokta atışıdır.
- Native testler yalnız kendi başlattığı kesin PID'i `try/finally` ile temizlemeli; Notepad/Explorer veya kullanıcının Python/Qt süreçlerini hedeflememeli.
- Native crash assertion geçse bile yok sayılmaz; son marker ve gerçek exit code raporlanır.
- Görsel değişiklik yalnız offscreen testle kabul edilmez; gerçek Windows penceresi ve mümkünse gerçek video gerekir.
- **Kayıt defteri ölçümü ve düzeltmesi yalnız `python -c "import winreg..."` ile yapılır.** `Get-ItemProperty`, `Set-ItemProperty` ve `reg.exe` bu ortamda GÜVENİLİR DEĞİLDİR: ajanın PowerShell'inden yapılan yazmalar sanal katmanda kalır, gerçek hive'a ulaşmaz. Çapraz test: `reg.exe`'nin yazdığını python GÖREMEZ, python'un yazdığını `reg.exe` GÖRÜR. Bu yüzden "düzelttim" raporları üç tur boyunca yanlıştı (bkz. docs/PROJECT_STATUS.md, ölçüm aracı tuzağı).
- **Kayıt defteri ölçümü ve düzeltmesi yalnız `python -c "import winreg..."` ile yapılır.** `Get-ItemProperty`, `Set-ItemProperty` ve `reg.exe` bu ortamda GÜVENİLİR DEĞİLDİR: ajanın PowerShell'inden yapılan yazmalar sanal katmanda kalır, gerçek hive'a ulaşmaz. Çapraz test: `reg.exe`'nin yazdığını python GÖREMEZ, python'un yazdığını `reg.exe` GÖRÜR. Bu yüzden "düzelttim" raporları üç tur boyunca yanlıştı (bkz. docs/history/PROJECT_STATUS.md, ölçüm aracı tuzağı).
- Windows kabuk davranışı (ör. "Birlikte aç" adı) yalnız dosya meta verisiyle doğrulanmaz; Explorer adı çıkarımla bulup ÖNBELLEĞE alır. Kabul, kullanıcının gerçek menüsünde görülmesidir.

## Tur sonu

İlgili testlerden sonra çalıştır:

```powershell
python -m compileall -q main.py app tests
python -m compileall -q app tests
git diff --check
```

Expand Down
2 changes: 1 addition & 1 deletion .claude/hooks/compile_check.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""Duzenlenen Python dosyasini ANINDA derler.

CLAUDE.md tur sonunda `python -m compileall -q main.py app tests` istiyor.
.claude/CLAUDE.md tur sonunda `python -m compileall -q app tests` istiyor.
Tur sonu cok gec: sozdizimi hatasi o ana kadar yapilan butun koşumları
bozabiliyor. Bu hook her Edit/Write sonrasi YALNIZ degisen dosyayi derler,
bu yuzden maliyeti milisaniyedir.
Expand Down
4 changes: 2 additions & 2 deletions .claude/hooks/guard_git.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""CLAUDE.md kuralini mekanik bariyere cevirir.
""".claude/CLAUDE.md kuralini mekanik bariyere cevirir.

Kural: "Kirli calisma agacini koru; stash, reset, checkout veya kullanici
degisikliklerini geri alan komutlar kullanma."
Expand Down Expand Up @@ -58,7 +58,7 @@ def main():
reason = (
f"ENGELLENDI: `git {verb}` calisma agacindaki degisiklikleri geri "
"alabilir.\n"
"CLAUDE.md kurali: kirli calisma agacini koru; stash/reset/checkout/"
".claude/CLAUDE.md kurali: kirli calisma agacini koru; stash/reset/checkout/"
"restore kullanma.\n"
"Gercekten gerekiyorsa kullaniciya sor ve komutu KULLANICI calistirsin."
)
Expand Down
2 changes: 1 addition & 1 deletion .claude/hooks/session_start.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def next_step():

def main():
context = (
"MLC Player oturum acilisi (AGENTS.md sozlesmesi, otomatik):\n\n"
"MLC Player oturum acilisi (docs/process/AGENTS.md sozlesmesi, otomatik):\n\n"
"### git rev-parse --show-toplevel\n"
f"{git_query(['rev-parse', '--show-toplevel'])}\n\n"
"### git status --short --branch\n"
Expand Down
54 changes: 31 additions & 23 deletions README.md → .github/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
**A cinematic media player for Windows, built on libmpv.**

[![Latest release](https://img.shields.io/github/v/release/IzzmooPro/MLCPlayer)](https://github.com/IzzmooPro/MLCPlayer/releases/latest)
[![Licence: GPL v3](https://img.shields.io/badge/licence-GPLv3-blue)](LICENSE)
[![Licence: GPL v3](https://img.shields.io/badge/licence-GPLv3-blue)](../LICENSE)
[![Platform](https://img.shields.io/badge/platform-Windows%2010%2F11-informational)](https://github.com/IzzmooPro/MLCPlayer/releases/latest)

MLC Player has one interface and commits to it: a frameless window, an
Expand Down Expand Up @@ -100,9 +100,9 @@ does not match is deleted. You do not run the `.sig` file yourself.
The installer is not yet code-signed, so Windows SmartScreen will warn about
an unknown publisher on first run.

See the project's [Code signing policy](CODE_SIGNING_POLICY.md),
[Privacy policy](PRIVACY.md), [SignPath readiness record](docs/SIGNPATH_READINESS.md)
and [application record](docs/SIGNPATH_FOUNDATION_APPLICATION.md). An
See the project's [Code signing policy](../docs/policies/CODE_SIGNING_POLICY.md),
[Privacy policy](../docs/policies/PRIVACY.md) and
[SignPath application and readiness record](../docs/release/SIGNPATH.md). An
application was submitted on 23 August 2026 and was not approved by the
Foundation on 2 September 2026 because public visibility/trust signals were
not yet sufficient; the current installer remains unsigned.
Expand All @@ -114,26 +114,34 @@ release as a separate step.

### Uninstall and user data

Uninstalling either package keeps your settings and logs so an upgrade or
reinstall does not erase your preferences. Logs are stored under
`%APPDATA%\MLCPlayer\logs` and can be inspected or deleted safely from
`Tools → Log Management`. The add-on has its own uninstaller; removing it
disables website extraction without removing the main player.
By default, uninstalling either package keeps your settings and logs so an
upgrade or reinstall does not erase your preferences. The main player's
interactive uninstaller offers separate unchecked choices to remove settings,
history and saved subtitle credentials, and to remove logs, thumbnail cache
and temporary update files. Selecting both choices removes the MLC Player data
owned by the Windows account registered when the installed player was opened;
the cleanup stops and reports a failure if that account cannot be identified
exactly. Unrelated files and shared legacy cache locations are never removed.
Logs are stored under `%APPDATA%\MLCPlayer\logs`
and can be inspected or deleted safely from `Tools → Log Management`. The
main uninstaller also offers to remove the installed Internet Video add-on;
the add-on's own uninstaller can instead remove it without removing the main
player.

---

## Build and run from source

The quickest path is `Start.bat`: it locates Python 3.12-3.14, installs it only
if missing, installs the packages from `requirements.txt` only if they are
if missing, installs the packages from `requirements/runtime.txt` only if they are
absent, verifies all three runtime binaries and starts the player.
`Start.bat -CheckOnly` verifies everything without launching.

Manually:

```bash
pip install -r requirements.txt
python main.py
pip install -r requirements/runtime.txt
python app/main.py
```

Manual local media playback requires Windows, Python 3.12-3.14 and
Expand All @@ -160,7 +168,7 @@ The release chain lives in `packaging/`: `build_release.bat` drives
PyInstaller, Inno Setup, the publisher signature and the verification steps in
`verify_build.py`. It refuses to build a version that installed clients could
not see as an update, and it stops if the installer cannot be signed. The
reasoning behind the packaging decisions is in `docs/PACKAGING_PLAN.md`.
reasoning behind the packaging decisions is in `docs/release/PACKAGING_PLAN.md`.

---

Expand All @@ -169,7 +177,7 @@ reasoning behind the packaging decisions is in `docs/PACKAGING_PLAN.md`.
Issues and pull requests are welcome at
[github.com/IzzmooPro/MLCPlayer](https://github.com/IzzmooPro/MLCPlayer).
The maintainer workflow, required CI check and evidence-preserving merge policy
are documented in [`docs/CHANGE_WORKFLOW.md`](docs/CHANGE_WORKFLOW.md).
are documented in [`docs/process/CHANGE_WORKFLOW.md`](../docs/process/CHANGE_WORKFLOW.md).

Two things are worth knowing before you send a change:

Expand All @@ -179,19 +187,19 @@ Two things are worth knowing before you send a change:
interface, the playlist stays in an owned window beside the main window,
mpv and the subtitle workers are shut down cooperatively rather than
terminated, and no new always-on-top flags or timers are introduced.
`CLAUDE.md` records these invariants and the reasons behind them.
`.claude/CLAUDE.md` records these invariants and the reasons behind them.

### Developer setup

`requirements.txt` is enough to run the player. To run the tests or build a
`requirements/runtime.txt` is enough to run the player. To run the tests or build a
release you also need the tooling:

```
pip install -r requirements-lock.txt
pip install -r requirements/lock.txt
```

The lock file is the reproducible Windows test/release environment.
`requirements.txt` and `requirements-dev.txt` document the smaller direct
`requirements/runtime.txt` and `requirements/dev.txt` document the smaller direct
runtime and developer dependency sets; their versions must match the lock.

The developer set brings pytest, Pillow, PyInstaller and PySide6. PySide6 is
Expand Down Expand Up @@ -233,7 +241,7 @@ Copyright (C) 2026 MLC Player contributors.

MLC Player is licensed under the **GNU General Public License v3.0**, SPDX
identifier **`GPL-3.0-only`**. Every source file carries that identifier in a
two-line SPDX header, and the full licence text is in [`LICENSE`](LICENSE) —
two-line SPDX header, and the full licence text is in [`LICENSE`](../LICENSE) —
the canonical gnu.org text, byte for byte, which a test keeps pinned by its
SHA-256.

Expand Down Expand Up @@ -262,20 +270,20 @@ a binary it ships are not the same thing.

For MLC Player itself the corresponding source is this repository. For the
third-party binaries we redistribute, every component is recorded in
[`bin/RUNTIME_MANIFEST.txt`](bin/RUNTIME_MANIFEST.txt) with its exact version,
[`bin/RUNTIME_MANIFEST.txt`](../bin/RUNTIME_MANIFEST.txt) with its exact version,
the upstream URL it came from and its SHA-256, and
[`licenses/mpv-NOTICE.txt`](licenses/mpv-NOTICE.txt) names the upstream
[`licenses/mpv-NOTICE.txt`](../licenses/mpv-NOTICE.txt) names the upstream
repositories for mpv, FFmpeg and the build recipe. Both files ship inside the
installed package, not only here. We do not modify any of those sources.

The runtime manifest records binary provenance; a binary, installer archive,
or development archive is **not** corresponding source. The separate
[`packaging/corresponding_sources.json`](packaging/corresponding_sources.json)
[`packaging/corresponding_sources.json`](../packaging/corresponding_sources.json)
contract lists rebuildable source archives. The release gate stays closed
while that contract has any blocker. Once the exact build inventory and
source bundles are verified, `python packaging/fetch_sources.py` will fetch
only those source archives, verify their size and SHA-256, and place them in
`source_mirror/` for publication beside the installers.
`output/source_mirror/` for publication beside the installers.

The verified subset can be collected during remediation with
`python packaging/fetch_sources.py --allow-incomplete`; this does not open the
Expand Down
36 changes: 22 additions & 14 deletions README.tr.md → .github/README.tr.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ silinir. `.sig` dosyasını kendiniz çalıştırmazsınız.
Kurulum henüz kod imzalı değildir; Windows SmartScreen ilk çalıştırmada
“bilinmeyen yayıncı” uyarısı gösterebilir.

Projenin [Kod imzalama politikası](CODE_SIGNING_POLICY.md),
[Gizlilik politikası](PRIVACY.md), [SignPath hazırlık kaydı](docs/SIGNPATH_READINESS.md)
ve [başvuru kaydı](docs/SIGNPATH_FOUNDATION_APPLICATION.md) herkese açıktır.
Projenin [Kod imzalama politikası](../docs/policies/CODE_SIGNING_POLICY.md),
[Gizlilik politikası](../docs/policies/PRIVACY.md) ve
[SignPath başvuru ve hazırlık kaydı](../docs/release/SIGNPATH.md) herkese açıktır.
Başvuru 23 Ağustos 2026 tarihinde gönderildi; Foundation başvuruyu 2 Eylül
2026'da projenin henüz yeterli kamu görünürlüğü/güven sinyali olmadığı
gerekçesiyle onaylamadı. Mevcut kurulum imzasızdır.
Expand All @@ -94,16 +94,24 @@ sayfasından ayrıca indirip çalıştırın.

### Kaldırma ve kullanıcı verileri

Paketlerden birini kaldırmak ayarlarınızı ve günlüklerinizi korur; böylece
yükseltme veya yeniden kurulum tercihlerinizi silmez. Günlükler
`%APPDATA%\MLCPlayer\logs` altında tutulur ve `Araçlar → Günlük Yönetimi`
üzerinden güvenle incelenebilir veya silinebilir. Ek paketin ayrı kaldırıcısı
vardır; onu kaldırmak ana oynatıcıyı silmeden site çıkarımını kapatır.
Varsayılan olarak paketlerden birini kaldırmak ayarlarınızı ve
günlüklerinizi korur; böylece yükseltme veya yeniden kurulum tercihlerinizi
silmez. Ana oynatıcının etkileşimli kaldırıcısında, ayarları/geçmişi/kayıtlı
altyazı kimliklerini ve günlükleri/küçük resim önbelleğini/geçici
güncelleme dosyalarını silmek için ayrı, varsayılan boş seçenekler vardır.
İki veri seçeneği de işaretlenirse kurulu oynatıcı açıldığında kaydedilmiş
Windows hesabına ait MLC Player verileri silinir; bu hesap kesin olarak
belirlenemezse temizlik durur ve hata bildirilir. İlgisiz dosyalar ve
paylaşılan eski önbellek konumlarına dokunulmaz. Günlükler
`%APPDATA%\MLCPlayer\logs` altında tutulur ve
`Araçlar → Günlük Yönetimi` üzerinden güvenle incelenebilir veya silinebilir.
Ana kaldırıcı ayrıca kurulu Internet Video eklentisini de kaldırmayı sunar;
eklenti kendi kaldırıcısıyla ana oynatıcıyı silmeden de kaldırılabilir.

## Çalıştırma (kaynaktan)

En kolay yol `Start.bat` dosyasına çift tıklamaktır: Python 3.12-3.14 yoksa
kurar, eksik paketleri `requirements.txt` üzerinden yükler ve programı açar.
kurar, eksik paketleri `requirements/runtime.txt` üzerinden yükler ve programı açar.
Başlatmadan önce üç çalışma zamanı ikilisini de doğrular. Her şey hazırsa
hiçbir kurulum yapmadan doğrudan başlatır. Yalnızca kontrol için
`Start.bat -CheckOnly` kullanın; program açılmaz.
Expand All @@ -114,11 +122,11 @@ gerekir. İnternet videosu site çıkarımı ayrıca `bin/yt-dlp.exe` ve
Mevcut `Start.bat` üç ikiliyi de zorunlu tutar.

```bash
pip install -r requirements.txt
pip install -r requirements/runtime.txt
```

```bash
python main.py
python app/main.py
```

Bu çalışma zamanı ikilileri boyutları nedeniyle depoda tutulmaz; sağlamaları
Expand All @@ -139,14 +147,14 @@ pakete dahil değildir.

Release zinciri `packaging/` altındadır: `build_release.bat`,
`MLCPlayer.iss` ve ölçümlü doğrulama adımlarıyla `verify_build.py`.
Kararların gerekçesi `docs/PACKAGING_PLAN.md` içindedir.
Kararların gerekçesi `docs/release/PACKAGING_PLAN.md` içindedir.

## Lisans

Copyright (C) 2026 MLC Player katkıcıları.

MLC Player **GNU General Public License v3.0** ile lisanslanmıştır; tam metin
[`LICENSE`](LICENSE) dosyasındadır (gnu.org kanonik metni, 35 149 bayt,
[`LICENSE`](../LICENSE) dosyasındadır (gnu.org kanonik metni, 35 149 bayt,
değiştirilmeden).

Bu program özgür yazılımdır: GNU GPL sürüm 3 şartları altında
Expand All @@ -172,7 +180,7 @@ lisansı aynı şey değildir.
### Değişiklik katkısı

Bakımcı dal/PR sırası, zorunlu CI kontrolü ve kanıt commit'lerini koruyan
birleştirme yöntemi [`docs/CHANGE_WORKFLOW.md`](docs/CHANGE_WORKFLOW.md)
birleştirme yöntemi [`docs/process/CHANGE_WORKFLOW.md`](../docs/process/CHANGE_WORKFLOW.md)
dosyasındadır.

### Yayın öncesi açık maddeler
Expand Down
Loading