VOD artwork and title logos

How the TV app reads and renders the catalogue's title logos, artwork and What's New fields. Reference for the Android, iOS and web app teams. Updated 23 October 2026.

Summary

The catalogue now carries, per show and per language, a transparent title logo (logoTitle), two landscape pictures (artwork.landscape with the logo burned in, artwork.landscape_no_logo without it), and, on What's New items, the show's cover (seriesImage) and a hasTrailer flag. The TV app uses them as follows:

API fields

Base: https://apps-api.ipt.to. Catalogue calls send locale and no session id.

EndpointFields used
GET /v2/vod/categories/main?locale=he|enRoot tabs (series, movies, telenovelas, docu, kids).
GET /v2/vod/categories/{id}/list?locale=&page=&size= results.items[] (child categories = shows): logoTitle, artwork.landscape, artwork.landscape_no_logo, artwork.portrait, showpic, hasTrailer, name, genre, year, description.
results.category (the requested show itself): the same fields, used by the series page.
GET /v2/vod/categories/{id}/vods?locale=&page=&size=Movies and episodes: showpic, hasTrailer, logoTitle when present. As of 22 Oct 2026 movie items do not carry artwork yet; the app falls back to showpic for both card and hero until they do.
GET /v2/vod/categories/{mainId}/vods/new?locale=&upper=1&size=25What's New. Each item has vod, category (the season) and upper[] (main → broadcaster → show → season, ids and names). On vod: seriesImage, logoTitle, hasTrailer, showpic (episode frame), type (episode or vod).
GET /v2/play/trailer/{series|movie}/{id}?sid=Trailer stream. Needs a session. Answer: { error: 0, streams: [url, …] }; play streams[0].

Field reference

FieldValueUse
logoTitleAbsolute URL of a transparent PNG, or nullTitle logo in the hero's title slot
artwork.landscapeAbsolute URL (JPG) or nullCard picture (logo burned in)
artwork.landscape_no_logoAbsolute URL or nullHero background behind the focused item; series page background
artwork.portraitAbsolute URL or nullNot used by the TV app yet
showpicProtocol-relative URL (//images.peer5.net/…)Fallback for card and hero; the episode frame in What's New
seriesImageAbsolute URLWhat's New episode card (the show's cover)
hasTrailertrue / falseWhether to request a trailer at all
URL normalisation: a value starting with // gets https: in front; a value starting with http is used as is; anything else is appended to the API base. Card copies are resized by the CDN with ?s=480 (poster and programme paths only); hero and logo images are loaded at full size.

Language

The API localises logoTitle. With locale=he it returns the Hebrew logo; with locale=en it returns the English logo only when one exists, otherwise null. The apps therefore never choose a logo themselves: request the catalogue in the UI's language and use what comes back. A Hebrew logo must not appear in the English UI; when logoTitle is null, show the text title.

Any cache of catalogue data that includes logos must be keyed by language as well as by id.

Card and hero images

The rule in words: every show has two landscape pictures. The one with the logo burned in (artwork.landscape) is for the card in a row, where there is no room for a separate title. The one without the logo (artwork.landscape_no_logo) is for the hero behind the focused show and for the series page background, because there the title is drawn separately, as the logoTitle image or as text, and a second logo inside the picture would double it.

Fallbacks, in order, when a field is missing or null:

  1. Card: artwork.landscape → showpic (the picture the catalogue always had).
  2. Hero: artwork.landscape_no_logo → artwork.landscape → showpic. A show without the clean picture simply shows its card picture in the hero, as before.
  3. Title: logoTitle → the text title in the logo style (see Text fallback).

Nothing is left empty: the pre-existing showpic is always the last fallback for both pictures, so a show with none of the new fields looks exactly as it did before.

ItemCardHero / background
Series (category item)artwork.landscape, else showpicartwork.landscape_no_logo, else the card picture
Movie (vod item)artwork.landscape, else showpicartwork.landscape_no_logo, else the card picture
What's New episodeseriesImage (the show's cover), else the episode showpicThe episode showpic (episode frame)
What's New movieshowpicshowpic
Series page background—category.artwork.landscape_no_logo, else category.showpic

What's New row

Title slot

The hero reserves a fixed box at the top for the title, so the rows below start at the same height for every show, whatever the logo's shape.

PropertyValue (fraction of screen)At 1920 × 1080
Box height17.5 % of screen height189 px
Box widthHero text width, 36.5 % of screen width700 px
AlignmentContents at the bottom of the box, on the start side (left in LTR, right in RTL)—
Headroom under the logo1.6 % of screen height between the logo (or text title) and the next row, the same gap the text blocks keep17 px
Below the boxEpisode title (What's New), genre | year, description (3 lines), duration—
Logo shadowdrop-shadow(0 0.2vh 0.6vh rgba(0,0,0,0.6))—

Logo sizing formula

The logos come in every shape, from portrait 0.44:1 to 13:1. Scaling them to fit a box makes wide logos enormous and tall ones tiny, so each logo is sized by its visual area and then capped. All lengths below are fractions of the screen width W, which keeps the result identical on every 16:9 screen.

// natural size of the PNG: naturalW × naturalH
r = naturalW / naturalH                // aspect ratio (default 2 when unknown)

AREA  = 0.0114 · W²                    // target visual area  (42 000 px² at 1920)
H_MAX = 0.088 · W                      // tallest allowed     (169 px at 1920)
W_MAX = 0.29  · W                      // widest allowed      (557 px at 1920)
H_MIN = 0.049 · W                      // shortest, if width allows (94 px at 1920)

h = sqrt(AREA / r)
h = min(h, H_MAX, W_MAX / r)           // caps
h = max(h, min(H_MIN, W_MAX / r))      // floor, unless the width cap forbids it
w = h · r

render the PNG at w × h (object-fit: contain), anchored bottom / start of the slot

Results at 1920 × 1080, measured over the catalogue:

Logo shapeExampleRendered size
Portrait (0.6:1)אתה חייב לקרוא את זה101 × 169 px
Square (1:1)המטבח המנצח169 × 169 px
Wide (2–3:1)דה וויס, הכוורת290–350 × 120–145 px
Very wide (3.5–6:1)ערב טוב עם גיא פינס385–400 × 100–110 px
The artwork files contain a transparent margin around the logo (typically 10–20 % of the file). The formula works on the file's size, so a file with a wide margin renders slightly smaller than one trimmed to the logo. Trimmed PNGs give the most even result.

Text fallback (no logo)

When logoTitle is null the title is set as text in the same slot. Keep the font and size your app already uses for the title — there is no need to change them. The only requirements are that the text sits in the title slot (bottom of the box, start side, same headroom) and keeps the fallback image rules above.

For reference only, this is how the trial build styles it (not required):

PropertyValue
FontRubik Bold (covers Hebrew and Latin), fallback Noto Sans Hebrew / Roboto Bold
Size3.4 % of screen width (65 px at 1920), line height 1.05, letter spacing −0.01 em
CaseUppercase for Latin text (no effect on Hebrew)
Weight effectsText stroke 0.05 % of screen width, shadow 0 0.3vh 0.9vh rgba(0,0,0,.75) + 0 0 2vh rgba(0,0,0,.35)
LinesUp to 3 across the full hero width, then an ellipsis

Trailers

Series page

Implementation checklist

Catalogue

Read logoTitle, artwork.*, hasTrailer on list items and on results.category. Request in the UI language. Cache per language.

Pictures

Card = artwork.landscape → showpic. Hero = artwork.landscape_no_logo → card picture.

What's New

Card = seriesImage; hero = episode frame; title = show name + episode name; logo = vod.logoTitle; no genre / year for episodes; trailer only if hasTrailer.

Title slot

Fixed box, contents bottom / start aligned; logo sized by the area formula with caps; text fallback in the logo style.