Latest commit

History

73 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

instadb

This script is currently deprecated due to Instagram removing the public /media/ endpoint

Features

  • Download ALL media files from an Instagram user (images, carousel media, videos)
  • Write metadata to ALL media files
  • Skip already downloaded files
  • Download media to custom directory
  • Proxy support
  • Upon connection error (with or without a proxy), enter a new proxy to resume
  • Skip downloading posts that don't have enough likes
  • Write user posts metadata to an Sqlite3 database
  • Download just photos, or just videos, or everything

Installation

Simply download this repository, or use git clone https://github.com/spambusters/instadb.git

Requirements

  1. python 3.5+
  2. requests
    • Network requests
    • pip3 install requests
  3. mutagen
    • Video metadata
    • pip3 install mutagen
  4. exiftool
    • Photo metadata
    • Ubuntu
      • sudo apt install libimage-exiftool-perl
    • Windows / OSX
      • Download from the offical site, then add it to your system's PATH

Usage

usage: instadb.py [-h] [--proxy PROXY] [--rate-limit LIMIT] [--likes LIKES]
[--photos] [--videos] [--tags [...]] [--path PATH] [--new]
[--db] [--only-db]
user
positional arguments:
user Instagram user
optional arguments:
-h, --help show this help message and exit
--proxy PROXY Proxy must be in the format address:port
--rate-limit LIMIT Seconds between Instagram requests (default: 1)
--likes LIKES Only download media with at least this many likes
--photos Only download photos
--videos Only download videos
--path PATH Custom path for saving local files. (default:
"$USER/Downloads/instadb/$ig_user/")
--new Only download new media files
Metadata:
--tags [ ...] Space separated media tags (default: [user,
"instagram"])
--db Write user metadata to an Sqlite3 database
--only-db Skip downloading media files

Examples

Example account:https://www.instagram.com/espn/

Download all media with the default rate limit, metadata tags, and write metadata to an Sqlite3 database
instadb.py espn --db

Use a proxy to download only photos with at least 2000 likes and no rate limit
instadb.py espn --proxy 192.168.0.1:8080 --photos --likes 2000 --rate-limit 0

Download only videos and tag them as "espn", "video", "sports"
instadb.py espn --videos --tags espn video sports

Download only new files to a custom path
instadb.py espn --path "/media/DataHoarder/espn/" --new

Skip downloading media files and only write the metadata database
instadb.py espn --only-db

Example Output

alt text

Metadata

Videos

Video metadata is useful for media servers like Plex.

  1. Video Title
    • Same as the filename (user + shortcode)
  2. Cast Members / Studio
    • The Instagram user
  3. Genres
    • The default tags are [user, "instagram"], but custom tags can be specified with the --tags CLI arg
  4. Video Summary
    • The post caption

Here's an example video in Plex from the https://www.instagram.com/espn/ account:

alt text

Because the videos are downloaded from Instagram, they're already optimized for streaming and should require no further conversions.

Photos

Photo metadata is useful for photo browsing programs that support it, like Shotwell

alt text

But the metadata can also be useful in a plain old file browser, like Windows explorer

alt text

Notice the Date Taken value. This is the time which the photo was originally uploaded to Instagram. This value is also written as the last "Modification date" for the file, so you can sort to your heart's content.

Database

When you specify the --db or --only-db CLI args, post metadata will be written to an Sqlite3 database in the downloads folder.

I suggest using DB Browser for SQLite for browsing.
It will allow you to sort by column, so for example you can sort by likes to find the most popular post.

alt text

About

Download an Instagram user's media plus metadata

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

73 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

instadb

This script is currently deprecated due to Instagram removing the public /media/ endpoint

Features

  • Download ALL media files from an Instagram user (images, carousel media, videos)
  • Write metadata to ALL media files
  • Skip already downloaded files
  • Download media to custom directory
  • Proxy support
  • Upon connection error (with or without a proxy), enter a new proxy to resume
  • Skip downloading posts that don't have enough likes
  • Write user posts metadata to an Sqlite3 database
  • Download just photos, or just videos, or everything

Installation

Simply download this repository, or use git clone https://github.com/spambusters/instadb.git

Requirements

  1. python 3.5+
  2. requests
    • Network requests
    • pip3 install requests
  3. mutagen
    • Video metadata
    • pip3 install mutagen
  4. exiftool
    • Photo metadata
    • Ubuntu
      • sudo apt install libimage-exiftool-perl
    • Windows / OSX
      • Download from the offical site, then add it to your system's PATH

Usage

usage: instadb.py [-h] [--proxy PROXY] [--rate-limit LIMIT] [--likes LIKES]
[--photos] [--videos] [--tags [...]] [--path PATH] [--new]
[--db] [--only-db]
user
positional arguments:
user Instagram user
optional arguments:
-h, --help show this help message and exit
--proxy PROXY Proxy must be in the format address:port
--rate-limit LIMIT Seconds between Instagram requests (default: 1)
--likes LIKES Only download media with at least this many likes
--photos Only download photos
--videos Only download videos
--path PATH Custom path for saving local files. (default:
"$USER/Downloads/instadb/$ig_user/")
--new Only download new media files
Metadata:
--tags [ ...] Space separated media tags (default: [user,
"instagram"])
--db Write user metadata to an Sqlite3 database
--only-db Skip downloading media files

Examples

Example account:https://www.instagram.com/espn/

Download all media with the default rate limit, metadata tags, and write metadata to an Sqlite3 database
instadb.py espn --db

Use a proxy to download only photos with at least 2000 likes and no rate limit
instadb.py espn --proxy 192.168.0.1:8080 --photos --likes 2000 --rate-limit 0

Download only videos and tag them as "espn", "video", "sports"
instadb.py espn --videos --tags espn video sports

Download only new files to a custom path
instadb.py espn --path "/media/DataHoarder/espn/" --new

Skip downloading media files and only write the metadata database
instadb.py espn --only-db

Example Output

alt text

Metadata

Videos

Video metadata is useful for media servers like Plex.

  1. Video Title
    • Same as the filename (user + shortcode)
  2. Cast Members / Studio
    • The Instagram user
  3. Genres
    • The default tags are [user, "instagram"], but custom tags can be specified with the --tags CLI arg
  4. Video Summary
    • The post caption

Here's an example video in Plex from the https://www.instagram.com/espn/ account:

alt text

Because the videos are downloaded from Instagram, they're already optimized for streaming and should require no further conversions.

Photos

Photo metadata is useful for photo browsing programs that support it, like Shotwell

alt text

But the metadata can also be useful in a plain old file browser, like Windows explorer

alt text

Notice the Date Taken value. This is the time which the photo was originally uploaded to Instagram. This value is also written as the last "Modification date" for the file, so you can sort to your heart's content.

Database

When you specify the --db or --only-db CLI args, post metadata will be written to an Sqlite3 database in the downloads folder.

I suggest using DB Browser for SQLite for browsing.
It will allow you to sort by column, so for example you can sort by likes to find the most popular post.

alt text

About

Download an Instagram user's media plus metadata

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

73 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

instadb

This script is currently deprecated due to Instagram removing the public /media/ endpoint

Features

  • Download ALL media files from an Instagram user (images, carousel media, videos)
  • Write metadata to ALL media files
  • Skip already downloaded files
  • Download media to custom directory
  • Proxy support
  • Upon connection error (with or without a proxy), enter a new proxy to resume
  • Skip downloading posts that don't have enough likes
  • Write user posts metadata to an Sqlite3 database
  • Download just photos, or just videos, or everything

Installation

Simply download this repository, or use git clone https://github.com/spambusters/instadb.git

Requirements

  1. python 3.5+
  2. requests
    • Network requests
    • pip3 install requests
  3. mutagen
    • Video metadata
    • pip3 install mutagen
  4. exiftool
    • Photo metadata
    • Ubuntu
      • sudo apt install libimage-exiftool-perl
    • Windows / OSX
      • Download from the offical site, then add it to your system's PATH

Usage

usage: instadb.py [-h] [--proxy PROXY] [--rate-limit LIMIT] [--likes LIKES]
[--photos] [--videos] [--tags [...]] [--path PATH] [--new]
[--db] [--only-db]
user
positional arguments:
user Instagram user
optional arguments:
-h, --help show this help message and exit
--proxy PROXY Proxy must be in the format address:port
--rate-limit LIMIT Seconds between Instagram requests (default: 1)
--likes LIKES Only download media with at least this many likes
--photos Only download photos
--videos Only download videos
--path PATH Custom path for saving local files. (default:
"$USER/Downloads/instadb/$ig_user/")
--new Only download new media files
Metadata:
--tags [ ...] Space separated media tags (default: [user,
"instagram"])
--db Write user metadata to an Sqlite3 database
--only-db Skip downloading media files

Examples

Example account:https://www.instagram.com/espn/

Download all media with the default rate limit, metadata tags, and write metadata to an Sqlite3 database
instadb.py espn --db

Use a proxy to download only photos with at least 2000 likes and no rate limit
instadb.py espn --proxy 192.168.0.1:8080 --photos --likes 2000 --rate-limit 0

Download only videos and tag them as "espn", "video", "sports"
instadb.py espn --videos --tags espn video sports

Download only new files to a custom path
instadb.py espn --path "/media/DataHoarder/espn/" --new

Skip downloading media files and only write the metadata database
instadb.py espn --only-db

Example Output

alt text

Metadata

Videos

Video metadata is useful for media servers like Plex.

  1. Video Title
    • Same as the filename (user + shortcode)
  2. Cast Members / Studio
    • The Instagram user
  3. Genres
    • The default tags are [user, "instagram"], but custom tags can be specified with the --tags CLI arg
  4. Video Summary
    • The post caption

Here's an example video in Plex from the https://www.instagram.com/espn/ account:

alt text

Because the videos are downloaded from Instagram, they're already optimized for streaming and should require no further conversions.

Photos

Photo metadata is useful for photo browsing programs that support it, like Shotwell

alt text

But the metadata can also be useful in a plain old file browser, like Windows explorer

alt text

Notice the Date Taken value. This is the time which the photo was originally uploaded to Instagram. This value is also written as the last "Modification date" for the file, so you can sort to your heart's content.

Database

When you specify the --db or --only-db CLI args, post metadata will be written to an Sqlite3 database in the downloads folder.

I suggest using DB Browser for SQLite for browsing.
It will allow you to sort by column, so for example you can sort by likes to find the most popular post.

alt text

About

Download an Instagram user's media plus metadata

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

73 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

instadb

This script is currently deprecated due to Instagram removing the public /media/ endpoint

Features

  • Download ALL media files from an Instagram user (images, carousel media, videos)
  • Write metadata to ALL media files
  • Skip already downloaded files
  • Download media to custom directory
  • Proxy support
  • Upon connection error (with or without a proxy), enter a new proxy to resume
  • Skip downloading posts that don't have enough likes
  • Write user posts metadata to an Sqlite3 database
  • Download just photos, or just videos, or everything

Installation

Simply download this repository, or use git clone https://github.com/spambusters/instadb.git

Requirements

  1. python 3.5+
  2. requests
    • Network requests
    • pip3 install requests
  3. mutagen
    • Video metadata
    • pip3 install mutagen
  4. exiftool
    • Photo metadata
    • Ubuntu
      • sudo apt install libimage-exiftool-perl
    • Windows / OSX
      • Download from the offical site, then add it to your system's PATH

Usage

usage: instadb.py [-h] [--proxy PROXY] [--rate-limit LIMIT] [--likes LIKES]
[--photos] [--videos] [--tags [...]] [--path PATH] [--new]
[--db] [--only-db]
user
positional arguments:
user Instagram user
optional arguments:
-h, --help show this help message and exit
--proxy PROXY Proxy must be in the format address:port
--rate-limit LIMIT Seconds between Instagram requests (default: 1)
--likes LIKES Only download media with at least this many likes
--photos Only download photos
--videos Only download videos
--path PATH Custom path for saving local files. (default:
"$USER/Downloads/instadb/$ig_user/")
--new Only download new media files
Metadata:
--tags [ ...] Space separated media tags (default: [user,
"instagram"])
--db Write user metadata to an Sqlite3 database
--only-db Skip downloading media files

Examples

Example account:https://www.instagram.com/espn/

Download all media with the default rate limit, metadata tags, and write metadata to an Sqlite3 database
instadb.py espn --db

Use a proxy to download only photos with at least 2000 likes and no rate limit
instadb.py espn --proxy 192.168.0.1:8080 --photos --likes 2000 --rate-limit 0

Download only videos and tag them as "espn", "video", "sports"
instadb.py espn --videos --tags espn video sports

Download only new files to a custom path
instadb.py espn --path "/media/DataHoarder/espn/" --new

Skip downloading media files and only write the metadata database
instadb.py espn --only-db

Example Output

alt text

Metadata

Videos

Video metadata is useful for media servers like Plex.

  1. Video Title
    • Same as the filename (user + shortcode)
  2. Cast Members / Studio
    • The Instagram user
  3. Genres
    • The default tags are [user, "instagram"], but custom tags can be specified with the --tags CLI arg
  4. Video Summary
    • The post caption

Here's an example video in Plex from the https://www.instagram.com/espn/ account:

alt text

Because the videos are downloaded from Instagram, they're already optimized for streaming and should require no further conversions.

Photos

Photo metadata is useful for photo browsing programs that support it, like Shotwell

alt text

But the metadata can also be useful in a plain old file browser, like Windows explorer

alt text

Notice the Date Taken value. This is the time which the photo was originally uploaded to Instagram. This value is also written as the last "Modification date" for the file, so you can sort to your heart's content.

Database

When you specify the --db or --only-db CLI args, post metadata will be written to an Sqlite3 database in the downloads folder.

I suggest using DB Browser for SQLite for browsing.
It will allow you to sort by column, so for example you can sort by likes to find the most popular post.

alt text

About

Download an Instagram user's media plus metadata

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

73 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

instadb

This script is currently deprecated due to Instagram removing the public /media/ endpoint

Features

  • Download ALL media files from an Instagram user (images, carousel media, videos)
  • Write metadata to ALL media files
  • Skip already downloaded files
  • Download media to custom directory
  • Proxy support
  • Upon connection error (with or without a proxy), enter a new proxy to resume
  • Skip downloading posts that don't have enough likes
  • Write user posts metadata to an Sqlite3 database
  • Download just photos, or just videos, or everything

Installation

Simply download this repository, or use git clone https://github.com/spambusters/instadb.git

Requirements

  1. python 3.5+
  2. requests
    • Network requests
    • pip3 install requests
  3. mutagen
    • Video metadata
    • pip3 install mutagen
  4. exiftool
    • Photo metadata
    • Ubuntu
      • sudo apt install libimage-exiftool-perl
    • Windows / OSX
      • Download from the offical site, then add it to your system's PATH

Usage

usage: instadb.py [-h] [--proxy PROXY] [--rate-limit LIMIT] [--likes LIKES]
[--photos] [--videos] [--tags [...]] [--path PATH] [--new]
[--db] [--only-db]
user
positional arguments:
user Instagram user
optional arguments:
-h, --help show this help message and exit
--proxy PROXY Proxy must be in the format address:port
--rate-limit LIMIT Seconds between Instagram requests (default: 1)
--likes LIKES Only download media with at least this many likes
--photos Only download photos
--videos Only download videos
--path PATH Custom path for saving local files. (default:
"$USER/Downloads/instadb/$ig_user/")
--new Only download new media files
Metadata:
--tags [ ...] Space separated media tags (default: [user,
"instagram"])
--db Write user metadata to an Sqlite3 database
--only-db Skip downloading media files

Examples

Example account:https://www.instagram.com/espn/

Download all media with the default rate limit, metadata tags, and write metadata to an Sqlite3 database
instadb.py espn --db

Use a proxy to download only photos with at least 2000 likes and no rate limit
instadb.py espn --proxy 192.168.0.1:8080 --photos --likes 2000 --rate-limit 0

Download only videos and tag them as "espn", "video", "sports"
instadb.py espn --videos --tags espn video sports

Download only new files to a custom path
instadb.py espn --path "/media/DataHoarder/espn/" --new

Skip downloading media files and only write the metadata database
instadb.py espn --only-db

Example Output

alt text

Metadata

Videos

Video metadata is useful for media servers like Plex.

  1. Video Title
    • Same as the filename (user + shortcode)
  2. Cast Members / Studio
    • The Instagram user
  3. Genres
    • The default tags are [user, "instagram"], but custom tags can be specified with the --tags CLI arg
  4. Video Summary
    • The post caption

Here's an example video in Plex from the https://www.instagram.com/espn/ account:

alt text

Because the videos are downloaded from Instagram, they're already optimized for streaming and should require no further conversions.

Photos

Photo metadata is useful for photo browsing programs that support it, like Shotwell

alt text

But the metadata can also be useful in a plain old file browser, like Windows explorer

alt text

Notice the Date Taken value. This is the time which the photo was originally uploaded to Instagram. This value is also written as the last "Modification date" for the file, so you can sort to your heart's content.

Database

When you specify the --db or --only-db CLI args, post metadata will be written to an Sqlite3 database in the downloads folder.

I suggest using DB Browser for SQLite for browsing.
It will allow you to sort by column, so for example you can sort by likes to find the most popular post.

alt text

About

Download an Instagram user's media plus metadata

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

73 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

instadb

This script is currently deprecated due to Instagram removing the public /media/ endpoint

Features

  • Download ALL media files from an Instagram user (images, carousel media, videos)
  • Write metadata to ALL media files
  • Skip already downloaded files
  • Download media to custom directory
  • Proxy support
  • Upon connection error (with or without a proxy), enter a new proxy to resume
  • Skip downloading posts that don't have enough likes
  • Write user posts metadata to an Sqlite3 database
  • Download just photos, or just videos, or everything

Installation

Simply download this repository, or use git clone https://github.com/spambusters/instadb.git

Requirements

  1. python 3.5+
  2. requests
    • Network requests
    • pip3 install requests
  3. mutagen
    • Video metadata
    • pip3 install mutagen
  4. exiftool
    • Photo metadata
    • Ubuntu
      • sudo apt install libimage-exiftool-perl
    • Windows / OSX
      • Download from the offical site, then add it to your system's PATH

Usage

usage: instadb.py [-h] [--proxy PROXY] [--rate-limit LIMIT] [--likes LIKES]
[--photos] [--videos] [--tags [...]] [--path PATH] [--new]
[--db] [--only-db]
user
positional arguments:
user Instagram user
optional arguments:
-h, --help show this help message and exit
--proxy PROXY Proxy must be in the format address:port
--rate-limit LIMIT Seconds between Instagram requests (default: 1)
--likes LIKES Only download media with at least this many likes
--photos Only download photos
--videos Only download videos
--path PATH Custom path for saving local files. (default:
"$USER/Downloads/instadb/$ig_user/")
--new Only download new media files
Metadata:
--tags [ ...] Space separated media tags (default: [user,
"instagram"])
--db Write user metadata to an Sqlite3 database
--only-db Skip downloading media files

Examples

Example account:https://www.instagram.com/espn/

Download all media with the default rate limit, metadata tags, and write metadata to an Sqlite3 database
instadb.py espn --db

Use a proxy to download only photos with at least 2000 likes and no rate limit
instadb.py espn --proxy 192.168.0.1:8080 --photos --likes 2000 --rate-limit 0

Download only videos and tag them as "espn", "video", "sports"
instadb.py espn --videos --tags espn video sports

Download only new files to a custom path
instadb.py espn --path "/media/DataHoarder/espn/" --new

Skip downloading media files and only write the metadata database
instadb.py espn --only-db

Example Output

alt text

Metadata

Videos

Video metadata is useful for media servers like Plex.

  1. Video Title
    • Same as the filename (user + shortcode)
  2. Cast Members / Studio
    • The Instagram user
  3. Genres
    • The default tags are [user, "instagram"], but custom tags can be specified with the --tags CLI arg
  4. Video Summary
    • The post caption

Here's an example video in Plex from the https://www.instagram.com/espn/ account:

alt text

Because the videos are downloaded from Instagram, they're already optimized for streaming and should require no further conversions.

Photos

Photo metadata is useful for photo browsing programs that support it, like Shotwell

alt text

But the metadata can also be useful in a plain old file browser, like Windows explorer

alt text

Notice the Date Taken value. This is the time which the photo was originally uploaded to Instagram. This value is also written as the last "Modification date" for the file, so you can sort to your heart's content.

Database

When you specify the --db or --only-db CLI args, post metadata will be written to an Sqlite3 database in the downloads folder.

I suggest using DB Browser for SQLite for browsing.
It will allow you to sort by column, so for example you can sort by likes to find the most popular post.

alt text

About

Download an Instagram user's media plus metadata

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

73 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

instadb

This script is currently deprecated due to Instagram removing the public /media/ endpoint

Features

  • Download ALL media files from an Instagram user (images, carousel media, videos)
  • Write metadata to ALL media files
  • Skip already downloaded files
  • Download media to custom directory
  • Proxy support
  • Upon connection error (with or without a proxy), enter a new proxy to resume
  • Skip downloading posts that don't have enough likes
  • Write user posts metadata to an Sqlite3 database
  • Download just photos, or just videos, or everything

Installation

Simply download this repository, or use git clone https://github.com/spambusters/instadb.git

Requirements

  1. python 3.5+
  2. requests
    • Network requests
    • pip3 install requests
  3. mutagen
    • Video metadata
    • pip3 install mutagen
  4. exiftool
    • Photo metadata
    • Ubuntu
      • sudo apt install libimage-exiftool-perl
    • Windows / OSX
      • Download from the offical site, then add it to your system's PATH

Usage

usage: instadb.py [-h] [--proxy PROXY] [--rate-limit LIMIT] [--likes LIKES]
[--photos] [--videos] [--tags [...]] [--path PATH] [--new]
[--db] [--only-db]
user
positional arguments:
user Instagram user
optional arguments:
-h, --help show this help message and exit
--proxy PROXY Proxy must be in the format address:port
--rate-limit LIMIT Seconds between Instagram requests (default: 1)
--likes LIKES Only download media with at least this many likes
--photos Only download photos
--videos Only download videos
--path PATH Custom path for saving local files. (default:
"$USER/Downloads/instadb/$ig_user/")
--new Only download new media files
Metadata:
--tags [ ...] Space separated media tags (default: [user,
"instagram"])
--db Write user metadata to an Sqlite3 database
--only-db Skip downloading media files

Examples

Example account:https://www.instagram.com/espn/

Download all media with the default rate limit, metadata tags, and write metadata to an Sqlite3 database
instadb.py espn --db

Use a proxy to download only photos with at least 2000 likes and no rate limit
instadb.py espn --proxy 192.168.0.1:8080 --photos --likes 2000 --rate-limit 0

Download only videos and tag them as "espn", "video", "sports"
instadb.py espn --videos --tags espn video sports

Download only new files to a custom path
instadb.py espn --path "/media/DataHoarder/espn/" --new

Skip downloading media files and only write the metadata database
instadb.py espn --only-db

Example Output

alt text

Metadata

Videos

Video metadata is useful for media servers like Plex.

  1. Video Title
    • Same as the filename (user + shortcode)
  2. Cast Members / Studio
    • The Instagram user
  3. Genres
    • The default tags are [user, "instagram"], but custom tags can be specified with the --tags CLI arg
  4. Video Summary
    • The post caption

Here's an example video in Plex from the https://www.instagram.com/espn/ account:

alt text

Because the videos are downloaded from Instagram, they're already optimized for streaming and should require no further conversions.

Photos

Photo metadata is useful for photo browsing programs that support it, like Shotwell

alt text

But the metadata can also be useful in a plain old file browser, like Windows explorer

alt text

Notice the Date Taken value. This is the time which the photo was originally uploaded to Instagram. This value is also written as the last "Modification date" for the file, so you can sort to your heart's content.

Database

When you specify the --db or --only-db CLI args, post metadata will be written to an Sqlite3 database in the downloads folder.

I suggest using DB Browser for SQLite for browsing.
It will allow you to sort by column, so for example you can sort by likes to find the most popular post.

alt text

About

Download an Instagram user's media plus metadata

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

73 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

instadb

This script is currently deprecated due to Instagram removing the public /media/ endpoint

Features

  • Download ALL media files from an Instagram user (images, carousel media, videos)
  • Write metadata to ALL media files
  • Skip already downloaded files
  • Download media to custom directory
  • Proxy support
  • Upon connection error (with or without a proxy), enter a new proxy to resume
  • Skip downloading posts that don't have enough likes
  • Write user posts metadata to an Sqlite3 database
  • Download just photos, or just videos, or everything

Installation

Simply download this repository, or use git clone https://github.com/spambusters/instadb.git

Requirements

  1. python 3.5+
  2. requests
    • Network requests
    • pip3 install requests
  3. mutagen
    • Video metadata
    • pip3 install mutagen
  4. exiftool
    • Photo metadata
    • Ubuntu
      • sudo apt install libimage-exiftool-perl
    • Windows / OSX
      • Download from the offical site, then add it to your system's PATH

Usage

usage: instadb.py [-h] [--proxy PROXY] [--rate-limit LIMIT] [--likes LIKES]
[--photos] [--videos] [--tags [...]] [--path PATH] [--new]
[--db] [--only-db]
user
positional arguments:
user Instagram user
optional arguments:
-h, --help show this help message and exit
--proxy PROXY Proxy must be in the format address:port
--rate-limit LIMIT Seconds between Instagram requests (default: 1)
--likes LIKES Only download media with at least this many likes
--photos Only download photos
--videos Only download videos
--path PATH Custom path for saving local files. (default:
"$USER/Downloads/instadb/$ig_user/")
--new Only download new media files
Metadata:
--tags [ ...] Space separated media tags (default: [user,
"instagram"])
--db Write user metadata to an Sqlite3 database
--only-db Skip downloading media files

Examples

Example account:https://www.instagram.com/espn/

Download all media with the default rate limit, metadata tags, and write metadata to an Sqlite3 database
instadb.py espn --db

Use a proxy to download only photos with at least 2000 likes and no rate limit
instadb.py espn --proxy 192.168.0.1:8080 --photos --likes 2000 --rate-limit 0

Download only videos and tag them as "espn", "video", "sports"
instadb.py espn --videos --tags espn video sports

Download only new files to a custom path
instadb.py espn --path "/media/DataHoarder/espn/" --new

Skip downloading media files and only write the metadata database
instadb.py espn --only-db

Example Output

alt text

Metadata

Videos

Video metadata is useful for media servers like Plex.

  1. Video Title
    • Same as the filename (user + shortcode)
  2. Cast Members / Studio
    • The Instagram user
  3. Genres
    • The default tags are [user, "instagram"], but custom tags can be specified with the --tags CLI arg
  4. Video Summary
    • The post caption

Here's an example video in Plex from the https://www.instagram.com/espn/ account:

alt text

Because the videos are downloaded from Instagram, they're already optimized for streaming and should require no further conversions.

Photos

Photo metadata is useful for photo browsing programs that support it, like Shotwell

alt text

But the metadata can also be useful in a plain old file browser, like Windows explorer

alt text

Notice the Date Taken value. This is the time which the photo was originally uploaded to Instagram. This value is also written as the last "Modification date" for the file, so you can sort to your heart's content.

Database

When you specify the --db or --only-db CLI args, post metadata will be written to an Sqlite3 database in the downloads folder.

I suggest using DB Browser for SQLite for browsing.
It will allow you to sort by column, so for example you can sort by likes to find the most popular post.

alt text

About

Download an Instagram user's media plus metadata

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages