← cd ../proiecte

Campus Audiobook Player

Player personal de audiobook-uri — import din dispozitiv, LibriVox, FTP/SMB, cu Chromecast, AirPlay și accesibilitate nativă.

ExpoReact NativeTypeScriptreact-native-track-playerSQLiteChromecastAirPlaySMBFTPLibriVoxOpen Librarymusic-metadataReanimatedi18n
Captură ecran Campus Audiobook Player

Context

Campus Audiobook Player (fost Campus Book Player) este un player personal de audiobook-uri cross-platform (Android + iOS) pentru cărțile pe care le ai deja — din fișiere locale, biblioteca media, catalogul LibriVox (public domain), servere FTP sau partaje SMB/CIFS.

Construit cu Expo SDK 57, React 19.2, React Native 0.86 și TypeScript 6 strict (New Architecture), pune accesibilitatea pe primul loc: fiecare ecran a fost proiectat mai întâi pentru VoiceOver și TalkBack, apoi pentru interfața vizuală. Aplicația nu cere cont, nu colectează date și nu vinde conținut — gestionează doar fișierele pe care alegi să le imporți.

Scheme: campus-book-player · Bundle ro.campusnet.bookplayer · build 2026-08-30 · v1.2.0 (Android versionCode 13, iOS build 1).

Caracteristici principale

  • Import de oriunde — fișiere individuale sau foldere întregi via Files, scanare bibliotecă media audio (permisiuni granulare audio-only), browsere dedicate FTP și SMB (NTLMv2) cu previzualizare audio 4 min înainte de descărcare, catalog LibriVox cu descărcări directe
  • Player în backgroundreact-native-track-player 4 cu queue de capitole, redare pe ecran blocat, Bluetooth, căști, controale OS, auto-rewind configurabil (0/5/10/15/30s) la resume
  • Capitole inteligente — un fișier per capitol sau metadate embedded (.m4b chpl, ID3 CHAP via music-metadata); detecție naturală a ordinii + strip junk headers MPEG cu scanare strictă
  • Control fin — viteză 0.5×–3× memorată per carte, sărituri 10/15/30/60s, jump pe minute (10/15/30/45/60), scrubber cu live preview (PanResponder + Animated, fără re-render la drag)
  • Sleep timer persistent — preseturi 5–90 min, „sfârșit capitol” / „sfârșit carte”, stare supraviețuiește restartului și background-ului (PlayerContext)
  • Progres whole-book(completedMs + positionMs) / totalDurationMs peste toate fișierele, persistență la fiecare 5–10s + pause/seek/schimbare capitol
  • Marcaje (bookmarks) — orice moment exact, cu notă opțională, toleranță 5s la dedup
  • Coperte la alegere — pipeline embedded APIC → iTunes → Audible → Google Books → Open Library → procedural SVG; galerie candidați cu CoverPickerSheet, fallback imagine procedurală sau artwork base64 embedded
  • Chromecast + AirPlay — Google Cast SDK cu handoff complet + server HTTP audio local pe react-native-tcp-socket (loopback http:// în loc de file://), control AirPlay nativ
  • Gestionar descărcări — coadă persistentă manifest JSON, pauză/reluare byte-level, viteză EMA-smoothed, keep-alive + gard celular
  • Bibliotecă & stocare — Storage Manager (spațiu pe disc, fișiere orfane, ștergere cu fișiere), reimport orphaned, recompute durate VBR corupte, strategie copy vs reference (economie spațiu), share-intent Android + folder-picker iOS + document types public.audio/m4b/ogg/flac/...
  • Teme & i18n — system/light/dark + 4 accente (amber, terracotta, forest, indigo), LanguageProvider (system/en/ro), landscape support
  • Servere & backup — profiluri FTP/SMB în expo-secure-store (Keychain/Keystore), export/import JSON via share sheet, discovery rețea SMB + enumerare share-uri

Repere tehnice

  • Expo SDK 57 — React Native 0.86, React 19.2, TypeScript 6, New Architecture, expo-sqlite WAL + foreign_keys=ON, expo-file-system + expo-document-picker, expo-media-library granular audio
  • Track-player import dinamicawait import('react-native-track-player/lib/src/trackPlayer') în PlayerContext.ensurePlayerReady() pentru a evita crash New Architecture; src/services/rntp.ts reexportă doar State/Event/AppKilledPlaybackBehavior
  • Server HTTP audio localaudioServer.ts pe react-native-tcp-socket pentru Cast, strip audioOffset (junk headers detectat la import) la streaming
  • SMB pur JSv9u-smb2 adaptat via shim-uri Metro (nettcp-socket, crypto-browserify, js-md4/js-md5), discovery + shares + profil transfer
  • SQLite performant — tabele books/chapters/cover_candidates/bookmarks, acces sincron libraryStore.ts, migrații audio_offset via PRAGMA table_info, resync la foreground race, reparare stale paths iOS (container UUID)
  • Coperte din 4 API-uri — iTunes Search, Audible, Google Books (cheie opțională), Open Library; prioritate configurabilă, cache candidați, auto-pick toggle
  • NavigațieRootNavigator (NativeStack) + Tabs (Library / Player / Settings), 20 ecrane (Library, BookDetails, Player, Bookmarks, Import, ScanDevice, LibrivoxBrowse/Book, Downloads, Ftp/Smb profiles/browse/shares/discover, StorageManager, Settings, About)
  • Shims & polyfillsbuffer, crypto-browserify, stream-browserify, os-browserify, react-native-get-random-values, react-native-reanimated plugin last

Evoluții recente (v1.1 → v1.2.0)

Față de v1.0.5 (Expo SDK 56) documentat inițial:

  • Rebrand Campus Book PlayerCampus Audiobook Player + bump Expo 56→57
  • Multilanguage — traducere completă RO/EN cu pluralizare Hermes-safe
  • Bookmarking + rename carte cu sugestii din metadate + export carte
  • Previzualizare 4 min pe FTP/SMB înainte de import, multiple-line file browsers, toast test conexiune
  • Auto-discovery SMB, share auto-enumerare, warm-up conexiuni, hardening browse/resume/stall
  • Calcul durate VBR corectat pentru MP3 cu head trunchiat și MP4 trunchiate
  • ** profiluri server export/import** JSON, logs opt-in cu LogViewerSheet și export share
  • Sleep timer mutat în PlayerContext — supraviețuiește uciderii procesului
  • JumpToTimeSheet + quick-jump pe minute, scrubber live preview, PlayerExtraControls modularizat
  • Accesibilitate rafinată — slider-e anunțate, tab icons ascunse de screen reader, timp vorbit, empty-state CTA-uri
  • Stabilitate playback — retry setup pe foreground race, resume no-op pe cărți diferite, chapter overshoot fix, warm-resume overlay
  • Build stamping (withBuildDate), EAS production autoIncrement, intent-filter audio/* + VIEW BROWSABLE

Accesibilitate & calitate

Fiecare interacțiune are accessibilityRole/accessibilityLabel/accessibilityHint, haptics pe acțiuni cheie, teme fără culori hardcodate (useTheme()), StatusBar/SystemUI sincronizate cu tema. Testat TalkBack/VoiceOver pe ecrane reale, iPad inclus (supportsTablet: true, UISupportedInterfaceOrientations toate).

Politica de confidențialitate dedicată la /policies/audiobook-player.html — fără analytics/ads, credențiale doar în secure store, metadata doar ca query public către iTunes/Audible/Google/Open Library și LibriVox.

Aplicații

De pe blog

Redarea MP3-urilor corupte pe Android: Dincolo de Expo15 iul 2026Construirea unei librării media cross-platform pe mobil13 iul 2026