贴吧油库里使用 HTML5 播放器

只做了油库里的 /w\

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name        贴吧油库里使用 HTML5 播放器
// @namespace   org.jixun.tieba.youku.html5
// @description 只做了油库里的 /w\
// @include     http://tieba.baidu.com/*
// @version     1.1.1
// @grant       none
// @run-at      document-start
// @require     https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js
// ==/UserScript==


/*jshint esnext:true*/
(function (window, $) {
    const framePath = 'http://jixunmoe.github.io/youku-html5/player.mini.html';
    
    var TiebaPlayer = function () {
        this.init();
    };

    var _proto = TiebaPlayer.prototype;
    $.extend(_proto, {
        init: function () {
            var self = this;
            $(function () {
                var fn = '_init-tieba-player-' + Math.random();
                window[fn] = function () {
                    self.tiebaShell();
                };

                var shell = $('<script>');
                shell.text('window[' + JSON.stringify(fn) + ']();');
                $('body').append(shell);
            });
        },

        getUniq: function () {
            return '_' + String(Math.random()).slice(2) + (+new Date());
        },

        fixName: function (name) {
            return name.replace(/([a-z])([A-Z])/g, function(z, a, b) {
                return a + "_" + b;
            }).toLowerCase();
        },
        getDefinedModule: function (path, cb, define) {
            var parts, type, scope, fileName, moduleName,
                newSrcPath, count, modulePath,
                l = "", seperator = "/";

            parts = path.replace(/\/$/, "").split("/");
            count = parts.length;

            if (1 == count && define) {
                fileName = path;
                moduleName = define.module;
                type = define.type;
                scope = define.scope;
            } else if (3 === count || 4 === count) {
                type = parts[1].toLowerCase();
                moduleName = parts[2];
                scope = parts[0];
                fileName = count > 3 ? parts[3] : parts[2];
            } else {
                if (count <= 4)
                    return false;

                type = parts[1].toLowerCase();
                moduleName = parts[2];
                scope = parts[0];

                for (var d = 3; count - 1 > d; d++)
                    l += parts[d] + seperator;

                fileName = parts[count - 1];
            }

            fileName = this.fixName(fileName);

            window.F.use([
                scope, type,
                this.fixName(moduleName),
                l + fileName + '.js?class'
            ].join(seperator), function (x) {
                cb(x.cls.prototype);
            });
        },

        _bak_createTag: null,
        tiebaShell: function () {
            var self = this;

            console.info('wait for module..');
            ['pb/widget/NoAutoVideo', 'ppb/widget/NoAutoVideo'].forEach(function (_path) {
                self.getDefinedModule(_path, function (NoAutoVideo) {
                    console.info('module loaded, hooking..');
                    self._bak_createTag = NoAutoVideo._createVideoTagForOtherBrowser;
                    NoAutoVideo._createVideoTagForOtherBrowser = self._createTag;
                });
            });
        },

        _createTag: function (opts) {
            var self = getInst();
            if (opts.src.indexOf('youku') == -1) {
                console.info('revert to default.');
                return self._bak_createTag.apply(this, arguments);
            }

            var r = $('<div>');
            self._getYouku(r, opts.src, opts);
            return r;
        },

        _getYouku: function ($dom, url, opts) {
            var m = url.match(/sid\/(.+?)\//);
            if (!m) {
                $dom.text('找不到视频 sid, 请务必提交视频地址供分析: ' + url);
                return ;
            }
            var sid = m[1];
            var _id = this.getUniq();
            var frame = $('<iframe>').attr({
                src: framePath + '?' + sid,
                id: _id,
                allowfullscreen: 'allowfullscreen'
            }).css({
                width: '100%',
                height: opts.height,
                border: 0
            }).prop('allowfullscreen', true);
            $dom.html(frame);
        }
    });

    var tp = new TiebaPlayer();
    function getInst () {
        return tp;
    }
})(window, jQuery);