class_docstr: Container for multiple `Scene` objects.
class_docstr_tok: ["Container","for","multiple","`","Scene","`","objects","."]
docstr: Determine filename and shape of animation to be created.
code: def _get_animation_info(
      self, all_datasets, filename, fill_value=None
  ):
      """Determine filename and shape of animation to be created."""
      valid_datasets = [ds for ds in all_datasets if ds is not None]
      first_dataset = valid_datasets[0]
      last_dataset = valid_datasets[-1]
      first_img = get_enhanced_image(first_dataset)
      first_img_data = first_img.finalize(fill_value=fill_value)[0]
      shape = tuple(
          first_img_data.sizes.get(dim_name)
          for dim_name in ("y", "x", "bands")
      )
      if fill_value is None and filename.endswith("gif"):
          log.warning(
              "Forcing fill value to '0' for GIF Luminance images"
          )
          fill_value = 0
          shape = shape[:2]
  
      attrs = first_dataset.attrs.copy()
      if "end_time" in last_dataset.attrs:
          attrs["end_time"] = last_dataset.attrs["end_time"]
      this_fn = filename.format(**attrs)
      return this_fn, shape, fill_value
  
imports: from __future__ import annotations
  import copy
  import logging
  import warnings
  from queue import Queue
  from threading import Thread
  from typing import Callable, Collection, Mapping
  import dask.array
  import numpy
  import xarray
  from satpy.dataset import DataID
  from satpy.scene import Scene
  from satpy.writers import get_enhanced_image, split_results
label_desc: Use image node_id 21 for calling the MultiScene obj's underlying member method code with example usage: obj._get_animation_info(all_datasets, filename, fill_value) and returns: this_fn,  shape,  fill_value