Mercurial > code > home > repos > video
changeset 38:0aea9e55899b
hack in path router - dirs kind of work; putting a video in the path doesn't
author | drewp@bigasterisk.com |
---|---|
date | Wed, 04 Dec 2024 21:50:16 -0800 |
parents | 7cacfae58430 |
children | b5b29f6ef5cb |
files | package.json pnpm-lock.yaml src/VideoPage.ts src/main.css src/main.ts video.py video_file_store.py |
diffstat | 7 files changed, 256 insertions(+), 307 deletions(-) [+] |
line wrap: on
line diff
--- a/package.json Tue Dec 03 19:28:11 2024 -0800 +++ b/package.json Wed Dec 04 21:50:16 2024 -0800 @@ -6,6 +6,7 @@ "test_forever": "jest --watch" }, "dependencies": { + "@lit-labs/router": "^0.1.3", "@shoelace-style/shoelace": "^2.16.0", "express": "^4.19.2", "lit": "^3.2.0",
--- a/pnpm-lock.yaml Tue Dec 03 19:28:11 2024 -0800 +++ b/pnpm-lock.yaml Wed Dec 04 21:50:16 2024 -0800 @@ -8,6 +8,9 @@ .: dependencies: + '@lit-labs/router': + specifier: ^0.1.3 + version: 0.1.3 '@shoelace-style/shoelace': specifier: ^2.16.0 version: 2.16.0(@types/react@18.3.4) @@ -24,8 +27,8 @@ specifier: ^0.6.6 version: 0.6.6 vite: - specifier: 5.4.2 - version: 5.4.2(@types/node@22.5.0)(stylus@0.63.0) + specifier: 4.3.9 + version: 4.3.9(@types/node@22.5.0)(stylus@0.63.0) devDependencies: '@types/jest': specifier: ^29.5.12 @@ -231,140 +234,134 @@ resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} engines: {node: '>=14'} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + '@esbuild/android-arm64@0.17.19': + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + '@esbuild/android-arm@0.17.19': + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + '@esbuild/android-x64@0.17.19': + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + '@esbuild/darwin-arm64@0.17.19': + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + '@esbuild/darwin-x64@0.17.19': + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + '@esbuild/freebsd-arm64@0.17.19': + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + '@esbuild/freebsd-x64@0.17.19': + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + '@esbuild/linux-arm64@0.17.19': + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + '@esbuild/linux-arm@0.17.19': + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + '@esbuild/linux-ia32@0.17.19': + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + '@esbuild/linux-loong64@0.17.19': + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + '@esbuild/linux-mips64el@0.17.19': + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + '@esbuild/linux-ppc64@0.17.19': + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + '@esbuild/linux-riscv64@0.17.19': + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + '@esbuild/linux-s390x@0.17.19': + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + '@esbuild/linux-x64@0.17.19': + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + '@esbuild/netbsd-x64@0.17.19': + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + '@esbuild/openbsd-x64@0.17.19': + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + '@esbuild/sunos-x64@0.17.19': + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + '@esbuild/win32-arm64@0.17.19': + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + '@esbuild/win32-ia32@0.17.19': + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + '@esbuild/win32-x64@0.17.19': + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -470,6 +467,9 @@ '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@lit-labs/router@0.1.3': + resolution: {integrity: sha512-G+HHo57KsArG58LOI8DLtipFfC9tVV4lGaDy2I8hYQvS2P/pV5wQObrpFYPZswse8D47y8VuHNXNdVPQOVc5MA==} + '@lit-labs/ssr-dom-shim@1.2.1': resolution: {integrity: sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==} @@ -481,86 +481,6 @@ '@lit/reactive-element@2.0.4': resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} - '@rollup/rollup-android-arm-eabi@4.21.1': - resolution: {integrity: sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.21.1': - resolution: {integrity: sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.21.1': - resolution: {integrity: sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.21.1': - resolution: {integrity: sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-linux-arm-gnueabihf@4.21.1': - resolution: {integrity: sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.21.1': - resolution: {integrity: sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.21.1': - resolution: {integrity: sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.21.1': - resolution: {integrity: sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.21.1': - resolution: {integrity: sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.21.1': - resolution: {integrity: sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.21.1': - resolution: {integrity: sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.21.1': - resolution: {integrity: sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.21.1': - resolution: {integrity: sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.21.1': - resolution: {integrity: sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.21.1': - resolution: {integrity: sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.21.1': - resolution: {integrity: sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==} - cpu: [x64] - os: [win32] - '@shoelace-style/animations@1.2.0': resolution: {integrity: sha512-avvo1xxkLbv2dgtabdewBbqcJfV0e0zCwFqkPMnHFGbJbBHorRFfMAHh1NG9ymmXn0jW95ibUVH03E1NYXD6Gw==} @@ -592,9 +512,6 @@ '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -1449,8 +1366,8 @@ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} hasBin: true @@ -1606,7 +1523,7 @@ resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} engines: {node: '>= 4.0'} os: [darwin] - deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 + deprecated: Upgrade to fsevents v2 to mitigate potential security issues fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -2659,9 +2576,9 @@ ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - rollup@4.21.1: - resolution: {integrity: sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true safe-buffer@5.1.2: @@ -2723,7 +2640,6 @@ shaka-player@4.8.20: resolution: {integrity: sha512-o2eshIikkyzGYKRsB9zZKzZ47dcG+luzNQgHvMNKa43PtO/G6qp3PK/i08wukyCzTA2rTw2vHv9DN8WVT+RYWw==} - engines: {node: '>=14'} shaka-video-element@0.6.6: resolution: {integrity: sha512-jbKKNJX/+eg6b63X1bVeAUKedSdP+Hyk0p1QRXFSLVvB26DHsClZ7xrLYCWm/zbLHRlZHylh8tS3pGOGLdOloQ==} @@ -3083,16 +2999,14 @@ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite@5.4.2: - resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@4.3.9: + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 + '@types/node': '>= 14' less: '*' - lightningcss: ^1.21.0 sass: '*' - sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -3101,12 +3015,8 @@ optional: true less: optional: true - lightningcss: - optional: true sass: optional: true - sass-embedded: - optional: true stylus: optional: true sugarss: @@ -3371,73 +3281,70 @@ '@ctrl/tinycolor@4.1.0': {} - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/android-arm64@0.17.19': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm@0.17.19': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-x64@0.17.19': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/darwin-arm64@0.17.19': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-x64@0.17.19': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/freebsd-arm64@0.17.19': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-x64@0.17.19': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/linux-arm64@0.17.19': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm@0.17.19': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-ia32@0.17.19': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-loong64@0.17.19': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-mips64el@0.17.19': optional: true - '@esbuild/linux-mips64el@0.21.5': - optional: true - - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-ppc64@0.17.19': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-riscv64@0.17.19': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-s390x@0.17.19': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/linux-x64@0.17.19': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/netbsd-x64@0.17.19': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/openbsd-x64@0.17.19': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/sunos-x64@0.17.19': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/win32-arm64@0.17.19': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/win32-ia32@0.17.19': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-x64@0.17.19': optional: true '@floating-ui/core@1.6.7': @@ -3640,6 +3547,10 @@ '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@lit-labs/router@0.1.3': + dependencies: + lit: 3.2.0 + '@lit-labs/ssr-dom-shim@1.2.1': {} '@lit/react@1.0.5(@types/react@18.3.4)': @@ -3650,54 +3561,6 @@ dependencies: '@lit-labs/ssr-dom-shim': 1.2.1 - '@rollup/rollup-android-arm-eabi@4.21.1': - optional: true - - '@rollup/rollup-android-arm64@4.21.1': - optional: true - - '@rollup/rollup-darwin-arm64@4.21.1': - optional: true - - '@rollup/rollup-darwin-x64@4.21.1': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.21.1': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.21.1': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.21.1': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.21.1': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.21.1': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.21.1': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.21.1': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.21.1': - optional: true - - '@rollup/rollup-linux-x64-musl@4.21.1': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.21.1': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.21.1': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.21.1': - optional: true - '@shoelace-style/animations@1.2.0': {} '@shoelace-style/localize@3.2.1': {} @@ -3746,8 +3609,6 @@ dependencies: '@babel/types': 7.25.4 - '@types/estree@1.0.5': {} - '@types/graceful-fs@4.1.9': dependencies: '@types/node': 22.5.0 @@ -5095,31 +4956,30 @@ es-errors@1.3.0: {} - esbuild@0.21.5: + esbuild@0.17.19: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 escalade@3.1.2: {} @@ -6639,26 +6499,8 @@ hash-base: 3.1.0 inherits: 2.0.4 - rollup@4.21.1: - dependencies: - '@types/estree': 1.0.5 + rollup@3.29.5: optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.21.1 - '@rollup/rollup-android-arm64': 4.21.1 - '@rollup/rollup-darwin-arm64': 4.21.1 - '@rollup/rollup-darwin-x64': 4.21.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.21.1 - '@rollup/rollup-linux-arm-musleabihf': 4.21.1 - '@rollup/rollup-linux-arm64-gnu': 4.21.1 - '@rollup/rollup-linux-arm64-musl': 4.21.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.21.1 - '@rollup/rollup-linux-riscv64-gnu': 4.21.1 - '@rollup/rollup-linux-s390x-gnu': 4.21.1 - '@rollup/rollup-linux-x64-gnu': 4.21.1 - '@rollup/rollup-linux-x64-musl': 4.21.1 - '@rollup/rollup-win32-arm64-msvc': 4.21.1 - '@rollup/rollup-win32-ia32-msvc': 4.21.1 - '@rollup/rollup-win32-x64-msvc': 4.21.1 fsevents: 2.3.3 safe-buffer@5.1.2: {} @@ -7113,11 +6955,11 @@ vary@1.1.2: {} - vite@5.4.2(@types/node@22.5.0)(stylus@0.63.0): - dependencies: - esbuild: 0.21.5 + vite@4.3.9(@types/node@22.5.0)(stylus@0.63.0): + dependencies: + esbuild: 0.17.19 postcss: 8.4.41 - rollup: 4.21.1 + rollup: 3.29.5 optionalDependencies: '@types/node': 22.5.0 fsevents: 2.3.3
--- a/src/VideoPage.ts Tue Dec 03 19:28:11 2024 -0800 +++ b/src/VideoPage.ts Wed Dec 04 21:50:16 2024 -0800 @@ -5,7 +5,7 @@ export { SlProgressBar } from "@shoelace-style/shoelace"; export { PagePlayer } from "./PagePlayer"; export { VideoSection } from "./VideoSection"; - +import { Routes, Router } from "@lit-labs/router"; interface VideoFile { webRelPath: string; @@ -24,6 +24,62 @@ @customElement("video-page") export class VideoPage extends LitElement { + static styles = [unsafeCSS(maincss)]; + private _router = new Router( + this, + [ + { + path: "/video/*", + enter: async (params: { [key: string]: string | undefined }): Promise<boolean> => { + const webRelPath = '/' + params[0]!; + console.log("enter", webRelPath); + // this.updatePathSegs(subdir); + const resp = await (await fetch("/video/api/videos?" + subdirQuery(webRelPath))).json(); + console.log("resp", resp); + // 404 page goes here + this.resp = resp; + + + let vid: string | null; + let dir: string; + + if (webRelPath.endsWith("/")) { + vid = null; + dir = webRelPath; + } else { + vid = webRelPath; + dir = webRelPath.slice(0, webRelPath.lastIndexOf("/")); + } + this.showVid = vid + this.linkx = (wrp: string) => { return '/video/' + wrp; }; + + return true; + }, + render: (p: { [key: string]: string | undefined }) => { + return html`<video-page2 .link=${this.linkx.bind(this)} .showVid=${this.showVid} .resp=${this.resp}></video-page2>`; + }, + }, + ], + {} + ); + + render() { + const requestedPath = this._router.params[0]; + return html` + <header><img src="${this._router.link("/video/logo1.png")}" title="JelloBello" /> <span class="breadcrumbs2">TOP > ${requestedPath}</span></header> + <main> + ${this._router.outlet()} + </main> + <footer>foot</footer> + `; + } +} + +@customElement("video-page2") +export class VideoPage2 extends LitElement { + @property() showVid?: string; + @property() resp?: any; + @property() link!: (s: string) => string; videos: VideoFile[]; subdirs: Subdir[]; @property() pathSegs: { label: string; subdir: string }[]; @@ -32,8 +88,8 @@ this.videos = []; this.subdirs = []; this.pathSegs = []; - this.loadVideos(); } + protected firstUpdated(_changedProperties: PropertyValues): void { document.addEventListener("keydown", (e) => { if (e.key == "Escape") { @@ -41,6 +97,20 @@ } }); } + protected update(changedProperties: PropertyValues<this>): void { + const resp = changedProperties.has('resp'); + if (resp) { + this.videos = (this.resp.videos || []) as VideoFile[]; + this.subdirs = (this.resp.subdirs || []) as Subdir[]; + console.log('set', this.videos, this.subdirs); + // if (this.showVid) { + // this.openPlayer(); + // } else { + // this.closePlayer(); + // } + } + super.update(changedProperties); + } updatePathSegs(subdir: string) { this.pathSegs = [{ label: "TOP", subdir: "/" }]; if (subdir != "/") { @@ -53,25 +123,20 @@ } } } - async loadVideos() { - const u = new URL(location.href); - const subdir = u.searchParams.get("subdir") || "/"; - this.updatePathSegs(subdir); - const resp = await (await fetch("api/videos?" + subdirQuery(subdir))).json(); - this.videos = resp.videos as VideoFile[]; - this.subdirs = resp.subdirs as Subdir[]; - this.requestUpdate(); - } + + static styles = [ unsafeCSS(maincss), css` - + :host { + display: block; + } .listing a { font-size: 20px; text-transform: uppercase; text-underline-offset: 10px; } - + .subdir { vertical-align: top; color: white; @@ -92,34 +157,38 @@ ]; render() { const thumbSrc = (v: VideoFile) => { - return '/video/api/thumbnail?webRelPath='+encodeURIComponent(v.webRelPath); + return "/video/api/thumbnail?webRelPath=" + encodeURIComponent(v.webRelPath); }; return html` <sl-breadcrumb> ${this.pathSegs.map( - (seg, i) => - html`<sl-breadcrumb-item> - <a href="./?${subdirQuery(seg.subdir)}"> - ${i == 0 ? html`<sl-icon name="house"></sl-icon>`:''} - ${seg.label} - </a></sl-breadcrumb-item>`)} + (seg, i) => + html`<sl-breadcrumb-item> + <a href="./?${subdirQuery(seg.subdir)}"> ${i == 0 ? html`<sl-icon name="house"></sl-icon>` : ""} ${seg.label} </a></sl-breadcrumb-item + >` + )} </sl-breadcrumb> <div class="listing"> - ${this.subdirs.map((s) => html`<div class="subdir"><a href="${"./?" + subdirQuery(s.path)}">${s.label}</a></div>`)} - ${this.videos.map( - (v) => html`<video-section @playVideo=${this.playVideo} thumbRelPath=${thumbSrc(v)} title="${v.label}" manifest="/video/files/${v.webDataPath}"></video-section>` - )} + ${this.subdirs.map((s) => html`<div class="subdir"><a href="${this.link(s.path) + "/"}">${s.label}</a></div>`)} + ${this.videos.map( + (v) => + html`<video-section + @playVideo=${this.playVideo} + thumbRelPath=${thumbSrc(v)} + title="${v.label}" + manifest="/video/files/${v.webDataPath}" + ></video-section>` + )} </div> <p><a href="ingest/">Add new videos...</a></p> - <div id="scrim" @click=${this.closePlayer}></div> <page-player manifest=""></page-player> `; } - escapeALittle(fileUri: string) : string { - return fileUri.replace('#', encodeURIComponent('#')); + escapeALittle(fileUri: string): string { + return fileUri.replace("#", encodeURIComponent("#")); } playVideo(ev: CustomEvent) { const player = this.shadowRoot!.querySelector("page-player")! as PagePlayer;
--- a/src/main.css Tue Dec 03 19:28:11 2024 -0800 +++ b/src/main.css Wed Dec 04 21:50:16 2024 -0800 @@ -6,6 +6,16 @@ margin: 0; height: 100vh; background: radial-gradient(ellipse at center, #162c4a 0%, #0c2236 36%, #020f16 100%) !important; + color: white; +} + +header { + background: rgb(247 112 31 / 44%); +} + +header img { + height: 50px; + vertical-align: middle; } h1,
--- a/src/main.ts Tue Dec 03 19:28:11 2024 -0800 +++ b/src/main.ts Wed Dec 04 21:50:16 2024 -0800 @@ -2,4 +2,4 @@ import { setBasePath } from "@shoelace-style/shoelace"; import '@shoelace-style/shoelace/dist/themes/dark.css'; -setBasePath("@fs/opt/node_modules/@shoelace-style/shoelace/dist"); \ No newline at end of file +setBasePath("/video/@fs/opt/node_modules/@shoelace-style/shoelace/dist"); \ No newline at end of file
--- a/video.py Tue Dec 03 19:28:11 2024 -0800 +++ b/video.py Wed Dec 04 21:50:16 2024 -0800 @@ -30,7 +30,20 @@ async def videos(req: Request) -> JSONResponse: - subdir = req.query_params.get('subdir', '/') # danger user input + subdir = req.query_params.get('subdir', '/') + if not subdir.endswith('/'): + # raise ValueError(f'not a dir {subdir=}') + # ok we'll list the parent dir underneath + subdir = '/'.join(subdir.split('/')[:-1]) # todo move to FE + else: + subdir = subdir[:-1] + if subdir=="": + subdir = "./" + if not (subdir.startswith('/') or subdir=='./'): + raise ValueError(f'not a dir {subdir=}') + subdir = subdir[1:] + log.debug(f'videos request corrected to: {subdir=}') + vfInDir = store.findInDir(subdir) return JSONResponse({ "videos": [{
--- a/video_file_store.py Tue Dec 03 19:28:11 2024 -0800 +++ b/video_file_store.py Wed Dec 04 21:50:16 2024 -0800 @@ -4,6 +4,7 @@ import os from dataclasses import dataclass from pathlib import Path +import re from typing import Iterable, Iterator import pymongo.collection @@ -20,26 +21,39 @@ # perms, playlists, req by/when +def numSort(docs: list): + + def pad(match): + return match.group(0).zfill(10) + + docs.sort(key=lambda doc: re.sub(r"\d+", pad, doc['label'])) + @dataclass class VideoFileStore: fs: pymongo.collection.Collection def findInDir(self, subdir: str) -> Iterable[VideoFile]: + log.warning(f'findInDir: {subdir=}') webRelParent = '.' if subdir == '/' else subdir - for doc in self.fs.find({ + docs = list(self.fs.find({ 'type': 'file', 'webRelParent': webRelParent - }, sort=[('label', 1)]): + })) + numSort(docs) + for doc in docs: yield VideoFile(Path(doc['diskPath']), doc['webRelPath'], doc['webDataPath'], doc['label']) def findSubdirs(self, subdir: str) -> Iterable: - for doc in self.fs.find({ + docs = list(self.fs.find({ 'type': 'dir', 'webRelParent': '.' if subdir == '/' else subdir - }, sort=[('label', 1)]): + })) + numSort(docs) + + for doc in docs: yield { 'label': doc['label'], 'path': doc['webRelPath'],