{"id":13476718,"url":"https://github.com/qsniyg/maxurl","last_synced_at":"2025-05-14T16:14:10.438Z","repository":{"id":38826395,"uuid":"121688487","full_name":"qsniyg/maxurl","owner":"qsniyg","description":"Finds larger/original versions of images and videos","archived":false,"fork":false,"pushed_at":"2025-04-11T11:12:10.000Z","size":619807,"stargazers_count":1236,"open_issues_count":359,"forks_count":78,"subscribers_count":22,"default_branch":"master","last_synced_at":"2025-04-13T01:56:01.505Z","etag":null,"topics":["addon","album-downloader","batch-download","batch-download-photos","browser-extension","download","gallery","image","image-downloader","userscript","video","video-downloader","webextension","website"],"latest_commit_sha":null,"homepage":"https://qsniyg.github.io/maxurl/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qsniyg.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.txt","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-02-15T22:05:50.000Z","updated_at":"2025-04-12T16:28:51.000Z","dependencies_parsed_at":"2023-09-29T04:26:33.725Z","dependency_job_id":"c4c3d31f-8e16-440c-b2f6-8e51f85218a1","html_url":"https://github.com/qsniyg/maxurl","commit_stats":{"total_commits":5398,"total_committers":26,"mean_commits":207.6153846153846,"dds":0.02315672471285657,"last_synced_commit":"46fbb7b282743730a23717b4c0ab91b9cc405dce"},"previous_names":[],"tags_count":109,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qsniyg%2Fmaxurl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qsniyg%2Fmaxurl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qsniyg%2Fmaxurl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qsniyg%2Fmaxurl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qsniyg","download_url":"https://codeload.github.com/qsniyg/maxurl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248654050,"owners_count":21140235,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["addon","album-downloader","batch-download","batch-download-photos","browser-extension","download","gallery","image","image-downloader","userscript","video","video-downloader","webextension","website"],"created_at":"2024-07-31T16:01:33.747Z","updated_at":"2025-04-13T01:56:12.247Z","avatar_url":"https://github.com/qsniyg.png","language":"JavaScript","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/qsniyg/maxurl/master/resources/imu_opera_banner_transparent.png\" alt=\"Image Max URL\" title=\"Image Max URL\" /\u003e\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eEnglish\u003c/b\u003e | \u003ca href=\"docs/pt/README.pt-BR.md\"\u003ePortuguês (Brasil)\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\nImage Max URL is a program that will try to find larger/original versions of images and videos, usually by replacing URL patterns.\n\nIt currently contains support for \\\u003e9000 hardcoded websites (full list in [sites.txt](https://github.com/qsniyg/maxurl/blob/master/sites.txt)),\nbut it also supports a number of generic engines (such as Wordpress and MediaWiki), which means it can work for many other websites as well.\n\nIt is currently released as:\n\n- Userscript: (most browsers)\n  - Stable: [userscript_smaller.user.js](https://github.com/qsniyg/maxurl/blob/master/userscript_smaller.user.js?raw=true) or [OpenUserJS](https://openuserjs.org/scripts/qsniyg/Image_Max_URL)\n  - Development: [userscript.user.js](https://github.com/qsniyg/maxurl/blob/master/userscript.user.js?raw=true) (recommended)\n  - It serves as the base for everything listed below. It also serves as a node module (used by the reddit bot), and can be embedded in a website.\n- Browser extension: [Firefox](https://addons.mozilla.org/firefox/addon/image-max-url/)\n  - Other browsers supporting WebExtensions can sideload the extension through this git repository.\n  - Since addons have more privileges than userscripts, it has a bit of extra functionality over the userscript.\n  - Source code is in [manifest.json](https://github.com/qsniyg/maxurl/blob/master/manifest.json) and the [extension](https://github.com/qsniyg/maxurl/tree/master/extension) folder.\n- [Website](https://qsniyg.github.io/maxurl/)\n  - Due to browser security constraints, some URLs (requiring cross-origin requests) can't be supported by the website.\n  - Source code is in the [gh-pages](https://github.com/qsniyg/maxurl/tree/gh-pages) branch.\n- Reddit bot ([/u/MaxImageBot](https://www.reddit.com/user/MaxImageBot/))\n  - Source code is in [reddit-bot/comment-bot.js](https://github.com/qsniyg/maxurl/blob/master/reddit-bot/comment-bot.js) and [reddit-bot/dourl.js](https://github.com/qsniyg/maxurl/blob/master/reddit-bot/dourl.js)\n\nCommunity:\n\n- [Discord Server](https://discord.gg/fH9Pf54)\n- [Matrix](https://matrix.to/#/#image-max-url:tedomum.net?via=tedomum.net) (`#image-max-url:tedomum.net`)\n- [Subreddit](http://reddit.com/r/MaxImage)\n\n# Sideloading the extension\n\nThe extension is currently unavailable to other browsers\\' addon stores (such as Chrome and Microsoft Edge),\nbut you can sideload this repository if you wish to use the extension version instead of the userscript.\n\n- Repository:\n  - Download the repository however you wish (I\\'d recommend cloning it through git as it allows easier updating)\n  - Chromium:\n    - Go to \u003cchrome://extensions\u003e, make sure \\\"Developer mode\\\" is enabled, click \\\"Load unpacked \\[extension\\]\\\", and navigate to the maxurl repository\n  - Firefox:\n    - Go to \u003cabout:debugging-\u003e\\\u003eThis Firefox, select \\\"Load temporary Add-on\\...\\\", and navigate to \\\"manifest.json\\\" within the maxurl repository\n    - Note that the addon will be deleted once Firefox is closed. There\\'s unfortunately nothing I can do about this.\n- CRX (Chromium-based browsers):\n  - Download the CRX build from \u003chttps://github.com/qsniyg/maxurl/blob/master/build/ImageMaxURL_crx3.crx\u003e\n  - Go to \u003cchrome://extensions\u003e, make sure \\\"Developer mode\\\" is enabled, then drag\u0026drop the downloaded CRX file onto the page.\n- XPI (Firefox-based browsers):\n  - Download the XPI build from \u003chttps://github.com/qsniyg/maxurl/blob/master/build/ImageMaxURL_signed.xpi\u003e\n  - Go to \u003cabout:addons\u003e, click on the gear icon, then select \\\"Install Add-on from From File\\...\\\", and navigate to the downloaded XPI file.\n\n# Contributing\n\nAny contribution is greatly appreciated! If you have any bug reports, feature requests, or new websites you want supported, please file an issue here.\n\nIf you don't have a Github account, feel free to either use one of the community links above or [contact me directly](https://qsniyg.github.io/).\n\nIf you wish to contribute to the repository itself (code contributions, translations, etc.), please check [CONTRIBUTING.md](https://github.com/qsniyg/maxurl/blob/master/CONTRIBUTING.md)\nfor more information.\n\n# Integrating IMU in your program\n\nAs mentioned above, userscript.user.js also functions as a node module.\n\n```js\nvar maximage = require('./userscript.user.js');\n\nmaximage(smallimage, {\n  // If set to false, it will return only the URL if there aren't any special properties\n  // Recommended to keep true.\n  //\n  // The only reason this option exists is as a small hack for a helper userscript used to find new rules,\n  //  to check if IMU already supports a rule.\n  fill_object: true,\n\n  // Maximum amount of times it should be run.\n  // Recommended to be at least 5.\n  iterations: 200,\n\n  // Whether or not to store to, and use an internal cache for URLs.\n  // Set this to \"read\" if you want to use the cache without storing results to it.\n  use_cache: true,\n\n  // Timeout (in seconds) for cache entries in the URL cache\n  urlcache_time: 60*60,\n\n  // List of \"problems\" (such as watermarks or possibly broken image) to exclude.\n  //\n  // By default, all problems are excluded.\n  // You can access the excluded problems through maximage.default_options.exclude_problems\n  // By setting it to [], no problems will be excluded.\n  //exclude_problems: [],\n\n  // Whether or not to exclude videos\n  exclude_videos: false,\n\n  // This will include a \"history\" of objects found through iterations.\n  // Disabling this will only keep the objects found through the last successful iteration.\n  include_pastobjs: true,\n\n  // This will try to find the original page for an image, even if it requires extra requests.\n  force_page: false,\n\n  // This allows rules that use 3rd-party websites to find larger images\n  allow_thirdparty: false,\n\n  // This is useful for implementing a blacklist or whitelist.\n  //  If unspecified, it accepts all URLs.\n  filter: function(url) {\n    return true;\n  },\n\n  // Helper function to perform HTTP requests, used for sites like Flickr\n  //  The API is expected to be like GM_xmlHTTPRequest's API.\n  // An implementation using node's request module can be found in reddit-bot/dourl.js\n  do_request: function(options) {\n    // options = {\n    //   url: \"\",\n    //   method: \"GET\",\n    //   data: \"\", // for method: \"POST\"\n    //   overrideMimeType: \"\", // used to decode alternate charsets\n    //   headers: {}, // If a header is null or \"\", don't include that header\n    //   onload: function(resp) {\n    //     // resp is expected to be XMLHttpRequest-like object, implementing these fields:\n    //     //   finalUrl\n    //     //   readyState\n    //     //   responseText\n    //     //   status\n    //   }\n    // }\n  },\n\n  // Callback\n  cb: function(result) {\n    if (!result)\n      return;\n\n    if (result.length === 1 \u0026\u0026 result[0].url === smallimage) {\n       // No larger image was found\n       return;\n    }\n\n    for (var i = 0; i \u003c result.length; i++) {\n      // Do something with the object\n    }\n  }\n});\n```\n\nThe result is a list of objects that contain properties that may be useful in using the returned image(s):\n\n```js\n[{\n  // The URL of the image\n  url: null,\n\n  // Whether or not this URL is a video\n  video: false,\n\n  // Whether it's expected that it will always work or not.\n  //  Don't rely on this value if you don't have to\n  always_ok: false,\n\n  // Whether or not the URL is likely to work.\n  likely_broken: false,\n\n  // Whether or not the server supports a HEAD request.\n  can_head: true,\n\n  // HEAD errors that can be ignored\n  head_ok_errors: [],\n\n  // Whether or not the server might return the wrong Content-Type header in the HEAD request\n  head_wrong_contenttype: false,\n\n  // Whether or not the server might return the wrong Content-Length header in the HEAD request\n  head_wrong_contentlength: false,\n\n  // This is used in the return value of the exported function.\n  //  If you're using a callback (as shown in the code example above),\n  //  this value will always be false\n  waiting: false,\n\n  // Whether or not the returned URL is expected to redirect to another URL\n  redirects: false,\n\n  // Whether or not the URL is temporary/only works on the current IP (such as a generated download link)\n  is_private: false,\n\n  // Whether or not the URL is expected to be the original image stored on the website's servers.\n  is_original: false,\n\n  // If this is true, you shouldn't input this URL again into IMU.\n  norecurse: false,\n\n  // Whether or not this URL should be used.\n  // If true, treat this like a 404\n  // If \"mask\", this image is an overlayed mask\n  bad: false,\n\n  // Same as above, but contains a list of objects, e.g.:\n  // [{\n  //    headers: {\"Content-Length\": \"1000\"},\n  //    status: 301\n  // }]\n  // If one of the objects matches the response, it's a bad image.\n  // You can use maximage.check_bad_if(bad_if, resp) to check.\n  //  (resp is expected to be an XHR-like object)\n  bad_if: [],\n\n  // Whether or not this URL is a \"fake\" URL that was used internally (i.e. if true, don't use this)\n  fake: false,\n\n  // Headers required to view the returned URL\n  //  If a header is null, don't include that header.\n  headers: {},\n\n  // Additional properties that could be useful\n  extra: {\n    // The original page where this image was hosted\n    page: null,\n\n    // The title/caption attached to the image\n    caption: null\n  },\n\n  // If set, this is a more descriptive filename for the image\n  filename: \"\",\n\n  // A list of problems with this image. Use exclude_problems to exclude images with specific problems\n  problems: {\n    // If true, the image is likely larger than the one inputted, but it also has a watermark (when the inputted one doesn't)\n    watermark: false,\n\n    // If true, the image is likely smaller than the one inputted, but it has no watermark\n    smaller: false,\n\n    // If true, the image might be entirely different from the one inputted\n    possibly_different: false,\n\n    // If true, the image might be broken (such as GIFs on Tumblr)\n    possibly_broken: false\n  }\n}]\n```\n","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqsniyg%2Fmaxurl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqsniyg%2Fmaxurl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqsniyg%2Fmaxurl/lists"}