New Movie Night Thread - Every Friday Starting at 6ish

  • 🏰 The Fediverse is up. If you know, you know.
  • Want to keep track of this thread?
    Accounts can bookmark posts, watch threads for updates, and jump back to where you stopped reading.
    Create account
This would make a great interstitial (not mine, found in a different thread).

 
Yo, I'm going to be running a playlist of Mystery Science Theater 3000 episodes for Thanksgiving, probably starting at around 9:00-10:00 EST on Wednesday and continuing all through Thursday. In case you get sick of normie things like "social interaction" and "spending time with your family", pop in to Lolcow.tv and watch a 90s TV show with other spergs.
 
I don’t know if we’ve watched The Room recently but this week seems like a good time for it, what with The Disaster Artist coming out this weekend.
 
I don’t know how well this would fit into movie night but a documentary on the late lolcow Gene Ray (the TimeCube guy) just came out. It’s an interesting look at the early days of trolling and insanity on the internet.
 
Alright folks, hopefully we can actually get a good movie night running (pray to the machine spirits that something doesn't fuck up), because I have a decent list of options tonight: Maradonia, The Thing, Se7en, Escape From New York, and Crank. If the machine spirits screw us over, we'll just watch episodes of a trippy 90s sci-fi show that's pretty much Warhammer on acid.
 
Have we had a movie night devoted to unintentionally bad shows and movies? We could play stuff like Neo Yokio and After Earth.
 
Have we had a movie night devoted to unintentionally bad shows and movies? We could play stuff like Neo Yokio and After Earth.
That's pretty much every movie night.
We haven't played Neo Yokio or After Earth.
However, Surviving Edged Weapons is available on Youtube, so we have to watch that.
 
Just a heads up that I’m going to put on a bunch of Christmas movies/whatever people suggest on lolcow.tv tonight, around 6:30-7:00 (est).
 
We're doing a new thing! We're gonna host our videos on Google Drive now!
In order to watch movies, you'll need to download TamperMonkey, then create a new script, then paste all of this in there instead (delete the old stuff.)

Be sure to scroll down to get all of the code!
Code:
// ==UserScript==
// @name Google Drive Video Player for lolcow
// @namespace gdcytube
// @description Play Google Drive videos on CyTube
// @include http://lolcow.tv/r/*
// @include https://lolcow.tv/r/*
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// @grant GM.xmlHttpRequest
// @connect docs.google.com
// @run-at document-end
// @version 1.6.0
// ==/UserScript==
console.log('Script running');
try {
   function debug(message) {
       if (!unsafeWindow.enableCyTubeGoogleDriveUserscriptDebug) {
           return;
       }

       try {
           unsafeWindow.console.log(message);
       } catch (error) {
           unsafeWindow.console.error(error);
       }
   }

   var ITAG_QMAP = {
       37: 1080,
       46: 1080,
       22: 720,
       45: 720,
       59: 480,
       44: 480,
       35: 480,
       18: 360,
       43: 360,
       34: 360
   };

   var ITAG_CMAP = {
       43: 'video/webm',
       44: 'video/webm',
       45: 'video/webm',
       46: 'video/webm',
       18: 'video/mp4',
       22: 'video/mp4',
       37: 'video/mp4',
       59: 'video/mp4',
       35: 'video/flv',
       34: 'video/flv'
   };

   function getVideoInfo(id, cb) {
       var url = 'https://docs.google.com/get_video_info?authuser='
               + '&docid=' + id
               + '&sle=true'
               + '&hl=en';
       debug('Fetching ' + url);

       GM_xmlhttpRequest({
           method: 'GET',
           url: url,
           onload: function (res) {
               try {
                   debug('Got response ' + res.responseText);
                   var data = {};
                   var error;
                   res.responseText.split('&').forEach(function (kv) {
                       var pair = kv.split('=');
                       data[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
                   });

                   if (data.status === 'fail') {
                       var error = 'Google Docs request failed: ' +
                               unescape(data.reason).replace(/\+/g, ' ');
                       return cb(error);
                   }

                   if (!data.fmt_stream_map) {
                       var error = 'Google Docs request failed: ' +
                               'metadata lookup returned no valid links';
                       return cb(error);
                   }

                   data.links = {};
                   data.fmt_stream_map.split(',').forEach(function (item) {
                       var pair = item.split('|');
                       data.links[pair[0]] = pair[1];
                   });
                   data.videoMap = mapLinks(data.links);

                   cb(null, data);
               } catch (error) {
                   unsafeWindow.console.error(error);
               }
           },

           onerror: function () {
               var error = 'Google Docs request failed: ' +
                       'metadata lookup HTTP request failed';
               error.reason = 'HTTP_ONERROR';
               return cb(error);
           }
       });
   }

   function mapLinks(links) {
       var videos = {
           1080: [],
           720: [],
           480: [],
           360: []
       };

       Object.keys(links).forEach(function (itag) {
           itag = parseInt(itag, 10);
           if (!ITAG_QMAP.hasOwnProperty(itag)) {
               return;
           }

           videos[ITAG_QMAP[itag]].push({
               itag: itag,
               contentType: ITAG_CMAP[itag],
               link: links[itag]
           });
       });

       return videos;
   }

   /*
    * Greasemonkey 2.0 has this wonderful sandbox that attempts
    * to prevent script developers from shooting themselves in
    * the foot by removing the trigger from the gun, i.e. it's
    * impossible to cross the boundary between the browser JS VM
    * and the privileged sandbox that can run GM_xmlhttpRequest().
    *
    * So in this case, we have to resort to polling a special
    * variable to see if getGoogleDriveMetadata needs to be called
    * and deliver the result into another special variable that is
    * being polled on the browser side.
    */

   /*
    * Browser side function -- sets gdUserscript.pollID to the
    * ID of the Drive video to be queried and polls
    * gdUserscript.pollResult for the result.
    */
   function getGoogleDriveMetadata_GM(id, callback) {
       debug('Setting GD poll ID to ' + id);
       unsafeWindow.gdUserscript.pollID = id;
       var tries = 0;
       var i = setInterval(function () {
           if (unsafeWindow.gdUserscript.pollResult) {
               debug('Got result');
               clearInterval(i);
               var result = unsafeWindow.gdUserscript.pollResult;
               unsafeWindow.gdUserscript.pollResult = null;
               callback(result.error, result.result);
           } else if (++tries > 100) {
               // Took longer than 10 seconds, give up
               clearInterval(i);
           }
       }, 100);
   }

   /*
    * Sandbox side function -- polls gdUserscript.pollID for
    * the ID of a Drive video to be queried, looks up the
    * metadata, and stores it in gdUserscript.pollResult
    */
   function setupGDPoll() {
       unsafeWindow.gdUserscript = cloneInto({}, unsafeWindow);
       var pollInterval = setInterval(function () {
           if (unsafeWindow.gdUserscript.pollID) {
               var id = unsafeWindow.gdUserscript.pollID;
               unsafeWindow.gdUserscript.pollID = null;
               debug('Polled and got ' + id);
               getVideoInfo(id, function (error, data) {
                   unsafeWindow.gdUserscript.pollResult = cloneInto({
                       error: error,
                       result: data
                   }, unsafeWindow);
               });
           }
       }, 1000);
   }

   function isRunningTampermonkey() {
       try {
           return GM_info.scriptHandler === 'Tampermonkey';
       } catch (error) {
           return false;
       }
   }

   if (isRunningTampermonkey()) {
       unsafeWindow.getGoogleDriveMetadata = getVideoInfo;
   } else {
       debug('Using non-TM polling workaround');
       unsafeWindow.getGoogleDriveMetadata = exportFunction(
               getGoogleDriveMetadata_GM, unsafeWindow);
       setupGDPoll();
   }

   unsafeWindow.console.log('Initialized userscript Google Drive player');
   unsafeWindow.hasDriveUserscript = true;
   unsafeWindow.driveUserscriptVersion = '1.3';
} catch (error) {
   unsafeWindow.console.error(error);
}
After that, save the script, refresh, and you'll be good to go.
If it doesn't work, make sure that you have ad blocking disabled on lolcow.tv, and make sure that anything that could interfere with your connection, like a VPN, is disabled as well. Clearing your cache may also help.

In rare circumstances, some people have been unable to load it for some reason, and we haven't figured out why yet. It tends to just start randomly working. If worst comes to worst, you can actually watch the video directly on Google Drive. Just click on the name of the file in the playlist in the bottom right. Feel free to ask other people for what timecode we're at.
I'm working to figure out the cause of this uncommon issue.

Please let me know if it doesn't work for you. The more info I have about who it doesn't work for, the more I can do to fix this.
 
Last edited:
Back
Top Bottom