News:

SMF - Just Installed!

Main Menu

Recent posts

#1
Duyurular ve Sürümler / 1.1.49
Last post by hitsumo - Oct 05, 2026, 12:38 PM
# Anime Tracker 1.1.49

**Yayın tarihi:** 2026-09-24

Tek iş: **içe aktarma kara listesinin yedeği.** Kara liste sayfasına
"Dışa aktar" ve "İçe aktar" düğmeleri geldi; liste artık ayrı bir dosya
olarak yedeklenip geri yüklenebiliyor. Şema değişikliği yok (boş
migration); merkez katalogda yapılacak bir şey yok. Yalnız çok
kullanıcılı (online) modu ilgilendirir.

## 1. Neden

İçe aktarma kara listesi (1.1.35) katalogdan silinen animelerin
kimliklerini tutar; MAL ve AniList içe aktarımı bu animeleri yeniden
katalog önerisi olarak açmaz. Ama liste **yalnızca uygulamanın
veritabanında** duruyordu:

- merkez kataloğa gönderilmez (tasarım gereği),
- Liste Ayarları'ndaki JSON yedeğine girmez,
- kara liste sayfasında da dışa / içe aktarma yoktu.

Sonuç: JSON yedeğinden temiz bir kuruluma dönüldüğünde liste boş
başlıyor ve ilk içe aktarım bilerek silinmiş animeleri yeniden
öneriyordu — 1.1.35'in kapattığı sorunun ta kendisi. Listeyi yalnızca
veritabanı yedeği kurtarıyordu.

## 2. Kara liste sayfasında "Yedek" kutusu

Yönetim panosu → **İçe Aktarma Kara Listesi** (moderatör ve üstü),
sayfanın altında:

- **Dışa aktar** — listenin tamamını `import_blacklist_YYYY-AA-GG.json`
  olarak indirir. Her kayıt: MAL ve AniDB kimliği, ad, kayıt türü
  (Silindi / Elle), not ve **orijinal tarih** (liste aynı zamanda silme
  defteri; "bunu ne zaman sildim" bilgisi korunur). Ekleyen kullanıcı
  taşınmaz — kullanıcı numarası kuruluma özeldir; geri yüklenen
  kayıtlarda ekleyen, yükleyen moderatör olur.
- **İçe aktar** — yalnızca **ekler**. Listede zaten olan kayıtlar
  atlanır, hiçbir şey silinmez ya da değişmez; aynı dosyayı iki kez
  yüklemek zararsızdır. Sonuç satırı "N kayıt eklendi, M kayıt zaten
  listedeydi" der; okunamayan satır varsa sayısını ayrıca söyler.
  Kayıtlar tek seferde yazılır: bir hata çıkarsa hiçbiri yazılmaz,
  yarım kalmış bir liste oluşmaz.

**Yanlış dosyaya karşı koruma:** yedek dosyası kendi türünü söyleyen
bir işaret taşır. Liste JSON yedeği (Liste Ayarları) ya da başka bir
dosya bu sayfaya yüklenirse reddedilir — bir üyenin anime listesini
kazara kara listeye çevirmek mümkün değildir.

**Tekrarları nasıl ayırt eder:** kimliği olan kayıtlar MAL / AniDB
kimliğiyle eşleşir. Dosyadaki bir kayıt, listedeki bir kayıtla
kimliklerinden yalnızca **birini** paylaşıyorsa "zaten listede" sayılır;
listedeki kayıt o kimliği engellemeye devam eder. Kimliği olmayan silme
kayıtları (hiçbir şeyi engellemezler, yalnız defterdir) ad + tarihle
eşleşir, böylece yeniden yükleme defteri ikiye katlamaz.

## 3. Neden liste JSON yedeğinin içinde değil

İki yol düşünüldü; ayrı dosya seçildi:

- Liste JSON yedeği **düz bir anime dizisidir**. Kara listeyi içine
  koymak dosyanın biçimini değiştirmek demekti ve 1.1.48 ve önceki
  sürümler yeni yedekleri "geçersiz biçim" diye reddederdi.
- Liste yedeği bir **üyenin kişisel dosyasıdır**; kara liste ise katalog
  politikasıdır ve yalnızca moderatörleri ilgilendirir. Üyelerin
  yedeğine girmemesi, üyelerin yüklemesiyle de değişmemesi gerekir.

## 4. Yardım

İçe aktarma yardımındaki kara liste bölümü güncellendi: eski "JSON
yedeğe girmez, yalnızca veritabanı yedeğinde yaşar" cümlesinin yerine
yedeğin nasıl alınıp yükleneceği ve **temiz kuruluma dönerken bu
dosyanın ilk içe aktarımdan önce yüklenmesi** gerektiği yazıldı.

## Dosyalar

**Yeni:**

```
files/migration/1.1.49/upgrade.sql        boş (sürüm damgası)
```

**Değişen:**

```
files/functions/blacklist_helpers.php     blacklist_export_rows(), blacklist_import_rows(), BLACKLIST_BACKUP_FORMAT
files/admin/admin_blacklist.php           export / import işlemleri, "Yedek" kutusu
files/lang/admin_tr.php                   +10 anahtar (admin_blacklist.backup.*, btn.export/import, hata/sonuç metinleri)
files/lang/admin_en.php                   aynı
files/lang/tr.php                         help.blacklist.where metni
files/lang/en.php                         aynı
files/version.txt
```

Dil dosyası eşitliği: kullanıcı 1149 = 1149, yönetici 321 = 321.

## Dağıtım notu

- **Merkez katalogda iş yok.** Tablo 1.1.35'ten beri var; kolon
  eklenmedi.
- Migration boştur; ilk sayfa yüklemesinde sürüm damgasını taşır.
- Tek kullanıcılı kurulumda kara liste zaten etkin değildir; yedek
  kutusu da orada görünmez.
- **Dağıtım sunucusunda** her zamanki iki adım: yayımlanan `version.txt`
  1.1.49'a çekilir ve `updates/1.1.49/anime-tracker-1.1.49.zip` paketi
  yayımlanır.
#2
Announcements & Releases / 1.1.49
Last post by hitsumo - Oct 05, 2026, 12:37 PM
# Anime Tracker 1.1.49

**Release date:** 2026-09-24

One job: **a backup for the import blacklist.** The blacklist page gained
"Export" and "Import" buttons; the list can now be backed up as a
separate file and restored. No schema change (empty migration); nothing
to do on the central catalog. Affects multi-user (online) mode only.

## 1. Why

The import blacklist (1.1.35) holds the ids of anime deleted from the
catalog; MAL and AniList imports do not reopen them as catalog
suggestions. But the list lived **only in the application database**:

- it is not sent to the central catalog (by design),
- it is not part of the JSON backup in List Settings,
- the blacklist page had no export or import either.

Result: returning to a clean install from a JSON backup started the list
empty, and the first import re-suggested every anime that had been
deleted on purpose — exactly the problem 1.1.35 closed. Only a database
backup saved the list.

## 2. "Backup" box on the blacklist page

Admin dashboard → **Import Blacklist** (moderators and above), at the
bottom of the page:

- **Export** — downloads the whole list as
  `import_blacklist_YYYY-MM-DD.json`. Each entry: MAL and AniDB id,
  title, entry type (Deleted / Manual), note and the **original date**
  (the list is also the deletion ledger; "when did I delete this" is
  kept). The user who added it is not carried — a user id is
  install-specific; on restored entries the adder is the moderator who
  loaded the file.
- **Import** — only **adds**. Entries already on the list are skipped,
  nothing is removed or changed; loading the same file twice is
  harmless. The result line says "N entries added, M were already on the
  list", and reports unreadable rows separately. Entries are written in
  one go: if something fails, none are written, so no half-restored list
  is left behind.

**Protection against the wrong file:** the backup carries a marker
naming its own kind. The list JSON backup (List Settings) or any other
file is refused on this page — a member's anime list cannot be turned
into blacklist entries by accident.

**How duplicates are told apart:** entries with ids match on MAL /
AniDB id. A file entry that shares only **one** of its ids with an
existing entry counts as "already on the list"; the existing entry keeps
blocking that id. Id-less deletion records (they block nothing, they are
only the ledger) match on title + date, so re-importing does not double
the ledger.

## 3. Why not inside the list JSON backup

Two routes were considered; a separate file was chosen:

- The list JSON backup is **a bare array of anime**. Putting the
  blacklist in it meant changing the file's shape, and 1.1.48 and older
  would reject new backups as "invalid format".
- The list backup is **a member's personal file**; the blacklist is
  catalog policy and concerns moderators only. It must not enter
  members' backups, nor change when a member loads one.

## 4. Help

The blacklist section of the import help was updated: the old "not part
of the JSON backup, lives only in the database backup" sentence now
explains how to take and load the backup, and that **when returning to a
clean install this file must be loaded before the first import**.

## Files

**New:**

```
files/migration/1.1.49/upgrade.sql        empty (version stamp)
```

**Changed:**

```
files/functions/blacklist_helpers.php     blacklist_export_rows(), blacklist_import_rows(), BLACKLIST_BACKUP_FORMAT
files/admin/admin_blacklist.php           export / import actions, "Backup" box
files/lang/admin_tr.php                   +10 keys (admin_blacklist.backup.*, btn.export/import, error/result texts)
files/lang/admin_en.php                   same
files/lang/tr.php                         help.blacklist.where text
files/lang/en.php                         same
files/version.txt
```

Language file parity: user 1149 = 1149, admin 321 = 321.

## Deployment note

- **Nothing to do on the central catalog.** The table exists since
  1.1.35; no column was added.
- The migration is empty; it moves the version stamp on the first page
  load.
- On a single-user install the blacklist is not active anyway; the
  backup box does not appear there.
- **On the distribution server** the usual two steps: the published
  `version.txt` goes to 1.1.49 and the
  `updates/1.1.49/anime-tracker-1.1.49.zip` package is published.
#3
Announcements & Releases / 1.1.48
Last post by hitsumo - Oct 05, 2026, 12:36 PM
# Anime Tracker 1.1.48

**Release date:** 2026-09-22

One item: **the relation diagram.** The Series Chronology page gained a
third tab — **Diagram** — that shows a series as a drawing rather than a
list: every record a box, every relation a line. The diagram asks for no
extra input; it is drawn from the relations and chain names that are
already set up. No schema change (empty migration); nothing to do on the
central catalog.

## 1. Why

The two tabs of the Series Chronology read a series in one dimension:
"in what order do I watch this" (Chain Order) and "when did it come out"
(Air Date). Yet the catalog holds two more facts, and neither showed in
a list:

- **The type of a link** (since 1.1.38): "Crystal is the alternative
  version of the 90s series" was one line on the detail page; the
  chronology never drew that link between the two tracks.
- **The tracks** (since 1.1.36): chain names became tabs, but how two
  tracks stand relative to each other — which comes first, which is
  linked to which — was invisible.

The curation was already being done; only the drawing was missing.

## 2. The Diagram tab

`series_timeline.php?id=...&mode=graph`. It appears for every anime that
has a series name (like Air Date); the "Other Chain" view stays chain
mode as before.

**Layout** — two natural axes, nothing computed:

- **Row = track.** Every chain name is a row; unnamed chains are numbered
  "Chain 1, 2..." (oldest first); records in no chain gather in the
  "Unlinked" row.
- **Column = release year.** Boxes run left to right by first air date.
  Two records released in the same year **share a column when they sit
  on different rows** (a TV season and that year's film stack
  vertically); on the same row a new column opens. Records with no known
  date stay in the rightmost "?" column. The year label is printed only
  when it changes.
- **Box:** poster, shortened title, media type · year. The colour stripe
  on the left edge is your watch status (same colours as the dot in the
  list); the blue frame marks the anime you came from. Clicking opens
  the detail page; hovering shows the full title.
- **Title shortening:** the series-name prefix is dropped inside the box
  — "Tensei Shitara Slime Datta Ken: Tensura Nikki" reads "Tensura
  Nikki", "... (2021)" reads "2021". The prefix is found even when it is
  not at the start ("Gekijouban <series>: Guren no Kizuna-hen" → "Guren
  no Kizuna-hen"; "Film" is on the line below anyway). If nothing is
  left (the first season) the full title stays. Display only; tooltip
  and link carry the full title.

**Lines** — every `anime_relations` row is a line:

- **Sequel / Prequel:** solid purple arrow, flowing left to right along
  a chain. When another box sits between the two on the same row the
  line does not pass under it but arcs over the top (otherwise it would
  read as "A → B").
- **Other types:** dashed curves between rows; each type has its own
  pattern and colour (alternative version / setting green, side story /
  summary orange, same setting / shared character blue, other grey). On
  the same row they arc over the top.
- **Arrow direction, one rule:** for directed types the arrow points at
  the **derived work** — predecessor → sequel, parent story → side
  story, full story → summary. Undirected types have no arrow.
- Hovering a line shows the two records and the type of the link.
- The **legend** sits under the diagram and lists only the types and
  statuses that occur in it — not the whole vocabulary.

**Scope:** the series-name group plus records outside it that are
**directly** related to a member. Such a record (another series, or none)
appears as a faded, dash-framed **"ghost" box** in the bottom "Outside
the series" row: a link that crosses the series boundary, like Lunlun ↔
Hua Xianzi, stays visible, but the rest of that record's series is not
pulled in. Clicking a ghost opens the diagram of its own series (or its
detail page if it has none).

**Empty states:** in a series with no relations the boxes are laid out
in release order and a note says "no relation set up yet". A record
flagged 18+ keeps its box; its title stays hidden unless the preference
is on (the 1.1.2 rule).

## 3. Why plain SVG, why no library

PHP produces the diagram; the page arrives ready. No JavaScript library,
no extra download. A library such as Mermaid would shorten the work but
brings a ~3 MB payload and decides the placement itself — we could not
say "TV series on top, films below". Here the position of every box
already follows from the two axes, so a general graph layout
(force-directed etc.) is unnecessary. Font Awesome remains the project's
only external resource.

**No per-type code.** The drawing rule is type-agnostic: `sequel` is a
horizontal arrow, every other type a dashed curve. The type name only
goes into a CSS class and the legend label. When a new type enters the
vocabulary (1.1.47's Same Setting / Shared Character arrived this way;
the pending `special` will too) the diagram draws it by itself; adding a
colour line to the CSS is optional, otherwise it falls back to grey
dashes.

## 4. List Settings

**Diagram** was added to the "Series Chronology View" option, so the
page can open on the diagram by default. The option list and the saving
endpoint's whitelist now come from one source (the mode list) — the
hard-coded copy that in 1.1.46 silently refused to save "Recently
Watched" existed here too and is gone.

## 5. Help

- The "Series Chronology Page" section of the series help: Diagram in
  the tab list; the "two tabs" sentences now say "three"; a new
  **"Diagram"** subsection — row/column rule, line types, arrow
  direction, status stripe, ghost box, scrolling.
- The List Settings description mentions the diagram.

## Files

**New:**

```
files/functions/series_graph_helpers.php  data gathering, row/column layout, SVG, legend
files/migration/1.1.48/upgrade.sql        empty (version stamp)
```

**Changed:**

```
files/series_timeline.php                 Diagram tab, mode=graph branch, diagram CSS, wide container
files/functions/series_helpers.php        series_timeline_modes(): 'graph'; single-source note
files/functions.php                       loads the new helper file
files/list_settings.php                   <select> and whitelist from series_timeline_modes()
files/set_series_timeline_mode.php        comment (mode list)
files/help/help_series.php                "Diagram" subsection
files/lang/tr.php                         +11 keys (series_timeline.tab.graph, series_graph.*, help.st.graph.*); 4 texts changed
files/lang/en.php                         same
files/version.txt
```

Language file parity: 1149 = 1149.

## Deployment note

- **Nothing to do on the central catalog.** The diagram only reads; no
  new table or column.
- The migration is empty; it moves the version stamp on the first page
  load.
- The `functions/` folder must go **whole**: `functions.php` loads the
  new `series_graph_helpers.php`; with the file missing every page
  fails fatally.
- Known limits (deliberate): row labels scroll with the diagram (they
  live inside the SVG); a very wide series needs horizontal scrolling;
  the page carries no mobile viewport meta (as since 1.1.23, untouched
  in this release).
- **On the distribution server** the usual two steps: the published
  `version.txt` goes to 1.1.48 and the `updates/1.1.48/anime-tracker-1.1.48.zip`
  package is published.
#4
Duyurular ve Sürümler / 1.1.48
Last post by hitsumo - Oct 05, 2026, 12:36 PM
# Anime Tracker 1.1.48

**Yayın tarihi:** 2026-09-22

Tek iş: **ilişki şeması.** Seri Kronolojisi sayfasına üçüncü bir sekme
geldi — **Şema** — ve bir seriyi liste değil çizim olarak gösteriyor:
her kayıt bir kutu, her ilişki bir çizgi. Şema hiçbir ek girdi istemez;
zaten kurulmuş ilişkilerden ve zincir adlarından kendiliğinden çizilir.
Şema değişikliği yok (boş migration); merkez katalogda yapılacak bir şey
yok.

## 1. Neden

Seri Kronolojisi'nin iki sekmesi seriyi tek boyutta okur: "hangi sırayla
izlerim" (Zincir Sırası) ve "ne zaman çıktı" (Yayın Tarihi). Oysa
katalogda iki bilgi daha var ve ikisi de listede görünmüyordu:

- **Bağın türü** (1.1.38'den beri): "Crystal, 90'lar dizisinin
  alternatif versiyonudur" cümlesi yalnız detay sayfasında bir satırdı;
  kronolojide iki hat arasındaki bu bağ çizilmiyordu.
- **Hatlar** (1.1.36'dan beri): zincir adları sekme oluyordu, ama iki
  hattın birbirine göre nerede durduğu — hangisi önce, hangisi hangisine
  bağlı — görülmüyordu.

Kürasyon zaten yapılıyordu; eksik olan yalnızca çizim.

## 2. Şema sekmesi

`series_timeline.php?id=...&mode=graph`. Seri adı olan her animede
görünür (Yayın Tarihi gibi); "Diğer Zincir" görünümü her zamanki gibi
zincir modudur.

**Yerleşim** — iki doğal eksen, hesaplanan bir şey yok:

- **Satır = hat.** Her zincir adı bir satır; ad verilmemiş zincirler
  "Zincir 1, 2..." diye numaralanır (eskiden yeniye); hiçbir zincire
  girmeyen kayıtlar "Bağımsız" satırında toplanır.
- **Sütun = yayın yılı.** Kutular soldan sağa ilk gösterim tarihine göre
  dizilir. Aynı yılda çıkan iki kayıt **farklı satırlardaysa aynı sütunu
  paylaşır** (bir TV sezonu ile aynı yılın filmi alt alta durur), aynı
  satırdaysa yeni sütun açılır. Tarihi bilinmeyen kayıtlar en sağda "?"
  sütununda. Yıl etiketi yalnız değiştiğinde yazılır.
- **Kutu:** poster, kısaltılmış ad, medya türü · yıl. Sol kenardaki renk
  şeridi sizin izleme durumunuz (listedeki noktayla aynı renkler); mavi
  çerçeve, sayfaya geldiğiniz anime. Kutuya tıklayınca detay açılır;
  üzerine gelince tam ad görünür.
- **Ad kısaltma:** seri adı öneki kutuda düşer — "Tensei Shitara Slime
  Datta Ken: Tensura Nikki" kutuda "Tensura Nikki", "... (2021)" kutuda
  "2021". Önek başta olmasa da bulunur ("Gekijouban <seri>: Guren no
  Kizuna-hen" → "Guren no Kizuna-hen"; "Film" zaten alt satırda). Geriye
  bir şey kalmıyorsa (ilk sezon) tam ad kalır. Yalnız gösterim; tooltip
  ve bağlantı tam adı taşır.

**Çizgiler** — her `anime_relations` satırı bir çizgi:

- **Devamı / Öncesi:** düz mor ok, zincir boyunca soldan sağa akar. Aynı
  satırda arada başka kutu varsa çizgi kutunun altından geçmez, üstten
  kemer yapar (yoksa "A → B" gibi okunurdu).
- **Öteki türler:** satırlar arası kesikli eğri; tür başına ayrı desen ve
  renk (alternatif versiyon / kurgu yeşil, yan hikâye / özet turuncu,
  aynı evren / ortak karakter mavi, diğer gri). Aynı satırdaysa üstten
  kemer.
- **Ok yönü, tek kural:** yönü olan türlerde ok **türetilmiş işe** bakar
  — önceki → devamı, ana hikâye → yan hikâye, tam hikâye → özet. Yönsüz
  türlerde ok yok.
- Çizginin üzerine gelince iki kaydın adı ve bağın türü görünür.
- **Lejant** şemanın altındadır ve yalnız o şemada geçen türleri ve
  durumları listeler — sözlüğün tamamını değil.

**Kapsam:** seri adı grubu + o gruba **doğrudan** ilişkiyle bağlı dış
kayıtlar. Dış kayıt (başka seri ya da serisiz) soluk, kesik çerçeveli bir
**"hayalet" kutu** olarak en alt "Seri dışı" satırında durur: Lunlun ↔
Hua Xianzi gibi seri sınırını aşan bir bağ görünür kalır, ama o kaydın
serisinin geri kalanı buraya taşınmaz. Hayalete tıklamak kendi serisinin
şemasına götürür (serisi yoksa detayına).

**Boş durumlar:** ilişkisi olmayan seride kutular yayın sırasıyla dizilir
ve altta "henüz kurulmuş ilişki yok" notu çıkar. 18+ kaydın kutusu durur,
adı tercih açık değilse gizlenir (1.1.2 kuralı).

## 3. Neden saf SVG, neden kütüphane yok

Şemayı PHP üretir, sayfa hazır gelir; JavaScript kütüphanesi yok, ek
indirme yok. Mermaid gibi bir kütüphane işi kısaltırdı ama ~3 MB'lık bir
yük getirir ve kutuların yerine kendisi karar verirdi — "TV dizileri
üstte, filmler altta" diyemezdik. Burada kutuların yeri iki eksenden
zaten belli olduğu için genel bir graf yerleşimi (force-directed vb.)
gereksizdir. Projenin tek dış kaynağı Font Awesome olarak kalır.

**Türe göre kod yok.** Çizim kuralı türden bağımsızdır: `sequel` yatay
ok, geri kalan her tür kesikli eğri. Tür adı yalnız CSS sınıfına ve
lejant etiketine gider. Sözlüğe yeni bir tür eklendiğinde (1.1.47'nin
Aynı Evren / Ortak Karakter'i böyle geldi; sıradaki `special` böyle
gelecek) şema onu kendiliğinden çizer; CSS'e bir renk satırı eklemek
isteğe bağlıdır, yoksa gri kesikli kullanılır.

## 4. Liste Ayarları

"Seri Kronolojisi Görünümü" seçeneğine **Şema** eklendi: sayfa
varsayılan olarak şemayla açılabilir. Seçenek listesi ve kaydeden ucun
beyaz listesi artık tek kaynaktan (mod listesi) gelir — 1.1.46'da "Son
İzlenenler" seçeneğinin sessizce kaydedilmemesine yol açan sabit kopya
liste burada da vardı, kaldırıldı.

## 5. Yardım

- Seri yardımındaki "Seri Kronolojisi Sayfası" bölümü: sekme listesine
  Şema; "iki sekme" cümleleri "üç"e; yeni **"Şema"** alt başlığı —
  satır/sütun kuralı, çizgi türleri, ok yönü, durum şeridi, hayalet kutu,
  kaydırma.
- Liste Ayarları açıklaması şemayı sayar.

## Dosyalar

**Yeni:**

```
files/functions/series_graph_helpers.php  veri toplama, satır/sütun yerleşimi, SVG, lejant
files/migration/1.1.48/upgrade.sql        boş (sürüm damgası)
```

**Değişen:**

```
files/series_timeline.php                 Şema sekmesi, mode=graph dalı, şema CSS'i, geniş kapsayıcı
files/functions/series_helpers.php        series_timeline_modes(): 'graph'; liste tek kaynak notu
files/functions.php                       yeni yardımcı dosyası yüklenir
files/list_settings.php                   <select> ve beyaz liste series_timeline_modes()'tan
files/set_series_timeline_mode.php        yorum (mod listesi)
files/help/help_series.php                "Şema" alt başlığı
files/lang/tr.php                         +11 anahtar (series_timeline.tab.graph, series_graph.*, help.st.graph.*); 4 metin değişti
files/lang/en.php                         aynı
files/version.txt
```

Dil dosyası paritesi: 1149 = 1149.

## Dağıtım notu

- **Merkez katalogda iş yok.** Şema yalnız okur; yeni tablo/kolon yok.
- Migration boştur; ilk sayfa açılışında sürüm damgasını taşır.
- `functions/` klasörü **bütün** gitmeli: `functions.php` yeni
  `series_graph_helpers.php`'yi yükler; dosya eksikse her sayfa ölümcül
  hata verir.
- Bilinen sınırlar (bilinçli): satır etiketleri şemayla birlikte kayar
  (SVG içinde); çok geniş bir seri yatay kaydırma ister; sayfa mobil
  viewport meta'sı taşımıyor (1.1.23'ten beri böyle, bu sürümde
  dokunulmadı).
- **Dağıtım sunucusunda** her zamanki iki adım: yayımlanan `version.txt`
  1.1.48'e çekilmeli ve `updates/1.1.48/anime-tracker-1.1.48.zip` paketi
  yayımlanmalı.
#5
Announcements & Releases / 1.1.47
Last post by hitsumo - Oct 02, 2026, 12:49 PM
# Anime Tracker 1.1.47

**Release date:** 2026-09-22

One item: **two more relation types.** The vocabulary that describes the
link between two records gained **Same Setting** and **Shared
Character**. There is a schema change (one enum widened, install-local);
nothing to do on the central catalog.

## 1. Why

The relation vocabulary had five types in 1.1.38 and six in 1.1.40;
AniDB's has eleven. Two of the missing ones were the two ways two works
can touch **without sharing a story**, and both fell into "Other
Relation". The help text even used them as the examples for "Other": "a
shared universe, a guest character". So the right answer was known but
could not be chosen, and picking the "closest" type would have corrupted
the vocabulary.

The triggering case: **Hana no Ko Lunlun** (1979) and **Hua Xianzi: Mofa
Xiang Dui Lun** (2026). The same flower-fairy world, a new heroine two
generations on. The producer calls it a sequel; the content is a new
heroine in the same world — and the series ended in 1980, the new work
is not watched as its continuation. Until now the closest available
type, "Alternative Setting", had been chosen, which says the exact
opposite (same characters, another world).

## 2. The two types

| Type | Meaning | Example |
| --- | --- | --- |
| **Same Setting** | the same world, **wholly different** characters | Lunlun ↔ Hua Xianzi |
| **Shared Character** | a character or two in common, separate stories | a guest character, a crossover scene |

- Both are **undirected**: "A is set in the same world as B" reads the
  same from either end. Like Alternative Version / Alternative Setting /
  Other they are stored as one record with no inverse label; in the form
  it does not matter which side you start from.
- **They state no order.** The "Next Up" box, the chain tab of the
  Series Chronology and the spoiler guard follow the "Sequel" link and
  nothing else; these two types are invisible to them. A generation jump
  the producer calls a "sequel" but that is not watched as one belongs
  here.
- **Do not confuse Same Setting with Alternative Setting** — each is the
  other's mirror image. Alternative Setting: same characters, another
  world ("what if" stories, school-life re-imaginings). Same Setting:
  same world, other characters. The help text explains them side by side.
- In the "Related Anime" section of the detail page the two types get
  their own headings, after Summary and before Other Relation. They sit
  in the same place in the add-relation form.
- **Existing data is not converted.** The program cannot know which
  "Other" (or provisional "Alternative Setting") row is really Same
  Setting / Shared Character; the curator who knows deletes the link in
  the panel and recreates it with the right type. The upgrade touches no
  row.
- **"Other Relation" got narrower.** Its help examples are now "a
  connected work by the same creator, two productions drawn from one
  source work that fit no pattern". Shared universe and guest character
  moved to their own types.

## 3. Backup

The list backup carries relations by type name; the two new types travel
the same way. Loading a 1.1.47 backup into a pre-1.1.47 install counts
the unknown type as "skipped" — no crash.

## 4. Help

- Two items in the "Relation Types" list of the series help (Same
  Setting, Shared Character); the "Other Relation" item's examples
  updated.
- In "Direction: the Form Asks One Question" the count of undirected
  types goes from three to five.

## Files

**New:**

```
files/migration/1.1.47/upgrade.sql       two values added to the relation_type enum (MODIFY)
```

**Changed:**

```
files/functions/relation_helpers.php     type list + undirected list + form options; header comment
files/schema.sql                         same enum (fresh install) + table comment
files/lang/tr.php                        +4 keys (relation.type.*, relation.opt.*); help list 2 items + 2 texts
files/lang/en.php                        same
files/version.txt
```

Language file parity: 1138 = 1138.

## Deployment note

- **Nothing to do on the central catalog.** Relations are install-local;
  the central server does not know the table, the catalog wire format has
  no field for it.
- The migration widens the enum on the first page load (`MODIFY`,
  re-runnable; existing rows stay as they are).
- `functions/relation_helpers.php` and the language files must go
  **together**: with the old helper the new rows show as "Other Relation"
  and cannot be picked in the form (no crash); with an old language file
  the two options show as key names.
- The one known row to convert on the live site is Lunlun ↔ Hua Xianzi:
  delete the "Alternative Setting" link in the panel and recreate it as
  "Same Setting".
- **On the distribution server** the usual two steps: the published
  `version.txt` goes to 1.1.47 and the `updates/1.1.47/anime-tracker-1.1.47.zip`
  package is published.
#6
Duyurular ve Sürümler / 1.1.47
Last post by hitsumo - Oct 02, 2026, 12:49 PM
# Anime Tracker 1.1.47

**Yayın tarihi:** 2026-09-22

Tek iş: **iki ilişki türü daha.** İki kaydın bağını anlatan sözlüğe
**Aynı Evren** ve **Ortak Karakter** eklendi. Şema değişikliği var (bir
enum genişlemesi, kurulum-yerel); merkez katalogda yapılacak bir şey yok.

## 1. Neden

İlişki sözlüğü 1.1.38'de beş, 1.1.40'ta altı türdü; AniDB'nin ilişki
sözlüğü on bir. Eksiklerden ikisi, iki işin **hikâye paylaşmadan**
birbirine değebileceği iki yoldu ve ikisi de "Diğer İlişki"ye düşüyordu.
Yardım metni bile "Diğer"i anlatırken örnek olarak tam bunları veriyordu:
"ortak evren, konuk karakter". Yani doğru cevap biliniyordu ama
seçilemiyordu; "en yakın" türü seçmek de sözlüğü bozardı.

Tetikleyen vaka: **Hana no Ko Lunlun** (1979) ile **Hua Xianzi: Mofa
Xiang Dui Lun** (2026). Aynı çiçek perileri dünyası, iki nesil sonra yeni
bir kahraman. Yapımcı "devamı" diyor; içerik yeni kahraman, aynı dünya —
ve dizi 1980'de bitmiş, yeni iş onun devamı olarak izlenmez. O güne kadar
en yakın tür olan "Alternatif Kurgu" seçilmişti, ki o tam tersini söyler
(aynı karakterler, başka dünya).

## 2. İki tür

| Tür | Anlamı | Örnek |
| --- | --- | --- |
| **Aynı Evren** | aynı dünya, **bambaşka** karakterler | Lunlun ↔ Hua Xianzi |
| **Ortak Karakter** | bir-iki karakter ortak, hikâyeler ayrı | konuk karakter, crossover sahnesi |

- İkisi de **yönsüz**: "A, B ile aynı evrendedir" iki uçtan aynı
  cümledir. Alternatif Versiyon / Alternatif Kurgu / Diğer gibi tek
  kayıt olarak saklanır, ters etiketi yoktur; formda hangi uçtan
  kurduğunuzun önemi yoktur.
- **Sıra belirtmezler.** "Sırada" kutusu, Seri Kronolojisi'nin zincir
  sekmesi ve spoiler koruması yalnız "Devamı" bağını izler; bu iki tür
  onların gözünde yoktur. Bir yapımcının "devamı" dediği ama izleme
  sırasına girmeyen nesil atlamaları için doğru yer burasıdır.
- **Aynı Evren ile Alternatif Kurgu'yu karıştırmayın** — biri ötekinin
  aynadaki hâlidir. Alternatif Kurgu: karakterler aynı, dünya başka ("ya
  öyle olsaydı", okul hayatı yeniden kurgusu). Aynı Evren: dünya aynı,
  karakterler başka. Yardım metni ikisini yan yana anlatır.
- Detay sayfasındaki "İlişkili Animeler" bölümünde iki tür kendi
  başlığıyla, Özet'ten sonra ve Diğer İlişki'den önce gruplanır.
  Ekleme formundaki tür listesinde de aynı yerde dururlar.
- **Var olan veri çevrilmez.** Hangi "Diğer" (ya da geçici "Alternatif
  Kurgu") satırının aslında Aynı Evren / Ortak Karakter olduğunu program
  bilemez; bunu bilen kürator panelden bağı silip doğru türle yeniden
  kurar. Yükseltme hiçbir satıra dokunmaz.
- **"Diğer İlişki"nin tanımı daraldı.** Yardımdaki örnekleri artık
  "aynı yaratıcının bağlantılı işi, ortak kaynaktan türeyen ama hiçbir
  kalıba oturmayan iki yapım". Ortak evren ve konuk karakter kendi
  türlerine taşındı.

## 3. Yedek

Liste yedeği ilişkileri tür adıyla taşır; iki yeni tür de öyle gider ve
gelir. 1.1.47 öncesi bir kuruluma 1.1.47 yedeği yüklenirse bilinmeyen
tür "atlandı" sayılır — çökmez.

## 4. Yardım

- Seri yardımındaki "İlişki Türleri" listesine iki madde (Aynı Evren,
  Ortak Karakter); "Diğer İlişki" maddesinin örnekleri güncellendi.
- "Yön: Form Tek Soru Sorar" bölümünde yönsüz türlerin sayısı üçten beşe.

## Dosyalar

**Yeni:**

```
files/migration/1.1.47/upgrade.sql       relation_type enum'una iki değer (MODIFY)
```

**Değişen:**

```
files/functions/relation_helpers.php     tür listesi + yönsüz tür listesi + form seçenekleri; başlık yorumu
files/schema.sql                         aynı enum (taze kurulum) + tablo yorumu
files/lang/tr.php                        +4 anahtar (relation.type.*, relation.opt.*); yardım listesi 2 madde + 2 metin
files/lang/en.php                        aynı
files/version.txt
```

Dil dosyası paritesi: 1138 = 1138.

## Dağıtım notu

- **Merkez katalogda iş yok.** İlişkiler kurulum-yereldir; merkez
  sunucu tabloyu bilmez, katalog telinde alan yok.
- Migration ilk sayfa açılışında enum'u genişletir (`MODIFY`, yeniden
  çalıştırılabilir; var olan satırlar yerinde kalır).
- `functions/relation_helpers.php` ile dil dosyaları **birlikte**
  gitmeli: eski yardımcı kalırsa yeni tür satırları "Diğer İlişki" diye
  görünür ve formda seçilemez (çökmez); eski dil dosyası kalırsa iki
  seçenek anahtar adıyla görünür.
- Canlı veride bilinen tek çevrilecek satır Lunlun ↔ Hua Xianzi:
  panelden "Alternatif Kurgu" bağını silip "Aynı Evren" ile yeniden kur.
- **Dağıtım sunucusunda** her zamanki iki adım: yayımlanan `version.txt`
  1.1.47'ye çekilmeli ve `updates/1.1.47/anime-tracker-1.1.47.zip` paketi
  yayımlanmalı.
#7
Announcements & Releases / 1.1.46
Last post by hitsumo - Oct 02, 2026, 12:48 PM
# Anime Tracker 1.1.46

**Release date:** 2026-09-21

One item: the **watch log.** The application now records every change
of your watched episode count with its time, and the **Recently
Watched** tab on the Recently Updated page gained four views built on
it: last week, last month, all, date range. There is a schema change (a
new, install-local table); nothing to do on the central catalog.

## 1. Why

"What did I watch last week?" had no honest answer. The personal record
carried a single timestamp — "last touch of the row". A note edit, a
status change and an episode increment all wrote the same stamp; a list
imported from MyAnimeList or AniList stamped every record with the
import day. The record knew only "where am I now", never "how did I get
here". The Recently Watched tab from 1.1.45 sorted by that stamp and
could not offer a weekly or monthly view.

## 2. The watch log

A new table (`user_watch_log`) keeps one row per **change** of the
watched episode count: from what, to what, when.

- **One writer.** Every path that writes the episode count already goes
  through the single helper that writes the personal record; the log
  was added to that helper. The +/− buttons on the list and the detail
  page, the edit form, adding an anime, the MAL / AniList / JSON
  imports — all of them land in the log by themselves; none needed code
  of its own.
- **An import is one row.** An import leaves "0 → 24, at the import
  moment" per anime. That is what happened: the day 24 episodes entered
  the count is known, the days they were watched are not, and nothing
  is invented.
- **A "−" is logged too.** Take an episode back and the row reads
  "6 → 5". The period views sum per anime: an episode you added and
  then took back nets to zero and is not counted.
- **No backfill.** On upgrade, existing records get no invented dates.
  The 1.1.44 rule stands: a stamp that was never taken is not made up.
  Your earlier watching stays in the "All" view below, labelled.
- **Install-local.** The log never goes to the central catalog. It does
  go into your backup (see §4).

## 3. Recently Watched: the period strip

A strip appeared under the tab: **Last week · Last month · All** and a
two-date **range** form.

| View | Source | Shows |
| --- | --- | --- |
| Last week | log | anime watched in the last 7 days |
| Last month | log | anime watched in the last 30 days |
| Range | log | anime watched between two dates (both inclusive) |
| All | log + older records | every anime with progress, newest movement first, 10 rows |

- In the week, month and range views each card carries a **net
  episodes** badge (+3 episodes) for the period and the list is headed
  by an **"N anime, M episodes watched"** summary. Only anime with a
  positive net are listed.
- Week and month are **rolling** windows (7 / 30 days back from now) —
  that is what "last week" means in speech; a calendar week would show
  one anime on a Monday morning.
- **All** continues the 1.1.45 list: an anime with log rows is placed
  by its latest log entry, an older anime without any is placed by its
  last-touch time as before and wears a **"pre-log"** label, so the two
  kinds do not blur.
- An empty period says its own sentence ("nothing logged in this
  period"), not the tab's "no watch activity yet".
- The range form needs both dates; reversed dates are swapped, a
  malformed or missing date falls back to "All" — no error page.
- The chosen period lives in the **address** and is not saved. The
  default-tab preference in List Settings stays as it is.
- On an online installation a visitor who is not signed in sees the
  "this tab is personal, sign in" note in all four views.

## 4. Backup

The list export puts a `watch_log` array under each anime (from, to,
when). Restore:

- When the file has the array (a 1.1.46+ backup) the rows come back
  **as they are**; the same row is never written twice, so loading the
  same file twice, or loading over a history that is already half
  there, does not duplicate. The restore jump itself is not logged.
- When the file has no array (an older backup) the restore jump is
  logged as one row — the same rule as a MAL import.

## 5. Help

- The "Recently Updated" section of the list help gained a "Watch log
  and period filters" heading: what the log records, the four views,
  net counting, no backfill, the pre-log label, the backup.
- The export/import help's "what is in the backup" list gained the log.

## 6. Side fix: "Recently Watched" as the default tab

1.1.45 added "Recently Watched" to the "Recently Updated tab" option in
List Settings, but the endpoint that saves it knew only the first two
values; choosing the third silently saved "Episode Updates". The
endpoint now validates against the tab list itself; the choice sticks.

## Files

**New:**

```
files/functions/watch_log_helpers.php    log write / export / import / period bounds / summary
files/migration/1.1.46/upgrade.sql       CREATE TABLE user_watch_log
```

**Changed:**

```
files/functions/user_anime_helpers.php   ua_set_state: log row when the count changes; $logWatch flag
files/functions.php                      loads the new helper file
files/schema.sql                         user_watch_log table (fresh install)
files/recent.php                         period strip, two new queries, summary, two badges
files/list_settings.php                  watch_log in export; restore writes it back and suppresses the auto row (both branches)
files/set_recent_tab_pref.php            accepts 'watched' (recent_tabs() whitelist)
files/help/help_list.php                 log heading + paragraph
files/lang/tr.php                        +16 keys (recent.period.*, help.list.recent.log.*); 1 changed (tab hint); backup list item
files/lang/en.php                        same
files/version.txt
```

Language file parity: 1134 = 1134.

## Deployment note

- **Nothing to do on the central catalog.** The table is install-local;
  the central server does not know it.
- The migration creates the table on the first page load (`CREATE TABLE
  IF NOT EXISTS`, re-runnable). After the upgrade the log is empty; it
  starts filling with the first episode mark. Until then the week /
  month views show their empty sentence — by design.
- The `functions/` folder must ship **whole**: `functions.php` loads
  the new `watch_log_helpers.php` and `user_anime_helpers.php` calls
  its function; with either missing, every episode mark is a fatal
  error.
- **On the distribution server** the usual two steps: pull the published
  `version.txt` to 1.1.46 and publish the
  `updates/1.1.46/anime-tracker-1.1.46.zip` package.
#8
Duyurular ve Sürümler / 1.1.46
Last post by hitsumo - Oct 02, 2026, 12:47 PM
# Anime Tracker 1.1.46

**Yayın tarihi:** 2026-09-21

Tek iş: **izleme günlüğü.** Uygulama artık izlenen bölüm sayınızın her
değişimini tarihiyle kaydediyor ve Son Güncellenenler sayfasındaki
**Son İzlenenler** sekmesi buna dayanan dört görünüm kazandı: son 1 hafta,
son 1 ay, hepsi, tarih aralığı. Şema değişikliği var (yeni tablo,
kurulum-yerel); merkez katalogda yapılacak bir şey yok.

## 1. Neden

"Geçen hafta ne izledim?" sorusunun dürüst bir cevabı yoktu. Kişisel
kaydın tek zaman damgası vardı — "satıra son dokunuş". Bir not
düzenlemesi, bir durum değişimi, bir bölüm artışı hepsi aynı damgaya
yazıyordu; MyAnimeList ya da AniList'ten liste aktarınca bütün kayıtlar
aktarım gününü alıyordu. Kayıt yalnız "şimdi neredeyim"i biliyor, "oraya
nasıl geldim"i bilmiyordu. 1.1.45'in Son İzlenenler sekmesi bu damgaya
göre sıralıyordu ve bir haftalık / aylık görünüm sunamıyordu.

## 2. İzleme günlüğü

Yeni bir tablo (`user_watch_log`) izlenen bölüm sayısının **her
değişimine** bir satır tutar: kaçtan kaça, ne zaman.

- **Tek yazan yer.** Bölüm sayısını yazan her yol zaten kişisel kaydı
  yazan tek yardımcıdan geçer; günlük o yardımcıya eklendi. Listedeki ve
  detay sayfasındaki +/− düğmeleri, düzenleme formu, anime ekleme,
  MAL / AniList / JSON içe aktarımı — hepsi kendiliğinden günlüğe düşer,
  hiçbiri ayrıca kod istemedi.
- **İçe aktarım tek satır.** Bir aktarım animeye "0 → 24, aktarım anı"
  diye bir satır bırakır. Olan da budur: o gün 24 bölümün sayıya
  girdiği bilinir, hangi gün izlendiği bilinmez; uydurulmaz.
- **"−" de yazılır.** Bir bölümü geri alırsanız satır "6 → 5" olur.
  Dönem görünümleri anime başına toplar: +1 basıp geri aldığınız bölüm
  sıfıra iner, sayılmaz.
- **Geriye dönük doldurma yok.** Yükseltmede var olan kayıtlara sahte
  tarih yazılmaz. 1.1.44'teki kural aynen: alınmamış bir damga icat
  edilmez. Eski izlemeleriniz aşağıdaki "Hepsi" görünümünde, etiketli,
  durmaya devam eder.
- **Kurulum-yerel.** Günlük merkez kataloğa gitmez. Yedeğinize girer
  (bkz. §4).

## 3. Son İzlenenler: dönem şeridi

Sekmenin altına bir şerit geldi: **Son 1 hafta · Son 1 ay · Hepsi** ve
iki tarihli bir **aralık** formu.

| Görünüm | Kaynak | Ne gösterir |
| --- | --- | --- |
| Son 1 hafta | günlük | son 7 günde izlenen animeler |
| Son 1 ay | günlük | son 30 günde izlenen animeler |
| Aralık | günlük | iki tarih arasında (iki uç dahil) izlenen animeler |
| Hepsi | günlük + eski kayıt | ilerlemesi olan her anime, en yeni hareket üstte, 10 satır |

- Hafta, ay ve aralık görünümlerinde her kartta o dönemde izlenen **net
  bölüm** rozeti (+3 bölüm) ve listenin üstünde **"N animede M bölüm
  izlendi"** özeti vardır. Yalnız net artışı olan animeler listelenir.
- Hafta ve ay **kayan** pencerelerdir (şu andan geriye 7 / 30 gün) —
  konuşmada "son bir hafta" bu demektir; takvim haftası pazartesi sabahı
  tek anime gösterirdi.
- **Hepsi**, 1.1.45'teki listenin devamıdır: günlüğü olan anime son
  günlük satırıyla, günlüğü olmayan eski anime eskisi gibi son dokunuş
  zamanıyla yer alır ve **"günlük öncesi"** etiketi taşır; iki tür
  birbirine karışmaz.
- Boş dönem kendi cümlesini söyler ("bu dönemde günlüğe giren izleme
  yok"), sekmenin "henüz izleme aktiviteniz yok" cümlesini değil.
- Aralık formunda iki tarih de gerekir; ters girilirse yer değiştirir,
  bozuk ya da eksik tarih "Hepsi"ye düşer — hata sayfası yok.
- Seçilen dönem **adreste** yaşar, kaydedilmez. Liste Ayarları'ndaki
  varsayılan sekme tercihi olduğu gibi durur.
- Çevrimiçi kurulumda giriş yapmamış ziyaretçi dört görünümde de "bu
  sekme kişiseldir, giriş yapın" notunu görür.

## 4. Yedek

Liste dışa aktarımı her animenin altına `watch_log` dizisini koyar
(kaçtan kaça, ne zaman). Geri yükleme:

- Dosyada dizi varsa (1.1.46 ve sonrası yedek) satırlar **olduğu gibi**
  geri gelir; aynı satır iki kez yazılmaz, o yüzden aynı dosyayı iki kez
  yüklemek ya da yarısı zaten duran bir geçmişin üstüne yüklemek
  çoğaltmaz. Geri yükleme sıçraması ayrıca günlüğe girmez.
- Dosyada dizi yoksa (eski yedek) geri yükleme sıçraması tek satır
  olarak günlüğe girer — MAL aktarımıyla aynı kural.

## 5. Yardım

- Liste yardımındaki "Son Güncellenenler" bölümüne "İzleme günlüğü ve
  dönem filtreleri" başlığı: günlük ne kaydeder, dört görünüm, net sayım,
  geriye dönük doldurma yok, günlük öncesi etiketi, yedek.
- İçe/dışa aktarma yardımındaki "yedekte ne var" listesine günlük
  satırı.

## 6. Yan düzeltme: varsayılan sekme seçiminde "Son İzlenenler"

Liste Ayarları'ndaki "Son Güncellenenler Sekmesi" seçeneğine 1.1.45'te
"Son İzlenenler" eklenmişti ama kaydeden uç yalnız ilk iki değeri
tanıyordu; üçüncüsü seçilince sessizce "Bölüm Güncellenenler" kaydediliyordu.
Uç artık sekme listesinin kendisinden doğrular; seçim kaydedilir.

## Dosyalar

**Yeni:**

```
files/functions/watch_log_helpers.php    günlük yazma / dışa-içe aktarma / dönem sınırları / özet
files/migration/1.1.46/upgrade.sql       CREATE TABLE user_watch_log
```

**Değişen:**

```
files/functions/user_anime_helpers.php   ua_set_state: bölüm değişince günlük satırı; $logWatch bayrağı
files/functions.php                      yeni yardımcı dosyası yüklenir
files/schema.sql                         user_watch_log tablosu (taze kurulum)
files/recent.php                         dönem şeridi, iki yeni sorgu, özet, iki rozet
files/list_settings.php                  dışa aktarımda watch_log; geri yüklemede geri yazma + otomatik satırı kapatma (iki dal)
files/set_recent_tab_pref.php            'watched' değeri kabul edilir (recent_tabs() beyaz listesi)
files/help/help_list.php                 günlük başlığı + paragrafı
files/lang/tr.php                        +16 anahtar (recent.period.*, help.list.recent.log.*); 1 değişen (sekme ipucu); yedek listesi maddesi
files/lang/en.php                        aynı
files/version.txt
```

Dil dosyası paritesi: 1134 = 1134.

## Dağıtım notu

- **Merkez katalogda iş yok.** Tablo kurulum-yereldir; merkez sunucu
  onu bilmez.
- Migration ilk sayfa açılışında tabloyu oluşturur (`CREATE TABLE IF
  NOT EXISTS`, yeniden çalıştırılabilir). Yükseltme sonrası günlük
  boştur; ilk bölüm işaretlemeyle dolmaya başlar. Hafta / ay
  görünümleri o ana kadar boş cümlesini gösterir — bilinçli.
- `functions/` klasörü **bütün** gitmeli: `functions.php` yeni
  `watch_log_helpers.php`'yi yükler, `user_anime_helpers.php` onun
  fonksiyonunu çağırır; biri eksikse her bölüm işaretlemesi ölümcül hata
  verir.
- **Dağıtım sunucusunda** her zamanki iki adım: yayımlanan `version.txt`
  1.1.46'ya çekilmeli ve `updates/1.1.46/anime-tracker-1.1.46.zip` paketi
  yayımlanmalı.
#9
Announcements & Releases / 1.1.45
Last post by hitsumo - Oct 02, 2026, 12:46 PM
# Anime Tracker 1.1.45

**Release date:** 2026-09-21

Main item: **community emotion distribution on the detail page.** On an
online (multi-user) installation, a line under the emotion buttons shows
the sum of the marks every member put on that anime. Second item:
**"Recently Watched" moved from Statistics to the Recently Updated page**
as a third tab. Alongside them, a small trim: the United States and
France were removed from the production-country list. No schema change;
nothing to do on the central catalog.

## 1. Community emotion distribution

### Why

Emotion marks have been personal since 0.6.1: each member puts at most
three emotions on an anime and sees only their own. On an online
installation what other members put on the same anime was visible
**nowhere**. Yet this was exactly the payoff of this site's deliberate
refusal to score anything: instead of "7.8", "it excited some and bored
others".

### What it does

A line appears right under the emotion buttons on the detail page:

> **3 people marked:** Excited **2** · Thought-provoking **2** · Bored **1**

- **Anonymous.** Only the total per emotion and how many distinct
  members marked; who marked what is never shown.
- **Public.** Guests see it too — the information that stands in for a
  score is as open as a score would be.
- **Order:** most-marked first; ties keep the button order. Two people
  see the same page in the same order.
- **No line when empty.** If nobody has marked anything there is neither
  a line nor a "nobody yet" text; on a small installation most pages are
  empty and the same sentence on every page would be noise.
- **Updates instantly.** Pressing a button brings the new distribution
  back in the server's reply; the line changes without a reload. Drawing
  happens in one place (the server) — the browser only swaps in the ready
  markup and keeps no copy of its own; label translation and colours are
  managed from one spot.
- **No line on a single-user installation on your own computer.** The
  distribution would be your own marks; the buttons above already show
  that. Not even the query runs.

The chips are the read-only emotion badges reserved in 0.6.1 for a
"detail page summary"; this is their first use.

### Cost

Two small queries (`GROUP BY emotion` and `COUNT(DISTINCT user_id)`),
both served by the table's existing `idx_anime` index. No new table,
column or index.

## 2. Help

One paragraph added to the "Emotions" section of the discovery help: what
the line shows, anonymity, guests, the empty case, why a single-user
installation has none.

## 3. "Recently Watched" is now the third tab of Recently Updated

The **Recently Watched** tab of the Statistics page (there since 1.1.1)
moved to the **Recently Updated** page, which now has three tabs:

| Tab | What it lists | Whose |
| --- | --- | --- |
| Episode Updates | The 5 anime whose aired episode count changed most recently | catalog |
| Content Updates | The 5 anime most recently added / edited | catalog |
| **Recently Watched** | The 10 anime whose watch progress you changed most recently | **you** |

Three answers to "what happened lately" on one page; Statistics went
back to what its name says — numbers (two tabs: personal summary, global
distribution).

- Same card layout, same "just now / 3 hours ago" time label; still ten
  rows, only anime with progress (a 0/12 "planned" row is not a watch
  event).
- The personal tab is the **only** one on the page ordered by
  `user_anime`; on the other two, marking an episode moves nothing — that
  rule stands.
- On an online installation a visitor who is not signed in sees "this
  tab is personal, sign in" instead of a list.
- The "Recently Updated tab" preference in List Settings gained the third
  option; the default is still episodes.
- Side fix: the cards on this page now follow your **title language
  preference** (the Statistics table had since 1.1.18; this page had
  not).

Help: the "Recently Updated" section of the list help describes three
tabs and its "not to be confused" box was rewritten around the catalog
tabs / personal tab split; the moved tab's paragraph was removed from the
Statistics help.

## 4. Production country: United States and France removed

The "Production Country" list on the add / edit form now has four
options: China, Japan, South Korea, Taiwan. In a catalog of 7,800+ rows
not a single one carried a US or FR code; the two options only made the
list longer.

Existing data is untouched and nothing is lost: a row that arrives with
an unlisted code (AniList's country of origin, catalog import) keeps the
code in its column; the country line on its page renders empty, and the
country filter — built from the data — simply does not offer it. Adding
one back is one line plus two language keys.

## Files

**New:**

```
files/migration/1.1.45/upgrade.sql   stamp only (no schema change)
```

**Changed:**

```
files/anime_details.php                  distribution line + swap in the toggle script
files/update_emotion.php                 distribution_html in the reply; lang_init (the reply now carries translated text)
files/functions/emotion_helpers.php      emotion_distribution() / emotion_distribution_html()
files/css/emotion.css                    .emotion-dist (hidden when empty)
files/recent.php                         third tab (watched), per-tab text map, display_title
files/statistics.php                     Recently Watched tab / query / CSS removed
files/list_settings.php                  third option in the default-tab setting
files/functions/user_anime_helpers.php   recent_tabs() += 'watched'
files/help/help_discovery.php            emotion paragraph added; Recently Watched removed from the statistics help
files/functions/country_helpers.php      US / FR removed
files/lang/tr.php                        +7 keys, −7 (country.us/fr, statistics.tab.recent_watched, statistics.col.last_watched, statistics.recent_watched.empty, help.stats.recent.h3/.text); 4 changed
files/lang/en.php                        same
files/version.txt
```

Language file parity: 1118 = 1118.

## Deployment note

- **Nothing to do on the central catalog.** Emotion data is local to the
  installation.
- The migration is a stamp only; the version moves to 1.1.45 on the first
  page load.
- `functions/emotion_helpers.php` and `functions/user_anime_helpers.php`
  must ship **together** (whole functions/ folder rule):
  `anime_details.php` / `update_emotion.php` call the new helpers, and
  `recent.php` expects the three values of `recent_tabs()`; with the old
  helper `?tab=watched` silently falls back to the default tab.
- Existing `recent_default_tab` preferences stay valid (episodes /
  content); `watched` is written only for those who choose it.
- The CSS version stamp comes from `version.txt`; the `emotion.css`
  change arrives under a new URL, no cache issue.
- **On the distribution server**, the usual two steps: the published
  `version.txt` must be moved to 1.1.45 and the
  `updates/1.1.45/anime-tracker-1.1.45.zip` package published.
#10
Duyurular ve Sürümler / 1.1.45
Last post by hitsumo - Oct 02, 2026, 12:45 PM
# Anime Tracker 1.1.45

**Yayın tarihi:** 2026-09-21

Ana iş: **detay sayfasında toplu duygu dağılımı.** Çevrimiçi (çok
kullanıcılı) kurulumda duygu düğmelerinin altında, o animeye tüm üyelerin
koyduğu işaretlerin toplamı görünür. İkinci iş: **"Son İzlenenler"
İstatistikler'den Son Güncellenenler sayfasına taşındı** — üçüncü sekme.
Yanında küçük bir sadeleştirme: yapım ülkesi listesinden ABD ve Fransa
çıkarıldı. Şema değişikliği yok; merkez katalogda yapılacak bir şey yok.

## 1. Toplu duygu dağılımı

### Neden

Duygu işaretleri 0.6.1'den beri kişisel: her üye bir animeye en çok üç
duygu koyar ve yalnız kendi işaretini görür. Çevrimiçi kurulumda aynı
animeye başka üyelerin ne koyduğu **hiçbir yerde** görünmüyordu. Oysa bu
sitenin puan vermeyi bilerek reddetmesinin karşılığı tam da buydu: "7.8"
yerine "kimi heyecanlandırdı, kimi sıktı".

### Ne yapar

Detay sayfasında duygu düğmelerinin hemen altına bir satır gelir:

> **3 kişi işaretledi:** Heyecanlandırdı **2** · Düşündürdü **2** · Sıktı **1**

- **Anonim.** Yalnız işaret başına toplam ve kaç farklı üyenin
  işaretlediği; kimin ne işaretlediği çıkmaz.
- **Herkese açık.** Konuklar da görür — puanın karşılığı olan bilgi,
  puan gibi açıktır.
- **Sıralama:** en çok işaretlenen önce; eşitlikte düğmelerin sırası.
  İki kişi aynı sayfayı aynı sırada görür.
- **Boşken satır yok.** Kimse işaretlememişse ne satır ne "henüz kimse
  işaretlemedi" metni çıkar; küçük bir kurulumda sayfaların çoğu boştur,
  her sayfada aynı cümle gürültü olurdu.
- **Anında tazelenir.** Bir düğmeye basınca sunucunun cevabı yeni
  dağılımı da taşır; satır sayfa yenilenmeden değişir. Çizim tek yerde
  (sunucuda) — tarayıcı yalnız hazır metni yerine koyar, kendi kopyasını
  çizmez; etiket çevirisi ve renkler bir yerden yönetilir.
- **Kendi bilgisayarınızdaki tek kullanıcılı kurulumda satır yoktur.**
  Dağılım kendi işaretleriniz olurdu; üstteki düğmeler zaten onu
  gösteriyor. Sorgu bile atılmaz.

Çipler 0.6.1'de "detay sayfası özeti" için ayrılan salt-okunur duygu
rozetleridir; ilk kullanımları bu.

### Maliyet

İki küçük sorgu (`GROUP BY emotion` ve `COUNT(DISTINCT user_id)`), ikisini
de tablonun mevcut `idx_anime` indeksi taşır. Yeni tablo, kolon, indeks
yok.

## 2. Yardım

Keşif yardımındaki "Duygular" bölümüne bir paragraf: satır ne gösterir,
anonimlik, konuklar, boş durum, tek kullanıcılı kurulumda neden yok.

## 3. "Son İzlenenler" artık Son Güncellenenler'in üçüncü sekmesi

İstatistikler sayfasındaki **Son İzlenenler** sekmesi (1.1.1'den beri
oradaydı) **Son Güncellenenler** sayfasına taşındı. Sayfanın artık üç
sekmesi var:

| Sekme | Ne listeler | Kimin |
| --- | --- | --- |
| Bölüm Güncellenenler | Yayınlanan bölüm sayısı en son değişen 5 anime | katalog |
| İçerik Güncellenenler | En son eklenen / düzenlenen 5 anime | katalog |
| **Son İzlenenler** | İzleme ilerlemenizi en son değiştirdiğiniz 10 anime | **siz** |

"Son zamanlarda ne oldu" sorusunun üç cevabı tek sayfada; İstatistikler
ise adının söylediği şeye — sayılara — döndü (iki sekme: kişisel özet,
global dağılım).

- Aynı kart görünümü, aynı "az önce / 3 saat önce" zaman etiketi; liste
  eskisi gibi 10 kayıt, yalnız ilerlemesi olan animeler (0/12 "planlandı"
  satırı bir izleme hareketi değildir).
- Kişisel sekme, sayfada `user_anime`'a göre sıralanan **tek** sekmedir;
  diğer ikisinde bir bölüm işaretlemeniz hiçbir şeyi oynatmaz — o kural
  aynen duruyor.
- Çevrimiçi kurulumda giriş yapmamış ziyaretçi bu sekmede liste yerine
  "bu sekme kişiseldir, giriş yapın" notunu görür.
- Liste Ayarları'ndaki "Son Güncellenenler Sekmesi" tercihine üçüncü
  seçenek eklendi; ön tanımlı hâlâ bölüm.
- Yan düzeltme: sayfadaki kartlar artık **başlık dili tercihinize** uyar
  (İstatistikler'deki tablo 1.1.18'den beri uyuyordu, bu sayfa uymuyordu).

Yardım: Liste sayfası yardımındaki "Son Güncellenenler" bölümü üç
sekmeyi anlatır, "karıştırmayın" kutusu katalog sekmeleri / kişisel sekme
ayrımına göre yeniden yazıldı; İstatistikler yardımından taşınan sekmenin
paragrafı kaldırıldı.

## 4. Yapım ülkesi: ABD ve Fransa çıkarıldı

Ekleme / düzenleme formundaki "Yapım Ülkesi" listesi artık dört seçenek:
Çin, Güney Kore, Japonya, Tayvan. 7.800'ü aşkın kayıtlık katalogda ABD
ya da Fransa kodlu tek satır yoktu; iki seçenek listeyi uzatıyordu.

Var olan veriye dokunulmadı ve kaybolan bir şey yok: listede olmayan bir
kodla gelen kayıt (AniList'in menşe ülkesi, katalog içe aktarımı) kodu
sütununda tutar; sayfada ülke satırı boş görünür, ülke filtresi — veriden
kurulduğu için — o seçeneği sunmaz. Geri eklemek tek satır + iki dil
anahtarı.

## Dosyalar

**Yeni:**

```
files/migration/1.1.45/upgrade.sql   damga (şema değişikliği yok)
```

**Değişen:**

```
files/anime_details.php                  dağılım satırı + toggle betiğinde satırı değiştirme
files/update_emotion.php                 cevaba distribution_html; lang_init (cevap artık çevrilen metin taşıyor)
files/functions/emotion_helpers.php      emotion_distribution() / emotion_distribution_html()
files/css/emotion.css                    .emotion-dist (boşken gizli)
files/recent.php                         üçüncü sekme (watched), sekme başına metin haritası, display_title
files/statistics.php                     Son İzlenenler sekmesi / sorgusu / CSS'i kaldırıldı
files/list_settings.php                  varsayılan sekme seçimine üçüncü seçenek
files/functions/user_anime_helpers.php   recent_tabs() += 'watched'
files/help/help_discovery.php            duygu paragrafı eklendi; istatistik yardımından Son İzlenenler kaldırıldı
files/functions/country_helpers.php      US / FR çıkarıldı
files/lang/tr.php                        +7 anahtar, −7 (country.us/fr, statistics.tab.recent_watched, statistics.col.last_watched, statistics.recent_watched.empty, help.stats.recent.h3/.text); 4 değişen
files/lang/en.php                        aynı
files/version.txt
```

Dil dosyası paritesi: 1118 = 1118.

## Dağıtım notu

- **Merkez katalogda iş yok.** Duygu verisi kurulum-yereldir.
- Migration damga-only; ilk sayfa açılışında sürüm 1.1.45'e taşınır.
- `functions/emotion_helpers.php` ve `functions/user_anime_helpers.php`
  **birlikte** gitmeli (functions/ klasörünün tamamı kuralı):
  `anime_details.php` / `update_emotion.php` yeni yardımcıları çağırır,
  `recent.php` ise `recent_tabs()`'ın üç değerini bekler; eski yardımcıyla
  `?tab=watched` sessizce varsayılan sekmeye düşer.
- Var olan `recent_default_tab` tercihleri geçerli kalır (episodes /
  content); `watched` yalnız seçenlerde yazılır.
- CSS sürüm damgası `version.txt`'ten gelir; `emotion.css` değişikliği
  yeni adresle iner, önbellek sorunu olmaz.
- **Dağıtım sunucusunda** her zamanki iki adım: yayımlanan `version.txt`
  1.1.45'e çekilmeli ve `updates/1.1.45/anime-tracker-1.1.45.zip` paketi
  yayımlanmalı.