Skip to content

Commit 2719e1d

Browse files
authored
Added metadata handlers (#83)
* Metadata extraction * Updated manager * Updated * Updated * Updates after PR comments * Updated for libheic dependencies * Updated codebase * Updated EXIT timezone bug * Additional timezone fixes * Updates * Updated to remove coverage report * Updates after PR comments * Updated README
1 parent d8aa1e1 commit 2719e1d

250 files changed

Lines changed: 11122 additions & 4201 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/copilot-instructions.md

Lines changed: 79 additions & 91 deletions
Large diffs are not rendered by default.

.github/workflows/on_pull_request_merge.yaml

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,5 @@ jobs:
2020
go-version: ${{ matrix.go-version }}
2121
- name: Run tests
2222
run: |
23-
sudo apt -y update && sudo apt -y install nasm
23+
sudo apt -y update && sudo apt -y install nasm libde265-dev libaom-dev libdav1d-dev
2424
make test
25-
- name: Generate coverage report
26-
run: make coverage
27-
- name: Upload coverage reports to Codecov
28-
uses: codecov/codecov-action@v5
29-
with:
30-
token: ${{ secrets.CODECOV_TOKEN }}
31-
slug: mutablelogic/go-media
32-
files: ./build/coverage.out
33-
flags: unittests
34-
name: codecov-go-${{ matrix.go-version }}
35-
fail_ci_if_error: false

Makefile

Lines changed: 122 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,18 @@ PKG_CONFIG=$(shell which pkg-config)
66
# Default parallelism
77
JOBS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)
88

9+
# Locations
10+
BUILD_DIR ?= build
11+
CMD_DIR := $(wildcard cmd/*)
12+
PREFIX ?= ${BUILD_DIR}/install
13+
914
# Source version
10-
#FFMPEG_VERSION ?= ffmpeg-7.1.1
11-
#SYS_VERSION ?= ffmpeg71
1215
FFMPEG_VERSION ?= ffmpeg-8.0.3
1316
SYS_VERSION ?= ffmpeg80
1417
CHROMAPRINT_VERSION ?= chromaprint-1.5.1
1518
LIBEXIF_VERSION ?= 0.6.26
1619
LIBRAW_VERSION ?= 0.22.1
20+
LIBHEIF_VERSION ?= 1.23.1
1721

1822
# Set OS and Architecture (must be before CGO configuration)
1923
ARCH ?= $(shell arch | tr A-Z a-z | sed 's/x86_64/amd64/' | sed 's/i386/amd64/' | sed 's/armv7l/arm/' | sed 's/aarch64/arm64/')
@@ -28,20 +32,18 @@ else
2832
CGO_ENV=PKG_CONFIG_PATH="$(shell realpath ${PREFIX})/lib/pkgconfig" CGO_LDFLAGS_ALLOW="-(W|D).*" CGO_LDFLAGS="-lstdc++"
2933
endif
3034

31-
# Build flags
32-
BUILD_MODULE := $(shell cat go.mod | head -1 | cut -d ' ' -f 2)
33-
BUILD_LD_FLAGS += -X $(BUILD_MODULE)/pkg/version.GitSource=${BUILD_MODULE}
34-
BUILD_LD_FLAGS += -X $(BUILD_MODULE)/pkg/version.GitTag=$(shell git describe --tags --always)
35-
BUILD_LD_FLAGS += -X $(BUILD_MODULE)/pkg/version.GitBranch=$(shell git name-rev HEAD --name-only --always)
36-
BUILD_LD_FLAGS += -X $(BUILD_MODULE)/pkg/version.GitHash=$(shell git rev-parse HEAD)
37-
BUILD_LD_FLAGS += -X $(BUILD_MODULE)/pkg/version.GoBuildTime=$(shell date -u '+%Y-%m-%dT%H:%M:%SZ')
38-
BUILD_FLAGS = -ldflags "-s -w $(BUILD_LD_FLAGS)"
39-
40-
# Paths to locations, etc
41-
BUILD_DIR := "build"
42-
CMD_DIR := $(filter-out cmd/README.md, $(wildcard cmd/*))
43-
BUILD_TAG := ${DOCKER_REGISTRY}/go-media-${OS}-${ARCH}:${VERSION}
44-
PREFIX ?= ${BUILD_DIR}/install
35+
36+
# Set build flags
37+
VERSION_PKG = github.com/mutablelogic/go-server/pkg/version
38+
BUILD_LD_FLAGS += -X $(VERSION_PKG).GitTag=$(shell git describe --tags --always)
39+
BUILD_LD_FLAGS += -X $(VERSION_PKG).GitBranch=$(shell git name-rev HEAD --name-only --always)
40+
BUILD_FLAGS = -ldflags "-s -w ${BUILD_LD_FLAGS}"
41+
42+
# Docker
43+
DOCKER_REPO ?= ghcr.io/mutablelogic/gomedia
44+
DOCKER_SOURCE ?= $(shell cat go.mod | head -1 | cut -d ' ' -f 2)
45+
DOCKER_TAG = ${DOCKER_REPO}:${VERSION}-${OS}-${ARCH}
46+
4547

4648
###############################################################################
4749
# TARGETS
@@ -50,9 +52,9 @@ PREFIX ?= ${BUILD_DIR}/install
5052
all: clean cmd
5153

5254
.PHONY: cmd
53-
cmd: ffmpeg chromaprint libexif $(CMD_DIR)
55+
cmd: ffmpeg chromaprint libexif libraw libheif $(CMD_DIR)
5456

55-
$(CMD_DIR): go-dep go-tidy sdl-dep mkdir
57+
$(CMD_DIR): go-dep go-tidy sdl-dep chromaprint-dep mkdir
5658
@echo Build cmd $(notdir $@)
5759
@${CGO_ENV} ${GO} build ${BUILD_FLAGS} -o ${BUILD_DIR}/$(notdir $@) ./$@
5860

@@ -218,34 +220,86 @@ libexif: libexif-build
218220
@sed -i.bak 's|-lexif$$|-lexif -lm|' "${PREFIX}/lib/pkgconfig/libexif.pc"
219221
@rm -f "${PREFIX}/lib/pkgconfig/libexif.pc.bak"
220222

223+
###############################################################################
224+
# LIBHEIF
225+
226+
# Download libheif sources
227+
${BUILD_DIR}/libheif-${LIBHEIF_VERSION}:
228+
@if [ ! -d "$(BUILD_DIR)/libheif-$(LIBHEIF_VERSION)" ]; then \
229+
echo "Downloading $(LIBHEIF_VERSION)"; \
230+
mkdir -p $(BUILD_DIR)/libheif-${LIBHEIF_VERSION}; \
231+
curl -L -o $(BUILD_DIR)/libheif.tar.gz https://github.com/strukturag/libheif/releases/download/v$(LIBHEIF_VERSION)/libheif-$(LIBHEIF_VERSION).tar.gz; \
232+
tar -xzf $(BUILD_DIR)/libheif.tar.gz -C $(BUILD_DIR); \
233+
rm -f $(BUILD_DIR)/libheif.tar.gz; \
234+
fi
235+
236+
.PHONY: libheif-configure
237+
libheif-configure: mkdir pkconfig-dep ${BUILD_DIR}/libheif-${LIBHEIF_VERSION} ffmpeg libheif-dep
238+
@echo "Configuring libheif-${LIBHEIF_VERSION} => ${PREFIX}"
239+
@cmake \
240+
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
241+
-DCMAKE_BUILD_TYPE=Release \
242+
-DBUILD_SHARED_LIBS=0 \
243+
-DCMAKE_INSTALL_PREFIX="$(shell realpath ${PREFIX})" \
244+
-DCMAKE_PREFIX_PATH="$(shell realpath ${PREFIX})" \
245+
-DCMAKE_LIBRARY_PATH="$(shell realpath ${PREFIX})/lib" \
246+
-DCMAKE_INCLUDE_PATH="$(shell realpath ${PREFIX})/include" \
247+
${LIBHEIF_CONFIG} \
248+
-S ${BUILD_DIR}/libheif-${LIBHEIF_VERSION} \
249+
-B ${BUILD_DIR}/libheif-${LIBHEIF_VERSION}
250+
251+
# Build libheif
252+
.PHONY: libheif-build
253+
libheif-build: libheif-configure
254+
@echo "Building libheif-${LIBHEIF_VERSION} with ${JOBS} jobs"
255+
@cmake --build ${BUILD_DIR}/libheif-${LIBHEIF_VERSION} -j$(JOBS)
256+
257+
# Install libheif
258+
.PHONY: libheif
259+
libheif: libheif-build
260+
@echo "Installing libheif-${LIBHEIF_VERSION} => ${PREFIX}"
261+
@cmake --install ${BUILD_DIR}/libheif-${LIBHEIF_VERSION}
262+
@if ! grep -q 'libavcodec' "${PREFIX}/lib/pkgconfig/libheif.pc"; then \
263+
sed -i.bak 's/^Requires.private:[[:space:]]*/Requires.private: libavcodec libavformat libavutil /' "${PREFIX}/lib/pkgconfig/libheif.pc"; \
264+
rm -f "${PREFIX}/lib/pkgconfig/libheif.pc.bak"; \
265+
fi
266+
221267
###############################################################################
222268
# DOCKER
223269

270+
# Build the docker image
271+
.PHONY: docker
224272
docker: docker-dep
225-
@echo build docker image: ${BUILD_TAG} for ${OS}/${ARCH}
273+
@echo build docker image ${DOCKER_TAG} OS=${OS} ARCH=${ARCH} SOURCE=${DOCKER_SOURCE} VERSION=${VERSION}
226274
@${DOCKER} build \
227-
--tag ${BUILD_TAG} \
275+
--tag ${DOCKER_TAG} \
276+
--provenance=false \
228277
--build-arg ARCH=${ARCH} \
229278
--build-arg OS=${OS} \
230-
--build-arg SOURCE=${BUILD_MODULE} \
279+
--build-arg SOURCE=${DOCKER_SOURCE} \
231280
--build-arg VERSION=${VERSION} \
232281
-f etc/docker/Dockerfile .
233282

234-
docker-push: docker-dep
235-
@echo push docker image: ${BUILD_TAG}
236-
@${DOCKER} push ${BUILD_TAG}
283+
# Push docker container
284+
.PHONY: docker-push
285+
docker-push: docker-dep
286+
@echo push docker image: ${DOCKER_TAG}
287+
@${DOCKER} push ${DOCKER_TAG}
288+
289+
# Print out the version
290+
.PHONY: docker-version
291+
docker-version: docker-dep
292+
@echo "tag=${VERSION}"
237293

238294
###############################################################################
239295
# TESTS
240296

241297
.PHONY: test
242-
test: ffmpeg chromaprint libexif libraw test-ffmpeg test-chromaprint test-exif test-raw
243-
@echo ... test pkg/file
244-
@${GO} test ${ARGS} ./pkg/file
298+
test: ffmpeg chromaprint libexif libraw libheif test-ffmpeg test-chromaprint test-exif test-raw test-heif test-metadata test-gomedia
245299

246300
.PHONY: test-chromaprint
247301
test-chromaprint:
248-
@echo ... test pkg/chromaprint
302+
@echo ... test pkg/segmenter pkg/chromaprint
249303
@${CGO_ENV} ${GO} test ${ARGS} ./pkg/segmenter
250304
@${CGO_ENV} ${GO} test ${ARGS} ./pkg/chromaprint
251305

@@ -261,26 +315,27 @@ test-raw:
261315
@${CGO_ENV} ${GO} test ${ARGS} ./sys/libraw
262316
@${CGO_ENV} ${GO} test ${ARGS} ./pkg/raw
263317

264-
.PHONY: test-sys
265-
test-sys: go-dep go-tidy
266-
@echo Test
267-
@echo ... test sys/${SYS_VERSION}
268-
@${CGO_ENV} ${GO} test ${ARGS} ./sys/${SYS_VERSION}
318+
.PHONY: test-heif
319+
test-heif:
320+
@echo ... test sys/libheif pkg/heif
321+
@${CGO_ENV} ${GO} test ${ARGS} ./sys/libheif
322+
@${CGO_ENV} ${GO} test ${ARGS} ./pkg/heif
269323

270324
.PHONY: test-ffmpeg
271-
test-ffmpeg: test-sys
272-
@echo Test
273-
@echo ... test pkg/ffmpeg/...
325+
test-ffmpeg: go-dep go-tidy
326+
@echo ... test sys/${SYS_VERSION} pkg/ffmpeg
327+
@${CGO_ENV} ${GO} test ${ARGS} ./sys/${SYS_VERSION}
274328
@${CGO_ENV} ${GO} test ${ARGS} ./pkg/ffmpeg/...
275329

276-
.PHONY: coverage
277-
coverage: ffmpeg chromaprint sdl-dep mkdir
278-
@echo "Running tests with coverage..."
279-
@${CGO_ENV} ${GO} test ${ARGS} ${BUILD_FLAGS} -coverprofile=${BUILD_DIR}/coverage.out -covermode=atomic ./sys/${SYS_VERSION} ./pkg/...
280-
@${GO} tool cover -func=${BUILD_DIR}/coverage.out | tail -1
281-
@${GO} tool cover -html=${BUILD_DIR}/coverage.out -o ${BUILD_DIR}/coverage.html
282-
@echo "Coverage report: ${BUILD_DIR}/coverage.html"
330+
.PHONY: test-metadata
331+
test-metadata:
332+
@echo ... test metadata/...
333+
@${CGO_ENV} ${GO} test ${ARGS} ./metadata/...
283334

335+
.PHONY: test-gomedia
336+
test-gomedia:
337+
@echo ... test gomedia/...
338+
@${CGO_ENV} ${GO} test ${ARGS} ./gomedia/...
284339

285340
###############################################################################
286341
# DEPENDENCIES, ETC
@@ -346,7 +401,31 @@ ffmpeg-dep:
346401
$(eval FFMPEG_CONFIG := $(FFMPEG_CONFIG) $(shell ${PKG_CONFIG} --exists openh264 && echo "--enable-libopenh264"))
347402
@echo "FFmpeg configuration: $(FFMPEG_CONFIG)"
348403

404+
# Check for libheif dependencies
405+
.PHONY: libheif-dep
406+
libheif-dep:
407+
$(eval LIBHEIF_CONFIG := -DENABLE_PLUGIN_LOADING=OFF -DWITH_EXAMPLES=OFF -DBUILD_TESTING=OFF -DBUILD_DOCUMENTATION=OFF)
408+
$(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG) -DWITH_GDK_PIXBUF=OFF)
409+
$(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG) -DWITH_LIBSHARPYUV=OFF)
410+
$(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG) -DWITH_LIBDE265=$(shell ${PKG_CONFIG} --exists libde265 && echo ON || echo OFF))
411+
$(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG) -DWITH_X265=$(shell ${PKG_CONFIG} --exists x265 && echo ON || echo OFF))
412+
$(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG) -DWITH_AOM_DECODER=$(shell ${PKG_CONFIG} --exists aom && echo ON || echo OFF))
413+
$(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG) -DWITH_AOM_ENCODER=$(shell ${PKG_CONFIG} --exists aom && echo ON || echo OFF))
414+
$(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG) -DWITH_DAV1D=$(shell ${PKG_CONFIG} --exists dav1d && echo ON || echo OFF))
415+
$(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG) -DWITH_SvtEnc=$(shell ${PKG_CONFIG} --exists SvtAv1Enc && echo ON || echo OFF))
416+
$(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG) -DWITH_OpenH264_DECODER=$(shell ${PKG_CONFIG} --exists openh264 && echo ON || echo OFF))
417+
$(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG) -DWITH_X264=$(shell ${PKG_CONFIG} --exists x264 && echo ON || echo OFF))
418+
$(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG) -DWITH_FFMPEG_DECODER=$(shell ${PKG_CONFIG} --exists libavcodec libavformat libavutil && echo ON || echo OFF))
419+
$(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG) -DWITH_JPEG_DECODER=$(shell ${PKG_CONFIG} --exists libjpeg && echo ON || echo OFF))
420+
$(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG) -DWITH_JPEG_ENCODER=$(shell ${PKG_CONFIG} --exists libjpeg && echo ON || echo OFF))
421+
@echo "libheif configuration: $(LIBHEIF_CONFIG)"
422+
349423
# Check for SDL dependencies
350424
.PHONY: sdl-dep
351425
sdl-dep:
352426
$(eval BUILD_FLAGS := $(BUILD_FLAGS) $(shell $(PKG_CONFIG) --exists sdl2 && echo "--tags sdl2"))
427+
428+
# Check for Chromaprint dependencies
429+
.PHONY: chromaprint-dep
430+
chromaprint-dep:
431+
$(eval BUILD_FLAGS := $(BUILD_FLAGS) $(shell PKG_CONFIG_PATH="$(shell realpath ${PREFIX})/lib/pkgconfig:$$PKG_CONFIG_PATH" $(PKG_CONFIG) --exists libchromaprint && echo "--tags chromaprint"))

0 commit comments

Comments
 (0)