Menu
Portfolio
Blog
Snippets
Login
Confirm
exit_to_app
Close
Entries
library_add
Utility(Event,Mouse): Log Movement X,Y
delete
Utility(txt): Basic Sentence Generator
delete
Utility(Event,Keyboard): Logger
delete
Utility(txt): Expanded Phrase Generator
delete
Scrape(General|Multi): Paginated Crawler
delete
Scrape(Sunbiz|Multi): Get Biz's By Zip
delete
Utility(Time): Test Load Speed
delete
Scrape(General|Single|NLP): Get Keyword Stats
delete
Scrape(General|Single): Get Text Near Links
delete
Utility(Event|Mouse): Press Down,Up, & Dragend
delete
Utility(Number): Between Range
delete
Utility(Event|Window): On Resize
delete
Scrape(Youtube|Single): Crawl Channel Videos
delete
Scrape(General|Multi): Tiny Link Crawler
delete
Utility(Time): Day of Week Report
delete
Utility(Number): Aspect Ratio Size Pairs
delete
Utility(Data): Sort Object Properties
delete
Scrape(General|Single): RiTa Sentences & Words
delete
Scrape(General|Single): Investigate Element Layers
delete
Scrape(NLP|Single): Using Compromise Plugins
delete
Utility(General): Remote Script Loader
delete
Scrape(General|Single|NLP): Compromise RiTa D3
delete
Scrape(General|Multi|Node): Grouped Node Crawler
delete
Scrape(Amazon|Multi): Crawl Product SERPs
delete
Scrape(Amazon|Multi): Get Paginated Brands
delete
Utility (Data): Download JSON in Browser
delete
Utility (Data): JSON AutoTypes
delete
Scrape(YouTube|Single): Video Page
delete
Utility (Text): Make Page Editable
delete
Utility (Text): Article Editor
delete
Scrape(General|Single|Text): Get Text On Click
delete
Utility (File): DnD File Parser (CSV,JSON,TXT)
delete
Scrape(General|Single): Get Links (Examples)
delete
Scrape(General|Single|Text): Get Sentences by Tag
delete
Utility (File): JSON to CSV via D3.js
delete
Scrape(General|Single): Auto Parse by Content Type
delete
Scrape(General|Single): Get Paragraphs & Sentences
delete
Scrape(Amazon|Multi): Get Reviews by ASIN
delete
Scrape(General|Single): Download Images on Page
delete
Utility(Event,Form): Custom Submit Function
delete
Utility (Fetch): Basic API Post Request
delete
Utility (Event,Form,Fetch): Form Data to API
delete
Utility (Time): Async Delay
delete
Utility (Time): Async Repeat Every N Secs
delete
Scrape(coj): Crawl Property SERPs
delete
Utility (Data): Promise Chain
delete
Utility (Fetch): Examples - JSON,Text,HTML
delete
Scrape(Amazon|Single): Product Review NLP
delete
Utility (Nodejs): Streaming Collections
delete
Scrape(Rate My Professor|Multi): Crawl Prof SERPs
delete
Utility (Time): JS Timer
delete
Utility (Text): Proper Case
delete
Scrape(Thingiverse API): Get Things via Search API
delete
Scrape(General|Single|Node): Get Node Attributes
delete
Scrape(General|Single|Node): Node Attributes + Text
delete
Scrape(Thesaurus): Get Words from SERPs
delete
Scrape(Walmart): Crawl Product SERPs
delete
Scrape(free3d): Crawl 3D Model SERPs
delete
Scrape(Aliexpress|Single): Get Products From SERP
delete
Scrape(simplify3d): Crawl Post SERPs
delete
Scrape(Twitter): Crawl Post Feed (infinite scroll)
delete
Scrape(DDuckGo|Single): Get Links from SERP
delete
Scrape(General|Single): Get Tokens String Distance
delete
Scrape(General|Single): Content Report
delete
Scrape(General|Single|Node): Node Recon (CSV)
delete
Utility (File): D3 JSON to CSV
delete
Scrape(coj|Multi): Crawl Property SERPs
delete
Scrape(coj|Single): sidenote
delete
Scrape(General|Single): Recursive Node Crawler
delete
Utility (Event,Window): Scroll to Root ScrollHeight
delete
Scrape(Indeed|Multi): Crawl Job SERPs
delete
Scrape(Thingiverse API): Get Things By Id
delete
Scrape(Thingiverse): Crawl Things by Category
delete
Scrape(Thingiverse API): Get Thing Batches by Id via DnD
delete
Scrape(YouTube|Single): Get Video Playlist
delete
Utility (Data): Join Thing Metrics & Meta
delete
Utility(Data): Get Nested Array Lengths
delete
Utility (Twitter): Hide Followed Profiles
delete
Utility (Time): YYYY-MM-DD HH:MM:SS
delete
Scrape(Thangs|Multi): Crawl 3D Model SERPs
delete
Scrape(PrusaPrints,Multi): Get Prints
delete
Scrape(Reddit,Single): Get Posts
delete
Userscript(Youtube): Scrape Channel Videos
delete
Userscript(Youtube): Tab Manager
delete
Scrape(Sunbiz|Multi): Biz Details
delete
Utility(Data):DnD View Types
delete
Scrape(General|Single|Node): Select Nodes by Attr
delete
Scrape(Aliexpress|Multi) Get Products via API
delete
Utility(Text): Strip Web Page CSS, Script, Events, Media
delete
Scrape(Youtube|Single) Get Subs
delete
Scrape(General|Single): SelectAll ReduceByProp
delete
Scrape(General|Single): SelectAll ReduceMultiProps
delete
Scrape(General|Multi): Tiny Link Crawler + Delay & Node Reports
delete
Scrape(P5|Multi): Get Examples
delete
Scrape(LinkedIn|Single): Find New Connections
delete
UserScript(linkedIn|Single) Get Jobs
delete
Utility (Time): Date From Days Ago
delete
Utility(General|Single) Keep Scrolling
delete
Scrape(YouTube) Videos From Search
delete
Utility(General|Single): getOffset
delete
Utility(Event,Form): Get Data On Form Input
delete
Utility(Event,Element): ResizeObserver
delete
COCO-SSD Object Categories
delete
Scrape(Wikipedia|Multi): What Links Here?
delete
Scrape(DDuckGo|Single): Download Images
delete
Scrape(General|Single|NLP): Compromise nGram
delete
Save Snippet
View Snippet
(() => { var dateFromDaysAgo = (daysAgo) => { try{ var dt = new Date(); dt.setDate( dt.getDate() - daysAgo ); return new Date(dt.getTime() - (dt.getTimezoneOffset()*60*1000)) .toISOString().split(".")[0].split("T")[0]; }catch(e){ console.log(e) return 0; } } var tAgo = (t) => { var n = t.replace(/\D+/gim,""); n = n ? +n : 0; return t.indexOf("minute") > -1 ? 1 : t.indexOf("hour") > -1 ? 1 : t.indexOf("day") > -1 ? n : t.indexOf("week") > -1 ? n*7 : t.indexOf("month") > -1 ? n*30 : t.indexOf("year") > -1 ? n*365 : 0; } var options = { scripts: ["https://d3js.org/d3.v6.min.js"] } var run = () => { var channelName = document.querySelector(".ytd-channel-name"); console.log({channelName}) channelName = channelName ? (""+channelName.innerText).toLowerCase().replace(/[\s\t\n\r\-]+/gim," ").trim() : "unknown"; console.log({channelName}) function downloadCSV(data, fileName="data") { var csvData = new Blob([d3.csvFormat(data)], { type: 'text/csv;charset=utf-8;' }); var link = document.createElement('a'); link.href = window.URL.createObjectURL(csvData); link.setAttribute('download', channelName + ".csv"); document.body.appendChild(link); link.click(); document.body.removeChild(link); }; async function wait(ms) { return new Promise(resolve => { setTimeout(resolve, ms); }); } var clean = s => s.toLowerCase().replace(/[\s\t\n\r\-]+/gim," ").trim(); var report = () => [...document.querySelectorAll("#items #dismissable")].map(el => { var dump = el.innerText.replace(/[\n\r]+/gim,"\n").replace(/[ \t]+/gim," "); var title = el.querySelector("#video-title"); var meta = el.querySelectorAll("#metadata-line span"); var details = title.getAttribute("aria-label"); details = details.replace(title.innerText,"").replace("by","").toLowerCase().replace(channelName,"").trim(); var ago = details.split("ago")[0].trim(); details = details.replace(`${ago} ago `,""); var views = details.split(" ").slice(-2)[0]; var duration = details.replace(`${views} views`,""); var times = duration.split(",").reduce((times,t) => { t.indexOf("hour") > -1 ? times.hours = t.replace(/\D+/gim,"") : t.indexOf("min") > -1 ? times.minutes = t.replace(/\D+/gim,""): t.indexOf("seconds") > -1 ? times.seconds = t.replace(/\D+/gim,"") : null; return times; },{}); times.hours = times.hours ? +times.hours : 0; times.minutes = times.minutes ? +times.minutes : 0; times.seconds = times.seconds ? +times.seconds : 0; var durationSeconds = times.hours*3600+(times.minutes*60)+times.seconds; views = +views.replace(/\D+/gim,""); var ageDays = tAgo(ago); var estCreateDate = dateFromDaysAgo(ageDays); var d = new Date(); d = new Date(d.getTime() - (d.getTimezoneOffset()*60*1000)).toISOString().split(".")[0].split("T")[0]; if(dump.match(/[\n]/gim).length > 8) return false; return { id:title ? title.href.replace("https://www.youtube.com/watch?v=","").split("&")[0] : "" , channelName, crawlDate:d, estCreateDate, ageDays, durationSeconds, title:title ? clean(title.innerText) : "", channelURL:window.location.href.replace("/videos",""), videoURL:title.href, videoViews:views, avgViewsPerDay:Math.round(views/ageDays) } }); var scrll = () => { var maxScrollHeight = document.querySelector(":root").scrollHeight; window.scrollTo(0,maxScrollHeight); return maxScrollHeight; } async function keepOnScrollin() { var prev = scrll(); await wait(4000); var current = scrll(); if(prev < current){ keepOnScrollin() }else{ let data = report(); console.log({data}); downloadCSV(data) } } keepOnScrollin(); } const loadScripts = ({scripts}) => { console.log(`Loading External Scripts`); var scriptCountdown = scripts.length; var loadScript = (url) => { var scriptsLoaded = () => scriptCountdown == 0 ? run() : null; var imported = document.createElement('script'); imported.src = url; imported.addEventListener("load", () => { scriptCountdown--; scriptsLoaded(); }); document.head.appendChild(imported); } scripts.forEach(loadScript) } loadScripts(options); })();