1#
2# The Python Imaging Library
3# $Id$
4#
5# GRIB stub adapter
6#
7# Copyright (c) 1996-2003 by Fredrik Lundh
8#
9# See the README file for information on usage and redistribution.
10#
11from __future__ import annotations
12
13import os
14
15from . import Image, ImageFile
16
17TYPE_CHECKING = False
18if TYPE_CHECKING:
19 from typing import IO
20
21
22def register_handler(handler: ImageFile.StubHandler | None) -> None:
23 """
24 Install application-specific GRIB image handler.
25
26 :param handler: Handler object.
27 """
28 GribStubImageFile._handler = handler
29
30
31# --------------------------------------------------------------------
32# Image adapter
33
34
35def _accept(prefix: bytes) -> bool:
36 return len(prefix) >= 8 and prefix.startswith(b"GRIB") and prefix[7] == 1
37
38
39class GribStubImageFile(ImageFile.StubImageFile):
40 format = "GRIB"
41 format_description = "GRIB"
42
43 def _open(self) -> None:
44 assert self.fp is not None
45 if not _accept(self.fp.read(8)):
46 msg = "Not a GRIB file"
47 raise SyntaxError(msg)
48
49 self.fp.seek(-8, os.SEEK_CUR)
50
51 # make something up
52 self._mode = "F"
53
54
55def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
56 if GribStubImageFile._handler is None or not hasattr(
57 GribStubImageFile._handler, "save"
58 ):
59 msg = "GRIB save handler not installed"
60 raise OSError(msg)
61 GribStubImageFile._handler.save(im, fp, filename)
62
63
64# --------------------------------------------------------------------
65# Registry
66
67Image.register_open(GribStubImageFile.format, GribStubImageFile, _accept)
68Image.register_save(GribStubImageFile.format, _save)
69
70Image.register_extension(GribStubImageFile.format, ".grib")