{
  "manifest_version": 3,
  "name": "Sync Waves",
  "version": "1.0",
  "description": "Synchronize audio and video with custom start times.",
  "permissions": [
    "activeTab",
    "scripting",
    "tabs"
  ],
  "action": {
    "default_title": "Sync Waves"
  },
  "background": {
    "service_worker": "background.js"
  },
  "icons": {
    "16": "icons/icon16.png",
    "48": "icons/icon48.png",
    "128": "icons/icon128.png"
  },
  "chrome_url_overrides": {
    "newtab": "index.html"
  }
}

chrome.runtime.onInstalled.addListener(() => {
  console.log('Sync Waves Extension Installed');
});

// Listen for the extension icon click
chrome.action.onClicked.addListener((tab) => {
  // Open index.html in a new tab
  chrome.tabs.create({ url: chrome.runtime.getURL("index.html") });
});

<!DOCTYPE html>
<html lang="en"><head>
  <meta charset="UTF-8">
  <title>Sync Waves</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <h1>Sync Waves</h1>
  
  <div class="container">
    <!-- Audio Section -->
    <div class="section" id="audio-section">
      <h2>Audio</h2>
      
      <div class="audio-content">
        <!-- Inputs and Load Button -->
        <div class="inputs">
          <label for="audio-url">YouTube URL:</label>
          <input type="url" id="audio-url" placeholder="Enter YouTube Audio URL">
          
          <label for="audio-file">Load Local Audio File:</label>
          <div class="inner-column">
            <div class="left">
              <input type="file" id="audio-file" accept="audio/*">
            </div>
            <div class="right">
              <audio id="audio-player" controls=""></audio>
            </div>
          </div>
          
          <label for="audio-start-time">Start Time (seconds):</label>
          <input type="number" id="audio-start-time" placeholder="Start Time (seconds)" min="0">
          
          <button id="load-audio">Load Audio</button>
        </div>
      </div>
    </div>
    
    <!-- Video Section -->
    <div class="section" id="video-section">
      <h2>Video</h2>
      
      <div class="video-content">
        <div class="inputs">
          <label for="video-url">YouTube URL:</label>
          <input type="url" id="video-url" placeholder="Enter YouTube Video URL">
          
          <label for="video-file">Load Local Video File:</label>
          <input type="file" id="video-file" accept="video/*">
          
          <label for="video-start-time">Start Time (seconds):</label>
          <input type="number" id="video-start-time" placeholder="Start Time (seconds)" min="0">
          
          <button id="load-video">Load Video</button>
        </div>
      </div>
    </div>
  </div>
  
  <!-- Control Buttons -->
  
  
  <!-- Media Elements -->
  <div class="media-container">
    <video id="video-player" controls="" width="100%"></video>
  </div>
  
  <script src="script.js"></script>

<div class="controls">
    <button id="play">Play</button>
    <button id="pause">Pause</button>
    <button id="resume">Resume</button>
</div></body></html>


document.addEventListener('DOMContentLoaded', () => {
  const audioUrlInput = document.getElementById('audio-url');
  const audioFileInput = document.getElementById('audio-file');
  const audioStartTimeInput = document.getElementById('audio-start-time');
  const loadAudioButton = document.getElementById('load-audio');
  
  const videoUrlInput = document.getElementById('video-url');
  const videoFileInput = document.getElementById('video-file');
  const videoStartTimeInput = document.getElementById('video-start-time');
  const loadVideoButton = document.getElementById('load-video');
  
  const playButton = document.getElementById('play');
  const pauseButton = document.getElementById('pause');
  const resumeButton = document.getElementById('resume');
  
  const audioPlayer = document.getElementById('audio-player');
  const videoPlayer = document.getElementById('video-player');
  
  // Load Audio
  loadAudioButton.addEventListener('click', () => {
    const youtubeUrl = audioUrlInput.value.trim();
    const file = audioFileInput.files[0];
    const startTime = parseInt(audioStartTimeInput.value, 10) || 0;
    
    if (youtubeUrl) {
      // Load YouTube Audio
      // Note: Directly loading YouTube audio requires using YouTube APIs.
      // For simplicity and due to CSP restrictions, we'll notify the user.
      alert('Loading audio from YouTube is not supported in this version.');
    } else if (file) {
      const reader = new FileReader();
      reader.onload = function(e) {
        audioPlayer.src = e.target.result;
        audioPlayer.load();
        audioPlayer.addEventListener('canplay', () => {
          audioPlayer.currentTime = startTime;
        }, { once: true });
      };
      reader.readAsDataURL(file);
    } else {
      alert('Please provide a YouTube URL or select an audio file.');
    }
  });
  
  // Load Video
  loadVideoButton.addEventListener('click', () => {
    const youtubeUrl = videoUrlInput.value.trim();
    const file = videoFileInput.files[0];
    const startTime = parseInt(videoStartTimeInput.value, 10) || 0;
    
    if (youtubeUrl) {
      // Load YouTube Video
      // Note: Embedding YouTube videos requires using iframes or YouTube APIs.
      // For CSP compliance, consider using embeds carefully.
      const videoID = extractYouTubeID(youtubeUrl);
      if (videoID) {
        videoPlayer.src = `https://www.youtube.com/embed/${videoID}?autoplay=1&controls=1`;
        videoPlayer.addEventListener('loadeddata', () => {
          setTimeout(() => {
            videoPlayer.pause();
            videoPlayer.currentTime = startTime;
          }, 125); // Play for 1/8th of a second (125ms)
        }, { once: true });
      } else {
        alert('Invalid YouTube URL.');
      }
    } else if (file) {
      const reader = new FileReader();
      reader.onload = function(e) {
        videoPlayer.src = e.target.result;
        videoPlayer.load();
        videoPlayer.addEventListener('canplay', () => {
          videoPlayer.currentTime = startTime;
        }, { once: true });
      };
      reader.readAsDataURL(file);
    } else {
      alert('Please provide a YouTube URL or select a video file.');
    }
  });
  
  // Play Button
  playButton.addEventListener('click', () => {
    audioPlayer.play();
    videoPlayer.play();
  });
  
  // Pause Button
  pauseButton.addEventListener('click', () => {
    audioPlayer.pause();
    videoPlayer.pause();
  });
  
  // Resume Button
  resumeButton.addEventListener('click', () => {
    audioPlayer.play();
    videoPlayer.play();
  });
  
  // Helper function to extract YouTube video ID
  function extractYouTubeID(url) {
    const regex = /(?:https?:\/\/)?(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-]{11})/;
    const match = url.match(regex);
    return match ? match[1] : null;
  }
});

* {
  box-sizing: border-box;
}

body {
  font-family: Arial, sans-serif;
  width: 90%;
  margin: 0 auto;
  padding: 15px;
}

h1 {
  text-align: center;
  margin-bottom: 30px;
}

/* Container for Audio and Video Sections */
.container {
  display: flex;
  flex-direction: column; /* Vertical layout */
  gap: 15px; /* Space between sections */
}

/* Individual Section Styling */
.section {
  width: 100%;
  display: flex;
  flex-direction: column;
}

.section h2 {
  text-align: center;
  margin: 15px;
}

/* Audio and Video Content Styling */
.audio-content,
.video-content {
  display: flex;
  flex-direction: column;
  gap: 15px;
}

/* Inputs Styling */
.inputs {
  display: flex;
  flex-direction: column;
  gap: 15px;
}

.inputs label {
  font-weight: bold;
}

.inputs input,
.inputs button {
  padding: 10px;
  font-size: 1em;
  width: 100%;
}

.inputs button {
  cursor: pointer;
}

/* Inner Column for Audio Player Positioning */
.inner-column {
  display: flex;
  flex-wrap: wrap;
  gap: 15px;
  align-items: center;
}

.left {
  flex: 1;
  min-width: 200px;
}

.right {
  flex: 1;
  display: flex;
  justify-content: center;
  min-width: 200px;
}

.right audio {
  width: 100%;
}

/* Control Buttons Styling */
.controls {
  display: flex;
  justify-content: center;
  gap: 10px;
  margin: 15px 0;
}

.controls button {
  padding: 10px 20px;
  font-size: 1em;
  cursor: pointer;
}

/* Media Container Styling */
.media-container {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 15px;
}

.media-container video {
  width: 100%;
  max-width: 800px;
  margin-top: 15px;
}

/* Responsive Design */
@media (max-width: 768px) {
  .inner-column {
    gap: 15px;
    flex-direction: column;
    align-items: stretch;
  }

  .right audio {
    max-width: 100%;
  }

  .media-container video {
    max-width: 100%;
  }

  h1 {
    text-align: center;
    margin-bottom: 15px;
  }
}

@media (max-width: 480px) {
  .controls {
    flex-direction: column;
    gap: 10px;
  }

  .controls button {
    width: 100%;
  }

.inner-column {
align-items: unset;
gap: unset;
}
}

i only want the completed updated files. optimize everything you see fit.