diff --git a/.github/workflows/build-check.yml b/.github/workflows/build-check.yml index 26f1720c6..07c7365cb 100644 --- a/.github/workflows/build-check.yml +++ b/.github/workflows/build-check.yml @@ -43,6 +43,8 @@ jobs: node ../netlify-arvio-tv-site/scripts/validate-localized-guides.mjs node --test ../netlify-arvio-tv-site/scripts/seo-guides.test.cjs node --test ../netlify-arvio-tv-site/scripts/premium-membership.test.cjs + node --test ../netlify-arvio-tv-site/scripts/premium-journey.test.cjs + node --test ../netlify-arvio-tv-site/collection-studio/starters.test.mjs - name: Check web types if: matrix.directory == 'web' run: npx tsc --noEmit diff --git a/docs/discovery-growth-2026-10-08.md b/docs/discovery-growth-2026-10-08.md new file mode 100644 index 000000000..25ef54a3a --- /dev/null +++ b/docs/discovery-growth-2026-10-08.md @@ -0,0 +1,92 @@ +# ARVIO discovery growth — 8 October 2026 + +## Scope +Incremental marketing-site and first-party report changes only. No Android or webapp runtime changes, prices, subscriptions, paid advertising, bought backlinks or automatic public posting. Reviewer messages below are drafts, not sent messages. Do not resubmit listings without checking for an existing listing/application first. + +## Evidence and priorities +Google Search Console's 28-day report covers 8 September–5 October: approximately 4,360 clicks and 19,700 impressions. A query filter excluding `arvio` shows 79 clicks / 1,191 impressions / average position 17.4, but includes misspellings and omits anonymized queries. It is not an exact non-brand share, keyword search-volume estimate or post-change evaluation. + +Small discovery signals: `android tv open source` (25 impressions, one click, position 7.8), `cinemeta alternative` (13 impressions, no clicks, position 8.0), and `servidor jellyfin android` (10 impressions, no clicks, position 10.9). The last query concerns a server, while ARVIO is a client: do not target it with a misleading server claim. + +Official competitor pages confirm that multi-source clients already exist (https://plezy.app/ and https://spectati.com/plex-jellyfin). This validates a product category, not keyword volume or ARVIO superiority. Improve existing pages before publishing additional keyword pages. Three candidates to evaluate next in Search Console: Jellyfin alternative client Android TV, Plex/Emby/Jellyfin one-app workflow, and compatible addon manifest setup. No commercial keyword-volume tool was used; no high-volume claim is made. + +Search guidance: https://developers.google.com/search/docs/fundamentals/creating-helpful-content and https://developers.google.com/search/docs/crawling-indexing/links-crawlable. Publish substantive help with accurate first-hand screenshots, not near-duplicate comparison pages or keyword stuffing. + +## Implementation +- Extend three existing English guides with decision/checklist sections and honest feature limits. Preserve their URLs, existing screenshots, FAQs, translated counterparts and navigation. +- Add three generated, public-safe Studio starter documents and read-only preview links. Separate discovery metadata from playable media, preserve edits in the original tab, and keep Studio network-free. +- Improve guide/tool links and browser/free-self-hosting/Premium choices. Do not imply an Android user needs to subscribe. +- Add bounded `guide_page_view` measurements and a `byLandingPage` report to the existing first-party funnel. No arbitrary path, collection fragment, email, cookie or browser storage is collected. Existing DNT/GPC opt-outs, deduplication and write ceilings stay in place. +- Keep Ko-fi subscription confirmation server-side. A direct purchase without a matched authenticated journey can remain unattributed; do not call it a tracked conversion merely because a visitor clicked Ko-fi. + +Studio visits and JSON downloads can be examined separately with Netlify analytics; Studio does not send marketing events. A visit/download alone does not prove import into the app. + +The guide counter is the number of measured transient journeys with a guide event, not unique visitors or a complete page-view total. The landing label belongs to the earliest observed event in the reporting window, not necessarily the visitor's original lifetime landing. Existing global and per-network write ceilings may undercount fast multi-step journeys; keep that limitation visible when comparing counts. + +## Crawl state observed +The aggregate indexing report was updated 4 October and must not be treated as real-time. Direct URL Inspection on 8 October: Stremio guide and clean media-kit URL indexed; Collection Studio, collections guide and self-hosting guide discovered but not indexed; browser-playback guide unknown. Check after production publishing; request indexing where eligible. A request does not guarantee indexing or ranking. + +## Distribution shortlist and draft messages +Verified contacts below come from the publisher's own pages. No audience-size, response, partnership or coverage guarantee is made. + +### AFTVnews — contact@aftvnews.com +Verified at https://www.aftvnews.com/contact/ on 8 October. Relevant Fire TV / Android TV / TV app audience. Use a Fire OS device; do not claim compatibility with Vega OS. No existing-message check was possible: Gmail search returned RATE_LIMIT_EXCEEDED, although the connected profile is arvio.app@gmail.com. Check sent mail before sending this draft. + +Subject: ARVIO: free Android TV media hub and a shareable collection builder + +Hi Elias, + +I'm the developer behind ARVIO, an independent media hub for Android TV and Android. It connects users' own Jellyfin, Plex and Emby libraries, with supported live TV sources and custom Home collections. + +A possible angle for your readers is Collection Studio: a free, no-account browser tool that turns TMDB discovery presets or public lists into an importable Home row. We've added three ready-to-use examples. No media or streaming subscriptions are included. + +Website and device-specific setup: https://arvio.tv/fire-tv-media-player/?utm_source=aftvnews&utm_medium=outreach&utm_campaign=discovery-oct2026 +Collection examples: https://arvio.tv/collection-studio/#examples +Screenshots: https://arvio.tv/media-kit/ +Short testing/recording outline: https://arvio.tv/media-kit/reviewer-brief.txt +Official APK/source: https://github.com/ProdigyV21/ARVIO + +The Android app and self-hosted web version are free; optional managed browser hosting is $2.99/month. I'd welcome independent feedback if you think it's a fit. There's no payment or required positive coverage attached to this invitation. + +Best, +ARVIO +arvio.app@gmail.com + +### AndroidTVNews — contact form +Verified at https://androidtvnews.com/contact/ on 8 October. Do not invent an email address. Draft not submitted. + +Subject: A free Android TV client for existing Jellyfin, Plex and Emby libraries + +Hi AndroidTVNews team, + +I develop ARVIO, an independent Android TV media hub. If you cover alternative media-server clients, one useful angle is keeping Jellyfin, Plex and Emby connections in one interface without migrating the server libraries. Connections remain separate; ARVIO does not promise a merged or automatically deduplicated database. + +The Android app is free and users bring their own media. Our setup guide includes the actual app screenshot, a first-session checklist and limitations: https://arvio.tv/plex-emby-jellyfin/?utm_source=androidtvnews&utm_medium=outreach&utm_campaign=discovery-oct2026 + +Screenshots and source: https://arvio.tv/media-kit/ and https://github.com/ProdigyV21/ARVIO +Testing outline: https://arvio.tv/media-kit/reviewer-brief.txt + +Would this be useful for an independent review or setup tutorial? No paid placement or positive review is requested. + +Best, +ARVIO +arvio.app@gmail.com + +### selfh.st — newsletter submission candidate, not a duplicate directory submission +Official form: https://selfh.st/submit/. Directory rules: https://selfh.st/apps-about/. Previous directory submission was authorized in this chat, but no current acceptance or rejection was verified. Do not claim it is listed or send a duplicate. The new collection examples could be pitched as a companion-tool update only if the newsletter form's current criteria permit it. + +Draft: ARVIO's free Collection Studio builds a personal Home row from authored TMDB discovery queries or public MDBList / numeric Trakt list references. Three starter templates can be previewed, customized and exported to JSON without an account. The tool makes no source requests or uploads; share links encode public-safe collection definitions. It complements the free Android client and self-hostable web version; no media is included. https://arvio.tv/collection-studio/#examples — source: https://github.com/ProdigyV21/ARVIO + +### Existing listing confirmed +AlternativeTo is already live: https://alternativeto.net/software/arvio/about/ (added 3 October). Its body correctly describes free Android / free self-hosting versus optional hosting. Its pricing summary describes the free tier as having limited functionality: worth clarifying with the directory rather than resubmitting or asking for fake reviews. No external edit made in this task. + +## Measurement and evaluation +- First complete 28-day baseline above is pre-change; keep it separate from the post-release window. +- Review discovery impressions and clicks after 7 complete days for crawl/measurement issues; 28 complete days for an initial traffic comparison. More time may be needed for rankings. +- Compare the same complete-day lengths, separate brand/misspellings from discovery terms, and inspect device/country mix. Do not infer causality from a before/after total alone. +- Compare guide landings, Premium views, membership clicks, connected trials, confirmed NEW subscriptions and observed paid access. Renewals are not new conversions. +- Do not calculate a Ko-fi conversion rate by dividing memberships by all site visits: attribution coverage, blockers and direct purchases differ. +- Add no automation/reminders unless the user asks. No broad ads until subscriber lifetime value and actual acquisition costs can be evaluated. + +## Release and verification +Fill in production/PR references only after tests, publication and live verification succeed. Backend must be deployed before the site starts emitting guide events. Deploy neither secrets nor local research artifacts. Google and reviewer outcomes remain outside ARVIO's control. diff --git a/netlify-arvio-tv-site/assets/premium-journey.js b/netlify-arvio-tv-site/assets/premium-journey.js index 991795db3..f06d617c4 100644 --- a/netlify-arvio-tv-site/assets/premium-journey.js +++ b/netlify-arvio-tv-site/assets/premium-journey.js @@ -11,13 +11,36 @@ const clean = value => /^[a-z0-9._-]{1,80}$/i.test(value || '') ? value.toLowerCase() : ''; let referrer = ''; try { referrer = clean(new URL(document.referrer).hostname); } catch {} + const organicReferrer = /^(?:www\.)?google\.(?:com|[a-z]{2}|com\.[a-z]{2}|co\.[a-z]{2})$/.test(referrer) || + ['www.bing.com', 'bing.com', 'duckduckgo.com', 'www.duckduckgo.com'].includes(referrer); const campaign = { source: clean(here.searchParams.get('utm_source')) || referrer || 'direct', - medium: clean(here.searchParams.get('utm_medium')) || (referrer ? 'referral' : 'direct'), + medium: clean(here.searchParams.get('utm_medium')) || (organicReferrer ? 'organic' : referrer ? 'referral' : 'direct'), campaign: clean(here.searchParams.get('utm_campaign')) || 'premium', content: clean(here.searchParams.get('utm_content')) || '', }; - const page = /\/premium\/?$/.test(here.pathname) ? 'premium' : 'home'; + // Bounded editorial route labels only, never arbitrary paths, queries or hashes. + // Studio intentionally keeps its network-free CSP and is not instrumented. + const guides = { + '/guides/': 'guides', '/android-tv-media-hub/': 'android', + '/jellyfin-android-tv/': 'jellyfin', '/plex-emby-jellyfin/': 'servers', + '/stremio-addons-android-tv/': 'addons', '/debrid-usenet-android-tv/': 'debrid', + '/trakt-simkl-sync/': 'tracking', '/live-tv-epg/': 'live', + '/ai-subtitles-android-tv/': 'subtitles', '/fire-tv-media-player/': 'firetv', + '/arvio-web/': 'browser', '/collections-catalogs/': 'collections', + '/self-host-arvio-web/': 'selfhost', '/browser-playback-guide/': 'playback', + '/pt-br/guias/': 'guides', '/es/guias/': 'guides', + '/pt-br/jellyfin-android-tv/': 'jellyfin', '/es/jellyfin-android-tv/': 'jellyfin', + '/pt-br/plex-emby-jellyfin/': 'servers', '/es/plex-emby-jellyfin/': 'servers', + '/pt-br/central-midia-android-tv/': 'android', '/es/centro-multimedia-android-tv/': 'android', + '/pt-br/arvio-web/': 'browser', '/es/arvio-web/': 'browser', + '/pt-br/arvio-fire-tv/': 'firetv', '/es/arvio-fire-tv/': 'firetv', + '/pt-br/debrid-usenet-android-tv/': 'debrid', '/es/debrid-usenet-android-tv/': 'debrid', + '/pt-br/sincronizacao-trakt-simkl/': 'tracking', '/es/sincronizacion-trakt-simkl/': 'tracking', + '/pt-br/tv-ao-vivo-epg/': 'live', '/es/tv-en-vivo-epg/': 'live', + '/pt-br/legendas-ia-android-tv/': 'subtitles', '/es/subtitulos-ia-android-tv/': 'subtitles', + }; + const page = /\/premium\/?$/.test(here.pathname) ? 'premium' : guides[here.pathname] || 'home'; const sent = new Set(); function record(eventName, placement) { if (sent.has(eventName)) return; @@ -73,4 +96,5 @@ document.addEventListener('click', clicked, { capture: true }); document.addEventListener('auxclick', clicked, { capture: true }); if (page === 'premium') record('premium_page_view'); + else if (guides[here.pathname]) record('guide_page_view'); })(); diff --git a/netlify-arvio-tv-site/collection-studio/examples/animation-scifi.json b/netlify-arvio-tv-site/collection-studio/examples/animation-scifi.json new file mode 100644 index 000000000..b652495f2 --- /dev/null +++ b/netlify-arvio-tv-site/collection-studio/examples/animation-scifi.json @@ -0,0 +1,45 @@ +[ + { + "id": "studio-row", + "title": "Animation and sci-fi", + "folders": [ + { + "id": "animation", + "title": "Animated movies", + "description": "Animated movies with at least 100 votes. Not age-filtered.", + "tileShape": "LANDSCAPE", + "sources": [ + { + "provider": "tmdb", + "tmdbSourceType": "DISCOVER", + "mediaType": "MOVIE", + "sortBy": "popularity.desc", + "filters": { + "withGenres": "16", + "voteCountGte": 100 + } + } + ] + }, + { + "id": "scifi", + "title": "Science fiction", + "description": "Science fiction rated 6+ with at least 100 votes.", + "tileShape": "LANDSCAPE", + "sources": [ + { + "provider": "tmdb", + "tmdbSourceType": "DISCOVER", + "mediaType": "MOVIE", + "sortBy": "popularity.desc", + "filters": { + "withGenres": "878", + "voteCountGte": 100, + "voteAverageGte": 6 + } + } + ] + } + ] + } +] diff --git a/netlify-arvio-tv-site/collection-studio/examples/highly-rated.json b/netlify-arvio-tv-site/collection-studio/examples/highly-rated.json new file mode 100644 index 000000000..c1514d8a7 --- /dev/null +++ b/netlify-arvio-tv-site/collection-studio/examples/highly-rated.json @@ -0,0 +1,44 @@ +[ + { + "id": "studio-row", + "title": "Highly rated picks", + "folders": [ + { + "id": "movies", + "title": "Highly rated movies", + "description": "Rating 7+ and at least 1,000 votes, sorted by rating.", + "tileShape": "LANDSCAPE", + "sources": [ + { + "provider": "tmdb", + "tmdbSourceType": "DISCOVER", + "mediaType": "MOVIE", + "sortBy": "vote_average.desc", + "filters": { + "voteCountGte": 1000, + "voteAverageGte": 7 + } + } + ] + }, + { + "id": "shows", + "title": "Highly rated shows", + "description": "Rating 7+ and at least 500 votes, sorted by rating.", + "tileShape": "LANDSCAPE", + "sources": [ + { + "provider": "tmdb", + "tmdbSourceType": "DISCOVER", + "mediaType": "TV", + "sortBy": "vote_average.desc", + "filters": { + "voteCountGte": 500, + "voteAverageGte": 7 + } + } + ] + } + ] + } +] diff --git a/netlify-arvio-tv-site/collection-studio/examples/weekend.json b/netlify-arvio-tv-site/collection-studio/examples/weekend.json new file mode 100644 index 000000000..114267c16 --- /dev/null +++ b/netlify-arvio-tv-site/collection-studio/examples/weekend.json @@ -0,0 +1,62 @@ +[ + { + "id": "studio-row", + "title": "Weekend discoveries", + "folders": [ + { + "id": "cinema", + "title": "Cinema night", + "description": "Highly rated movies with at least 1,000 votes.", + "tileShape": "LANDSCAPE", + "sources": [ + { + "provider": "tmdb", + "tmdbSourceType": "DISCOVER", + "mediaType": "MOVIE", + "sortBy": "vote_average.desc", + "filters": { + "voteCountGte": 1000, + "voteAverageGte": 7 + } + } + ] + }, + { + "id": "episodes", + "title": "One more episode", + "description": "Popular shows with at least 100 votes.", + "tileShape": "LANDSCAPE", + "sources": [ + { + "provider": "tmdb", + "tmdbSourceType": "DISCOVER", + "mediaType": "TV", + "sortBy": "popularity.desc", + "filters": { + "voteCountGte": 100 + } + } + ] + }, + { + "id": "scifi", + "title": "Beyond the ordinary", + "description": "Science fiction rated 6+ with at least 100 votes.", + "tileShape": "LANDSCAPE", + "sources": [ + { + "provider": "tmdb", + "tmdbSourceType": "DISCOVER", + "mediaType": "MOVIE", + "sortBy": "popularity.desc", + "filters": { + "withGenres": "878", + "voteCountGte": 100, + "voteAverageGte": 6 + } + } + ] + } + ] + } +] diff --git a/netlify-arvio-tv-site/collection-studio/index.html b/netlify-arvio-tv-site/collection-studio/index.html index acc151dc3..89794162b 100644 --- a/netlify-arvio-tv-site/collection-studio/index.html +++ b/netlify-arvio-tv-site/collection-studio/index.html @@ -4,12 +4,17 @@ Collection Studio — Create and share an ARVIO Home row - + - + + + + + + @@ -24,8 +29,9 @@

Your taste, beautifully organized

-

A good collection
is worth sharing.

+

Your ARVIO collection.
Made to share.

Turn a few favorite lists into a Home row of your own. Give it a name, arrange its folders, and pass it on.

+ Browse starter collections
@@ -71,6 +77,13 @@

A good collection
is worth sharing.

+

The next chapter

Put your collection
where you watch.

A collection organizes metadata. No playable media is included. Sender and recipient each use their own sources they are authorized to access.

1

Copy your JSON

Use Copy JSON above. A downloaded file is useful for sharing or hosting; direct file uploads into ARVIO are not currently supported.

2

Import it in ARVIO

On Android, open Settings → Catalogs → Import Catalog Pack / Collections and paste the JSON. On ARVIO Web, open Settings → Catalogs (Home Rows), paste it into Collection, and choose Import collections.

3

Find your new Home row

Open a folder to browse its titles. Public list access and service availability are required; Studio cannot verify them. Import into the profile you want to use.

Read the collection guide
diff --git a/netlify-arvio-tv-site/collection-studio/starters.mjs b/netlify-arvio-tv-site/collection-studio/starters.mjs new file mode 100644 index 000000000..644e14d2d --- /dev/null +++ b/netlify-arvio-tv-site/collection-studio/starters.mjs @@ -0,0 +1,28 @@ +import { validateDraft } from './studio-core.mjs'; + +// Authored discovery queries only: no private lists, tokens or playable media. +const folder = (id, title, description, theme, preset) => ({ + id, title, description, theme, source: { kind: 'tmdb', preset } +}); +export const STARTERS = [ + { id: 'weekend', title: 'Weekend discoveries', description: 'A movie night, a new series and a little science fiction.', draft: { + version: 1, title: 'Weekend discoveries', folders: [ + folder('cinema', 'Cinema night', 'Highly rated movies with at least 1,000 votes.', 'sage', 'movie-acclaimed'), + folder('episodes', 'One more episode', 'Popular shows with at least 100 votes.', 'plum', 'tv-popular'), + folder('scifi', 'Beyond the ordinary', 'Science fiction rated 6+ with at least 100 votes.', 'ocean', 'movie-scifi') + ] + } }, + { id: 'highly-rated', title: 'Highly rated picks', description: 'Two focused folders for well-rated movies and series.', draft: { + version: 1, title: 'Highly rated picks', folders: [ + folder('movies', 'Highly rated movies', 'Rating 7+ and at least 1,000 votes, sorted by rating.', 'sage', 'movie-acclaimed'), + folder('shows', 'Highly rated shows', 'Rating 7+ and at least 500 votes, sorted by rating.', 'plum', 'tv-acclaimed') + ] + } }, + { id: 'animation-scifi', title: 'Animation and sci-fi', description: 'Genre discovery for animation and science-fiction fans.', draft: { + version: 1, title: 'Animation and sci-fi', folders: [ + folder('animation', 'Animated movies', 'Animated movies with at least 100 votes. Not age-filtered.', 'ember', 'movie-animation'), + folder('scifi', 'Science fiction', 'Science fiction rated 6+ with at least 100 votes.', 'ocean', 'movie-scifi') + ] + } } +]; +for (const starter of STARTERS) validateDraft(starter.draft); diff --git a/netlify-arvio-tv-site/collection-studio/starters.test.mjs b/netlify-arvio-tv-site/collection-studio/starters.test.mjs new file mode 100644 index 000000000..5596e51f1 --- /dev/null +++ b/netlify-arvio-tv-site/collection-studio/starters.test.mjs @@ -0,0 +1,31 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import { STARTERS } from './starters.mjs'; +import { encodeShare, decodeShare, createCollectionDocument, serializeCollections, validateDraft } from './studio-core.mjs'; + +const html = fs.readFileSync(new URL('./index.html', import.meta.url), 'utf8'); +test('all authored starters round-trip through sharing and match generated importer documents', () => { + assert.equal(new Set(STARTERS.map(s => s.id)).size, 3); + for (const starter of STARTERS) { + assert.deepEqual(decodeShare(encodeShare(starter.draft)), validateDraft(starter.draft)); + const exported = fs.readFileSync(new URL(`./examples/${starter.id}.json`, import.meta.url), 'utf8'); + assert.deepEqual(JSON.parse(exported), createCollectionDocument(starter.draft)); + assert.equal(exported.trim(), serializeCollections(starter.draft)); + assert.ok(starter.draft.folders.every(f => f.source.kind === 'tmdb')); + assert.ok(html.includes(`href="/collection-studio/${encodeShare(starter.draft)}" target="_blank" rel="noopener"`)); + assert.ok(html.includes(`href="/collection-studio/examples/${starter.id}.json" download`)); + } +}); +test('Studio has crawlable useful examples and truthful metadata without enabling network access', () => { + assert.match(html, /id="examples"/); + assert.match(html, /not fixed movie lists/); + assert.match(html, /not an import URL/); + assert.match(html, /connect-src 'none'/); + const schema = JSON.parse(html.match(/ @@ -34,7 +34,7 @@

Make Home your own

Collections and catalogs

Create folders of movies and shows, add your favorite lists, and organize them into your own Home rows. Build in your browser with Collection Studio, or start with the ready-to-import JSON example.

-

Updated 2 October 2026 · Android TV, Android mobile and ARVIO Web

+

Updated 8 October 2026 · Android TV, Android mobile and ARVIO Web

@@ -48,6 +48,7 @@

Which one do you need?

1. Create

Start with a working collection

Build in Collection Studio

+

Want to try a complete example first? Open Weekend discoveries, Highly rated picks, or Animation and sci-fi. Preview one without changing your current draft, make your own copy, or download its ready-to-import JSON. The queries supply discovery metadata, not media files.

Open Collection Studio to name one Home row, add up to eight folders, choose a TMDB discovery preset or a public MDBList or numeric Trakt list, and preview the layout. It runs in your browser without an account.

Choose Copy JSON and paste that text into ARVIO using the import steps below. You can also download collections.json or share a public preview link. A preview link opens Studio; it does not import into ARVIO. The colored gradients are preview styles, not artwork included in the import.

Studio checks the supported format but does not fetch list contents or verify that a list is public or available. Anyone with the preview link can read its names, descriptions and list references. Include only information you are comfortable sharing.

diff --git a/netlify-arvio-tv-site/guides/guide.css b/netlify-arvio-tv-site/guides/guide.css index 11082af83..a063e4ea3 100644 --- a/netlify-arvio-tv-site/guides/guide.css +++ b/netlify-arvio-tv-site/guides/guide.css @@ -752,6 +752,8 @@ h1 { /* Setup guides and the screenshot media kit. */ .guide-reading{max-width:850px}.guide-updated,figcaption{color:var(--muted);font-size:13px;line-height:1.7}.guide-jump{display:flex;flex-wrap:wrap;gap:12px 24px;margin-top:24px}.guide-capture{margin:0}.guide-capture img{width:100%;height:auto;display:block;border-radius:18px}.guide-capture figcaption{margin-top:12px}.setup-list{padding-left:28px}.setup-list li{padding:10px 0 18px 16px}.setup-list li::marker{color:var(--accent);font-weight:700}.setup-list h3{margin-bottom:10px}.setup-list p{line-height:1.8;color:var(--muted)}.kit-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:28px}.kit-grid img{width:100%;height:auto;border-radius:12px}.kit-grid figure{margin:0}.guide-intro h1{max-width:1000px}.guide-intro .actions{margin-top:24px}.note .actions{margin:24px 0}a:focus-visible{outline:2px solid var(--accent);outline-offset:5px}@media(max-width:640px){.kit-grid{grid-template-columns:1fr}.setup-list li{padding-left:4px}.guide-intro h1{font-size:40px;line-height:1.12}} +.decision-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px;margin:24px 0}.decision-list article{padding:22px;border:1px solid var(--line);border-radius:14px;background:var(--surface);min-width:0}.decision-list h3{margin-top:0}.decision-list p:last-child{margin-bottom:0}@media(max-width:640px){.decision-list{grid-template-columns:1fr}.decision-list article{padding:18px}} + /* Commands and a readable, scrollable troubleshooting table. */ .practical-guide .guide-intro h1{font-size:clamp(38px,5.2vw,64px);line-height:1.12}.practical-guide .guide-intro{padding-bottom:48px}.practical-guide .guide-reading h3{font-size:23px;line-height:1.35}.practical-guide .guide-reading p{color:var(--muted)}.practical-guide .guide-reading a{color:var(--text)} .guide-code{max-width:100%;margin:18px 0;padding:20px 22px;overflow-x:auto;background:var(--surface);border:1px solid var(--line);border-radius:12px;font-size:14px;line-height:1.8;tab-size:2}.guide-code code{white-space:pre;overflow-wrap:normal}.guide-reading p code{font-size:.92em;overflow-wrap:anywhere;color:var(--accent-strong)}.guide-table-wrap{max-width:100%;overflow-x:auto;border:1px solid var(--line);border-radius:14px}.guide-table{width:100%;min-width:540px;border-collapse:collapse;text-align:left}.guide-table th,.guide-table td{padding:20px 24px;vertical-align:top;border-bottom:1px solid var(--line)}.guide-table thead{background:var(--surface)}.guide-table tbody th{width:32%;font-size:15px}.guide-table td{color:var(--muted)}.guide-table tr:last-child th,.guide-table tr:last-child td{border-bottom:0}.guide-table-wrap:focus-visible{outline:2px solid var(--accent);outline-offset:5px}@media(max-width:640px){.guide-code{padding:16px;font-size:12px}.guide-table th,.guide-table td{padding:16px}.guide-table{min-width:500px}} diff --git a/netlify-arvio-tv-site/guides/index.html b/netlify-arvio-tv-site/guides/index.html index 92ac84ad4..6792b138f 100644 --- a/netlify-arvio-tv-site/guides/index.html +++ b/netlify-arvio-tv-site/guides/index.html @@ -93,7 +93,7 @@

Create collections and add catalogs

Build and share

Collection Studio

-

Design one Home row with up to eight folders, copy its JSON for ARVIO, and share a public preview link. No account required.

+

Try three ready-to-use discovery collections, customize up to eight folders, export JSON and share a preview. Free, with no account required.

Start here diff --git a/netlify-arvio-tv-site/jellyfin-android-tv/index.html b/netlify-arvio-tv-site/jellyfin-android-tv/index.html index eedd364cf..90612ec62 100644 --- a/netlify-arvio-tv-site/jellyfin-android-tv/index.html +++ b/netlify-arvio-tv-site/jellyfin-android-tv/index.html @@ -32,7 +32,7 @@ { "@context": "https://schema.org", "@graph": [ - {"@type":"TechArticle","headline":"A Jellyfin client for Android TV and Google TV.","description":"Use ARVIO as a free Jellyfin client on Android TV and Google TV. Connect with a password or Quick Connect, browse libraries and troubleshoot playback.","dateModified":"2026-10-05","author":{"@type":"Organization","name":"ARVIO"},"url":"https://arvio.tv/jellyfin-android-tv/","image":"https://arvio.tv/assets/screenshots-v2/tv/04-homeserver.webp"}, + {"@type":"TechArticle","headline":"A Jellyfin client for Android TV and Google TV.","description":"Use ARVIO as a free Jellyfin client on Android TV and Google TV. Connect with a password or Quick Connect, browse libraries and troubleshoot playback.","dateModified":"2026-10-08","author":{"@type":"Organization","name":"ARVIO"},"url":"https://arvio.tv/jellyfin-android-tv/","image":"https://arvio.tv/assets/screenshots-v2/tv/04-homeserver.webp"}, {"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"ARVIO","item":"https://arvio.tv/"},{"@type":"ListItem","position":2,"name":"Guides","item":"https://arvio.tv/guides/"},{"@type":"ListItem","position":3,"name":"Jellyfin on Android TV","item":"https://arvio.tv/jellyfin-android-tv/"}]}, {"@type":"FAQPage","mainEntity":[ {"@type":"Question","name":"Is ARVIO a free alternative to the Jellyfin Android TV app?","acceptedAnswer":{"@type":"Answer","text":"Yes. ARVIO is a free, open-source Android client that can connect to a Jellyfin server, alongside other supported sources. It is an independent project, not the official Jellyfin app. You still need your own server access and media; Premium hosting is not required for the Android app."}}, @@ -57,12 +57,24 @@

A Jellyfin client for Android TV and Google TV.

Looking for an alternative way to use Jellyfin on your TV? ARVIO connects to your existing server, lets you browse its movie and series libraries, and offers one interface for Jellyfin alongside Plex, Emby and compatible addons. Your server still holds your files and controls access.

-

Updated 5 October 2026 · By the ARVIO project

- +

Updated 8 October 2026 · By the ARVIO project

+
ARVIO Android TV Library with a Jellyfin server, Movies and Shows libraries, search and filters
ARVIO's Homeserver view on Android TV. This existing app screenshot shows an example library; no titles or server access are included.
+
+

Choose a client, keep your server

ARVIO or the official Jellyfin Android TV app?

+

ARVIO is an independent alternative client, not a replacement Jellyfin server. The useful difference is access to several kinds of source from one app, rather than a promise of better playback on every TV.

+
+

Only need your Jellyfin library?

The official Jellyfin clients are a sensible starting point. Keep a working client installed while testing another one.

+

Use Jellyfin alongside Plex, Emby or addons?

Try ARVIO's multi-server workflow. Connections remain separate; it does not merge databases or deduplicate the same film across servers.

+

Want custom discovery rows?

Try a ready-to-use Home collection with TMDB discovery. A discovery result is metadata, not proof that your Jellyfin server contains that title.

+

Need Trakt or Simkl tracking?

Read the watch-tracking setup and sync limits. An ARVIO tracking connection is not a Jellyfin server plugin, and does not guarantee full two-way watched-state sync.

+
+

Before switching: test one movie and one episode from your own library, including the audio track and subtitles you normally use. Check resume behavior in both clients. The Android app is free; buying hosted Web access is not required for this test.

+
+

An alternative client, not a new server

When ARVIO fits a Jellyfin setup.

Try ARVIO if you want to browse a Jellyfin library in the same Android app as other media sources. There is no need to migrate the library or replace your Jellyfin installation.

@@ -105,6 +117,7 @@

Jellyfin Quick Connect: sign in without typing a password on TV.

Related guides

Build on your Jellyfin setup.

+

Need access from a laptop or iPad too?

ARVIO Web is a browser companion with different networking and codec limits. Self-host it for free, or choose $2.99/month managed hosting if you want us to run it. Hosting does not include a Jellyfin server or media.

Use the browser playback checklist before subscribing.

Try ARVIO with your Jellyfin library.

The Android app is free and open source. Bring your own server and media.

diff --git a/netlify-arvio-tv-site/media-kit/reviewer-brief.txt b/netlify-arvio-tv-site/media-kit/reviewer-brief.txt new file mode 100644 index 000000000..1df68c68a --- /dev/null +++ b/netlify-arvio-tv-site/media-kit/reviewer-brief.txt @@ -0,0 +1,35 @@ +ARVIO — independent reviewer brief +Updated: 8 October 2026 + +Website: https://arvio.tv/ +Screenshots and downloadable kit: https://arvio.tv/media-kit/ +Android release: https://github.com/ProdigyV21/ARVIO/releases/latest +Google Play: https://play.google.com/store/apps/details?id=com.arvio.tv +Source: https://github.com/ProdigyV21/ARVIO +Contact: arvio.app@gmail.com + +What it is +An independent media hub for Android TV, Google TV and Android mobile, with a browser companion. Connect your own Jellyfin, Plex or Emby server; add supported sources and organize discovery rows. ARVIO is not affiliated with those projects. No movies, channels, streaming accounts or third-party subscriptions are included. + +Pricing +The Android app is free. The browser version can be self-hosted for free. Optional managed browser hosting is $2.99/month. Hosting is not an Android feature unlock and cannot guarantee that a source will work. Check the current Premium page for trial and membership terms: https://arvio.tv/premium/ + +A short demonstration you can record yourself +1. Install the official Android release on a supported device. Show Home navigation with a remote; do not use an included screenshot as proof of a test on your device. +2. In Settings > Home Server, connect a test account on your own Jellyfin server. Open Library > Homeserver, browse a library and test one film or episode you may legally play. Check audio, subtitles and resume. +3. If you run Plex or Emby as well, add a separately named connection. Explain that this is one interface for separate libraries, not a guaranteed merged/deduplicated database. +4. Open https://arvio.tv/collection-studio/#examples in a browser. Preview a starter, choose Make your own copy and rename a folder. Copy JSON and use ARVIO's collection importer. The Studio link itself is not an import URL. +5. Explain discovery versus playback: a collection lists metadata; the viewer supplies authorized sources. Browser codecs and networking differ from Android. Describe anything that fails on your tested setup. + +Choose the part relevant to your audience; all five steps are not required for a short clip. This is a recording outline, not an existing video or a guarantee that setup takes a particular number of seconds. + +Useful setup pages +Jellyfin: https://arvio.tv/jellyfin-android-tv/ +Plex / Emby / Jellyfin: https://arvio.tv/plex-emby-jellyfin/ +Stremio-compatible manifests: https://arvio.tv/stremio-addons-android-tv/ +Fire TV compatibility: https://arvio.tv/fire-tv-media-player/ +Free self-hosting: https://arvio.tv/self-host-arvio-web/ +Browser playback checks: https://arvio.tv/browser-playback-guide/ + +Safety and editorial notes +Use your own test library. Hide passwords, configured addon URLs, server addresses, private lists and account details from recordings. Studio starters use only authored TMDB discovery queries; results are dynamic and not age-filtered. No paid placement, affiliate commission or required positive coverage is offered by this brief. Ask for permission before using anyone else's footage or artwork outside the context of the app screenshots. diff --git a/netlify-arvio-tv-site/plex-emby-jellyfin/index.html b/netlify-arvio-tv-site/plex-emby-jellyfin/index.html index 4561a8559..0c50ce0f3 100644 --- a/netlify-arvio-tv-site/plex-emby-jellyfin/index.html +++ b/netlify-arvio-tv-site/plex-emby-jellyfin/index.html @@ -32,7 +32,7 @@ { "@context":"https://schema.org", "@graph":[ - {"@type":"TechArticle","headline":"Plex, Emby and Jellyfin in one Android TV app.","description":"Connect Plex, Emby and Jellyfin in one Android TV app. Set up separate servers in ARVIO, browse their libraries and understand Android versus web sign-in.","dateModified":"2026-10-05","author":{"@type":"Organization","name":"ARVIO"},"url":"https://arvio.tv/plex-emby-jellyfin/","image":"https://arvio.tv/assets/screenshots-v2/tv/04-homeserver.webp"}, + {"@type":"TechArticle","headline":"Plex, Emby and Jellyfin in one Android TV app.","description":"Connect Plex, Emby and Jellyfin in one Android TV app. Set up separate servers in ARVIO, browse their libraries and understand Android versus web sign-in.","dateModified":"2026-10-08","author":{"@type":"Organization","name":"ARVIO"},"url":"https://arvio.tv/plex-emby-jellyfin/","image":"https://arvio.tv/assets/screenshots-v2/tv/04-homeserver.webp"}, {"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"ARVIO","item":"https://arvio.tv/"},{"@type":"ListItem","position":2,"name":"Guides","item":"https://arvio.tv/guides/"},{"@type":"ListItem","position":3,"name":"Plex, Emby and Jellyfin","item":"https://arvio.tv/plex-emby-jellyfin/"}]}, {"@type":"FAQPage","mainEntity":[ {"@type":"Question","name":"Can I connect Plex, Emby and Jellyfin at the same time?","acceptedAnswer":{"@type":"Answer","text":"Yes. ARVIO supports multiple saved home-server connections. Add each server separately and choose its library in the Library screen. Each server keeps its own files, accounts, permissions and library organization."}}, @@ -57,12 +57,24 @@

Plex, Emby and Jellyfin in one Android TV app.

Use ARVIO to access your Plex, Emby and Jellyfin libraries without changing server software or moving your files. Save each connection, give it a recognizable name and browse its libraries from the same Android TV, Google TV or Android mobile app.

Get the free Android appConnect your servers
-

Updated 5 October 2026 · By the ARVIO project

- +

Updated 8 October 2026 · By the ARVIO project

+
ARVIO Homeserver library on Android TV showing a named Jellyfin server, Movies and Shows, and a Connect server option
Existing ARVIO Android TV screenshot showing a Jellyfin connection. Other servers are added separately; the example titles are not included with ARVIO.
+
+

A practical first session

Try two servers before moving your routine.

+

You do not need to move files, rebuild libraries or stop using your existing clients. Install ARVIO beside them and check the workflow with media you are authorized to access.

+
    +
  1. Name each connection clearly

    Use names such as “Living room Jellyfin” and “Plex library.” Add one server first, open a known title, then add the second. Your server password belongs in the app's connection form, never a shareable collection.

  2. +
  3. Check which library you are browsing

    Open Library → Homeserver and select the server and library. The same movie on two servers stays in separate libraries; ARVIO does not promise a merged, automatically deduplicated library.

  4. +
  5. Test the details that matter to you

    Play a movie and an episode; check sound, subtitles and returned media versions. Leave and reopen the title to check resume. Do not infer full two-way server sync from one successful playback.

  6. +
  7. Add discovery separately

    A Home collection can organize TMDB discovery or public lists. It does not create a server library or guarantee a playable source for every result. Configure Trakt or Simkl only if you want that additional tracking connection.

  8. +
+

The Android app is free. Browser use has separate setup and playback limits, with a choice of free self-hosting or optional managed hosting.

+
+

Android TV, Google TV and Android mobile

How to connect each media server.

Install ARVIO from Google Play or the official APK release. You need an account authorized to access each server and an address the device can reach. Prefer HTTPS and include any required port or reverse-proxy base path.

diff --git a/netlify-arvio-tv-site/scripts/build-studio-starters.mjs b/netlify-arvio-tv-site/scripts/build-studio-starters.mjs new file mode 100644 index 000000000..407d82cc9 --- /dev/null +++ b/netlify-arvio-tv-site/scripts/build-studio-starters.mjs @@ -0,0 +1,20 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { STARTERS } from '../collection-studio/starters.mjs'; +import { encodeShare, serializeCollections } from '../collection-studio/studio-core.mjs'; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const escape = value => String(value).replace(/[&<>"']/g, c => ({'&':'&', '<':'<', '>':'>', '"':'"', "'":'''}[c])); +const cards = STARTERS.map(starter => { + const jsonPath = `/collection-studio/examples/${starter.id}.json`; + fs.mkdirSync(path.join(root, 'collection-studio/examples'), { recursive: true }); + fs.writeFileSync(path.join(root, jsonPath), serializeCollections(starter.draft) + '\n'); + return `

${starter.draft.folders.length} discovery folders

${escape(starter.title)}

${escape(starter.description)}

    ${starter.draft.folders.map(f => `
  • ${escape(f.title)}
  • `).join('')}
`; +}).join('\n'); +const file = path.join(root, 'collection-studio/index.html'); +const source = fs.readFileSync(file, 'utf8'); +const marker = /[\s\S]*?/; +if (!marker.test(source)) throw Error('Missing Studio starter markers'); +fs.writeFileSync(file, source.replace(marker, `\n${cards}\n`)); +console.log(`Built ${STARTERS.length} public-safe Studio previews and JSON files.`); diff --git a/netlify-arvio-tv-site/scripts/premium-journey.test.cjs b/netlify-arvio-tv-site/scripts/premium-journey.test.cjs index 32aa3c04b..59cbae514 100644 --- a/netlify-arvio-tv-site/scripts/premium-journey.test.cjs +++ b/netlify-arvio-tv-site/scripts/premium-journey.test.cjs @@ -51,7 +51,7 @@ test('content hrefs remain clean before activation, even with an incoming campai const result = run({ url: `https://arvio.tv/arvio-web/?arvio_journey=${id}&utm_source=reddit&utm_campaign=guides`, destinations: ['/guides/', '/premium/?lang=nl#plans', 'https://web.arvio.tv/?intent=trial'] }); assert.deepEqual(result.links.map(link => link.getAttribute('href')), ['/guides/', '/premium/?lang=nl#plans', 'https://web.arvio.tv/?intent=trial']); - assert.equal(result.events.length, 0); + assert.deepEqual(result.events.map(event => event.event_name), ['guide_page_view']); result.flushTimers(); assert.equal(result.links[0].getAttribute('href'), '/guides/'); }); @@ -160,3 +160,39 @@ test('unavailable analytics does not delay attributed native navigation', async }); module.exports = { run, id }; + +test('guide landings record only bounded labels and carry the journey into Premium', () => { + for (const [route, page] of [['/jellyfin-android-tv/', 'jellyfin'], ['/plex-emby-jellyfin/', 'servers'], ['/stremio-addons-android-tv/', 'addons'], ['/pt-br/jellyfin-android-tv/', 'jellyfin']]) { + const result = run({ url: `https://arvio.tv${route}?utm_source=google&utm_campaign=discovery#private-fragment`, destinations: ['/premium/'] }); + assert.equal(result.events[0].event_name, 'guide_page_view'); + assert.equal(result.events[0].metadata.page, page); + assert.equal(result.events[0].metadata.source, 'google'); + assert.equal(JSON.stringify(result.events).includes('private-fragment'), false); + assert.equal(new URL(result.activate(0)).searchParams.get('arvio_journey'), id); + result.flushTimers(); + assert.equal(result.links[0].getAttribute('href'), '/premium/'); + } +}); +test('unknown paths and Studio previews do not generate guide landing events', () => { + for (const route of ['/private-account/', '/collection-studio/#studio=private']) { + const result = run({ url: 'https://arvio.tv' + route, destinations: [] }); + assert.equal(result.events.length, 0); + } +}); +test('guide measurement respects privacy opt-outs without changing links', () => { + for (const navigator of [{ doNotTrack: '1' }, { globalPrivacyControl: true }]) { + const result = run({ url: 'https://arvio.tv/jellyfin-android-tv/', navigator, destinations: ['/premium/'] }); + assert.equal(result.events.length, 0); + assert.equal(result.activate(0), 'https://arvio.tv/premium/'); + } +}); +test('search referrers are organic but cannot override explicit campaign medium', () => { + const organic = run({ url: 'https://arvio.tv/jellyfin-android-tv/', referrer: 'https://www.google.nl/search?q=private-search' }); + assert.equal(organic.events[0].metadata.medium, 'organic'); + assert.equal(organic.events[0].metadata.source, 'www.google.nl'); + assert.equal(JSON.stringify(organic.events).includes('private-search'), false); + const paid = run({ url: 'https://arvio.tv/jellyfin-android-tv/?utm_medium=cpc', referrer: 'https://www.google.com/' }); + assert.equal(paid.events[0].metadata.medium, 'cpc'); + const fake = run({ url: 'https://arvio.tv/jellyfin-android-tv/', referrer: 'https://www.google.com.evil.invalid/' }); + assert.equal(fake.events[0].metadata.medium, 'referral'); +}); diff --git a/netlify-arvio-tv-site/scripts/seo-guides.test.cjs b/netlify-arvio-tv-site/scripts/seo-guides.test.cjs index 1d5e4e5b3..7336ce245 100644 --- a/netlify-arvio-tv-site/scripts/seo-guides.test.cjs +++ b/netlify-arvio-tv-site/scripts/seo-guides.test.cjs @@ -9,10 +9,10 @@ const routes = [ { route: '/android-tv-media-hub/', pt: '/pt-br/central-midia-android-tv/', es: '/es/centro-multimedia-android-tv/', updated: '2026-10-04' }, { route: '/arvio-web/', pt: '/pt-br/arvio-web/', es: '/es/arvio-web/', updated: '2026-10-04' }, { route: '/fire-tv-media-player/', pt: '/pt-br/arvio-fire-tv/', es: '/es/arvio-fire-tv/', updated: '2026-10-04' }, - { route: '/jellyfin-android-tv/', pt: '/pt-br/jellyfin-android-tv/', es: '/es/jellyfin-android-tv/', updated: '2026-10-05' }, - { route: '/plex-emby-jellyfin/', pt: '/pt-br/plex-emby-jellyfin/', es: '/es/plex-emby-jellyfin/', updated: '2026-10-05' }, + { route: '/jellyfin-android-tv/', pt: '/pt-br/jellyfin-android-tv/', es: '/es/jellyfin-android-tv/', updated: '2026-10-08' }, + { route: '/plex-emby-jellyfin/', pt: '/pt-br/plex-emby-jellyfin/', es: '/es/plex-emby-jellyfin/', updated: '2026-10-08' }, { route: '/debrid-usenet-android-tv/', pt: '/pt-br/debrid-usenet-android-tv/', es: '/es/debrid-usenet-android-tv/', updated: '2026-10-05' }, - { route: '/stremio-addons-android-tv/', updated: '2026-10-05' }, + { route: '/stremio-addons-android-tv/', updated: '2026-10-08' }, { route: '/live-tv-epg/', pt: '/pt-br/tv-ao-vivo-epg/', es: '/es/tv-en-vivo-epg/', updated: '2026-10-05' }, { route: '/trakt-simkl-sync/', pt: '/pt-br/sincronizacao-trakt-simkl/', es: '/es/sincronizacion-trakt-simkl/', updated: '2026-10-05' }, { route: '/ai-subtitles-android-tv/', pt: '/pt-br/legendas-ia-android-tv/', es: '/es/subtitulos-ia-android-tv/', updated: '2026-10-05' } diff --git a/netlify-arvio-tv-site/scripts/standalone-guide-routes.mjs b/netlify-arvio-tv-site/scripts/standalone-guide-routes.mjs index dfc58cc0e..97282c5b2 100644 --- a/netlify-arvio-tv-site/scripts/standalone-guide-routes.mjs +++ b/netlify-arvio-tv-site/scripts/standalone-guide-routes.mjs @@ -1,15 +1,15 @@ // English guides and tools with no translated counterpart yet. Keep their real language // explicit in localized directories rather than adding inaccurate hreflang. export const standaloneGuideRoutes = [ - { route: "/stremio-addons-android-tv/", updated: "2026-10-05", labels: { + { route: "/stremio-addons-android-tv/", updated: "2026-10-08", labels: { pt: ["Configuração de addons · Em inglês", "Addons compatíveis com Stremio no ARVIO", "Instale uma URL de manifesto, configure pelo celular e confira os limites de compatibilidade na Android TV."], es: ["Configuración de addons · En inglés", "Addons compatibles con Stremio en ARVIO", "Instala una URL de manifiesto, configura desde el móvil y consulta los límites de compatibilidad en Android TV."] } }, - { route: "/collections-catalogs/", updated: "2026-10-02", labels: { + { route: "/collections-catalogs/", updated: "2026-10-08", labels: { pt: ["Personalização · Em inglês", "Criar coleções e adicionar catálogos", "Modelos JSON, hospedagem gratuita e importação por URL para personalizar a página inicial."], es: ["Personalización · En inglés", "Crear colecciones y añadir catálogos", "Plantillas JSON, alojamiento gratuito e importación por URL para personalizar el inicio."] } }, - { route: "/collection-studio/", updated: "2026-10-02", labels: { + { route: "/collection-studio/", updated: "2026-10-08", labels: { pt: ["Criador de coleções · Em inglês", "Collection Studio", "Crie uma linha inicial com até oito pastas, copie o JSON para o ARVIO e compartilhe uma prévia pública."], es: ["Creador de colecciones · En inglés", "Collection Studio", "Crea una fila de inicio con hasta ocho carpetas, copia el JSON para ARVIO y comparte una vista previa pública."] } }, diff --git a/netlify-arvio-tv-site/sitemap.xml b/netlify-arvio-tv-site/sitemap.xml index 4d94a35bb..ca4d30cf0 100644 --- a/netlify-arvio-tv-site/sitemap.xml +++ b/netlify-arvio-tv-site/sitemap.xml @@ -56,7 +56,7 @@ https://arvio.tv/jellyfin-android-tv/ - 2026-10-05 + 2026-10-08 monthly 0.8 @@ -74,7 +74,7 @@ https://arvio.tv/plex-emby-jellyfin/ - 2026-10-05 + 2026-10-08 monthly 0.8 @@ -200,9 +200,9 @@ https://arvio.tv/premium/ https://arvio.tv/media-kit/ - https://arvio.tv/stremio-addons-android-tv/2026-10-05monthly - https://arvio.tv/collections-catalogs/2026-10-02monthly - https://arvio.tv/collection-studio/2026-10-02monthly + https://arvio.tv/stremio-addons-android-tv/2026-10-08monthly + https://arvio.tv/collections-catalogs/2026-10-08monthly + https://arvio.tv/collection-studio/2026-10-08monthly https://arvio.tv/self-host-arvio-web/2026-09-30monthly https://arvio.tv/browser-playback-guide/2026-09-30monthly diff --git a/netlify-arvio-tv-site/stremio-addons-android-tv/index.html b/netlify-arvio-tv-site/stremio-addons-android-tv/index.html index c2742d50a..8be1ec21f 100644 --- a/netlify-arvio-tv-site/stremio-addons-android-tv/index.html +++ b/netlify-arvio-tv-site/stremio-addons-android-tv/index.html @@ -24,7 +24,7 @@