def play(self, tag: AVTag, on_done: OnDoneCallback) -> None: assert isinstance(tag, SoundOrVideoTag) self._on_done = on_done filename = hooks.media_file_filter(tag.filename) path = os.path.join(os.getcwd(), filename) self.command("loadfile", path, "append-play") gui_hooks.av_player_did_begin_playing(self, tag)
def play(self, tag: AVTag, on_done: OnDoneCallback) -> None: assert isinstance(tag, SoundOrVideoTag) self._on_done = on_done filename = hooks.media_file_filter(tag.filename) path = os.path.join(self.media_folder, filename) self.command("loadfile", path, "replace", "pause=no") gui_hooks.av_player_did_begin_playing(self, tag)
def _play(self, tag: AVTag) -> None: assert isinstance(tag, SoundOrVideoTag) filename = hooks.media_file_filter(tag.filename) self._process = subprocess.Popen( self.args + [filename], env=self.env, stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, startupinfo=startup_info(), ) self._wait_for_termination(tag)
def _exportMedia(self, z: ZipFile, files: List[str], fdir: str) -> Dict[str, str]: media = {} for c, file in enumerate(files): cStr = str(c) file = hooks.media_file_filter(file) mpath = os.path.join(fdir, file) if os.path.isdir(mpath): continue if os.path.exists(mpath): if re.search(r"\.svg$", file, re.IGNORECASE): z.write(mpath, cStr, zipfile.ZIP_DEFLATED) else: z.write(mpath, cStr, zipfile.ZIP_STORED) media[cStr] = unicodedata.normalize("NFC", file) hooks.media_files_did_export(c) return media
def _redirectWebExports(path): # catch /_anki references and rewrite them to web export folder targetPath = "_anki/" if path.startswith(targetPath): dirname = os.path.dirname(path) filename = os.path.basename(path) addprefix = None # remap legacy top-level references if dirname == "_anki": base, ext = os.path.splitext(filename) if ext == ".css": addprefix = "css/" elif ext == ".js": if base in ("browsersel", "jquery-ui", "jquery", "plot"): addprefix = "js/vendor/" else: addprefix = "js/" elif dirname == "_anki/js/vendor": base, ext = os.path.splitext(filename) if base == "jquery": base = "jquery.min" addprefix = "js/vendor/" elif base == "jquery-ui": base = "jquery-ui.min" addprefix = "js/vendor/" elif base == "browsersel": base = "css_browser_selector.min" addprefix = "js/vendor/" if addprefix: oldpath = path path = f"{targetPath}{addprefix}{base}{ext}" print(f"legacy {oldpath} remapped to {path}") return _exportFolder, path[len(targetPath):] # catch /_addons references and rewrite them to addons folder targetPath = "_addons/" if path.startswith(targetPath): addonPath = path[len(targetPath):] try: addMgr = aqt.mw.addonManager except AttributeError as error: if devMode: print("_redirectWebExports: %s" % error) return None try: addon, subPath = addonPath.split("/", 1) except ValueError: return None if not addon: return None pattern = addMgr.getWebExports(addon) if not pattern: return None if re.fullmatch(pattern, subPath): return addMgr.addonsFolder(), addonPath print(f"couldn't locate item in add-on folder {path}") return None if not aqt.mw.col: print(f"collection not open, ignore request for {path}") return None path = hooks.media_file_filter(path) return aqt.mw.col.media.dir(), path
if re.fullmatch(pattern, sub_path): return LocalFileRequest(root=manager.addonsFolder(), path=addon_path) return NotFound(message=f"couldn't locate item in add-on folder {path}") def _extract_request(path: str) -> LocalFileRequest | DynamicRequest | NotFound: if internal := _extract_internal_request(path): return internal elif addon := _extract_addon_request(path): return addon if not aqt.mw.col: return NotFound(message=f"collection not open, ignore request for {path}") path = hooks.media_file_filter(path) return LocalFileRequest(root=aqt.mw.col.media.dir(), path=path) def graph_data() -> bytes: args = from_json_bytes(request.data) return aqt.mw.col.graph_data(search=args["search"], days=args["days"]) def graph_preferences() -> bytes: return aqt.mw.col.get_graph_preferences() def set_graph_preferences() -> None: prefs = GraphPreferences() prefs.ParseFromString(request.data)