O formato funscript, campo por campo

O formato funscript é um objeto JSON com uma chave essencial, actions: uma lista de pares {"at", "pos"} que dá uma posição de 0 a 100 num momento em milissegundos. Em volta dela ficam version, inverted, range e metadata. Esta página define cada campo, as convenções que os arquivos seguem e exatamente o que o AutoScript Sync faz ao ler e escrever um.

Conferido com o código do app em 21 de setembro de 2026. Descreve as convenções comuns, não uma especificação formal.

A estrutura

Um funscript é um único objeto JSON salvo como texto UTF-8 com a extensão .funscript. Um arquivo pequeno completo, no formato em que o AutoScript Sync salva:

{
  "version": "1.0",
  "inverted": false,
  "range": 100,
  "metadata": {
    "creator": "AutoScript Sync",
    "format": "funscript"
  },
  "actions": [
    {"at": 0,    "pos": 50},
    {"at": 350,  "pos": 95},
    {"at": 720,  "pos": 5},
    {"at": 1080, "pos": 95},
    {"at": 1500, "pos": 5},
    {"at": 5500, "pos": 5}
  ]
}

Os dois últimos pontos mantêm a mesma posição por quatro segundos: uma pausa é escrita como dois pontos com o mesmo pos, não como uma lacuna. A ordem das chaves não importa em JSON, e os espaços em branco são livres.

Os campos

actions
Uma matriz de pontos, cada um um objeto com at e pos. É o único campo de que um player precisa. Um arquivo sem ele não é um script utilizável.
at
O momento do ponto em milissegundos a partir do início do vídeo, como número inteiro. 1500 é um segundo e meio de vídeo.
pos
A posição em que estar naquele momento, como número inteiro de 0 a 100. O que 0 e 100 significam fisicamente depende do dispositivo e das configurações dele; o arquivo só diz "até este ponto da faixa".
version
A versão do formato como string, geralmente "1.0".
inverted
true ou false. Quando for true, as posições devem ser lidas de cabeça para baixo, como 100 − pos.
range
Um número, geralmente 100, que descreve a amplitude de pos. A maioria dos arquivos o deixa em 100.
metadata
Um objeto para qualquer coisa sobre o script: o programa que o criou, um título, notas, tags. Os players não precisam dele para reproduzir o arquivo.

Arquivos de editores costumam trazer chaves extras no nível superior, como capítulos ou marcadores. Elas são permitidas; um leitor que não as entenda deve ignorá-las e, idealmente, mantê-las.

Convenções que um arquivo bem formado segue

  • at é um número inteiro de milissegundos, contado a partir do início do vídeo, nunca negativo.
  • pos é um número inteiro de 0 a 100.
  • As ações são ordenadas por at, da mais cedo para a mais tarde.
  • Nenhuma ação compartilha o mesmo at com outra.
  • Os números são números JSON, não strings: "at": 400, e não "at": "400".

Os programas variam na tolerância quando um arquivo quebra essas regras. O app para desktop conserta o que consegue, como descrito abaixo. Nossa própria ferramenta de navegador, o Report Studio, não conserta: ela assume que as ações já estão ordenadas, pega a duração da última ação, ignora inverted e range, e rejeita um arquivo cujos valores de at sejam strings. Um arquivo que segue as cinco convenções evita essas diferenças.

Como o AutoScript Sync lê um arquivo

Quando você abre um script com Load Funscript…, solta o arquivo na janela ou abre um vídeo com um script de mesmo nome ao lado, o app conserta as ações em vez de recusar o arquivo:

  • ordena as ações por tempo;
  • funde ações que compartilham o mesmo tempo, mantendo a última;
  • limita pos a 0–100 e tempos negativos a 0;
  • pula entradas que não consegue ler, sem dizer quantas;
  • range, mas nunca o usa para reescalar, então um arquivo com range diferente de 100 ainda é tratado como 0–100;
  • mantém version como encontrado ("1.0" se estiver ausente).

A próxima atualização (2.121.2, já compilada, mas ainda não lançada) faz o leitor aceitar mais arquivos e preservar mais do que há neles:

  • arquivos salvos com byte-order mark, ou em UTF-16, são carregados em vez de recusados;
  • inverted: true é aplicado uma vez ao carregar (100 − pos), com um aviso para você, e o arquivo é salvo de volta com inverted: false, para que todos os outros players vejam o mesmo movimento. O app lançado ignora a flag, então um arquivo invertido toca de cabeça para baixo;
  • valores fracionários de at e pos são arredondados para o inteiro mais próximo, e valores NaN ou infinitos são pulados;
  • chaves de nível superior desconhecidas, como capítulos ou marcadores, são mantidas e gravadas de volta quando você salva; o app lançado as descarta ao salvar;
  • um arquivo que não é texto, não é JSON, não é um objeto ou não tem lista actions recebe uma mensagem em linguagem simples, e um script sem ações utilizáveis não é associado ao vídeo.

Como o AutoScript Sync grava um arquivo

Todo script que o app salva, gerado ou editado, segue as convenções acima, não importa o que tenha acontecido no editor:

  • Ações são gravadas em ordem crescente de tempo, com tempos únicos, at como número inteiro não negativo de milissegundos e pos como número inteiro de 0 a 100. Se dois pontos arredondarem para o mesmo milissegundo, prevalece o mais tardio.
  • Cabeçalho: version, inverted e range são gravados como estão; um script gerado recebe "1.0", false e 100.
  • Metadados: creator é sempre definido como "AutoScript Sync" e format como "funscript". Salvar por cima do script de outra ferramenta substitui o criador dele.
  • Detalhes da análise nos scripts gerados: gerador, resumo do reconhecimento, tempos, caminho de rastreamento e um bloco ai com o rótulo de tipo de cena de cada janela de dois segundos, a região rastreada, quanto foi preenchido em vez de medido e as pontuações da eleição de âncora.
  • Salvamento seguro: o JSON é gravado, indentado, num arquivo temporário e depois trocado pelo original, para que uma falha no meio do salvamento não corrompa o script existente.
  • Backup: quando o Generate salva ao lado do vídeo, qualquer script existente é primeiro copiado para <name>.funscript.bak. Só um backup é mantido; o próximo Generate o sobrescreve.

O arquivo no disco nunca é ajustado a um dispositivo. Quando o app envia um script ao Autoblow AI Ultra, ele ajusta uma cópia aos limites do dispositivo e remove os metadados de análise, mantendo apenas o movimento e alguns campos do cabeçalho (generator, creator, format, version, range, stroke_expansion e um id, se houver).

Erros comuns e como encontrá-los

O validador de funscript verifica cada um deles no seu navegador, sem enviar o arquivo, e lista os problemas que encontra.

JSON inválido
Uma vírgula ou colchete faltando, ou uma vírgula sobrando depois da última ação. Nada consegue ler o arquivo até que seja corrigido.
Ações ausentes ou malformadas
Sem a chave actions, ou entradas sem at e pos numéricos.
Tempos fora de ordem
Geralmente por juntar dois scripts ou editar à mão. Programas que assumem ações ordenadas mostram uma duração errada ou dão saltos na reprodução.
Tempos repetidos
Dois pontos no mesmo at com posições diferentes: um player não pode estar em dois lugares ao mesmo tempo.
Posições fora de 0–100
Um pos abaixo de 0 ou acima de 100 aponta para fora da faixa que o player mapeia no dispositivo.
Movimentos rápidos demais para o dispositivo
Não é um erro de formato, mas um salto grande em pouco tempo exige mais do que um dispositivo consegue fazer. O validador sinaliza trechos acima de um limite de velocidade que você define, 400 unidades por segundo por padrão.

Quando o arquivo é JSON válido com uma lista actions, o validador oferece uma cópia consertada: ordenada por tempo, tempos duplicados fundidos, posições limitadas a 0–100 e valores arredondados, com todo o resto do arquivo mantido. Ele não consegue consertar JSON quebrado nem uma lista actions ausente, e não desacelera movimentos rápidos demais.

Perguntas

Existe uma especificação oficial de funscript?

Esta página descreve as convenções que os arquivos em circulação seguem e o que o AutoScript Sync lê e grava. Não é um padrão formal, e não descrevemos como outros players lidam com casos extremos.

Quantos pontos por segundo um script deve ter?

O formato não define uma taxa. Os pontos ficam onde o movimento muda de direção. Os scripts gerados pelo AutoScript Sync colocam um ponto em cada inversão do movimento medido, então uma cena lenta tem poucos e uma rápida tem muitos.

Por que meu script diz "creator": "AutoScript Sync" se outra pessoa o fez?

O app carimba o próprio nome como criador em cada salvamento, inclusive ao salvar por cima do script de outra ferramenta. Coloque o nome do autor original de volta nos metadados, ou na sua publicação, quando for compartilhá-lo.

O AutoScript Sync mantém capítulos e outras chaves extras?

Na próxima atualização (2.121.2), sim: chaves de nível superior desconhecidas são mantidas e gravadas de volta. A versão lançada 2.121.1 as descarta ao salvar, então guarde uma cópia do original.

Leia a seguir

Gere scripts bem formados a partir dos seus vídeos

O AutoScript Sync grava funscripts padrão ao lado dos seus vídeos; o teste é o app completo por um dia.