Download not starting after I stop recording

So when I start my recording it starts without any error and there is a red REC on top. But when I stop recording, it again succeeds with stopping the recording though there is nothing to be downloaded.

A while ago with the same installation, when I used to stop a video file used to start downloading but now its nothing.

As far as my log goes, jibri logs show no error, I double-checked the configurations (new one for jibri). Neither Jicofo shows any error nor jvb.

I am attaching a few log files and here is my jibri.conf

jibri {
  // A unique identifier for this Jibri
  // TODO: eventually this will be required with no default
  id = ""
  // Whether or not Jibri should return to idle state after handling
  // (successfully or unsuccessfully) a request.  A value of 'true'
  // here means that a Jibri will NOT return back to the IDLE state
  // and will need to be restarted in order to be used again.
  single-use-mode = false
  api {
    http {
      external-api-port = 2222
      internal-api-port = 3333
    xmpp {
      // See example_xmpp_envs.conf for an example of what is expected here
      environments = [
            name: ""
            xmpp-server-hosts: [""],
            xmpp-domain: ""
            control_login: {
                domain: ""
                username: "jibri"
                password: "*******"
            control_muc: {
                domain: ""
                room-name: "JibriBrewery"
                nickname = "*******"
            call_login: {
                domain: ""
                username: "recorder"
                password: "**********"
            strip-from-room-domain = "conference."
            trust-all-xmpp-certs = true
            usage-timeout: "0"
  recording {
    recordings-directory = "/tmp/recordings"
    finalize-script = "/path/to/finalize"
    # TODO: make this an optional param and remove the default
  streaming {
    // A list of regex patterns for allowed RTMP URLs.  The RTMP URL used
    // when starting a stream must match at least one of the patterns in
    // this list.
    rtmp-allow-list = [
      // By default, all services are allowed
  sip {
    // The routing rule for the outbound scenario in VoxImplant is based on this prefix
    outbound-prefix = "out_"
  ffmpeg {
    resolution = "1920x1080"
    framerate = 30
    // Encoding speed to compression ratio (slower preset -> better compression)
    // Available presets: ultrafast, superfast, veryfast, faster, fast, medium,
    // slow, slower, veryslow, placebo
    video-encode-preset = "veryfast"
    queue-size = 4096
    streaming-max-bitrate = 2976
    // The range of the CRF scale is 0-51, where 0 is lossless,
    // 23 is the default, and 51 is worst quality possible. A lower value
    // generally leads to higher quality, and a subjectively sane range is
    // 17-28. Consider 17 or 18 to be visually lossless or nearly so;
    // it should look the same or nearly the same as the input but it
    // isn't technically lossless.
    h264-constant-rate-factor = 25
    // The audio source that will be used to capture audio on Linux
    audio-source = "alsa"
    // The audio device that will be used to capture audio on Linux
    audio-device = "plug:bsnoop"
  chrome {
    // The flags which will be passed to chromium when launching
    flags = [
  stats {
    enable-stats-d = true
  webhook {
    // A list of subscribers interested in receiving webhook events
    subscribers = []
  jwt-info {
    // The path to a .pem file which will be used to sign JWT tokens used in webhook
    // requests.  If not set, no JWT will be added to webhook requests.
    # signing-key-path = "/path/to/key.pem"

    // The kid to use as part of the JWT
    # kid = "key-id"

    // The issuer of the JWT
    # issuer = "issuer"

    // The audience of the JWT
    # audience = "audience"

    // The TTL of each generated JWT.  Can't be less than 10 minutes.
    # ttl = 1 hour
  call-status-checks {
    // If not all clients have their audio and video muted, but Jibri does not
    // detect any data stream (audio or video) comming in, it will stop
    // recording after NO_MEDIA_TIMEOUT expires.
    no-media-timeout = 3 minutes

    // If all clients have their audio and video muted, Jibri consideres this
    // as an empty call and stops the recording after ALL_MUTED_TIMEOUT expires.
    all-muted-timeout = 10 minutes

    // When detecting if a call is empty, Jibri takes into consideration for how
    // long the call has been empty already. If it has been empty for more than
    // DEFAULT_CALL_EMPTY_TIMEOUT, it will consider it empty and stop the recording.
    default-call-empty-timeout = 30 seconds

    // If ICE hasn't completed, or stays in a state other than "connected" for this amount of time, Jibri will stop.
    ice-connection-timeout = 30 seconds

jibri.txt (6.5 KB)
jicofo.log (258.9 KB)
jvb.log (653.5 KB)
prosody.log (135.3 KB)

Jibri doesn’t provide an automatic download link (unless you configure a finalize script with the necessary code to do so). You get that download link if you’re using the Local Recording function, which is entirely based on the client and doesn’t require/use Jibri at all.

Looking at your jibri.conf, your recording can be found in /tmp/recordings (assuming it recorded successfully).


So I checked "/tmp/recordings" and there seems to be no recordings folder. Does it save with the help of finalize_script?

Also, what would a finalised script look like if it serves a downloaded recording?

in the /tmp I found a chromedriver.log and in it I found this

}, {
   "level": "DEBUG",
   "message": "DevTools WebSocket Command: Page.addScriptToEvaluateOnNewDocument (id=3) (session_id=B678FE1EAF79E327880730EB0DAE3E58) AE7FC2D91C5F654539C34564FAE1CFB1 {\n   \"source\": \"(function () {window.cdc_adoQ...",
   "timestamp": 1.67665422917e+12
}, {
   "level": "DEBUG",
   "message": "DevTools WebSocket Command: Runtime.evaluate (id=4) (session_id=B678FE1EAF79E327880730EB0DAE3E58) AE7FC2D91C5F654539C34564FAE1CFB1 {\n   \"expression\": \"(function () {window.cdc_adoQpoasnfa76pfcZLmcf...",
   "timestamp": 1.67665422917e+12
}, {
   "level": "DEBUG",
   "message": "DevTools WebSocket Command: Log.enable (id=5) (session_id=B678FE1EAF79E327880730EB0DAE3E58) AE7FC2D91C5F654539C34564FAE1CFB1 {\n}\n",
   "timestamp": 1.67665422917e+12
}, {
   "level": "DEBUG",
   "message": "DevTools WebSocket Command: Target.setAutoAttach (id=6) (session_id=B678FE1EAF79E327880730EB0DAE3E58) AE7FC2D91C5F654539C34564FAE1CFB1 {\n   \"autoAttach\": true,\n   \"flatten\": true,\n   \"waitForDebugg...",
   "timestamp": 1.67665422917e+12
}, {
   "level": "DEBUG",
   "message": "DevTools WebSocket Command: Page.enable (id=7) (session_id=B678FE1EAF79E327880730EB0DAE3E58) AE7FC2D91C5F654539C34564FAE1CFB1 {\n}\n",
   "timestamp": 1.676654229171e+12
}, {
   "level": "DEBUG",
   "message": "DevTools WebSocket Command: Page.enable (id=8) (session_id=B678FE1EAF79E327880730EB0DAE3E58) AE7FC2D91C5F654539C34564FAE1CFB1 {\n}\n",
   "timestamp": 1.676654229171e+12
}, "..." ]
[1676654229.277][INFO]: [e7d97c25421bfed60bf30b0eba480fd5] COMMAND ExecuteScript {
   "args": [  ],
   "script": "            try {\n                return APP.conference._room.leave();\n            } catch (e) {\n                return e.message;\n            }"
[1676654229.277][INFO]: Waiting for pending navigations...
[1676654229.277][INFO]: Done waiting for pending navigations. Status: ok
[1676654229.279][INFO]: Waiting for pending navigations...
[1676654229.280][INFO]: Done waiting for pending navigations. Status: ok
[1676654229.281][INFO]: [e7d97c25421bfed60bf30b0eba480fd5] RESPONSE ExecuteScript "APP is not defined"
[1676654229.285][INFO]: [e7d97c25421bfed60bf30b0eba480fd5] COMMAND ExecuteScript {
   "args": [  ],
   "script": "            try {\n                return APP.conference.membersCount;\n            } catch (e) {\n                return e.message;\n            }"
[1676654229.285][INFO]: Waiting for pending navigations...
[1676654229.286][INFO]: Done waiting for pending navigations. Status: ok
[1676654229.288][INFO]: Waiting for pending navigations...
[1676654229.288][INFO]: Done waiting for pending navigations. Status: ok
[1676654229.288][INFO]: [e7d97c25421bfed60bf30b0eba480fd5] RESPONSE ExecuteScript "APP is not defined"
[1676654229.291][INFO]: [e7d97c25421bfed60bf30b0eba480fd5] COMMAND Quit {
[1676654229.341][INFO]: [e7d97c25421bfed60bf30b0eba480fd5] RESPONSE Quit

No, finalize_script run after the recording is completed. If there is no folder or recorded file in /tmp/recordings, this means that your jibri doesn’t work correctly.