// ==PREPROCESSOR== // @name "R2YS a script for reddit" // @author "zeremy" // ==/PREPROCESSOR== /*Disclaimer * *The usage of this script must comply with the Reddit API Terms of Use *https://www.reddit.com/wiki/api *I will not be responsible for any modifications of the script made by the end users that do not comply with the terms. * *Credits: *Original concept (Subreddit to YouTube Source Bookmarklet) from https://gist.github.com/akaleeroy/b3de63c46ee43d413913 * *Description: *Search subreddits for youtube/vimeo/spotify url's and create a playlist within foobar2000. * *Required components: *JScript Panel (http://www.foobar2000.org/components/view/foo_jscript_panel) and *Youtube Source (http://fy.3dyd.com/download/) *foo_input_spotify (https://github.com/stengerh/foo_input_spotify) Spotify support for foobar2000. Requires a Spotify premium account. * *Optional components: *m-tags (http://www.foobar2000.org/components/view/foo_tags) * *Installation: *Create an empty jscript panel and import the script. *Modify the script with your oauth2 credentials / or add them in the jscript panel properties. *username and password are your reddit credentials. *You must authorize with your account @ https://www.reddit.com/prefs/apps/ as your personal script to get your client_id and client_secret keys. *See https://github.com/reddit/reddit/wiki/OAuth2 , https://github.com/reddit/reddit/wiki/OAuth2-Quick-Start-Example * * example: * var username = window.GetProperty("Reddit.username", "redditusername"); * var password = window.GetProperty("Reddit.password", "redditpassword"); * var client_id = window.GetProperty("Reddit.client_id", "redditclientid"); * var client_secret = window.GetProperty("Reddit.client_secret", "redditsecret"); * * ADD THOSE VALUES BELOW FOR THE SCRIPT TO OBTAIN Authorization. */ //user oauth2 values var username = window.GetProperty("Reddit.username", ""); var password = window.GetProperty("Reddit.password", ""); var client_id = window.GetProperty("Reddit.client_id", ""); var client_secret = window.GetProperty("Reddit.client_secret", ""); // var script_name = "R2YS a script for reddit - v.0.0.1 "; //leave blank var access_token = ""; var disclaimer = window.GetProperty("System.message", 0); //types var get_youtube = window.GetProperty("System.youtube", true); var get_vimeo = window.GetProperty("System.vimeo", true); var get_spotify = window.GetProperty("System.spotify", true); function check_types() { if (!get_youtube && !get_vimeo && !get_spotify) fb.ShowPopupMessage("You have no search type selected , nothing will be imported!! \nSelect at least one search type.", script_name); } //Search history var search_history = window.GetProperty("System.history", null); var search_history_a = []; if (search_history) search_history_a = search_history.split(","); //my list var mylist = window.GetProperty("System.mylist", null); var mylist_a = []; if (mylist) mylist_a = mylist.split(","); //no of items to process var pitems = window.GetProperty("Reddit.items", 300); //search term var search_term = ["top", "hot", "new", "rising", "controversial"]; var search = window.GetProperty("Reddit.search_term", 0); //search time var search_time = ["all", "year", "month", "week", "day", "hour"]; var time = window.GetProperty("Reddit.search_time", 0); //playlist creation method var playlist_type_method = ["m3u8", "mtags", "native"] var playlist_type = window.GetProperty("System.playlist_type", 0); //Disclaimer if (disclaimer == 0) fb.ShowPopupMessage("Disclaimer\nThe usage of this script must comply with the Reddit API Terms of Use\nhttps://www.reddit.com/wiki/api\n\nI will not be responsible for any modifications of the script made by the end users that do not comply with the terms.\n\nInstallation\nYou must authorize with your account @ https://www.reddit.com/prefs/apps/ as your personal script to get your client_id and client_secret keys.\nSee https://github.com/reddit/reddit/wiki/OAuth2 , https://github.com/reddit/reddit/wiki/OAuth2-Quick-Start-Example\n\nusername and password are your reddit credentials.", script_name); window.SetProperty("System.message", 1); try { var WshShell = new ActiveXObject("WScript.Shell"); var objXMLHTTP = new ActiveXObject("MSXML2.XMLHTTP"); var objFSO = new ActiveXObject("Scripting.FileSystemObject"); var objStream = new ActiveXObject("ADODB.Stream") var adTypeBinary = 1; var adSaveCreateOverWrite = 2; var adModeReadWrite = 3; var vb = new ActiveXObject("ScriptControl"); vb.Language = "VBScript"; youtube_source_installed = utils.CheckComponent("foo_youtube", true); if (!youtube_source_installed) throw "Youtube Source not installed"; foo_spotify_installed = utils.CheckComponent("foo_input_spotify", true); if (!foo_spotify_installed) throw "foo_input_spotify not installed"; } catch (e) { fb.ShowPopupMessage("Failed to load required system components.\n\n" + e, script_name); } //Optional mtags_source_installed = utils.CheckComponent("foo_tags", true); //create directories for playlists var path = fb.ProfilePath + "\\r2ys\\"; var path_m3u8 = path + "m3u8"; var path_mtags = path + "mtags"; if (!objFSO.FolderExists(path)) { objFSO.CreateFolder(path); }; if (!objFSO.FolderExists(path_m3u8)) { objFSO.CreateFolder(path_m3u8); }; if (!objFSO.FolderExists(path_mtags)) { objFSO.CreateFolder(path_mtags); }; //console function console(msg) { fb.trace(script_name, msg); } //Msg Box MsgBox = function (prompt, buttons, title) { prompt = prompt.replace(/"/g, '" + Chr(34) + "').replace(/\n/g, '" + Chr(13) + "'); title = title.replace(/"/g, '" + Chr(34) + "'); return vb.eval('MsgBox' + '("' + prompt + '", "' + buttons + '", "' + title + '")'); } //Input Box InputBox = function (prompt, title, value) { prompt = prompt.replace(/"/g, '" + Chr(34) + "').replace(/\n/g, '" + Chr(13) + "'); title = title.replace(/"/g, '" + Chr(34) + "'); value = value.replace(/"/g, '" + Chr(34) + "'); var temp_value = vb.eval('InputBox' + '("' + prompt + '", "' + title + '", "' + value + '")'); if (typeof temp_value == "undefined") return value; return temp_value; } //regexp var re_youtube = new RegExp('(?:youtube(?:-nocookie)?.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu.be/)([^"&?/ ]{11})(?:.*list=([^"&?/ ]*))?'); var re_vimeo = new RegExp('(?:(vimeo).com\/(.*))'); var re_spotify = new RegExp('((open|play)\.spotify\.com\/)'); //timers var g_timer_ID; var g_count = 0; //flags var MF_STRING = 0x00000000; var MF_GRAYED = 0x00000001; var DT_TOP = 0x00000000; var DT_LEFT = 0x00000000; var DT_CENTER = 0x00000001; var DT_VCENTER = 0x00000004; var DT_WORDBREAK = 0x00000010; var DT_CALCRECT = 0x00000400; var DT_NOPREFIX = 0x00000800; ColorTypeCUI = { text: 0, selection_text: 1, inactive_selection_text: 2, background: 3, selection_background: 4, inactive_selection_background: 5, active_item_frame: 6 }; FontTypeCUI = { items: 0, labels: 1 }; ColorTypeDUI = { text: 0, background: 1, highlight: 2, selection: 3 }; FontTypeDUI = { defaults: 0, tabs: 1, lists: 2, playlists: 3, statusbar: 4, console: 5 }; var IDC_HAND = 32649; var g_instancetype = window.InstanceType; var g_font = null; var g_text = "R2YS (Click for Menu) / "; var g_text2 = ""; var g_text3 = ""; var g_text4 = ""; var ww = 0, wh = 0; var g_textcolor = 0, g_textcolor_hl = 0; var g_backcolor = 0; var g_hot = false; function get_font() { if (g_instancetype == 0) { g_font = window.GetFontCUI(FontTypeCUI.items); } else if (g_instancetype == 1) { g_font = window.GetFontDUI(FontTypeDUI.defaults); } else {} } get_font(); function get_colors() { if (g_instancetype == 0) { g_textcolor = window.GetColorCUI(ColorTypeCUI.text); g_textcolor_hl = window.GetColorCUI(ColorTypeCUI.text); g_backcolor = window.GetColorCUI(ColorTypeCUI.inactive_selection_background); } else if (g_instancetype == 1) { g_textcolor = window.GetColorDUI(ColorTypeDUI.text); g_textcolor_hl = window.GetColorDUI(ColorTypeDUI.highlight); g_backcolor = window.GetColorDUI(ColorTypeDUI.background); } else {} } get_colors(); function on_size() { ww = window.Width; wh = window.Height; } function on_paint(gr) { var text_color = g_hot ? g_textcolor_hl : g_textcolor; if (!access_token) { g_text2 = "Unauthorized"; } else { g_text2 = "Authorized"; } yt = get_youtube ? "YouTube / " : ""; vm = get_vimeo ? "Vimeo / " : ""; sp = get_spotify ? "Spotify / " : ""; gr.FillSolidRect(0, 0, ww, wh, g_backcolor); gr.GdiDrawText(g_text + g_text2 + " " + g_text3, g_font, text_color, 10, 10, ww, wh, DT_LEFT | DT_CALCRECT | DT_NOPREFIX); gr.GdiDrawText("Selected Options: " + yt + vm + sp + pitems + " / " + search_term[search] + " / " + search_time[time] + " / " + playlist_type_method[playlist_type], g_font, text_color, 10, 30, ww, wh, DT_LEFT | DT_CALCRECT | DT_NOPREFIX); gr.GdiDrawText(g_text4, g_font, text_color, 10, 50, ww, wh, DT_LEFT | DT_CALCRECT | DT_NOPREFIX); } function on_mouse_lbtn_up(x, y) { window.ShowConfigure(); } function on_mouse_move() { if (!g_hot) { window.SetCursor(IDC_HAND); g_hot = true; window.Repaint(); } } function on_mouse_leave() { if (g_hot) { g_hot = false; window.Repaint(); } } function on_font_changed() { get_font(); window.Repaint(); } function on_colors_changed() { get_colors(); window.Repaint(); } function notify_data(data) { g_text4 = data; window.Repaint(); } //Listings from https://www.reddit.com/r/Music/wiki/musicsubreddits 01/02/2017 //genres var genre = [ "Classical Music", "Electronic Music", "Rock / Metal", "Hip Hop", "Some decades", "By country/region/culture", "Other", "Any Genre", "Community", "Redditor Made Music", "Single Artist/Band subreddits", "DJs / Playlist", "Learning", "Instrument", "Production", "Gear" ]; //subreddits var subreddits = [ ["/r/composer", "/r/baroque", "/r/classicalmusic", "/r/contemporary", "/r/concertband", "/r/choralmusic", "/r/ChamberMusic", "/r/EarlyMusic", "/r/earlymusicalnotation", "/r/ElitistClassical", "/r/icm", "/r/Opera", "/r/orchestra"], ["/r/acidhouse", "/r/ambientmusic", "/r/AStateOfTrance", "/r/AtmosphericDnB", "/r/BigBeat", "/r/boogiemusic", "/r/breakbeat", "/r/breakcore", "/r/brostep", "/r/chicagohouse", "/r/chillout", "/r/Chipbreak", "/r/Chiptunes", "/r/complextro", "/r/darkstep", "/r/deephouse", "/r/DnB", "/r/DubStep", "/r/EDM", "/r/electronicdancemusic", "/r/ElectronicJazz", "/r/ElectronicBlues", "/r/electrohiphop", "/r/electrohouse", "/r/electronicmagic", "/r/ElectronicMusic", "/r/electropop", "/r/electroswing", "/r/ExperimentalMusic", "/r/fidget", "/r/filth", "/r/frenchelectro", "/r/frenchhouse", "/r/funkhouse", "/r/fusiondancemusic", "/r/futurebeats", "/r/FutureFunkAirlines", "/r/FutureGarage", "/r/futuresynth", "/r/gabber", "/r/glitch", "/r/glitchop", "/r/Grime", "/r/happyhardcore", "/r/hardhouse", "/r/hardstyle", "/r/house", "/r/idm", "/r/industrialmusic", "/r/ItaloDisco", "/r/latinhouse", "/r/LiquidDubstep", "/r/mashups", "/r/melodichouse", "/r/minimal", "/r/mixes", "/r/moombahcore", "/r/nightstep", "/r/OldskoolRave", "/r/Outrun", "/r/partymusic", "/r/plunderphonics", "/r/psybient", "/r/PsyBreaks", "/r/psytrance", "/r/purplemusic", "/r/raggajungle", "/r/RealDubstep", "/r/skweee", "/r/swinghouse", "/r/tech_house", "/r/Techno", "/r/Trance", "/r/tranceandbass", "/r/trap", "/r/tribalbeats", "/r/TropicalHouse", "/r/ukfunky", "/r/witchhouse", "/r/wuuB"], ["/r/80sHardcorePunk", "/r/90sAlternative", "/r/90sPunk", "/r/90sRock", "/r/AlternativeRock", "/r/AltCountry", "/r/AORMelodic", "/r/ausmetal", "/r/BlackMetal", "/r/bluegrass", "/r/Blues", "/r/bluesrock", "/r/Boneyard", "/r/CanadianClassicRock", "/r/CanadianMusic", "/r/ClassicRock", "/r/country", "/r/Christcore", "/r/crunkcore", "/r/deathcore", "/r/deathmetal", "/r/Djent", "/r/DoomMetal", "/r/Drone", "/r/Emo", "/r/EmoScreamo", "/r/epicmetal", "/r/flocked", "/r/folk", "/r/folkmetal", "/r/folkpunk", "/r/folkrock", "/r/folkunknown", "/r/GaragePunk", "/r/GothicMetal", "/r/Grunge", "/r/hardcore", "/r/HardRock", "/r/horrorpunk", "/r/indie_rock", "/r/jrock", "/r/krautrock", "/r/LadiesofMetal", "/r/MathRock", "/r/melodicdeathmetal", "/r/MelodicMetal", "/r/MetalNews", "/r/Metalmusic", "/r/metal", "/r/metalcore", "/r/ModernRockMusic", "/r/monsterfuzz", "/r/neopsychedelia", "/r/NewWave", "/r/noiserock", "/r/numetal", "/r/pianorock", "/r/poppunkers", "/r/PostHardcore", "/r/PostRock", "/r/powermetal", "/r/powerpop", "/r/ProgMetal", "/r/progrockmusic", "/r/PsychedelicRock", "/r/punk", "/r/Punkskahardcore", "/r/Punk_Rock", "/r/raprock", "/r/Rock", "/r/shoegaze", "/r/stonerrock", "/r/symphonicblackmetal", "/r/symphonicmetal", "/r/synthrock", "/r/truethrash", "/r/Truemetal", "/r/OutlawCountry", "/r/WomenRock"], ["/r/80sHipHop", "/r/90sHipHop", "/r/altrap", "/r/asianrap", "/r/backspin", "/r/BayRap", "/r/ChapHop", "/r/ChiefKeef", "/r/DrillandBop", "/r/Gfunk", "/r/HipHopHeads", "/r/HipHopHeadsNorthWest", "/r/MemphisRap", "/r/NYrap", "/r/Rap", "/r/raprock", "/r/rapverses", "/r/rhymesandbeats", "/r/trapmuzik"], ["/r/2010smusic", "/r/2000smusic", "/r/90sMusic", "/r/80sMusic", "/r/70sMusic", "/r/60sMusic", "/r/50sMusic"], ["/r/AfricanMusic", "/r/afrobeat", "/r/balkanbrass", "/r/balkanmusic", "/r/brazilianmusic", "/r/britpop", "/r/CroatianMusic", "/r/Flamenco", "/r/Irishmusic", "/r/ItalianMusic", "/r/jpop", "/r/KoreanRock", "/r/kpop", "/r/RoMusic", "/r/spop", "/r/somluso", "/r/UKbands", "/r/WorldMusic"], ["/r/70s", "/r/Acappella", "/r/AcousticCovers", "/r/ambientfolk", "/r/animemusic", "/r/boomswing", "/r/bossanova", "/r/carmusic", "/r/concerts", "/r/chillmusic", "/r/cpop", "/r/Complextro", "/r/dembow", "/r/disco", "/r/DreamPop", "/r/dub", "/r/Elephant6", "/r/ETIMusic", "/r/Exotica", "/r/FilmMusic", "/r/FunkSouMusic", "/r/gamemusic", "/r/GamesMusicMixMash", "/r/GunslingerMusic", "/r/GypsyJazz", "/r/IndieFolk", "/r/jambands", "/r/jazz", "/r/JazzFusion", "/r/JazzInfluence", "/r/listentoconcerts", "/r/klezmer", "/r/lt10k", "/r/MedievalMusic", "/r/MelancholyMusic", "/r/minimalism_music", "/r/motown", "/r/MusicForConcentration", "/r/muzyka", "/r/NuDisco", "/r/oldiemusic", "/r/OldiesMusic", "/r/pianocovers", "/r/popheads", "/r/PoptoRock", "/r/QuietStorm", "/r/rainymood", "/r/recordstorefinds", "/r/reggae", "/r/remixxd", "/r/RetroMusic", "/r/rnb", "/r/rootsmusic", "/r/SalsaMusic", "/r/Ska", "/r/Soca", "/r/songbooks", "/r/Soulies", "/r/SoulDivas", "/r/SoundsVintage", "/r/SpaceMusic", "/r/swing", "/r/Tango", "/r/TheRealBookVideos", "/r/TouhouMusic", "/r/TraditionalMusic", "/r/treemusic", "/r/triphop", "/r/vaporwave", "/r/VintageObscura", "/r/vocaloid"], ["/r/audioinsurrection", "/r/albumaday", "/r/albumoftheday", "/r/Albums", "/r/albumlisteners", "/r/bassheavy", "/r/BinauralMusic", "/r/BoyBands", "/r/Catchysongs", "/r/Chopping", "/r/CircleMusic", "/r/CoverSongs", "/r/cyberpunk_music", "/r/DANCEPARTY", "/r/danktunes", "/r/deepcuts", "/r/EarlyMusic", "/r/earlymusicalnotation", "/r/FemaleVocalists", "/r/festivals", "/r/findaband", "/r/FitTunes", "/r/FreeAlbums", "/r/freemusic", "/r/Frisson", "/r/gameofbands", "/r/GayMusic", "/r/germusic", "/r/gethightothis", "/r/GuiltyPleasureMusic", "/r/HeadNodders", "/r/heady", "/r/HeyThatWasIn", "/r/HighFidelity", "/r/ifyoulikeblank", "/r/indie", "/r/IndieWok", "/r/Instrumentals", "/r/ipm", "/r/IsolatedVocals", "/r/LeeHallMusic", "/r/LetsTalkMusic", "/r/listentoconcerts", "/r/listentomusic", "/r/listentonews", "/r/ListenToThis", "/r/ListenToUs", "/r/livemusic", "/r/llawenyddhebddiwedd", "/r/LongerJams", "/r/Lyrics", "/r/mainstreammusic", "/r/makemeaplaylist", "/r/MiddleEasternMusic", "/r/MLPtunes", "/r/Music", "/r/MusicAlbums", "/r/musicanova", "/r/musicsuggestions", "/r/MusicToSleepTo", "/r/musicvideos", "/r/NameThatSong", "/r/NewAlbums", "/r/newmusic", "/r/onealbumaweek", "/r/partymusic", "/r/RedditOriginals", "/r/RepublicOfMusic", "/r/RoyaltyFreeMusic", "/r/runningmusic", "/r/ScottishMusic", "/r/SlavicMusicVideos", "/r/songwriterscircle", "/r/SpotifyMusic", "/r/ThemVoices", "/r/unheardof", "/r/WhatIListenTo", "/r/WTFMusicVideos"], ["/r/AlbumArtPorn", "/r/albumreviews", "/r/Audio", "/r/Audiophile", "/r/audiophilemusic", "/r/AustinMusicians", "/r/bandmembers", "/r/CarAV", "/r/CassetteCulture", "/r/Cd_collectors", "/r/ConcertTickets", "/r/germusic", "/r/glastonbury_festival", "/r/ICoveredASong", "/r/ifyoulikeblank", "/r/independentmusic", "/r/ineedasong", "/r/japanesemusic", "/r/Jazzguitar", "/r/koreanmusic", "/r/LubbockMusicians", "/r/mixcd", "/r/musiccritics", "/r/MusicalComedy", "/r/musicessentials", "/r/MusicEventMeetUp", "/r/musicfestivals", "/r/musicnews", "/r/MusiciansBlogs", "/r/Musicians", "/r/NeedVocals", "/r/OSOM", "/r/performer", "/r/RecordClub", "/r/recordstore", "/r/redditmusicclub", "/r/Rockband", "/r/RockbandChallenges", "/r/TheSongRemainsTheSame", "/r/TipOfMyTongue", "/r/TouringMusicians", "/r/vinyl", "/r/VinylReleases", "/r/WeAreTheMusicMakers"], ["/r/300Songs", "/r/AcousticOriginals", "/r/Composer", "/r/ICoveredASong", "/r/independentmusic", "/r/MusicCritique", "/r/MusicInTheMaking", "/r/MyMusic", "/r/RadioReddit", "/r/RoastMyTrack", "/r/ratemyband", "/r/Songwriters", "/r/TheseAreOurAlbums", "/r/ThisIsOurMusic", "/r/UserProduced", "/r/WereOnSpotify", "/r/WhiteLabels"], ["/r/311", "/r/ADTR", "/r/AliciaKeys", "/r/ArcadeFire", "/r/ArethaFranklin", "/r/APerfectCircle", "/r/AvengedSevenfold", "/r/TheAvettBrothers", "/r/BaysideIsACult", "/r/TheBeachBoys", "/r/Beatles", "/r/billytalent", "/r/Blink182", "/r/BMSR", "/r/BoBurnham", "/r/boniver", "/r/brandnew", "/r/BruceSpringsteen", "/r/Burial", "/r/ChristinaAguilera", "/r/cityandcolour", "/r/Coldplay", "/r/CutCopy", "/r/TheCure", "/r/DaftPunk", "/r/DavidBowie", "/r/Deadmau5", "/r/DeathCabforCutie", "/r/DeathGrips", "/r/DeepPurple", "/r/Deftones", "/r/DieAntwoord", "/r/DMB", "/r/elliegoulding", "/r/Eminem", "/r/empireofthesun", "/r/EnterShikari", "/r/Evanescence", "/r/FallOutBoy", "/r/feedme", "/r/FirstAidKit", "/r/flaminglips", "/r/franzferdinand", "/r/finkworld", "/r/Gorillaz", "/r/grateful_dead", "/r/Greenday", "/r/GunsNRoses", "/r/Incubus", "/r/JackJohnson", "/r/JackWhite", "/r/JanetJackson", "/r/John_frusciante", "/r/kings_of_leon", "/r/Korn", "/r/ladygaga", "/r/lanadelrey", "/r/lennykravitz", "/r/Led_Zeppelin", "/r/lorde", "/r/Macklemore", "/r/Madonna", "/r/Manowar", "/r/MariahCarey", "/r/MattAndKim", "/r/Megadeth", "/r/Metallica", "/r/MGMT", "/r/MichaelJackson", "/r/MinusTheBear", "/r/ModestMouse", "/r/Morrissey", "/r/mrbungle", "/r/MyChemicalRomance", "/r/Muse", "/r/NeilYoung", "/r/NIN", "/r/Nirvana", "/r/NOFX", "/r/oasis", "/r/ofMontreal", "/r/OFWGKTA", "/r/Opeth", "/r/OutKast", "/r/panicatthedisco", "/r/PearlJam", "/r/phish", "/r/Pinback", "/r/PinkFloyd", "/r/porcupinetree", "/r/prettylights", "/r/Puscifer", "/r/Queen", "/r/Radiohead", "/r/RATM", "/r/RedHotChiliPeppers", "/r/The_Residents", "/r/RiseAgainst", "/r/Rush", "/r/SigurRos", "/r/Slayer", "/r/slipknot", "/r/SmashingPumpkins", "/r/SOCOTRAband", "/r/SparksFTW", "/r/TeganAndSara", "/r/TheKillers", "/r/TheMagneticZeros", "/r/TheOffspring", "/r/TheStrokes", "/r/TheWeeknd", "/r/tmbg", "/r/tragicallyhip", "/r/ToolBand", "/r/TwentyOnePilots", "/r/U2Band", "/r/Umphreys", "/r/UnicornsMusic", "/r/velvetunderground", "/r/Ween", "/r/weezer", "/r/WeirdAl", "/r/yesband", "/r/Zappa"], ["/r/GrooveSharkPlaylists", "/r/DJs", "/r/PirateRadio", "/r/Spotify", "/r/Turntablists"], ["/r/abletonclass", "/r/bandmembers", "/r/bassLessons", "/r/DancePerformance", "/r/earlymusicalnotation", "/r/Ethnomusicology", "/r/ExplainThisSong", "/r/GuitarLessons", "/r/LearnMusic", "/r/MusicEd", "/r/musicindustry", "/r/MusicInstructor", "/r/musicology", "/r/MusicTheory", "/r/solresol", "/r/tabs"], ["/r/Accordion", "/r/banjo", "/r/Bass", "/r/bassplaying", "/r/Bassoon", "/r/beatbox", "/r/brass", "/r/Cello", "/r/Clarinet", "/r/ClassicalGuitar", "/r/Concertina", "/r/DoubleBass", "/r/Drummers", "/r/Drums", "/r/Flute", "/r/Guitar", "/r/GuitarPlaying", "/r/hammondorgan", "/r/handpan", "/r/harmonica", "/r/Horn", "/r/keys", "/r/luthier", "/r/Mandolin", "/r/Oboe", "/r/Ocarina", "/r/Percussion", "/r/Percussionists", "/r/Piano", "/r/Piccolo", "/r/PlayingGuitar", "/r/Recorder", "/r/saxophone", "/r/saxophonics", "/r/Singing", "/r/synthesizers", "/r/Telecaster", "/r/Trombone", "/r/Trumpet", "/r/tuba", "/r/ukulele", "/r/viola", "/r/Violinist"], ["/r/AudioEngineering", "/r/EDMproduction", "/r/FL_Studio", "/r/ableton", "/r/AbletonLive", "/r/AudioPost", "/r/Cubase", "/r/futurebeatproducers", "/r/GameAudio", "/r/linuxaudio", "/r/LocationSound", "/r/Logic_Studio", "/r/makinghiphop", "/r/MaxMSP", "/r/ProductionLounge", "/r/Protools", "/r/RateMyAudio", "/r/Reaper", "/r/Reasoners", "/r/Remix", "/r/Renoise", "/r/Samplehunters", "/r/SongStems", "/r/VSTi"], ["/r/DIYGear", "/r/diyguitar", "/r/Gear4Sale", "/r/GuitarPedals", "/r/skullcandy", "/r/Synthesizers"] ]; function on_mouse_lbtn_down(x, y) { if (access_token == 0) { oauth2(); } //base var _menu = window.CreatePopupMenu(); //by genre var _genre_menu = window.CreatePopupMenu(); //by letter var _letter_menu = window.CreatePopupMenu(); //my list var _mylist_menu = window.CreatePopupMenu(); //search history var _search_history_menu = window.CreatePopupMenu(); //terms var _term = window.CreatePopupMenu(); //items var _items = window.CreatePopupMenu(); //playlist var _playlist = window.CreatePopupMenu(); //time var _time = window.CreatePopupMenu(); //custom var _custom = window.CreatePopupMenu(); var idx; var idz = -1; var subreddit_idx = []; //Build Menu _menu.AppendMenuItem(MF_GRAYED, 1, "R2YS a script for reddit"); _menu.AppendMenuItem(MF_GRAYED, 2, "Subreddit Importer for foobar2000"); _menu.AppendMenuSeparator(); //by genre menu _genre_menu.AppendTo(_menu, MF_STRING, "Listing By Genre"); for (i = 0; i < genre.length; i++) { submenuname = "_subgenre" + i; var submenuname = window.CreatePopupMenu(); submenuname.AppendTo(_genre_menu, MF_STRING, genre[i]); for (j = 0; j < subreddits[i].length; j++) { idz++; submenuname.AppendMenuItem(MF_STRING, idz + 2000, subreddits[i][j]); subreddit_idx.push(subreddits[i][j]); } } //by letter menu _letter_menu.AppendTo(_menu, MF_STRING, "Listing By First Letter"); allsubs_sorted = []; for (i = 0; i < subreddits.length; i++) { for (j = 0; j < subreddits[i].length; j++) { allsubs_sorted.push(subreddits[i][j].toLowerCase()); } } allsubs_sorted = allsubs_sorted.sort(); allsubs_sorted_nodups = []; allsubs_sorted_nodups = remove_duplicates_safe(allsubs_sorted); var index = 'abcdefghijklmnopqrstuvwxyz1234567890'.split(''); for (i = 0; i < index.length; i++) { submenuname = "_subletter" + i; var submenuname = window.CreatePopupMenu(); submenuname.AppendTo(_letter_menu, MF_STRING, index[i]); var results = []; var len = allsubs_sorted_nodups.length; var letter = index[i].toString(); for (var j = 0; j < len; j++) { if (allsubs_sorted_nodups[j].substr(3).indexOf(letter) == 0) results.push(allsubs_sorted_nodups[j]); } for (k = 0; k < results.length; k++) { idz++; submenuname.AppendMenuItem(MF_STRING, idz + 2000, results[k]); subreddit_idx.push(results[k]); } } //my list _mylist_menu.AppendTo(_menu, MF_STRING, "My List"); for (i = 0; i < mylist_a.length; i++) { idz++; _mylist_menu.AppendMenuItem(MF_STRING, idz + 2000, mylist_a[i]); subreddit_idx.push(mylist_a[i]); } _menu.AppendMenuSeparator(); _custom.AppendTo(_menu, MF_STRING, "Custom Search"); _custom.AppendMenuItem(MF_STRING, 99, "Search by name"); _menu.AppendMenuSeparator(); //search_history menu _search_history_menu.AppendTo(_menu, MF_STRING, "Custom Search History"); for (i = 0; i < search_history_a.length; i++) { idz++; _search_history_menu.AppendMenuItem(MF_STRING, idz + 2000, search_history_a[i]); subreddit_idx.push(search_history_a[i]); } _search_history_menu.AppendMenuSeparator(); _search_history_menu.AppendMenuItem(MF_STRING, 25, "Clear Search History"); _menu.AppendMenuSeparator(); _term.AppendTo(_menu, MF_STRING, "Search Term"); _term.AppendMenuItem(MF_STRING, 2, "top"); _term.AppendMenuItem(MF_STRING, 3, "hot"); _term.AppendMenuItem(MF_STRING, 4, "new"); _term.AppendMenuItem(MF_STRING, 5, "rising"); _term.AppendMenuItem(MF_STRING, 6, "controversial"); _term.CheckMenuRadioItem(2, 6, search + 2); _time.AppendTo(_menu, MF_STRING, "Search Time"); _time.AppendMenuItem(MF_STRING, 13, "all"); _time.AppendMenuItem(MF_STRING, 14, "year"); _time.AppendMenuItem(MF_STRING, 15, "month"); _time.AppendMenuItem(MF_STRING, 16, "week"); _time.AppendMenuItem(MF_STRING, 17, "day"); _time.AppendMenuItem(MF_STRING, 18, "hour"); _time.CheckMenuRadioItem(13, 18, time + 13); _items.AppendTo(_menu, MF_STRING, "Search Items"); _items.AppendMenuItem(MF_STRING, 1000, 100); _items.AppendMenuItem(MF_STRING, 1100, 200); _items.AppendMenuItem(MF_STRING, 1200, 300); _items.AppendMenuItem(MF_STRING, 1300, 400); _items.AppendMenuItem(MF_STRING, 1400, 500); _items.AppendMenuItem(MF_STRING, 1500, 600); _items.AppendMenuItem(MF_STRING, 1600, 700); _items.AppendMenuItem(MF_STRING, 1700, 800); _items.AppendMenuItem(MF_STRING, 1800, 900); _items.AppendMenuItem(MF_STRING, 1900, 1000); _items.CheckMenuRadioItem(1000, 1900, pitems + 900); _playlist.AppendTo(_menu, MF_STRING, "Playlist method"); _playlist.AppendMenuItem(MF_STRING, 10, "m3u8 (prefered)"); _playlist.AppendMenuItem((mtags_source_installed) ? MF_STRING : MF_GRAYED, 11, "m-tags (noart-noseek)"); _playlist.AppendMenuItem(MF_STRING, 12, "native (slow)"); _playlist.CheckMenuRadioItem(10, 12, playlist_type + 10); _menu.AppendMenuSeparator(); _menu.AppendMenuItem(MF_STRING, 21, "Get Youtube"); _menu.CheckMenuItem(21, get_youtube); _menu.AppendMenuItem(MF_STRING, 22, "Get Vimeo"); _menu.CheckMenuItem(22, get_vimeo); _menu.AppendMenuItem(MF_STRING, 23, "Get Spotify"); _menu.CheckMenuItem(23, get_spotify); _menu.AppendMenuSeparator(); _menu.AppendMenuItem(MF_STRING, 20, "Open Playlist Folder"); _menu.AppendMenuSeparator(); _menu.AppendMenuItem(MF_STRING, 24, "Visit Reddit Webpage"); idx = _menu.TrackPopupMenu(x, y); switch (idx) { case 0: break; case 2: case 3: case 4: case 5: case 6: search = idx - 2; window.SetProperty("Reddit.search_term", search); window.Repaint(); break; case 10: case 11: case 12: playlist_type = idx - 10; window.SetProperty("System.playlist_type", playlist_type); window.Repaint(); break; case 13: case 14: case 15: case 16: case 17: case 18: time = idx - 13; window.SetProperty("Reddit.search_time", time); window.Repaint(); break; case 20: WshShell.Run("\"" + path + "\""); break; case 21: get_youtube = !get_youtube; check_types(); window.SetProperty("System.youtube", get_youtube); window.Repaint(); break; case 22: get_vimeo = !get_vimeo; check_types(); window.SetProperty("System.vimeo", get_vimeo); window.Repaint(); break; case 23: get_spotify = !get_spotify; check_types(); window.SetProperty("System.spotify", get_spotify); window.Repaint(); break; case 24: WshShell.Run("https:\\www.reddit.com"); break; case 25: window.SetProperty("System.history", null); search_history_a = []; break; case 99: custom_input = InputBox("ENTER subreddit name (e.g. for /r/Music ) type \n\n Music ", "Custom Search", ""); custom_search = "https://oauth.reddit.com/r/" + custom_input; search_history_addition = "/r/" + custom_input; search_history_a.push(search_history_addition); window.SetProperty("System.history", search_history_a.toString()); term = search_term[search]; t = search_time[time]; if (custom_input) { listing(custom_search, term, t); } break; case 1000: case 1100: case 1200: case 1300: case 1400: case 1500: case 1600: case 1700: case 1800: case 1900: pitems = idx - 900; window.SetProperty("Reddit.items", pitems); window.Repaint(); break; default: ShiftDown = utils.IsKeyPressed(0x10) ? true : false; CtrlDown = utils.IsKeyPressed(0x11) ? true : false; name = subreddit_idx[idx - 2000]; console(name); term = search_term[search]; t = search_time[time]; url = "https://oauth.reddit.com" + name; url2 = "https://www.reddit.com" + name; if (ShiftDown && CtrlDown) { index = mylist_a.indexOf(name); if (index > -1) { mylist_a.splice(index, 1); window.SetProperty("System.mylist", mylist_a.toString()); break; } } else if (ShiftDown) { WshShell.Run(url2); break; } else if (CtrlDown) { mylist_a.push(name); window.SetProperty("System.mylist", mylist_a.toString()); break; } else { listing(url, term, t); break; } } _menu.Dispose(); _genre_menu.Dispose(); _letter_menu.Dispose(); _mylist_menu.Dispose(); _term.Dispose(); _items.Dispose(); _playlist.Dispose(); _custom.Dispose(); } function listing(url, term, t) { notify_data(""); if (access_token == 0) { fb.ShowPopupMessage("Cannot continue unauthorized !!!", script_name); return; } notify_data("[Processing...]"); timestamp(); subredditName = url.substring(url.lastIndexOf('/') + 1); playlist_name = "r/" + subredditName + " " + mydate + " [" + term + "-" + t + "-" + pitems + "-" + playlist_type_method[playlist_type] + "] "; //PASS1 notify_data("[Processing.. 100 of " + pitems + "]"); json_url = url + "/" + term + "/.json?t=" + t + "&limit=100"; console(json_url); objXMLHTTP.open("GET", json_url, true); objXMLHTTP.setRequestHeader("Authorization", "Bearer " + access_token); objXMLHTTP.setRequestHeader("User-Agent", "windows:" + script_name + " (by /u/" + username + ")"); objXMLHTTP.send(); objXMLHTTP.onreadystatechange = function () { if (objXMLHTTP.readyState == 4) { if (objXMLHTTP.status == 200) { response = objXMLHTTP.ResponseText; objXMLHTTP.Close; if (!response) { notify_data("No Response??"); return; } json_data = JSON.parse(response); json_data = json_data.data.children; if (json_data == 0) { notify_data("No Data."); return; } last = json_data[json_data.length - 1].data.name; data_all = json_data; //call pass2 if (pitems > 100) { processNext(1); } else { processResults(data_all); } } else { response = objXMLHTTP.ResponseText; objXMLHTTP.Close; console("Error: " + response); notify_data("[Error]"); } } } //PASS2 function processNext(i) { notify_data("[Processing.. " + i * 100 + " of " + pitems + "]"); json_url = url + "/" + term + "/.json?t=" + t + "&limit=100&after=" + last; console(json_url); objXMLHTTP.open("GET", json_url, true); objXMLHTTP.setRequestHeader("Authorization", "Bearer " + access_token); objXMLHTTP.setRequestHeader("User-Agent", "windows:" + script_name + " (by /u/" + username + ")"); objXMLHTTP.send(); objXMLHTTP.onreadystatechange = function () { if (objXMLHTTP.readyState == 4) { if (objXMLHTTP.status == 200) { response = objXMLHTTP.ResponseText; objXMLHTTP.Close; json_data = JSON.parse(response); json_data = json_data.data.children; if (json_data == 0) { processResults(data_all); return; } last = json_data[json_data.length - 1].data.name; data_all = data_all.concat(json_data); i++; if (i < (pitems / 100)) { //timer to control rate limit of 60 requests/min ptimer1 = window.SetTimeout(function () { processNext(i); }, 2000); } else { processResults(data_all); }; } else { response = objXMLHTTP.ResponseText; objXMLHTTP.Close; console("Error: " + response); notify_data("[Error]"); } } } } //process results function processResults(data) { items = data.length; var results = []; switch (playlist_type) { case 0: //m3u8 var playlist_m3u8 = "#EXTM3U\n"; for (i = 0; i < items; i++) { url = data[i].data.url; if (url.match(re_youtube) && get_youtube) { var itemArtistTitle = data[i].data.title.replace(/&/g, "&").split(/ - | (?=\[)/); itemArtist = itemArtistTitle.shift(); itemTitle = itemArtistTitle.join(" - "); itemURL = url.replace(/&/g, "&"); itemURL = itemURL.replace(/^https?:\/\//i, "3dydfy://"); if (itemArtist && itemTitle && /^3dydfy:\/\//.test(itemURL)) { itemURL += "&fb2k_artist=" + encodeURIComponent(itemArtist) + "&fb2k_title=" + encodeURIComponent(itemTitle); playlist_m3u8 += "#EXTINF:" + itemArtist + " - " + itemTitle + "\n" + itemURL + "\n"; } else { itemURL += "&fb2k_title=" + encodeURIComponent(data[i].data.title.replace(/&/g, "&")); playlist_m3u8 += "#EXTINF:" + data[i].data.title.replace(/&/g, "&") + "\n" + itemURL + "\n"; } results.push(itemURL); } if (url.match(re_vimeo) && get_vimeo) { itemURL = url.replace(/&/g, "&"); playlist_m3u8 += "#EXTINF:" + data[i].data.title.replace(/&/g, "&") + "\n" + itemURL + "\n"; results.push(itemURL); } if (url.match(re_spotify) && get_spotify) { itemURL = url.replace(/&/g, "&"); itemURL = itemURL.replace(/.*?:\/\/?/i, ""); itemURL = itemURL.substring(itemURL.indexOf('/') + 1); itemURL = itemURL.replace(/\//g, ":"); itemURL = "spotify:" + itemURL; playlist_m3u8 += "#EXTINF:" + data[i].data.title.replace(/&/g, "&") + "\n" + itemURL + "\n"; results.push(itemURL); } } items = results.length; console("Processing Complete."); notify_data("Url's Found: " + items); console(g_text4); //Create playlist if (items > 0) { g_text4 += " - Creating Playlist..."; window.Repaint(); console(g_text4); create_playlist(); try { filename = path_m3u8 + "\\" + clean_filename(playlist_name) + ".m3u8 "; objStream.Open(); objStream.CharSet = "utf-8"; objStream.WriteText(playlist_m3u8.replace(/(^[ \t]*\n)/gm, "")); objStream.SaveToFile(filename, adSaveCreateOverWrite); objStream.Close(); } catch (e) { console(e) }; cmd = ("foobar2000.exe /add \"" + filename + "\""); WshShell.Run(cmd, 0, true); g_text4 += " Completed"; window.Repaint(); console(g_text4); } else { g_text4 += " - Nothing found - Aborting."; window.Repaint(); console(g_text4); } break; case 1: //mtags var mtags = []; for (i = 0; i < items; i++) { url = data[i].data.url; if (url.match(re_youtube) && get_youtube) { var itemArtistTitle = data[i].data.title.replace(/&/g, "&").split(/ - | (?=\[)/); itemArtist = itemArtistTitle.shift(); itemTitle = itemArtistTitle.join(" - "); itemURL = url.replace(/&/g, "&"); itemURL = itemURL.replace(/^https?:\/\//i, "3dydfy://"); if (itemArtist && itemTitle && /^3dydfy:\/\//.test(itemURL)) { itemURL += "&fb2k_artist=" + encodeURIComponent(itemArtist) + "&fb2k_title=" + encodeURIComponent(itemTitle); mtags.push({ "@": itemURL, "ARTIST": itemArtist, "TITLE": itemTitle }); } else { itemURL += "&fb2k_title=" + encodeURIComponent(data[i].data.title.replace(/&/g, "&")); mtags.push({ "@": itemURL, "ARTIST": null, "TITLE": data[i].data.title.replace(/&/g, "&") }); } results.push(itemURL); } if (url.match(re_vimeo) && get_vimeo) { var itemArtistTitle = data[i].data.title.replace(/&/g, "&").split(/ - | (?=\[)/); itemArtist = itemArtistTitle.shift(); itemTitle = itemArtistTitle.join(" - "); itemURL = url.replace(/&/g, "&"); if (itemArtist && itemTitle) { mtags.push({ "@": itemURL, "ARTIST": itemArtist, "TITLE": itemTitle }); } else { mtags.push({ "@": itemURL, "ARTIST": null, "TITLE": data[i].data.title.replace(/&/g, "&") }); } results.push(itemURL); } if (url.match(re_spotify) && get_spotify) { var itemArtistTitle = data[i].data.title.replace(/&/g, "&").split(/ - | (?=\[)/); itemArtist = itemArtistTitle.shift(); itemTitle = itemArtistTitle.join(" - "); itemURL = url.replace(/&/g, "&"); itemURL = itemURL.replace(/.*?:\/\/?/i, ""); itemURL = itemURL.substring(itemURL.indexOf('/') + 1); itemURL = itemURL.replace(/\//g, ":"); itemURL = "spotify:" + itemURL; if (itemArtist && itemTitle) { mtags.push({ "@": itemURL, "ARTIST": itemArtist, "TITLE": itemTitle }); } else { mtags.push({ "@": itemURL, "ARTIST": null, "TITLE": data[i].data.title.replace(/&/g, "&") }); } results.push(itemURL); } } items = results.length; console("Processing Complete."); notify_data("Url's Found: " + items); console(g_text4); //Create playlist if (items > 0) { g_text4 += " - Creating Playlist..."; window.Repaint(); console(g_text4); create_playlist(); try { filename = path_mtags + "\\" + clean_filename(playlist_name) + ".tags "; objStream.Open(); objStream.CharSet = "utf-8"; objStream.WriteText(JSON.stringify(mtags, null, 3)); objStream.SaveToFile(filename, adSaveCreateOverWrite); objStream.Close(); } catch (e) { console(e) }; cmd = ("foobar2000.exe /add \"" + filename + "\""); console(cmd); WshShell.Run(cmd, 0, true); g_text4 += " Completed"; window.Repaint(); console(g_text4); } else { g_text4 += " - Nothing found - Aborting."; window.Repaint(); console(g_text4); } break; case 2: //native for (i = 0; i < items; i++) { url = data[i].data.url; //youtube if (url.match(re_youtube) && get_youtube) { var itemArtistTitle = data[i].data.title.replace(/&/g, "&").split(/ - | (?=\[)/); itemArtist = itemArtistTitle.shift(); itemTitle = itemArtistTitle.join(" - "); itemURL = url.replace(/&/g, "&"); itemURL = itemURL.replace(/^https?:\/\//i, "3dydfy://"); if (itemArtist && itemTitle && /^3dydfy:\/\//.test(itemURL)) { itemURL += "&fb2k_artist=" + encodeURIComponent(itemArtist) + "&fb2k_title=" + encodeURIComponent(itemTitle); } results.push(itemURL); }; //vimeo if (url.match(re_vimeo) && get_vimeo) { itemURL = url.replace(/&/g, "&"); results.push(itemURL); }; //spotify if (url.match(re_spotify) && get_spotify) { itemURL = url.replace(/&/g, "&"); itemURL = itemURL.replace(/.*?:\/\/?/i, ""); itemURL = itemURL.substring(itemURL.indexOf('/') + 1); itemURL = itemURL.replace(/\//g, ":"); itemURL = "spotify:" + itemURL; results.push(itemURL); }; } items = results.length; console("Processing Complete."); notify_data("Url's Found: " + items); console(g_text4); //Create playlist if (items > 0) { g_text4 += " - Creating Playlist..."; window.Repaint(); console(g_text4); create_playlist(); for (i = 0; i < items; i++) { cmd = ("foobar2000.exe /add /immediate \"" + results[i] + "\""); WshShell.Run(cmd, 0, true); } g_text4 += " Completed "; window.Repaint(); console(g_text4); } else { g_text4 += " - Nothing found - Aborting."; window.Repaint(); console(g_text4); } break; } } } function oauth2() { request_url = "https://www.reddit.com/api/v1/access_token"; objXMLHTTP.open("POST", request_url, true); objXMLHTTP.setRequestHeader("User-Agent", "windows:" + script_name + " (by /u/" + username + ")"); objXMLHTTP.setRequestHeader("Authorization", "Basic " + Base64.encode(client_id + ":" + client_secret)); objXMLHTTP.send("grant_type=password&username=" + username + "&password=" + password); objXMLHTTP.onreadystatechange = function () { if (objXMLHTTP.readyState == 4) { if (objXMLHTTP.status == 200) { data = objXMLHTTP.ResponseText; objXMLHTTP.Close; if (!data) { notify_data("WTF !! No Response??"); return; } json_data = JSON.parse(data); access_token = json_data.access_token; console("Access token: " + access_token); if (access_token) { g_text3 = "[Expires in 60 min]"; window.Repaint(); start_timer(); } } else { data = objXMLHTTP.ResponseText; objXMLHTTP.Close; console("oauth2 Error: " + data); } } } } //timer to re-auth after expiration function start_timer() { var g_count = 0; g_timer_ID = window.SetInterval(function () { g_count++; if (g_count < 60) { timer = 60 - g_count; g_text3 = "[Expires in " + timer + " min]"; window.Repaint(); } else { access_token = ""; g_text3 = ""; console("Access token Expired"); window.ClearInterval(g_timer_ID); window.Repaint(); oauth2(); } }, 60000); } //helpers //timestamp function timestamp() { d = new Date(); mydate = d.toUTCString(); ; return mydate; } //create playlist function create_playlist() { var idxp = -1; for (var i = 0; i < fb.PlaylistCount; ++i) { if (fb.GetPlaylistName(i) == playlist_name) { idxp = i; break; } } if (idxp == -1) idxp = plman.CreatePlaylist(plman.PlaylistCount, playlist_name); plman.ActivePlaylist = idxp; } //Remove false string from file names function clean_filename(filename) { return filename.replace(/[\/\\|:]/g, '-').replace(/\*/g, 'x').replace(/"/g, "''").replace(/[?<>]/g, '_'); } //Revove duplicates from array function remove_duplicates_safe(arr) { var seen = {}; var ret_arr = []; for (var i = 0; i < arr.length; i++) { if (!(arr[i]in seen)) { ret_arr.push(arr[i]); seen[arr[i]] = true; } } return ret_arr; } //base64 /** * * Base64 encode / decode * http://www.webtoolkit.info/ * **/ var Base64 = { _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", encode: function (input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = Base64._utf8_encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); } return output; }, decode: function (input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = this._keyStr.indexOf(input.charAt(i++)); enc2 = this._keyStr.indexOf(input.charAt(i++)); enc3 = this._keyStr.indexOf(input.charAt(i++)); enc4 = this._keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = Base64._utf8_decode(output); return output; }, _utf8_encode: function (string) { string = string.replace(/\r\n/g, "\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if ((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }, _utf8_decode: function (utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while (i < utftext.length) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if ((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i + 1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i + 1); c3 = utftext.charCodeAt(i + 2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; } } //oauth2 on start oauth2();