summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Jolly <kangie@gentoo.org>2024-03-25 17:46:52 +1000
committerMatt Jolly <kangie@gentoo.org>2024-03-25 20:27:02 +1000
commit27d24e85030b0653630c93f123ccc68e310d7dc4 (patch)
tree87d3883a16fae10cb7a79758803809d8df3e9512
parentnew script: get-opera-version-mapping (diff)
downloadchromium-tools-27d24e85030b0653630c93f123ccc68e310d7dc4.tar.gz
chromium-tools-27d24e85030b0653630c93f123ccc68e310d7dc4.tar.bz2
chromium-tools-27d24e85030b0653630c93f123ccc68e310d7dc4.zip
automate chromium-ffmpeg packaging
Signed-off-by: Matt Jolly <kangie@gentoo.org>
-rwxr-xr-xget-opera-version-mapping.py2
-rwxr-xr-xpackage-chromium-ffmpeg.py175
2 files changed, 176 insertions, 1 deletions
diff --git a/get-opera-version-mapping.py b/get-opera-version-mapping.py
index 43f8f32..2b515b4 100755
--- a/get-opera-version-mapping.py
+++ b/get-opera-version-mapping.py
@@ -103,7 +103,7 @@ def remediate_unknown_versions(versions):
# Example usage
# Base URL with version placeholder
base_url = "https://blogs.opera.com/desktop/changelog-for-{}/"
-opera_chromium_versions = get_opera_chromium_versions(base_url, 100, 108)
+opera_chromium_versions = get_opera_chromium_versions(base_url, 100, 110)
opera_chromium_versions = remediate_unknown_versions(opera_chromium_versions)
diff --git a/package-chromium-ffmpeg.py b/package-chromium-ffmpeg.py
new file mode 100755
index 0000000..5db694e
--- /dev/null
+++ b/package-chromium-ffmpeg.py
@@ -0,0 +1,175 @@
+#!/usr/bin/env python3
+
+import re
+import os
+import logging
+import subprocess
+import requests
+
+# Configure logging
+logging.basicConfig(
+ format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO,
+ datefmt='%Y-%m-%d %H:%M:%S')
+
+
+def get_commit(version_url):
+ """Fetches the git hash from the Chromium ffmpeg submodule URL using requests.
+
+ Args:
+ version_url: The URL of the Chromium ffmpeg submodule for a specific version.
+
+ Returns:
+ The git commit hash found in the submodule URL, or None if not found.
+ """
+ try:
+ # Use requests.get to fetch the URL content
+ response = requests.get(version_url)
+ response.raise_for_status() # Raise exception for non-200 status codes
+
+ # Search for commit hash within the 'gitlink-detail' class (adapt if needed)
+ match = re.search(
+ r'<div class="gitlink-detail">Submodule link to (.*?) of', response.text)
+ if match:
+ return match.group(1)
+ else:
+ return None
+ except requests.exceptions.RequestException as e:
+ logging.error(f"Error: Failed to fetch URL {version_url} - {e}")
+ return None
+
+
+def archive_ffmpeg(version, commit_hash):
+ """Archives the Chromium ffmpeg repository at the specified commit hash.
+
+ Args:
+ version: The Chromium major version (e.g. 123).
+ commit_hash: The git commit hash of the desired ffmpeg revision.
+ """
+ # Base directory for ffmpeg checkout (configurable)
+ ffmpeg_dir = os.getenv("FFMPEG_TEMP_DIR", "/tmp/ffmpeg")
+ # Archive filename with version substitution
+ archive_name = f"/tmp/ffmpeg-chromium-{version}.tar.xz"
+
+ repo_uri = "https://chromium.googlesource.com/chromium/third_party/ffmpeg"
+
+ # Check if ffmpeg directory already exists
+ if os.path.exists(ffmpeg_dir):
+ # Verify remote URL matches expected repository
+ try:
+ output = subprocess.run(
+ ["git", "remote", "-v"], cwd=ffmpeg_dir, capture_output=True, check=True).stdout.decode()
+ if not re.search(repo_uri, output, re.MULTILINE):
+ logging.error(
+ f"Existing ffmpeg directory {ffmpeg_dir} points to a different remote. Please remove and re-clone.")
+ exit(1)
+ except subprocess.CalledProcessError as e:
+ logging.error(f"Error verifying remote URL: {e}")
+ exit(1)
+
+ # Update existing repository
+ try:
+ subprocess.run(["git", "pull"], cwd=ffmpeg_dir, check=True)
+ except subprocess.CalledProcessError as e:
+ logging.error(f"Error updating ffmpeg repository: {e}")
+ exit(1)
+ else:
+ # Clone the Chromium ffmpeg repository
+ try:
+ subprocess.run(
+ ["git", "clone", repo_uri, ffmpeg_dir], check=True)
+ except subprocess.CalledProcessError as e:
+ logging.error(f"Error cloning ffmpeg repository: {e}")
+ exit(1)
+
+ # Archive the ffmpeg directory with prefix and specific commit hash
+ try:
+ logging.info(
+ f"Archiving ffmpeg-chromium@{commit_hash}, this may take a moment...")
+ subprocess.run(["git", "archive", "--format=tar.xz", "-o", archive_name,
+ f"--prefix=ffmpeg-chromium-{version}/", commit_hash], cwd=ffmpeg_dir, check=True)
+ logging.info(
+ f"ffmpeg-chromium@{commit_hash} archived to {archive_name}")
+ except subprocess.CalledProcessError as e:
+ logging.error(f"Error archiving ffmpeg: {e}")
+
+
+def copy_and_update_ebuild(version, commit_hash):
+ """Copies the latest ffmpeg-chromium.ebuild and updates the COMMIT variable.
+
+ Args:
+ version: The Chromium version (e.g., 124).
+ commit_hash: The git commit hash of the desired ffmpeg revision.
+ """
+ # Target directory for ffmpeg-chromium ebuilds (configurable)
+ ebuild_dir = os.getenv("FFMPEG_EBUILD_DIR",
+ "/var/db/repos/gentoo/media-video/ffmpeg-chromium")
+ # Destination ebuild filename with version substitution
+ dest_ebuild = f"ffmpeg-chromium-{version}.ebuild"
+
+ # Find the highest version ebuild file
+ highest_version = None
+ for filename in os.listdir(ebuild_dir):
+ match = re.match(r"ffmpeg-chromium-(\d+)\.ebuild", filename)
+ if match:
+ current_version = int(match.group(1))
+ if highest_version is None or current_version > highest_version:
+ highest_version = current_version
+ highest_ebuild = os.path.join(ebuild_dir, filename)
+ # Check if a higher version ebuild exists
+ if highest_version:
+ # Copy the highest version ebuild
+ try:
+ subprocess.run(["cp", highest_ebuild,
+ os.path.join(ebuild_dir, dest_ebuild)],
+ check=True,)
+ except subprocess.CalledProcessError as e:
+ logging.error(f"Error copying ebuild file: {e}")
+ exit(1)
+
+ logging.info(
+ f"Copied ffmpeg-chromium-{highest_version}.ebuild to {dest_ebuild}"
+ )
+
+ # Update the COMMIT variable in the copied ebuild
+ with open(os.path.join(ebuild_dir, dest_ebuild), "r+") as f:
+ lines = f.readlines()
+ for i, line in enumerate(lines):
+ if line.startswith("COMMIT="):
+ lines[i] = f"COMMIT={commit_hash}\n"
+ f.seek(0)
+ f.writelines(lines)
+ logging.info(
+ f"Updated COMMIT variable in {dest_ebuild} to {commit_hash}")
+ break
+ else:
+ logging.info(
+ f"No existing ffmpeg-chromium ebuilds found in {ebuild_dir}")
+
+
+def main():
+ """Main function to handle user input and script execution."""
+ version_regex = r"^\d+\.\d+(?:\.\d+(?:\.\d+)?)?$" # Validate version format
+
+ while True:
+ version = input("Enter Chromium version (e.g., 123.0.4567.890): ")
+ if re.match(version_regex, version):
+ break
+ else:
+ print(
+ "Invalid version format. Please enter a version like X.Y.Z.W (e.g., 123.0.4567.890)")
+
+ version_url = f"https://chromium.googlesource.com/chromium/src.git/+/refs/tags/{version}/third_party/ffmpeg"
+ commit_hash = get_commit(version_url)
+ if commit_hash:
+ logging.info(
+ f"Chromium version {version} uses ffmpeg commit {commit_hash}")
+ major_version = version.split(".")[0]
+ archive_ffmpeg(major_version, commit_hash)
+ copy_and_update_ebuild(major_version, commit_hash)
+ else:
+ logging.error(
+ f"Failed to retrieve commit hash for Chromium version {version}")
+
+
+if __name__ == "__main__":
+ main()