PyVideoKit-GUI 0.2.0__py3-none-any.whl → 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  from pathlib import Path
2
2
 
3
- from PySide6.QtWidgets import QLabel, QSpinBox, QVBoxLayout
3
+ from PySide6.QtWidgets import QCheckBox, QHBoxLayout, QLabel, QSpinBox, QVBoxLayout
4
4
 
5
5
  from pyvideokit_gui._base_panel import BasePanel
6
6
  from pyvideokit_libs import convert_to_ffv1
@@ -10,11 +10,17 @@ class ConvertPanel(BasePanel):
10
10
  def _build_ui(self, layout: QVBoxLayout):
11
11
  self._input = self._input_row(layout, "Input file")
12
12
 
13
- layout.addWidget(QLabel("FPS"))
13
+ fps_row = QHBoxLayout()
14
+ self._fps_override = QCheckBox("Override FPS")
14
15
  self._fps = QSpinBox()
15
16
  self._fps.setRange(1, 240)
16
17
  self._fps.setValue(60)
17
- layout.addWidget(self._fps)
18
+ self._fps.setEnabled(False)
19
+ self._fps_override.toggled.connect(self._fps.setEnabled)
20
+ fps_row.addWidget(self._fps_override)
21
+ fps_row.addWidget(self._fps)
22
+ fps_row.addStretch()
23
+ layout.addLayout(fps_row)
18
24
 
19
25
  self._output = self._output_row(layout, "Output MKV (optional)")
20
26
 
@@ -24,4 +30,5 @@ class ConvertPanel(BasePanel):
24
30
  self._status.setText("❌ Select an input file.")
25
31
  return
26
32
  output = self._output.text().strip() or None
27
- self._start_worker(convert_to_ffv1, Path(path), fps=self._fps.value(), output=output)
33
+ fps = self._fps.value() if self._fps_override.isChecked() else None
34
+ self._start_worker(convert_to_ffv1, Path(path), fps=fps, output=output)
@@ -1,6 +1,6 @@
1
1
  from pathlib import Path
2
2
 
3
- from PySide6.QtWidgets import QDoubleSpinBox, QHBoxLayout, QLabel, QSpinBox, QVBoxLayout
3
+ from PySide6.QtWidgets import QDoubleSpinBox, QHBoxLayout, QLabel, QVBoxLayout
4
4
 
5
5
  from pyvideokit_gui._base_panel import BasePanel
6
6
  from pyvideokit_libs import fade_video
@@ -30,12 +30,6 @@ class FadePanel(BasePanel):
30
30
  row.addLayout(fo_col)
31
31
  layout.addLayout(row)
32
32
 
33
- layout.addWidget(QLabel("FPS"))
34
- self._fps = QSpinBox()
35
- self._fps.setRange(1, 240)
36
- self._fps.setValue(60)
37
- layout.addWidget(self._fps)
38
-
39
33
  self._output = self._output_row(layout, "Output (optional)")
40
34
 
41
35
  def _run(self):
@@ -54,6 +48,5 @@ class FadePanel(BasePanel):
54
48
  Path(path),
55
49
  fade_in=fi,
56
50
  fade_out=fo,
57
- fps=self._fps.value(),
58
51
  output=output,
59
52
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyVideoKit-GUI
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: GUI for PyVideoKit — FFmpeg-based video processing
5
5
  Author-email: Evilchuck666 <carlos.martinez.medina1992@gmail.com>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -687,3 +687,140 @@ License-File: LICENSE
687
687
  Requires-Dist: PySide6>=6.0
688
688
  Requires-Dist: PyVideoKit-Libs
689
689
  Dynamic: license-file
690
+
691
+ # 🎬 PyVideoKit-GUI
692
+
693
+ ![Python](https://img.shields.io/badge/python-%3E%3D3.10-blue)
694
+ ![License](https://img.shields.io/badge/license-GPLv3-green)
695
+
696
+ Graphical interface for PyVideoKit — FFmpeg-based video processing. Provides the same operations as [PyVideoKit-CLI](../PyVideoKit-CLI) through a PySide6 desktop application with real-time progress tracking.
697
+
698
+ ---
699
+
700
+ ## ✨ Features
701
+
702
+ - 📼 **VHS effect** — retro visual noise, color bleed, and audio degradation
703
+ - ✂️ **Trim** — cut a segment by start/end time with stream copy (no re-encoding)
704
+ - 🔗 **Concatenate** — join multiple videos with drag-and-drop reordering
705
+ - 🎬 **Fade** — fade-in and/or fade-out on an FFV1 master
706
+ - 🔊 **Extract audio** — dump the audio track to uncompressed WAV (PCM 16-bit)
707
+ - 🎞️ **Convert to FFV1** — create a lossless MKV master for editing
708
+ - 📺 **Prepare for YouTube** — encode to ProRes 422 HQ MOV, upscaled to 4K
709
+
710
+ ---
711
+
712
+ ## 📦 Requirements
713
+
714
+ - **Python** ≥ 3.10
715
+ - **PySide6** ≥ 6.0
716
+ - **FFmpeg** and **FFprobe** available in `PATH`
717
+ - **SoX** available in `PATH` (required by VHS effect)
718
+ - **PyVideoKit-Libs** — installed automatically as a dependency
719
+
720
+ ---
721
+
722
+ ## 🔧 Installation
723
+
724
+ ### 🏗️ Arch Linux (AUR)
725
+
726
+ ```bash
727
+ yay -S python-pyvideokit-gui
728
+ ```
729
+
730
+ FFmpeg, FFprobe, SoX, PySide6, and PyVideoKit-Libs are installed automatically as pacman dependencies.
731
+
732
+ ### 🐍 Other systems (pip)
733
+
734
+ ```bash
735
+ pip install PyVideoKit-GUI
736
+ ```
737
+
738
+ Make sure **FFmpeg**, **FFprobe**, and **SoX** are available in your `PATH`.
739
+
740
+ ---
741
+
742
+ ## 🖥️ Desktop Integration
743
+
744
+ Arch Linux users get the launcher entry and icon automatically via the AUR package. For all other systems, create them manually:
745
+
746
+ **1. Save the icon:**
747
+
748
+ ```bash
749
+ mkdir -p ~/.local/share/icons/hicolor/scalable/apps
750
+ cat > ~/.local/share/icons/hicolor/scalable/apps/pvk-gui.svg << 'EOF'
751
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
752
+ <rect x="4" y="14" width="40" height="30" rx="3" fill="#2d3561"/>
753
+ <rect x="10" y="19" width="28" height="20" rx="2" fill="#1a2038"/>
754
+ <polygon points="18,21 18,37 33,29" fill="#ff6b6b"/>
755
+ <rect x="4" y="6" width="40" height="8" rx="2" fill="#ff6b6b"/>
756
+ <rect x="11" y="6" width="6" height="8" fill="#ffffff"/>
757
+ <rect x="23" y="6" width="6" height="8" fill="#ffffff"/>
758
+ <rect x="35" y="6" width="5" height="8" fill="#ffffff"/>
759
+ </svg>
760
+ EOF
761
+ ```
762
+
763
+ **2. Create the `.desktop` entry:**
764
+
765
+ ```bash
766
+ mkdir -p ~/.local/share/applications
767
+ cat > ~/.local/share/applications/pvk-gui.desktop << 'EOF'
768
+ [Desktop Entry]
769
+ Version=1.0
770
+ Type=Application
771
+ Name=PyVideoKit
772
+ GenericName=Video Processing Tool
773
+ Comment=FFmpeg-based video processing GUI
774
+ Exec=pvk-gui
775
+ Icon=pvk-gui
776
+ Categories=AudioVideo;Video;AudioVideoEditing;
777
+ Terminal=false
778
+ Keywords=video;ffmpeg;trim;fade;vhs;youtube;convert;
779
+ EOF
780
+ ```
781
+
782
+ **3. Refresh the icon cache** *(may be required on some desktop environments)*:
783
+
784
+ ```bash
785
+ gtk-update-icon-cache ~/.local/share/icons/hicolor/
786
+ ```
787
+
788
+ PyVideoKit will now appear in your application launcher.
789
+
790
+ ---
791
+
792
+ ## 🚀 Usage
793
+
794
+ ```bash
795
+ pvk-gui
796
+ ```
797
+
798
+ The application opens a tabbed window. Each tab corresponds to one operation:
799
+
800
+ | Tab | Operation |
801
+ |---|---|
802
+ | 🎞️ Convert to FFV1 | Convert any video to a lossless FFV1/MKV master |
803
+ | ✂️ Trim | Cut a segment by start/end time (no re-encoding) |
804
+ | 🔗 Concat | Join multiple videos (drag to reorder) |
805
+ | 🎬 Fade | Add fade-in and/or fade-out |
806
+ | 📼 VHS Effect | Apply retro VHS visual and audio effect |
807
+ | 🔊 Extract Audio | Export audio track to WAV |
808
+ | 📺 YouTube | Encode to ProRes 422 HQ MOV for upload |
809
+
810
+ All operations run in a background thread and display a real-time progress bar.
811
+
812
+ ---
813
+
814
+ ## 🔄 Typical Workflow
815
+
816
+ ```
817
+ 🎞️ Convert to FFV1 → ✂️ Trim / 🎬 Fade / 📼 VHS Effect → 📺 YouTube
818
+ ```
819
+
820
+ > Operations that re-encode (Fade, VHS Effect, YouTube) expect an FFV1 `.mkv` as input.
821
+
822
+ ---
823
+
824
+ ## ⚖️ License
825
+
826
+ This project is licensed under the GPLv3 License — see the [LICENSE](LICENSE) file for details.
@@ -4,15 +4,15 @@ pyvideokit_gui/_main.py,sha256=-iyypcAoThr7Ysa4rvrJ7hYq-cd8h8RqYxL77_lkDqM,331
4
4
  pyvideokit_gui/_main_window.py,sha256=Pls03EJ9CoREhV1eiYavVg9oK0Z8JmXyAUFTGHc0pAU,1032
5
5
  pyvideokit_gui/_worker.py,sha256=1f151Q0F2JzpHFxczl4ex0mP6Vf1h-c2ZQuJL5CGv9o,574
6
6
  pyvideokit_gui/concat_panel.py,sha256=FSg0-FQpALW4fD9rBIxX89DlkVq56h2VJDJnN3kEg7A,1734
7
- pyvideokit_gui/convert_panel.py,sha256=BVs1ltCslHkRtb3MxpUlYGkM4fA11odiEp9nP4mq9hI,880
7
+ pyvideokit_gui/convert_panel.py,sha256=7HaDpuhatgOw1TvTvYNXPWcwwNb4QQwWwYXmMzQYYx4,1224
8
8
  pyvideokit_gui/extract_audio_panel.py,sha256=NADJT0rkNhO61dKDebYZdQhZUvjmW833OHygCU8746Q,665
9
- pyvideokit_gui/fade_panel.py,sha256=kpGfikGDY_VPJqPPlYEjPD4dAAkcWhzJIGYEg_I1zfY,1853
9
+ pyvideokit_gui/fade_panel.py,sha256=8h6T4O-56qs8BMA3SH0tOfbL_2ym3LZ95NzLFUi9vrw,1634
10
10
  pyvideokit_gui/trim_panel.py,sha256=yjdVhwxmfaSp2aflOywWlmW4WwFgtVKfGzqhUxac0UI,1425
11
11
  pyvideokit_gui/vhs_panel.py,sha256=DMCcXIB1_bZD8RvmXujJwb27ODOlF_e8NOL-QEv1wZs,680
12
12
  pyvideokit_gui/youtube_panel.py,sha256=4LogFd2Cc4Fj2xRM5RQsYBW4M9aW_pb-BJrGlBM4Hc0,671
13
- pyvideokit_gui-0.2.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
14
- pyvideokit_gui-0.2.0.dist-info/METADATA,sha256=jPLAHBUTDWR_2kIJ-0DCPeWrnZva37-KjPSCAXJm6Bo,41076
15
- pyvideokit_gui-0.2.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
16
- pyvideokit_gui-0.2.0.dist-info/entry_points.txt,sha256=svm4llnRZU8Y0-2ThznB9avSUowxpuDxZc2rBfedrX0,54
17
- pyvideokit_gui-0.2.0.dist-info/top_level.txt,sha256=SDnrDTKTriy3iVrM4dlbpb2fDHWjnzLK9bZ05nzRl0U,15
18
- pyvideokit_gui-0.2.0.dist-info/RECORD,,
13
+ pyvideokit_gui-0.3.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
14
+ pyvideokit_gui-0.3.0.dist-info/METADATA,sha256=8rpdzn1ag15rh0UD-nTwycx0qx_K9ovkzqJASe3IZV4,45053
15
+ pyvideokit_gui-0.3.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
16
+ pyvideokit_gui-0.3.0.dist-info/entry_points.txt,sha256=svm4llnRZU8Y0-2ThznB9avSUowxpuDxZc2rBfedrX0,54
17
+ pyvideokit_gui-0.3.0.dist-info/top_level.txt,sha256=SDnrDTKTriy3iVrM4dlbpb2fDHWjnzLK9bZ05nzRl0U,15
18
+ pyvideokit_gui-0.3.0.dist-info/RECORD,,