public override bool Suitable(string url)
        {
            GILState(true);

            if (MatchString != null)
            {
                dynamic re = PythonScope.Import("re");
                return(re.match(MatchString, url) != null);
            }

            return((extractorInstance as dynamic).suitable(url));
        }
        public override void Initialize()
        {
            if (extractorInstance == null)
            {
                GILState(true);

                YTDLPyBridge pyBridge        = new YTDLPyBridge(ytdl);
                var          pythonYoutubeDL = (PythonYoutubeDLModule as dynamic)(pyBridge.ToPython());

                dynamic sys = PythonScope.Import("sys");
                sys.path.insert(0, AppDomain.CurrentDomain.BaseDirectory);

                dynamic ext     = PythonScope.Import(Module);
                dynamic ieClass = (ext as PyObject).GetAttr(Name);

                extractorInstance = ieClass(pythonYoutubeDL);
            }
        }
        public string MatchId(string url)
        {
            GILState(true);

            if (MatchString != null)
            {
                dynamic re    = PythonScope.Import("re");
                dynamic match = re.match(MatchString, url);
                if (match == null)
                {
                    return(null);
                }
                string id1 = (string)match.group("id");
                if (id1 != null)
                {
                    return(id1);
                }
                string id2 = (string)match.group(2);
                return(id2);
            }

            return((string)(extractorInstance as dynamic)._match_id(url));
        }