Merhaba 👋

Geçtiğimiz günlerde bir içerik paylaşımı hazırlarken, Instagram’daki bir videoyu indirmem gerekti. Ancak malum, Instagram doğrudan indirme seçeneği sunmuyor. Derken biraz araştırırken, tarayıcı üzerinde küçük bir JavaScript kodu sayesinde izlediğim videoyu otomatik kaydedip bilgisayarıma indirebildiğimi keşfettim.

Kodu paylaşmadan önce küçük bir not: Bu yöntem yalnızca tarayıcınızda o anda açık ve izlenebilir durumdaki videolar için geçerli. Yani videoyu zaten izleyebiliyorsanız, bu kod da o videoyu sistem üzerinden yakalayıp kaydedebiliyor.

💡 Nasıl Kullanılır?

  1. Videoyu izlediğiniz sayfayı açın.
  2. Sağ tıklayıp “İncele (Inspect)” seçeneğine tıklayın.
  3. Açılan geliştirici araçlar penceresinden “Console” sekmesine geçin.
  4. Aşağıdaki kodu yapıştırın:
(() => {
  if (window.__igAutoRecInstalled) return;
  window.__igAutoRecInstalled = true;

  // En görünür/oynayan videoyu seç
  const pickVideo = () => {
    const vids = Array.from(document.querySelectorAll('video'));
    if (!vids.length) return null;
    return vids
      .map(v => {
        const r = v.getBoundingClientRect();
        const area = Math.max(0, r.width) * Math.max(0, r.height);
        const playing = !v.paused && !v.ended && v.readyState >= 2;
        return { v, area, playing };
      })
      .sort((a,b)=> (b.playing - a.playing) || (b.area - a.area))[0].v;
  };

  const video = pickVideo();
  if (!video) { alert('Video bulunamadı. Lütfen videoyu görünür/oynatılır yapın.'); return; }

  // Küçük durum etiketi
  const host = video.closest('[role], article, div') || video.parentElement || document.body;
  if (getComputedStyle(host).position === 'static') host.style.position = 'relative';
  const badge = document.createElement('div');
  Object.assign(badge.style, {
    position: 'absolute', top: '8px', left: '8px', zIndex: 999999,
    padding: '6px 10px', borderRadius: '10px', fontSize: '12px',
    fontWeight: '600', color: '#fff', background: 'rgba(0,0,0,0.65)'
  });
  badge.textContent = 'Hazır • Oynatınca kaydeder';
  host.appendChild(badge);
  const setBadge = (t)=> badge.textContent = t;

  let recorder = null;
  let chunks = [];
  let activeStream = null;
  let started = false;

  const makeFilename = () => {
    const ts = new Date().toISOString().replace(/[:.]/g,'-');
    return `instagram_auto_capture_${ts}.webm`;
  };

  const stopAndSave = () => {
    try {
      if (recorder && recorder.state !== 'inactive') recorder.stop();
    } catch {}
    try {
      if (activeStream) activeStream.getTracks().forEach(t => t.stop());
    } catch {}
    activeStream = null;
    recorder = null;
  };

  const startRecording = async () => {
    if (recorder || started) return;
    started = true;
    setBadge('Kayıt başlatılıyor…');

    chunks = [];

    // 1) Öncelik: video.captureStream (varsa sesiyle birlikte)
    const composeFromVideo = () => {
      try {
        if (!video.captureStream) return null;
        const vStream = video.captureStream();
        const tracks = [...vStream.getVideoTracks(), ...vStream.getAudioTracks()];
        if (!tracks.length) return null;
        const ms = new MediaStream(tracks);
        return ms;
      } catch { return null; }
    };

    // 2) Alternatif: getDisplayMedia (kullanıcı sekmeyi seçer, sistem/tab sesi dahil olabilir)
    const getDisplay = async () => {
      return await navigator.mediaDevices.getDisplayMedia({
        video: { frameRate: 30 },
        audio: true
      });
    };

    activeStream = composeFromVideo();
    if (!activeStream) {
      try {
        activeStream = await getDisplay();
      } catch (e) {
        setBadge('İzin alınamadı • Kaydedilemiyor');
        started = false;
        return;
      }
    }

    let mime = 'video/webm;codecs=vp9,opus';
    if (!MediaRecorder.isTypeSupported?.(mime)) {
      mime = 'video/webm;codecs=vp8,opus';
      if (!MediaRecorder.isTypeSupported?.(mime)) mime = 'video/webm';
    }

    recorder = new MediaRecorder(activeStream, { mimeType: mime });
    recorder.ondataavailable = (ev) => { if (ev.data && ev.data.size) chunks.push(ev.data); };
    recorder.onstop = () => {
      try {
        const blob = new Blob(chunks, { type: mime });
        const url = URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url; a.download = makeFilename();
        document.body.appendChild(a); a.click(); a.remove();
        setTimeout(()=>URL.revokeObjectURL(url), 30_000);
      } catch {}
      setBadge('Kaydedildi • Tekrar oynatınca yeniden kaydeder');
      started = false;
    };

    recorder.start();
    setBadge('● Kaydediyor…');
  };

  // Oynayınca otomatik başlat, bitince otomatik durdur
  const onPlay = async () => {
    // Bazı tarayıcılarda captureStream ses için muted etkileyebilir; emin olmak için:
    try { if (video.muted) video.muted = false; } catch {}
    if (!recorder) await startRecording();
  };

  const onEnded = () => {
    setBadge('Bitirdi • Kaydediliyor…');
    stopAndSave();
  };

  // Eğer kullanıcı durdurursa (pause) kaydı sürdürmek isteyebilir; dokunmuyoruz.
  // Sadece tamamen bittiğinde kaydı sonlandırıyoruz.
  video.addEventListener('play', onPlay, { passive: true });
  video.addEventListener('ended', onEnded, { passive: true });

  // Eğer sayfa içi carousel/next post ile video objesi değişirse, yeniden bağla
  const mo = new MutationObserver(() => {
    if (!document.body.contains(video)) {
      try { video.removeEventListener('play', onPlay); } catch {}
      try { video.removeEventListener('ended', onEnded); } catch {}
      mo.disconnect();
      window.__igAutoRecInstalled = false;
    }
  });
  mo.observe(document.body, { childList: true, subtree: true });
})();

Instagram Video indirme kodu

Artık tek yapman gereken videoya tıklayıp oynatmak. Kod, o anda ekranda görünen videoyu sesiyle birlikte kaydetmeye başlıyor. Video bittiğinde otomatik olarak indirme işlemi gerçekleşiyor. 🎉

🧠 Ufak Bir Teknik Detay

Bu kod, tarayıcıların MediaRecorder API’sini kullanıyor. Yani sayfadaki videonun gerçek zamanlı görüntüsünü ve sesini alıp kaydediyor. HLS veya DRM korumalı videolarda (örneğin Netflix, Amazon Prime gibi) çalışmaz ama sosyal medya veya haber sitelerindeki videolarda genellikle sorunsuz şekilde işe yarıyor.

💬 Kapanış

Aslında bu küçük kod parçası bana bir şeyi hatırlattı:

Bazen en basit çözümler, en büyük konforu getiriyor.

Tarayıcı üzerinde birkaç satır JavaScript ile günlük işlerimizi kolaylaştırabiliyoruz. Benim için bu sadece video indirmek değil, aynı zamanda tarayıcıda doğrudan üretken olmanın bir yolu oldu.