mirror of
https://github.com/xlmnxp/extractify.zip.git
synced 2024-11-23 17:13:12 +03:00
support play videos
This commit is contained in:
parent
1b9d943696
commit
0a5c42cb11
10
app.vue
10
app.vue
@ -18,6 +18,7 @@ let selectedList = ref<any>([]);
|
|||||||
let filesManager = new FilesManager(filesList);
|
let filesManager = new FilesManager(filesList);
|
||||||
let history = new HistoryManager(filesManager);
|
let history = new HistoryManager(filesManager);
|
||||||
|
|
||||||
|
const videoExtensions = ['mp4', 'avi', 'mov', 'mkv'];
|
||||||
let mediaBlobUrl = ref('');
|
let mediaBlobUrl = ref('');
|
||||||
|
|
||||||
watchEffect(async () => {
|
watchEffect(async () => {
|
||||||
@ -65,9 +66,10 @@ watchEffect(async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Experimental feature
|
// Experimental feature
|
||||||
// if(['mp4', 'avi', 'mov', 'mkv'].includes(filesManager.getFile(selectedPath.value)?.extension?.toLowerCase())) {
|
if(videoExtensions.includes(filesManager.getFile(selectedPath.value)?.extension?.toLowerCase())) {
|
||||||
// mediaBlobUrl.value = await filesManager.getFileBlobUrl(selectedPath.value) as string;
|
mediaBlobUrl.value = await filesManager.getFileBlobUrl(selectedPath.value) as string;
|
||||||
// }
|
console.log(mediaBlobUrl.value)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const dragContainer = document.querySelector(".select-area");
|
const dragContainer = document.querySelector(".select-area");
|
||||||
@ -168,7 +170,7 @@ function stepUp(path: string) {
|
|||||||
</v-row>
|
</v-row>
|
||||||
</v-list>
|
</v-list>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="!filesManager.getFile(selectedPath)?.isFolder && ['mp4'].includes(filesManager.getFile(selectedPath)?.extension)">
|
<template v-if="!filesManager.getFile(selectedPath)?.isFolder && videoExtensions.includes(filesManager.getFile(selectedPath)?.extension)">
|
||||||
<MediaVideoPlayer :src="mediaBlobUrl"></MediaVideoPlayer>
|
<MediaVideoPlayer :src="mediaBlobUrl"></MediaVideoPlayer>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="!files.length">
|
<template v-if="!files.length">
|
||||||
|
@ -2,17 +2,20 @@
|
|||||||
import 'vue-plyr/dist/vue-plyr.css';
|
import 'vue-plyr/dist/vue-plyr.css';
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import VuePlyr from 'vue-plyr';
|
import VuePlyr from 'vue-plyr';
|
||||||
|
import mime from 'mime';
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
src: string
|
src: string
|
||||||
}
|
}
|
||||||
|
|
||||||
let { src } = defineProps<Props>();
|
let { src } = defineProps<Props>();
|
||||||
|
let selectedPath = useSelectedPath();
|
||||||
|
|
||||||
|
let videoType = mime.getType(selectedPath.value);
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<VuePlyr>
|
<VuePlyr>
|
||||||
<video controls playsinline>
|
<video controls playsinline :src="src" :type="videoType!" style="height: 84vh;">
|
||||||
<source :src="src" />
|
|
||||||
</video>
|
</video>
|
||||||
</VuePlyr>
|
</VuePlyr>
|
||||||
</template>
|
</template>
|
@ -5,7 +5,7 @@ import SevenZip, { SevenZipModule } from "7z-wasm";
|
|||||||
// @ts-expect-error 7z-wasm have that file but typescript can't find it when query it with url
|
// @ts-expect-error 7z-wasm have that file but typescript can't find it when query it with url
|
||||||
import SevenZipWasm from "7z-wasm/7zz.wasm?url";
|
import SevenZipWasm from "7z-wasm/7zz.wasm?url";
|
||||||
import * as Comlink from "comlink";
|
import * as Comlink from "comlink";
|
||||||
import mime from 'mime-types';
|
import mime from 'mime';
|
||||||
|
|
||||||
export interface iFile {
|
export interface iFile {
|
||||||
name: string;
|
name: string;
|
||||||
@ -148,37 +148,20 @@ export class SevenZipManager {
|
|||||||
if (!this.sevenZip) return;
|
if (!this.sevenZip) return;
|
||||||
file = typeof file === "string" ? JSON.parse(file) : file;
|
file = typeof file === "string" ? JSON.parse(file) : file;
|
||||||
|
|
||||||
// override archive name as file name
|
|
||||||
file.path = '/' + this.archiveName;
|
|
||||||
|
|
||||||
this.sevenZip.FS.chdir("/");
|
this.sevenZip.FS.chdir("/");
|
||||||
console.log("Directory content before extracting", this.sevenZip.FS.readdir("/"));
|
|
||||||
|
|
||||||
// extract file from archive
|
// extract file from archive
|
||||||
this.execute(['x', '-y', this.archiveName, file.path.substring(1)]);
|
this.execute(['x', '-y', this.archiveName, file.path.substring(1)]);
|
||||||
|
|
||||||
console.log("Directory content after extracting", this.sevenZip.FS.readdir('/'));
|
const { node } = this.sevenZip.FS.lookupPath('/');
|
||||||
|
const buffer = node.contents[file.path.substring(1)].contents;
|
||||||
|
|
||||||
console.log({
|
const blob = new Blob([buffer as unknown as Uint8Array], { type: mime.getType(file.extension!) || "application/octet-stream" });
|
||||||
file: file.path.substring(1),
|
const blobUrl = URL.createObjectURL(blob);
|
||||||
p: file.path
|
|
||||||
});
|
|
||||||
|
|
||||||
const stream = this.sevenZip.FS.open(file.path, 'r');
|
// this.sevenZip.FS.unlink(file.path.substring(1));
|
||||||
const stat = this.sevenZip.FS.stat(file.path);
|
|
||||||
const bufferLength = stat.size;
|
|
||||||
const buffer = new Uint8Array(bufferLength);
|
|
||||||
this.sevenZip.FS.read(stream, buffer, 0, bufferLength, 0);
|
|
||||||
this.sevenZip.FS.close(stream);
|
|
||||||
|
|
||||||
console.log({buffer});
|
return blobUrl;
|
||||||
|
|
||||||
// const blob = new Blob([buffer], { type: mime.lookup(file.extension!) || "application/octet-stream" });
|
|
||||||
// const blobUrl = URL.createObjectURL(blob);
|
|
||||||
|
|
||||||
// console.log({blobUrl});
|
|
||||||
|
|
||||||
return "blobUrl";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
33
package-lock.json
generated
33
package-lock.json
generated
@ -6,12 +6,13 @@
|
|||||||
"": {
|
"": {
|
||||||
"name": "nuxt-app",
|
"name": "nuxt-app",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
|
"license": "GPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mdi/font": "^7.2.96",
|
"@mdi/font": "^7.2.96",
|
||||||
"@types/mime-types": "^2.1.1",
|
"@types/mime": "^3.0.1",
|
||||||
"7z-wasm": "^1.0.2",
|
"7z-wasm": "^1.0.2",
|
||||||
"comlink": "^4.4.1",
|
"comlink": "^4.4.1",
|
||||||
"mime-types": "^2.1.35",
|
"mime": "^3.0.0",
|
||||||
"moveable": "^0.47.7",
|
"moveable": "^0.47.7",
|
||||||
"sass": "^1.62.1",
|
"sass": "^1.62.1",
|
||||||
"selecto": "^1.22.3",
|
"selecto": "^1.22.3",
|
||||||
@ -1734,10 +1735,10 @@
|
|||||||
"integrity": "sha512-ddCRDAyVftfnbNvEe77FrOSWMYoFI85xJKITQ5AnvfR330KmEHS48KOmhEncpZadxefh64TO6jk6g2oabxWupg==",
|
"integrity": "sha512-ddCRDAyVftfnbNvEe77FrOSWMYoFI85xJKITQ5AnvfR330KmEHS48KOmhEncpZadxefh64TO6jk6g2oabxWupg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/mime-types": {
|
"node_modules/@types/mime": {
|
||||||
"version": "2.1.1",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
|
||||||
"integrity": "sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw=="
|
"integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "18.16.9",
|
"version": "18.16.9",
|
||||||
@ -5048,7 +5049,6 @@
|
|||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
|
||||||
"integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
|
"integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
|
||||||
"dev": true,
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"mime": "cli.js"
|
"mime": "cli.js"
|
||||||
},
|
},
|
||||||
@ -5056,25 +5056,6 @@
|
|||||||
"node": ">=10.0.0"
|
"node": ">=10.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/mime-db": {
|
|
||||||
"version": "1.52.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
|
||||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/mime-types": {
|
|
||||||
"version": "2.1.35",
|
|
||||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
|
||||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
|
||||||
"dependencies": {
|
|
||||||
"mime-db": "1.52.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/mimic-fn": {
|
"node_modules/mimic-fn": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
|
||||||
|
@ -19,10 +19,10 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mdi/font": "^7.2.96",
|
"@mdi/font": "^7.2.96",
|
||||||
"@types/mime-types": "^2.1.1",
|
"@types/mime": "^3.0.1",
|
||||||
"7z-wasm": "^1.0.2",
|
"7z-wasm": "^1.0.2",
|
||||||
"comlink": "^4.4.1",
|
"comlink": "^4.4.1",
|
||||||
"mime-types": "^2.1.35",
|
"mime": "^3.0.0",
|
||||||
"moveable": "^0.47.7",
|
"moveable": "^0.47.7",
|
||||||
"sass": "^1.62.1",
|
"sass": "^1.62.1",
|
||||||
"selecto": "^1.22.3",
|
"selecto": "^1.22.3",
|
||||||
|
Loading…
Reference in New Issue
Block a user