github GeiserX/Telegram-Archive v9.3.0

one hour ago

Pictures in the chat take the sizes Telegram Desktop gives them, custom emoji are drawn in reactions and in text, a private chat between two archived accounts shows each side, and the transcription queue drains every 15 minutes. Migration 040 runs on start and adds one table for custom emoji; nothing else changes in the database. Update both images together. After upgrading, run telegram-archive check-media and, if it reports photos without a size, check-media --repair. A script that reads a custom emoji entity's document_id from the viewer's API now gets a string. See Upgrading to 9.3.0.

Added

  • Custom emoji reactions are drawn as their emoji. A reaction made with a custom emoji, the premium kind from an emoji pack, showed a theatre-mask placeholder. The archive now fetches the emoji's file once, the way the Telegram apps do, at the next backup run or, for an emoji the listener saw, within about five minutes: 100 ids per request, at most 500 files per run and account, each file written once to media/_emoji/<id>.webp, .tgs or .webm and shared by every chat and account. The viewer draws it in the chip, and an animated one moves while it is on screen, at most three at once beside the four stickers. The ordinary emoji Telegram gives as its meaning stays in the page under the picture, so copying the chip gives it, a screen reader reads it, and a browser that cannot play the kind shows it. The fetch is always on, like profile photos, and logins whose downloads are off see custom emoji too. Migration 040 adds the custom_emoji table and a pending record for every custom emoji already stored as a reaction, so old reactions are drawn after the next backup. backfill-details --apply asks again for emoji that gave up, and merge copies the records and files the target lacks. Two routes serve them: /api/custom-emoji and /media/emoji/{document_id}. See Custom emoji and Upgrading to 9.3.0.
  • Custom emoji in message text are drawn too. A custom emoji inside a text showed only its ordinary emoji. Every message the backup or the listener stores, and every edit, now notes the custom emoji of its text, the backup fetches them with the reactions' ones, and the viewer draws them at the size of the text's emoji, the ordinary emoji staying under the picture for copy and screen readers. In the edit history an animated one shows its first frame. Messages archived before this release get theirs after backfill-details --apply.
  • A screen reader hears who spoke in a private chat. On screen only the side of a message says who sent it. The first message of each run now carries a hidden name: "You", or the row's account when you can see more than one, for your own messages, and the chat's name for the other person.
  • check-media --repair fills the size of photos stored without one. Releases before 7.32.0 stored no width or height for photos from the full pass, and the viewer now sizes each picture from them. For a photo in place with neither value, check-media reads the size from the file's header without decoding the picture, turned by its EXIF orientation, and --repair stores it. A dry run prints Photos without size, a repair Photo sizes filled, and a header it cannot read Size not readable. A stored size is never replaced and the file is never written. These counts do not change the exit code. See check-media.

Changed

  • A custom emoji's document_id is a string in the viewer's API. In raw_data.entities of the messages, pinned and by-date routes, in message versions, and in the new_message and edit live frames, document_id is now a string of digits. A document id is larger than a JSON number holds in a browser, so the number lost its last digits and could name another emoji. A client that compares it as a number must read it as a string. The chat exports keep the number. See Custom emoji.
  • A private chat between two archived accounts is drawn the way the Telegram apps draw it. Each account keeps its own row of the conversation. In each row that account's messages are on the right and the other account's are on the left, so the two rows mirror each other. The messages carry no account name, since the header names the row's account. Before, every message sat on the right in both rows, each with an account name. Saved Messages, groups and channels keep their sides. See Multiple accounts.
  • In a group or channel several archived accounts hold, the account name beside the time takes the account's tag colour. It now matches that account's tag in the chat list. Before, it was grey, like the time. Where the tag colour reads at 4.5:1 on the outgoing bubble the name uses it as is. In the other palettes it is mixed toward the bubble's text colour until it does. The name is in bold, like the tag, so it stands apart from the time even where that mix leaves little colour. Over a picture the name keeps the time pill's colour. See Multiple accounts.
  • Pressed files, a backlog and akou results are handled within 15 minutes, without waiting for the daily pass. Since 9.2.0 the full pass runs once a day, and the transcription drain ran only at its end, so a pressed Transcribe button could wait up to a day. The schedule command now runs a drain every TRANSCRIPTION_DRAIN_INTERVAL_MINUTES, 15 by default, as well as after each pass. It needs no Telegram connection and runs during a pass too, never at the same moment as the pass's own drain. A drain with nothing to do reads the database only. It sends no request to the server and logs no info line. A file that is still missing does not start one. A drain logs its summary at info level only when it did something, and results collected from akou's event feed or the poll now count. A backlog drains at up to TRANSCRIPTION_BACKFILL_PER_RUN files per account every interval, up to 96 times what the daily pass sent, so on a paid or shared server set a larger interval, or 0 to keep only the drain after each pass. After a timer drain that ended on the server's side the timer waits twice as long, up to a day, so a server outage does not use up the retries of many files. Only the drain after a pass sends a missing file back to download. A file the listener is still sending is never sent a second time by a drain. The viewer's answer to a press past TRANSCRIPTION_ASK_MAX_OPEN now reads "Many transcripts are waiting to be sent. Try again later.", with a Retry-After of 15 minutes instead of an hour. See When files are sent and Upgrading to 9.3.0.

Fixed

  • A photo imported from an HTML export stores its real size. The import took the width and height from the style of the export's thumbnail, which is the thumbnail's size, so the viewer drew such a photo at the thumbnail's size. It now reads the size from the photo file's header. A JSON export names the real size and keeps it. Photos imported before this release keep the stored thumbnail size; see Upgrading to 9.3.0.
  • Photos, videos and GIFs take the size Telegram Desktop gives them. A single photo had no width of its own, so its bubble took the width of the sender's name or the time: a tall photo was drawn about 140 px wide, and a landscape photo under a short channel signature about 64 px. Videos and GIFs started at 300 by 150 and jumped when they loaded. Each picture now has a box set from its stored size before the file loads: scaled down to fit 430 px each way, 320 px for a GIF, three quarters of the screen width on a phone, and no wider than a bubble may be in a narrow window. The box is at least 100 px each way and at least 200 px wide in a bubble with a name, a caption or reactions; only these minimums make a box larger than its picture, so a 50 px picture is drawn at 100 px, as in Telegram Desktop. A picture that filling its box would cut by more than a quarter of its height, or at its sides, is drawn whole on a tint. The caption wraps under the picture instead of widening the bubble. An image sent as a file uses the same box and opens from the keyboard, and so does a GIF. A GIF that fails to load shows the placeholder instead of an empty box. The placeholder of a picture the archive does not show takes the box the picture would take, and in a short box it says the reason without the size, on up to two lines, so a phone reads it whole. An album is 400 px wide instead of as wide as its caption. A photo stored with no size shows a 4:3 box until it loads, and keeps its real shape after a jump to another message. See Media.
  • A short message at the bottom of the viewer no longer cuts words in two. On a phone a message that took two lines, such as a refused transcript press, broke inside words. It now wraps between words, and a long link or file name still wraps where it would overflow. The message also uses the width of the screen, up to 90%, so a short one fits on one or two lines instead of four.

📋 Full changelog: docs/CHANGELOG.md

Don't miss a new Telegram-Archive release

NewReleases is sending notifications on new releases.