From 5c808c579adf2db0f863403b939c6ee199e3a2ad Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Wed, 7 Jan 2026 17:34:32 -0600 Subject: [PATCH] Updated yt_dlp version; added extremly basic dumb cache setup in thumbnailer; moved build and script as well as deb folder to build --- debs/build.sh | 34 - debs/chown_all.sh | 6 - debs/solarfm-0-0-1-x64/DEBIAN/control | 8 - debs/solarfm-0-0-1-x64/DEBIAN/postrm | 12 - debs/solarfm-0-0-1-x64/bin/solarfm | 17 - debs/solarfm-0-0-1-x64/opt/DELETE_ME.txt | 1 - .../usr/share/applications/solarfm.desktop | 11 - .../usr/share/doc/solarfm/copyright | 22 - .../usr/share/solarfm/Main_Window.glade | 968 ----------- .../usr/share/solarfm/contexct_menu.json | 19 - .../usr/share/solarfm/fileicons/3g2.png | Bin 3780 -> 0 bytes .../usr/share/solarfm/fileicons/3gp.png | Bin 3771 -> 0 bytes .../usr/share/solarfm/fileicons/ai.png | Bin 3547 -> 0 bytes .../usr/share/solarfm/fileicons/air.png | Bin 3170 -> 0 bytes .../usr/share/solarfm/fileicons/asf.png | Bin 3126 -> 0 bytes .../usr/share/solarfm/fileicons/avi.png | Bin 3208 -> 0 bytes .../usr/share/solarfm/fileicons/bib.png | Bin 3531 -> 0 bytes .../usr/share/solarfm/fileicons/cls.png | Bin 1763 -> 0 bytes .../usr/share/solarfm/fileicons/csv.png | Bin 4519 -> 0 bytes .../usr/share/solarfm/fileicons/deb.png | Bin 2915 -> 0 bytes .../usr/share/solarfm/fileicons/djvu.png | Bin 4973 -> 0 bytes .../usr/share/solarfm/fileicons/dmg.png | Bin 2523 -> 0 bytes .../usr/share/solarfm/fileicons/doc.png | Bin 1536 -> 0 bytes .../usr/share/solarfm/fileicons/docx.png | Bin 4144 -> 0 bytes .../usr/share/solarfm/fileicons/dwf.png | Bin 4319 -> 0 bytes .../usr/share/solarfm/fileicons/dwg.png | Bin 3107 -> 0 bytes .../usr/share/solarfm/fileicons/eps.png | Bin 2299 -> 0 bytes .../usr/share/solarfm/fileicons/epub.png | Bin 2772 -> 0 bytes .../usr/share/solarfm/fileicons/exe.png | Bin 2651 -> 0 bytes .../usr/share/solarfm/fileicons/f.png | Bin 2050 -> 0 bytes .../usr/share/solarfm/fileicons/f77.png | Bin 2187 -> 0 bytes .../usr/share/solarfm/fileicons/f90.png | Bin 2212 -> 0 bytes .../usr/share/solarfm/fileicons/flac.png | Bin 1121 -> 0 bytes .../usr/share/solarfm/fileicons/flv.png | Bin 3181 -> 0 bytes .../usr/share/solarfm/fileicons/gif.png | Bin 2802 -> 0 bytes .../usr/share/solarfm/fileicons/gz.png | Bin 1480 -> 0 bytes .../usr/share/solarfm/fileicons/ico.png | Bin 3130 -> 0 bytes .../usr/share/solarfm/fileicons/indd.png | Bin 4031 -> 0 bytes .../usr/share/solarfm/fileicons/iso.png | Bin 2704 -> 0 bytes .../usr/share/solarfm/fileicons/jpeg.png | Bin 3319 -> 0 bytes .../usr/share/solarfm/fileicons/jpg.png | Bin 3319 -> 0 bytes .../usr/share/solarfm/fileicons/log.png | Bin 2486 -> 0 bytes .../usr/share/solarfm/fileicons/m4a.png | Bin 3806 -> 0 bytes .../usr/share/solarfm/fileicons/m4v.png | Bin 3178 -> 0 bytes .../usr/share/solarfm/fileicons/midi.png | Bin 3511 -> 0 bytes .../usr/share/solarfm/fileicons/mkv.png | Bin 1915 -> 0 bytes .../usr/share/solarfm/fileicons/mov.png | Bin 3197 -> 0 bytes .../usr/share/solarfm/fileicons/mp3.png | Bin 4064 -> 0 bytes .../usr/share/solarfm/fileicons/mp4.png | Bin 3156 -> 0 bytes .../usr/share/solarfm/fileicons/mpeg.png | Bin 3195 -> 0 bytes .../usr/share/solarfm/fileicons/mpg.png | Bin 3195 -> 0 bytes .../usr/share/solarfm/fileicons/msi.png | Bin 2655 -> 0 bytes .../usr/share/solarfm/fileicons/odp.png | Bin 2895 -> 0 bytes .../usr/share/solarfm/fileicons/ods.png | Bin 2435 -> 0 bytes .../usr/share/solarfm/fileicons/odt.png | Bin 3701 -> 0 bytes .../usr/share/solarfm/fileicons/oga.png | Bin 3163 -> 0 bytes .../usr/share/solarfm/fileicons/ogg.png | Bin 5100 -> 0 bytes .../usr/share/solarfm/fileicons/ogv.png | Bin 5921 -> 0 bytes .../usr/share/solarfm/fileicons/pdf.png | Bin 3408 -> 0 bytes .../usr/share/solarfm/fileicons/png.png | Bin 3014 -> 0 bytes .../usr/share/solarfm/fileicons/pps.png | Bin 3178 -> 0 bytes .../usr/share/solarfm/fileicons/ppsx.png | Bin 3306 -> 0 bytes .../usr/share/solarfm/fileicons/ppt.png | Bin 3390 -> 0 bytes .../usr/share/solarfm/fileicons/pptx.png | Bin 3942 -> 0 bytes .../usr/share/solarfm/fileicons/psd.png | Bin 3898 -> 0 bytes .../usr/share/solarfm/fileicons/pub.png | Bin 3822 -> 0 bytes .../usr/share/solarfm/fileicons/py.png | Bin 2431 -> 0 bytes .../usr/share/solarfm/fileicons/qt.png | Bin 3731 -> 0 bytes .../usr/share/solarfm/fileicons/ra.png | Bin 3141 -> 0 bytes .../usr/share/solarfm/fileicons/ram.png | Bin 3269 -> 0 bytes .../usr/share/solarfm/fileicons/rar.png | Bin 3168 -> 0 bytes .../usr/share/solarfm/fileicons/rm.png | Bin 3185 -> 0 bytes .../usr/share/solarfm/fileicons/rpm.png | Bin 3278 -> 0 bytes .../usr/share/solarfm/fileicons/rtf.png | Bin 2400 -> 0 bytes .../usr/share/solarfm/fileicons/rv.png | Bin 3136 -> 0 bytes .../usr/share/solarfm/fileicons/skp.png | Bin 3208 -> 0 bytes .../usr/share/solarfm/fileicons/spx.png | Bin 1283 -> 0 bytes .../usr/share/solarfm/fileicons/sql.png | Bin 1883 -> 0 bytes .../usr/share/solarfm/fileicons/sty.png | Bin 1301 -> 0 bytes .../usr/share/solarfm/fileicons/tar.png | Bin 2781 -> 0 bytes .../usr/share/solarfm/fileicons/tex.png | Bin 2936 -> 0 bytes .../usr/share/solarfm/fileicons/tgz.png | Bin 1757 -> 0 bytes .../usr/share/solarfm/fileicons/tiff.png | Bin 3127 -> 0 bytes .../usr/share/solarfm/fileicons/ttf.png | Bin 2699 -> 0 bytes .../usr/share/solarfm/fileicons/txt.png | Bin 1734 -> 0 bytes .../usr/share/solarfm/fileicons/vob.png | Bin 3184 -> 0 bytes .../usr/share/solarfm/fileicons/wav.png | Bin 3169 -> 0 bytes .../usr/share/solarfm/fileicons/wmv.png | Bin 3205 -> 0 bytes .../usr/share/solarfm/fileicons/xls.png | Bin 4439 -> 0 bytes .../usr/share/solarfm/fileicons/xlsx.png | Bin 4560 -> 0 bytes .../usr/share/solarfm/fileicons/xml.png | Bin 1596 -> 0 bytes .../usr/share/solarfm/fileicons/xpi.png | Bin 4283 -> 0 bytes .../usr/share/solarfm/fileicons/zip.png | Bin 2099 -> 0 bytes .../usr/share/solarfm/icons/archive.png | Bin 1670 -> 0 bytes .../usr/share/solarfm/icons/audio.png | Bin 1544 -> 0 bytes .../usr/share/solarfm/icons/bin.png | Bin 858 -> 0 bytes .../usr/share/solarfm/icons/dir.png | Bin 850 -> 0 bytes .../usr/share/solarfm/icons/doc.png | Bin 702 -> 0 bytes .../usr/share/solarfm/icons/pdf.png | Bin 925 -> 0 bytes .../usr/share/solarfm/icons/presentation.png | Bin 882 -> 0 bytes .../usr/share/solarfm/icons/solarfm-64x64.png | Bin 16172 -> 0 bytes .../usr/share/solarfm/icons/solarfm.png | Bin 16172 -> 0 bytes .../usr/share/solarfm/icons/spreadsheet.png | Bin 707 -> 0 bytes .../usr/share/solarfm/icons/text.png | Bin 798 -> 0 bytes .../usr/share/solarfm/icons/trash.png | Bin 989 -> 0 bytes .../usr/share/solarfm/icons/video.png | Bin 1313 -> 0 bytes .../usr/share/solarfm/icons/web.png | Bin 1845 -> 0 bytes .../usr/share/solarfm/key-bindings.json | 23 - .../usr/share/solarfm/settings.json | 45 - .../usr/share/solarfm/stylesheet.css | 165 -- .../share/solarfm/ui_widgets/about_ui.glade | 390 ----- .../solarfm/ui_widgets/appchooser_ui.glade | 75 - .../ui_widgets/bottom_status_info_ui.glade | 50 - .../solarfm/ui_widgets/file_exists_ui.glade | 337 ---- .../solarfm/ui_widgets/new_file_ui.glade | 186 --- .../share/solarfm/ui_widgets/rename_ui.glade | 241 --- .../solarfm/ui_widgets/save_load_ui.glade | 65 - plugins/thumbnailer/icons/icon.py | 8 +- plugins/youtube_download/yt_dlp/YoutubeDL.py | 69 +- plugins/youtube_download/yt_dlp/__init__.py | 23 + .../yt_dlp/__pyinstaller/hook-yt_dlp.py | 1 + plugins/youtube_download/yt_dlp/cookies.py | 15 +- .../yt_dlp/dependencies/__init__.py | 6 + .../yt_dlp/downloader/common.py | 3 +- .../yt_dlp/downloader/external.py | 88 +- .../yt_dlp/extractor/_extractors.py | 51 +- .../youtube_download/yt_dlp/extractor/abc.py | 2 + .../yt_dlp/extractor/agalega.py | 91 ++ .../yt_dlp/extractor/alibaba.py | 42 + .../yt_dlp/extractor/archiveorg.py | 236 ++- .../youtube_download/yt_dlp/extractor/ard.py | 164 +- .../yt_dlp/extractor/bandcamp.py | 81 +- .../youtube_download/yt_dlp/extractor/bigo.py | 4 +- .../yt_dlp/extractor/bitmovin.py | 74 + .../yt_dlp/extractor/bunnycdn.py | 23 +- .../youtube_download/yt_dlp/extractor/cda.py | 59 +- .../yt_dlp/extractor/common.py | 1 + .../yt_dlp/extractor/croatianfilm.py | 79 + .../yt_dlp/extractor/digiteka.py | 95 +- .../yt_dlp/extractor/dplay.py | 94 +- .../yt_dlp/extractor/dropbox.py | 5 +- .../yt_dlp/extractor/facebook.py | 64 - .../youtube_download/yt_dlp/extractor/fc2.py | 4 + .../yt_dlp/extractor/filmarchiv.py | 52 + .../yt_dlp/extractor/firsttv.py | 35 +- .../yt_dlp/extractor/floatplane.py | 66 +- .../yt_dlp/extractor/frontro.py | 164 ++ .../yt_dlp/extractor/generic.py | 14 +- .../yt_dlp/extractor/gofile.py | 12 +- .../yt_dlp/extractor/googledrive.py | 257 ++- .../yt_dlp/extractor/goplay.py | 12 +- .../yt_dlp/extractor/hotstar.py | 2 +- .../yt_dlp/extractor/iqiyi.py | 184 --- .../youtube_download/yt_dlp/extractor/jtbc.py | 2 +- .../youtube_download/yt_dlp/extractor/kika.py | 90 +- .../youtube_download/yt_dlp/extractor/loom.py | 66 +- .../yt_dlp/extractor/manoto.py | 128 -- .../youtube_download/yt_dlp/extractor/mave.py | 155 +- .../yt_dlp/extractor/medaltv.py | 170 +- .../youtube_download/yt_dlp/extractor/mux.py | 92 ++ .../yt_dlp/extractor/nascar.py | 60 + .../youtube_download/yt_dlp/extractor/nbc.py | 14 +- .../yt_dlp/extractor/nebula.py | 61 + .../yt_dlp/extractor/netapp.py | 79 + .../yt_dlp/extractor/neteasemusic.py | 5 +- .../yt_dlp/extractor/netzkino.py | 103 +- .../yt_dlp/extractor/nextmedia.py | 238 --- .../youtube_download/yt_dlp/extractor/nhk.py | 303 ++-- .../yt_dlp/extractor/nowcanal.py | 37 + .../yt_dlp/extractor/ntvru.py | 151 +- .../yt_dlp/extractor/pandatv.py | 83 + .../yt_dlp/extractor/parti.py | 36 +- .../yt_dlp/extractor/patreon.py | 3 +- .../yt_dlp/extractor/picarto.py | 6 +- .../yt_dlp/extractor/pornhub.py | 23 +- .../yt_dlp/extractor/rinsefm.py | 39 +- .../youtube_download/yt_dlp/extractor/s4c.py | 13 +- .../youtube_download/yt_dlp/extractor/scte.py | 137 -- .../yt_dlp/extractor/soundcloud.py | 8 +- .../yt_dlp/extractor/sportdeutschland.py | 36 +- .../yt_dlp/extractor/sproutvideo.py | 4 +- .../yt_dlp/extractor/tarangplus.py | 243 +++ .../yt_dlp/extractor/telecinco.py | 52 +- .../yt_dlp/extractor/thisoldhouse.py | 70 +- .../yt_dlp/extractor/tiktok.py | 18 + .../yt_dlp/extractor/tubetugraz.py | 12 +- .../yt_dlp/extractor/tubitv.py | 11 +- .../yt_dlp/extractor/tumblr.py | 14 + .../yt_dlp/extractor/tv5unis.py | 130 +- .../yt_dlp/extractor/twitch.py | 52 +- .../yt_dlp/extractor/twitter.py | 231 +-- .../yt_dlp/extractor/urplay.py | 51 +- .../yt_dlp/extractor/wistia.py | 14 +- .../yt_dlp/extractor/xhamster.py | 82 +- .../yt_dlp/extractor/yahoo.py | 167 +- .../yt_dlp/extractor/yfanefa.py | 67 + .../yt_dlp/extractor/youtube/_base.py | 39 +- .../yt_dlp/extractor/youtube/_tab.py | 12 +- .../yt_dlp/extractor/youtube/_video.py | 1416 +++++++++-------- .../yt_dlp/extractor/youtube/jsc/README.md | 132 ++ .../yt_dlp/extractor/youtube/jsc/__init__.py | 5 + .../youtube/jsc/_builtin/__init__.py | 0 .../extractor/youtube/jsc/_builtin/bun.py | 150 ++ .../extractor/youtube/jsc/_builtin/deno.py | 131 ++ .../extractor/youtube/jsc/_builtin/ejs.py | 328 ++++ .../extractor/youtube/jsc/_builtin/node.py | 70 + .../extractor/youtube/jsc/_builtin/quickjs.py | 59 + .../youtube/jsc/_builtin/vendor/__init__.py | 17 + .../youtube/jsc/_builtin/vendor/_info.py | 11 + .../jsc/_builtin/vendor/yt.solver.bun.lib.js | 9 + .../jsc/_builtin/vendor/yt.solver.core.js | 550 +++++++ .../jsc/_builtin/vendor/yt.solver.deno.lib.js | 9 + .../yt_dlp/extractor/youtube/jsc/_director.py | 287 ++++ .../yt_dlp/extractor/youtube/jsc/_registry.py | 4 + .../yt_dlp/extractor/youtube/jsc/provider.py | 161 ++ .../yt_dlp/extractor/youtube/pot/_director.py | 11 +- .../yt_dlp/extractor/youtube/pot/_provider.py | 25 +- .../youtube_download/yt_dlp/extractor/zdf.py | 262 +-- .../youtube_download/yt_dlp/extractor/zoom.py | 8 +- plugins/youtube_download/yt_dlp/globals.py | 9 + .../yt_dlp/networking/_curlcffi.py | 5 +- .../yt_dlp/networking/_requests.py | 23 +- .../yt_dlp/networking/_urllib.py | 22 +- .../yt_dlp/networking/common.py | 8 +- plugins/youtube_download/yt_dlp/options.py | 48 +- .../yt_dlp/postprocessor/ffmpeg.py | 9 +- .../yt_dlp/postprocessor/metadataparser.py | 3 + .../yt_dlp/postprocessor/sponsorblock.py | 1 + plugins/youtube_download/yt_dlp/update.py | 17 +- .../yt_dlp/utils/_jsruntime.py | 145 ++ .../youtube_download/yt_dlp/utils/_utils.py | 41 +- .../yt_dlp/utils/networking.py | 2 +- plugins/youtube_download/yt_dlp/version.py | 6 +- src/create-binary.sh | 17 - src/create-standalone.sh | 17 - src/create-stubs.sh | 16 - src/debugger.sh | 18 - src/setup.py | 11 - src/solarfm.toml | 3 - .../core/widgets/files_view/grid_mixin.py | 2 + .../core/widgets/files_view/tab_mixin.py | 14 +- src/solarfm/core/widgets/icon_grid_widget.py | 9 + src/solarfm/core/widgets/tab_header_widget.py | 1 + 243 files changed, 6397 insertions(+), 5957 deletions(-) delete mode 100644 debs/build.sh delete mode 100644 debs/chown_all.sh delete mode 100644 debs/solarfm-0-0-1-x64/DEBIAN/control delete mode 100755 debs/solarfm-0-0-1-x64/DEBIAN/postrm delete mode 100755 debs/solarfm-0-0-1-x64/bin/solarfm delete mode 100644 debs/solarfm-0-0-1-x64/opt/DELETE_ME.txt delete mode 100755 debs/solarfm-0-0-1-x64/usr/share/applications/solarfm.desktop delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/doc/solarfm/copyright delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/Main_Window.glade delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/contexct_menu.json delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/3g2.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/3gp.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ai.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/air.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/asf.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/avi.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/bib.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/cls.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/csv.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/deb.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/djvu.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/dmg.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/doc.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/docx.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/dwf.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/dwg.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/eps.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/epub.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/exe.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/f.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/f77.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/f90.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/flac.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/flv.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/gif.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/gz.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ico.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/indd.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/iso.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/jpeg.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/jpg.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/log.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/m4a.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/m4v.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/midi.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/mkv.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/mov.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/mp3.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/mp4.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/mpeg.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/mpg.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/msi.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/odp.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ods.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/odt.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/oga.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ogg.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ogv.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/pdf.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/png.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/pps.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ppsx.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ppt.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/pptx.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/psd.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/pub.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/py.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/qt.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ra.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ram.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/rar.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/rm.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/rpm.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/rtf.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/rv.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/skp.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/spx.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/sql.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/sty.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/tar.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/tex.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/tgz.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/tiff.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ttf.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/txt.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/vob.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/wav.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/wmv.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/xls.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/xlsx.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/xml.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/xpi.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/zip.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/archive.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/audio.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/bin.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/dir.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/doc.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/pdf.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/presentation.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/solarfm-64x64.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/solarfm.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/spreadsheet.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/text.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/trash.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/video.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/web.png delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/key-bindings.json delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/settings.json delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/stylesheet.css delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/about_ui.glade delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/appchooser_ui.glade delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/bottom_status_info_ui.glade delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/file_exists_ui.glade delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/new_file_ui.glade delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/rename_ui.glade delete mode 100644 debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/save_load_ui.glade create mode 100644 plugins/youtube_download/yt_dlp/extractor/agalega.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/alibaba.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/bitmovin.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/croatianfilm.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/filmarchiv.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/frontro.py delete mode 100644 plugins/youtube_download/yt_dlp/extractor/manoto.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/mux.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/nascar.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/netapp.py delete mode 100644 plugins/youtube_download/yt_dlp/extractor/nextmedia.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/nowcanal.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/pandatv.py delete mode 100644 plugins/youtube_download/yt_dlp/extractor/scte.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/tarangplus.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/yfanefa.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/README.md create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/__init__.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/_builtin/__init__.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/_builtin/bun.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/_builtin/deno.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/_builtin/ejs.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/_builtin/node.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/_builtin/quickjs.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/_builtin/vendor/__init__.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/_builtin/vendor/_info.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/_builtin/vendor/yt.solver.bun.lib.js create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/_builtin/vendor/yt.solver.core.js create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/_builtin/vendor/yt.solver.deno.lib.js create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/_director.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/_registry.py create mode 100644 plugins/youtube_download/yt_dlp/extractor/youtube/jsc/provider.py create mode 100644 plugins/youtube_download/yt_dlp/utils/_jsruntime.py delete mode 100755 src/create-binary.sh delete mode 100755 src/create-standalone.sh delete mode 100644 src/create-stubs.sh delete mode 100755 src/debugger.sh delete mode 100644 src/setup.py delete mode 100644 src/solarfm.toml diff --git a/debs/build.sh b/debs/build.sh deleted file mode 100644 index 48e85d7..0000000 --- a/debs/build.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -# Fixes ownershp -function main() { - sudo find . -type f -exec chmod 644 {} + - sudo find . -type d -exec chmod 755 {} + - - # Set postrm permissions - for i in `find . -name postrm`; do - sudo chmod 755 "${i}" - done - - # Set pytop permissions - for i in `find . -name pytop`; do - sudo chmod 755 "${i}" - done - - sudo chown -R root:root ./*/ - - builder; - bash ./chownAll.sh -} - -#builds debs -function builder() { - for i in `ls`; do - if [[ -d "${i}" ]]; then - dpkg --build "${i}" - else - echo "Not a dir." - fi - done -} -main; diff --git a/debs/chown_all.sh b/debs/chown_all.sh deleted file mode 100644 index 2c3d7c8..0000000 --- a/debs/chown_all.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -function main() { - sudo chown -R "${USER}":"${USER}" . -} -main; \ No newline at end of file diff --git a/debs/solarfm-0-0-1-x64/DEBIAN/control b/debs/solarfm-0-0-1-x64/DEBIAN/control deleted file mode 100644 index 50ac836..0000000 --- a/debs/solarfm-0-0-1-x64/DEBIAN/control +++ /dev/null @@ -1,8 +0,0 @@ -Package: solarfm64 -Version: 0.0-1 -Section: python -Priority: optional -Architecture: amd64 -Depends: python3.8, wget, ffmpegthumbnailer, python3-setproctitle, python3-gi, steamcmd -Maintainer: Maxim Stewart <1itdominator@gmail.com> -Description: SolarFM is a Gtk + Python file manager. diff --git a/debs/solarfm-0-0-1-x64/DEBIAN/postrm b/debs/solarfm-0-0-1-x64/DEBIAN/postrm deleted file mode 100755 index 2646766..0000000 --- a/debs/solarfm-0-0-1-x64/DEBIAN/postrm +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# Note: postrm (script executed after uninstalling the package) -# set -e - - -if [ -f /bin/solarfm ]; then - rm /bin/solarfm -fi - -if [ -f /opt/solarfm.zip ]; then - rm /opt/solarfm.zip -fi diff --git a/debs/solarfm-0-0-1-x64/bin/solarfm b/debs/solarfm-0-0-1-x64/bin/solarfm deleted file mode 100755 index 8cca2db..0000000 --- a/debs/solarfm-0-0-1-x64/bin/solarfm +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# . CONFIG.sh - -# set -o xtrace ## To debug scripts -# set -o errexit ## To exit on error -# set -o errunset ## To exit if a variable is referenced but not set - - -function main() { - call_path=`pwd` - cd "${call_path}" - echo "Working Dir: " $(pwd) - - python /opt/solarfm.zip "$@" -} -main "$@"; diff --git a/debs/solarfm-0-0-1-x64/opt/DELETE_ME.txt b/debs/solarfm-0-0-1-x64/opt/DELETE_ME.txt deleted file mode 100644 index 913acd6..0000000 --- a/debs/solarfm-0-0-1-x64/opt/DELETE_ME.txt +++ /dev/null @@ -1 +0,0 @@ -Place the zipped up solarfm zip here amnd run the build script. \ No newline at end of file diff --git a/debs/solarfm-0-0-1-x64/usr/share/applications/solarfm.desktop b/debs/solarfm-0-0-1-x64/usr/share/applications/solarfm.desktop deleted file mode 100755 index 77b2ecb..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/applications/solarfm.desktop +++ /dev/null @@ -1,11 +0,0 @@ -[Desktop Entry] -Name=SolarFM -GenericName=File Manager -Comment=A file manager built with Python and GObject introspection. -Exec=/bin/solarfm %F -Icon=/usr/share/solarfm/icons/solarfm.png -Type=Application -StartupNotify=true -Categories=System;FileTools;Utility;Core;GTK;FileManager; -MimeType=inode/directory;inode/mount-point;x-scheme-handler/ssh;x-scheme-handler/smb;x-scheme-handler/nfs;x-scheme-handler/ftp;x-scheme-handler/ptp;x-scheme-handler/mtp;x-scheme-handler/webdav;x-scheme-handler/http;x-scheme-handler/https; -Terminal=false diff --git a/debs/solarfm-0-0-1-x64/usr/share/doc/solarfm/copyright b/debs/solarfm-0-0-1-x64/usr/share/doc/solarfm/copyright deleted file mode 100644 index b293cfe..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/doc/solarfm/copyright +++ /dev/null @@ -1,22 +0,0 @@ -SolarFM is copyright 2021 Maxim Stewart. -SolarFM is currently developed by ITDominator <1itdominator@gmail.com>. - -License: GPLv2 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. - -See /usr/share/common-licenses/GPL-2, or - for the terms of the latest version -of the GNU General Public License. diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/Main_Window.glade b/debs/solarfm-0-0-1-x64/usr/share/solarfm/Main_Window.glade deleted file mode 100644 index e604e38..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/solarfm/Main_Window.glade +++ /dev/null @@ -1,968 +0,0 @@ - - - - - - True - False - gtk-save-as - - - True - False - gtk-file - - - True - False - gtk-justify-center - - - True - False - gtk-save - - - True - False - gtk-execute - - - True - False - gtk-redo - - - True - False - gtk-justify-center - - - True - False - gtk-stop - - - True - False - gtk-apply - 3 - - - True - False - gtk-apply - 3 - - - True - False - gtk-apply - 3 - - - True - False - gtk-apply - 3 - - - True - False - vertical - top - - - True - False - - - True - False - - - True - False - _File - True - - - True - False - - - gtk-new - create - True - False - New File/Folder... - True - True - - - - - - gtk-open - open - True - False - Open... - True - True - - - - - - True - False - - - - - Reload Plugins - True - False - image6 - False - - - - - - Terminal - True - False - image5 - False - - - - - - True - False - Session - - - True - False - - - Save Session - save_session - True - False - New File/Folder... - image4 - False - - - - - - Save Session As - save_session_as - True - False - New File/Folder... - image1 - False - - - - - - Load Session - load_session - True - False - New File/Folder... - image2 - False - - - - - - - - - - True - False - Debug - - - True - False - - - Show Errors - messages_popup - True - False - image3 - False - - - - - - Show Interactive Debugger - ui_debug - True - False - image7 - False - - - - - - - - - - gtk-quit - tear_down - True - False - True - True - - - - - - - - - - True - False - _Edit - True - - - True - False - - - gtk-cut - cut - True - False - True - True - - - - - - gtk-copy - copy - True - False - True - True - - - - - - gtk-paste - paste - True - False - True - True - - - - - - - - - - True - False - _Help - True - - - True - False - - - gtk-about - about_page - True - False - True - True - - - - - - - - - - True - True - 0 - - - - - True - False - 5 - start - - - Plugins - plugins_popup - True - True - True - - - - True - True - 0 - - - - - tggl_notebook_1 - True - True - True - tggl_notebook_1_img - True - - - - True - True - 1 - - - - - tggl_notebook_2 - True - True - True - tggl_notebook_2_img - True - - - - True - True - 2 - - - - - tggl_notebook_3 - True - True - True - tggl_notebook_3_img - True - - - - True - True - 3 - - - - - tggl_notebook_4 - True - True - True - tggl_notebook_4_img - True - - - - True - True - 4 - - - - - I/O - io_popup - True - True - True - io_img - True - - - - True - True - 5 - - - - - False - True - 1 - - - - - - True - False - False - False - False - False - - - True - True - 2 - - - - - False - True - 0 - - - - - True - False - - - gtk-home - go_home - True - True - True - True - True - - - - False - True - 0 - - - - - gtk-add - create_tab - True - True - True - True - True - - - - False - True - 1 - - - - - gtk-go-up - go_up - True - True - True - True - True - - - - False - True - 2 - - - - - path_entry - True - True - True - Path... - - - - True - True - 3 - - - - - gtk-refresh - refresh_view - True - True - True - True - True - - - - False - True - 4 - - - - - False - True - 1 - - - - - True - True - True - True - vertical - True - - - True - True - 5 - True - True - True - - - notebook1 - True - True - True - 5 - 5 - 5 - 5 - False - True - sfm_windows - - - - - - - - - - - - - - - - - - - - - - - - False - start - - - gtk-go-back - True - True - True - True - True - - - True - True - 0 - - - - - gtk-go-forward - True - True - True - True - True - - - True - True - 1 - - - - - False - - - - - window_1 - True - True - edit-find-symbolic - False - False - Search... - - - - False - - - - - False - False - - - - - notebook2 - True - True - True - 5 - 5 - 5 - 5 - False - True - sfm_windows - - - - - - - - - - - - - - - - - - - - - - - - False - start - - - gtk-go-back - True - True - True - True - True - - - True - True - 0 - - - - - gtk-go-forward - True - True - True - True - True - - - True - True - 1 - - - - - False - - - - - window_2 - True - True - edit-find-symbolic - False - False - Search... - - - - False - - - - - False - False - - - - - True - True - - - - - True - True - 5 - True - True - True - - - notebook3 - True - True - True - 5 - 5 - 5 - 5 - False - True - sfm_windows - - - - - - - - - - - - - - - - - - - - - - - - False - start - - - gtk-go-back - True - True - True - True - True - - - True - True - 0 - - - - - gtk-go-forward - True - True - True - True - True - - - True - True - 1 - - - - - False - - - - - window_3 - True - True - edit-find-symbolic - False - False - Search... - - - - False - - - - - False - False - - - - - notebook4 - True - True - True - 5 - 5 - 5 - False - True - sfm_windows - - - - - - - - - - - - - - - - - - - - - - - - False - start - - - gtk-go-back - True - True - True - True - True - - - True - True - 0 - - - - - gtk-go-forward - True - True - True - True - True - - - True - True - 1 - - - - - False - - - - - window_4 - True - True - edit-find-symbolic - False - False - Search... - - - - False - - - - - False - False - - - - - True - True - - - - - True - True - 2 - - - - - - - diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/contexct_menu.json b/debs/solarfm-0-0-1-x64/usr/share/solarfm/contexct_menu.json deleted file mode 100644 index c17be4c..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/solarfm/contexct_menu.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "Open Actions": { - "Open": ["STOCK_OPEN", "open"], - "Open With": ["STOCK_OPEN", "open_with"], - "Execute": ["STOCK_EXECUTE", "execute"], - "Execute in Terminal": ["STOCK_EXECUTE", "execute_in_terminal"] - }, - "File Actions": { - "New": ["STOCK_ADD", "create"], - "Rename": ["STOCK_EDIT", "rename"], - "Cut": ["STOCK_CUT", "cut"], - "Copy": ["STOCK_COPY", "copy"], - "Copy Name": ["STOCK_COPY", "copy_name"], - "Copy Path": ["STOCK_COPY", "copy_path"], - "Copy Path+Name": ["STOCK_COPY", "copy_path_name"], - "Paste": ["STOCK_PASTE", "paste"] - }, - "Plugins": {} -} diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/3g2.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/3g2.png deleted file mode 100644 index cccf50a8fa973db06465c39ba1dbbcc99447af26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3780 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ai.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ai.png deleted file mode 100644 index ddb172fe56041dd50f9ba44be8fa53adcebdeaae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3547 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 VFXbTjN|XQq002ovPDHLkV1mFFyNCb) diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/air.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/air.png deleted file mode 100644 index 076f08e7d7ad9bff52bdcc623586ea0aa5387b37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3170 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 IM6N<$f)KSF&Hw-a diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/asf.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/asf.png deleted file mode 100644 index b700cf40b964016385688aece63ef41bd4ab9666..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3126 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 QJOBUy07*qoM6N<$f>?~xy#N3J diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/avi.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/avi.png deleted file mode 100644 index f4436f748617621c45659611fa536693577e874f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3208 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 FV1m)ijs^e# diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/cls.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/cls.png deleted file mode 100644 index 4759ad6f01d3aad46c74f210a7fa461cd01610d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1763 zcmaKr2{hDu6vxNVixDS1A%%q3qD>`95oeTj456Wt^q!L4NTWiAu`gj%V~uKL?3HCO zqd|~9mYNy#{0=RowxPwIsf~=|KIQa?)`l~=l+9{h)Y5+Nf-nI5z^Ixn}GN6 zjfbBXcUEST?Jv}|3uZW0EJR21qFqLh5s%{rBchv%07Jf0NUl|=7O}%xV*f) zqN1X*vJw=js;b(oQ&Uq@TU%RKS65$O-_X#|*x1QuWR0A47K0pCD02+aTfk8n*p`oE+VPSw$ zL_|bnWMouSRCIK7OiTT6 zDskY@cT-c-(KSREA&rgQyl|laa|9UI9|lkYTz@k%`O_yb`5Qtv^n5pPC9ZF(ZY>1D zyGIwUX{u8lZf5Ab+f4NQasy_nBf@Z^C>?vyOe*$*BFO}fdt%w9?88G#4booDT;W+2 z;6m-;8Rn!X$Y?E%=+pTmxDsxA0x>W6WD+^>W5*C-wsPrRR-SDmd9)Wj6TctQSi4&4 zhu1by%Q94X(DY05k$A3dc`f=cyJ6sPSjJYNO$rX9`;PLATq;vx4PKOwM-AkoaW>muc2b<8S#FC)q8bP>8LvIUNd{L zM^=B*!!<2>N`}ByZKIJwb;1_N5`#;%uz1)<<#?ELDAKO!ly>I1>U)k;p7B%yI?~7M zUW--PvR%^tQ;o$$BFb3IIkoxp3}b!Zw)u)6D(uuzJ?m`Y3pFdA7$bJ2)8WI5Q}5c| z=zF+JzR)DX?ow=LD^8x*5<%A>q`b=yV_yVRNKvJjnk@R8Ej+3{us!#J4TOC}y|naR zhK(r@Om-yW`8n3ue%EuYEQ7pQ_=$O1GA2zmOaRNjB*Ax9UO`QYRyR=AiM;`L7B^G0 zD1R|_fIA|CP(riGTt-~t!D^T_3Cm$GRHIZc&g66{1j@l|J5+voz1p6=OR&7&ZJx_B zC?@0(PKaq>vZdFO?sKbX1@f~g`W5D?b&*#UZm(O_Fo#K!#ACrimCcyzmUkM4o7k#M z{B7j~YzM9J4Ie7O?5nORz9l`1r7TA?+IML`{?$^lCf`11k*+IrV;S$==|?41G7H~l nNbCtA+uj`A`P&hu1s_X;B7Q5&@=|&6#!srNjeuusS!4eMD2>Cb diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/csv.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/csv.png deleted file mode 100644 index 869e3541b739b1c4380b52eb52e7f7307535d51b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4519 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 FV1ml(uT%g4 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/deb.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/deb.png deleted file mode 100644 index e5581ad1f784062671ced5047881499c3bc6c461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2915 zcmV-p3!LcMPX^bY(7z;HL ziWnh3Fa;rz1!72`Tr3jff)SFU&_s#_q_9Mmg)F$c?Ci|+_mSKAZD5t4-4_gH zYenuW`q{S4XfjzX3Mdgc#Ljfmtc!N8n2VlTe5jb2Pr8r$UQ<((R*M2^@O~UfrF--( z;Ps_n=iLv$+SHDCp&yiqR{$G56qR9v02~r>_#jlLj{~Nup)tAek#AtcI#6FM0!nJBVUhID?naHxg30a!NEOw4)Tw`0?r%niFYZ5p^&Y?r7ei);Yzme6lYtE#1gxn6 znP~v_<^WHeMd$5f0B3sui#9^hhWrbEhT`USNI!cw8efvRpO%U?k8;f`q zPf*)s`KPyI@t3cKJx59h_4e7Qf9Dp)hS!HYN^s4{O3uCxEc|E-bB~-B58SRE%ssG< z!O!mn<14c(AjE%bQht2WAOS{Vo(+uk?zX;kb(*Q;eA!w)}$c3Om3s{{u z88WXv427q+gSD~UgIC^y+;?9FW!wnRXHJMtC{R$1M@w8IML$LM4F0b;-S<9({4aJQ z+K#uNM-4&av87-U{F+?=Jvq^?-#UY3_B_sv6*rcsg!BpvU?|g#5cMz(mR@roQ>T5R z^n!Eb6cm5ISEePwrCzlHZEbC_?e?38!QOdLh+ur}1~6az1}H=7;?_`wM~Q0_?S=;C zqf2Q(Z-Vu?Q$#F5;y{u2tG7Tdms0{)UxJXKaq}X1572J@G@8%c2`r^u5-LJq9y(}| zx~IB!rrO*(L2Ei{`t7JL^OP=J_4ME#%nBVgwRNdM+R zVC0#Ys(AkJVjhs?5S&t~hU%-KtAm&vCu)rH#1kPpuh3 z0mf-SuboUB2N}5yKkNo&LX!uVnCGQ23F|~y%43n`AXfzC>Jgw_H?bl!t91=1A#&zX zXHc3NK!Q$?orO6(aUDF_jgkNupGwdeT6t2ri{+k+Xf`OL8Zr7p5<^xlLFOdW`&War zvRPw8FRRahd$d!)A*l~`_W_*mD-F!OmbK%b3bE__l}jGiQ=}$0%A^1V zK)i32W z_dx1PE#CT)yp_+bLS87T%%feR+MB&OWI-xZ4 zD3u>W*9s9hl~PV3asebT`i{(*Bp8WuR8k>YNnSS*52Gk7bN@|@6Ex0a3R~U^RjH$% z<5Hd~(kH}uqQQ@=;TM`%O>Q(U4b*3hht#q;US)zPGf(WJRcAT4C7nqrXtX*X*xxrm z^$M7#smOF%LIP%ga2qIB4MqFtX((*{JH}Kl5-Sl=XvIB~sWu9dN{1U%CaYASv9VDN z(P`=63$X6_dl_ew{ZG8Y$gL(qC6O;BKq&Ct0c=E(n|P6nF007`*=$xzm_;!|#)4+d z{^SmDyFSK?-&}`0O_ZO<&2)63%T^61`Cc7>&%Eo39U62U8^fgb@(@z_wo;@vQ=Tn) zlv%L=vX9-y9HIlg%h!T)-rlbH0?k$FMwkhDX7T;K^-!# zI2F2ARY-q*9yDx!n3r4N;`cW~vF#9Gu5j4^B^T@v%EJ4w;WID#q|>HQ!f~9M6i^fD zn{qPmwUg!bmWj~#mmj0K^m^?7;qTz%ML$D=RxIx0))oKjc^iIm*jOS!a^ZPG&)0!v zS^28D5Vt_w=3J<76)k2NI?H_P^I+aJ53PMiSbo#rKq1bfO&ZO#PmKkl({eOL&(nxq zDNlHTdx3c|F0Df$JijL4p{J+kY%L0?rR2Lxz7n)?%3v;>E>85z=3=w2l+c&U?*3k& zc+5q495`^KrX8BNO}FxgF_uopW$s|=Sf2Kv4}(Athw#n?cU?a7 z3Iwo`$Li?lINaOYTc{-;sDO~XM5HhzF2$vNiTlBeM(ubA+e*Hkqs2eh}hAKtZVS6fR< z%lVqB(|&oq0v__lTeRjAg;ThXw`M)z3G=pve9C6#SF86t@AnVv9y0*+{+tc>F1j2YALfAQ}&{{^bX&waX9Fy;UN N002ovPDHLkV1mTxdba=o diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/djvu.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/djvu.png deleted file mode 100644 index f3ed05deba51cc39dea3fb3c8ae7284c946c3bfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4973 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/dmg.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/dmg.png deleted file mode 100644 index b52c92cda4e20ea86d849748b2010cfa3cdd950f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2523 zcmV<12_*K3P)%|1976&iCJu48x#WnY9L~ z$x-I$=5jf5I-N8$H1r#6>rS3Ld4RLdg79;nv| z%aWB>WpF*w=Xba$*?B&)BfR^3K5_riqepb=)Tx7q4-C115yn_p3C-!fB*hN0|NtjWa3v>u3Tx1 zg_>OhWA@Rk3UZ!ev6xn` z1B)6jB!X-uCt$#nauhYqD8o#D0d6J3BxF$+PFO6g`57)Uc|6vNR$}89z6+}5$)$#h znBl{FMHW~sJEfCxI9a4bDo*pW zabdjA=ckW9{u`dL(cs_!Aft+?FLZ#%XjluG>8;?{W~bj()4tUM#mn|j_w^~#p@lNTj-59wt)AO^!V{(TEB5UuG=8$CaI&NLuext zM%B`zVF#+$0wqC)A}bWh<#Ip*#OaGK?$8GxoL}_)kN!M_cO*J==m_=o^$W}=;yD@{ z8>gPG9xzTp7|t+cuBh%AO%ZboGhi5{>*;hFP|@iJd)}e9-yVelfB-PA8>IydGY-pz z`T2QpeU8?yZKH?d4@uW_a=JVuV@w{y9J-pWtLLuUf$GlrypG{jnhJv@pRd8Jq#cqI+>~?Fpff3~k`SLt+g~gWJ zI9F5y&vsp~OiN2p2r;qJvO1W5N`@<-MFAt2gTgdqK4-`6R48g-F^+0!EH{chpD)y` zwWi5wPPy5QOKQ?8F#hSMH}Ss>M#5%9mlr6S0%-9cV5KO~Hi*37cpMeLi}BCrvc*m+ z-ue8-O;Bi|JddrSR(a0l)PQ9rOUmlh7K;kqzduTeL;|aSi9G-%G6ibHOv+qumDuSL z^oooqLq&U6ai62BQNZh?$FUeC)7f%u)m}R^>_Bx|c{!L!#L0ow|L~pf3neMDNJFPr z(TKRP6<+IF00(wPFN$|Kx||6`mqc-AGFjTRc{6?QyWar`==eV+3cCh`q=p@M=EyUL zR7Im(w{KA(5EKRpr6QH+Haam*iTNa@vKg=rj7712cH_FJ6^mqu>>iBejPiX+@LGr0_|=>js`4-DMT=d;w^(?edrmxljy4;aSc#p9#yH+Le+ zX~A4v+$yre-C4yy1tl-^R3PB5n(Mj1OZ8?zUswaYv92);jn=oXr`fqU8W%hQv#6R1 zxL6?*rYH%yuybcOZQs6)QY`jRs9ccT?6_}m<;UYG+OS~*sVI4*6yLaspk|B|RW4XM@1dBPB%Smp#M|4;c3RQvb$qVTa z4EWH6ErQJyIK&WI4sF)0MxQN8NMJS?4wC_1pPZaPHuALP_17snIZcV=9L>!o02N-} zYT}(Dn8<-f=de4;j=B0}Cn5YL&}h)D$SpkEpkI z7X^bJNQr6SK8mOYY17v`sjJHcgOCZeAd1xE^ij5up*wf}O-bmU*pnxsxVT=XXOn`7 zT3bVvV5zFQ>}Bh+)o7JlqJTr8Af!Zy)~smYIHu1VF99RcDj4_9)0-XB`DD~ zC`dcWXjV4aj%6aUGV?k8{jYx^54x>vlK~$GDPSVMKSX`s`ZgfuBbU7t-R)i7fRept z)|*-bCN5PN@(Fa%j&Hn4H_)IqZrm&~;c(gEfD>?NrxY65y?gh`hhnv1)y1-T7VCm` zIQzAZUJ6HUAq(v^8Ff=U@rb^;yQ}#%u-L}%h{dAN_iF{yOiqr0T@vK?g~2|I|9N!b zETFLtk++Kv08DspmzP{%tI>xeG(CBXEcSIEgie~BnZ&(aukQDOg;476e+vcqFHm5f z-hKB+#L|bAC#y>mze<(Xw0*mKMAxo#aE_|Zx+e+R{4r_(luB9J+_9DV`upqp*0kab z@C07q`u+ER-RvJQ>-tb;d6|s(f8XSDHVS3ANER($n3 z5Q#)q-GP_cu#|T)pz{`voA_gKxv0M?EE(nC^3R!LOWC=U11wH%V*lqVCqXGYR2K^w l<;brV?MUT)(fR);zyRw|0z75LrJ?`;002ovPDHLkV1h<+y`caA diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/doc.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/doc.png deleted file mode 100644 index 8f615d16fb5abf9dd468f56c691403c97ed3e2de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmW;LdpOez7zgl;IhovY6i3Cna5@r+BE}+S3Kc51O75jR$+}D`%}(V$k)95+sU5dm z#!$HoD|5fMxy>zRZe!aIqc-Q~e4h7xzt8*k`@FH|T^y7Yv=kr^h>|15&K1m~TP-gO zPTvuD1q1?RpLcS%2iKE6Z&ASor*G37BI=wTwOxoAycj!qDeTSV1fECIoM-Z)Cy^ig zmLD1#dJhy&#eG^DXJlk#lJl~PTi+Gd zkw_#mr7$Pw{rjS73aGr9Qq@nXoz5+-$(Xctw2T4pLcfT~W>XHXYV-7Tu=5!Qlw0eYX1-Y>4NuW#rV zHhc#f8yguc(N_>l&;%L~HV*pwxie*M}STPcx9q*CeT=B8nvdmnSMk#AQ)Ip;Fy9OQWF6O)>ax7f=Uh@Yv^?Y~k!w}W)ha$V{lDc0uRfIAw zm(<;#7G{`DL2YmBwlWXh*Dn*R$zULSKAYawLFDcKB4wlGB@)97|xGMM*19^cufJFlB^= z1cWWGR^n`D5i0XnIGK|sJLHbVqnDyChnV>X=zqcLMaZMHW@Fs_jI`qka;$-{s_Xg` z)V^We)P_kL{m&Zl8<|{cPfrh(s*5IDPTd`hP=?1k$Rb57rG%dLz5~<7bgpT=W3F2) zhseHh!mmBZ!QKeA{qLw}8n}|IHQ`l<%m?PM^c|Yj9YH28Z#kVR{>%*++zm0c_MkF4 zOM*pet>1rSsjgNlqf^YYRJC!dw73~&jt&v3^+wnrNmJ}CAa@V(F z;L|C{rm1qzPkMJa-*T+Uary4jdfW9pSl;g42#l+B#z}&=?tsx$CN!gmcJ$E;!TPcG zR}sAdkz-#=iuumY6gNi;GTQt%jQaVj%)EmAI}rz+ALOwgDHy*i`Tb16Mzwo$pb6kL zzhW_OC@+(dt+E||)Y9s4@crv|BZFFIewqh#&6EL{MD%-QB7#0fhZ;ZG92(LxP+=W8 zi;Fy{I`Yw*=rOS^wZ-(Lj=ZKu(8o*jYK)^U=oDR59t`4I=k4ih9sC$>MpL0%npj&~XGd7Pz48ejLWW0U zbspv)AwA!$b4X8^$zdzZc)p`s`5U)WcU;0Y{-&6H&SO{0S`u`dS_o7u-99d7C~F`S zA@+Ku9(i_#5LhHNijUV$&Sf3POYr^`v!zZ>9tPPkoM11b<0PZV+l(^&JXa37rvSSQ zq}d@S%~fi&aprsi(*V&ISL`WNFNuoO&7<^zByBc1fH&Ipe*7O4OO{H;J-s0?Op7O IZGG|o0m92xYybcN diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/docx.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/docx.png deleted file mode 100644 index 377ecc729ed4659b00b5635b7d3b2041496f0086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4144 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 uUnHL)01JBKLp!*bvAd$Oy&&0000D diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/dwf.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/dwf.png deleted file mode 100644 index 349610c2718c00cc023ea2f02b30b941d7cbac9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4319 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/eps.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/eps.png deleted file mode 100644 index 10f19ebf2fa2fc9f09132fa5b405c46f511386f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2299 zcmVwKOMeT0VrcK(!sqV;VzKWFf-s0<#dI@4sJQZbt9gEvWm#B% z{P^S94?cMB{Q2|Sy~mF?55OA}6X5fD-9Nr`>0MEj&JiGl1#~ICUnp+G1k=VQSGG#f ztu5{Xs-i%lP=KvuGT+kL`ul~s`L}u^k;K^ZU#=>f^y&~eMFF10`wrYt)hVomE_v;3 zcqF)eQ~kkkXD|ecqH^0jU8M)23CJHj-LrfxX&}(u3(hodf|PC0AIit$z^5{iua^xrfk9C5OkbSit|r}QcdRZK?$yI zp6=ztL-^85--FkGb_MeJJZvTsFm&n^fswbiw*L6x!op9-#>Q5^ap3|?&CHlvAawvO zsu$dvMI}KeIG4-m6u{?^7+*<%+`bG2Sp{#a$i@eG1@>|>yC=asEh4yG4%o-}OzzMU z04g00_V?jXmYJWC6_`+xB>MgS?>-ZYiIbC)6Mug9FRPKBh&ceY3dcyB(e76G(RWTT zq0j_yVR!E%TWd@ojrtqOg({r&1}IlpYy@RuXTgJ!v#yLS@_ML9x!l%P+=%t zlmJelr-Dh65C{auhet+)nd#|?h53bt!z05L@;Ov(L$00Dy*4HQqUeAC3beSAgWp|S zhnYKRaJfY2YiFDZFVW%McnP-LYP zp{Q#hF2;sqzg${ciei+4csyPXKyTVI!S!Rc2&7PuA)hNiI-O^ZO#Sx9X_&da10JMP zht~xTj0jEt!Q)9#$uiD!|~5RY_J_)hCfF5FMcrq7tVIU`c@u3TFtRKimNU?}MFAcA&rqFeyW4@>BU``y_14e z7JULkrGSeB)Nmfxbp=}Bg?JD{BbFaGlPnU^en$Fm>vB!G+-`_OB9U>e`fpm354 zolIZ&0qo?8Qb{c>m61nh0TJoqZ1u1Lge6I`q>c8q!cx$SD6OSoXD<)GK*_^a6&?xY zker=AdE@e>?r>y4Rn=P5WuaK1l<7&RzLNti&s3w1S#`?*U=pQ7`gc-@ojBdyfym1j zUwtJQ>>5xFkzBA4P+yanj!_tw(@C+uB79nbs3;{g+U!?TXj@xbw!OVw@p{{AIa=+E zV70bZ;f=p@)O`XHgu2!e-Kf^*Ny==Eks@XX9y9vX4Zx@gs~75fGMR)MH*Nry$1Ikc z30FXDHfseXD8sH1iW4^+`D&= zmCRN&sdjE|iUsWG!=LdQhWh}uXf#TJ0Pf$vZwaDSK*lIkw*|ORW|4%1+u7M++|OpS z?5GIrROe(?I5;?f<>h4<7#Lt6t3{$}p;S5w|Ml|(>d~V|u)4a+1oQcP(ACw&o>2rM zAiKM}%okFr6zuKo!I?8>s8j}HVyxAn>$ZRy0QNZqBh1Fe1{GS+-`~%K=Vx59h@#c{ zm`7N_M%KA|_byvMG&BUkV2}Z+6~vL8*vNI#=p5GYBn)YkA`TaxI^FBXtSk=%*jfTI zJ3EU7VY=?9)U+^4TJ7uWW1QCe2mhkSd)bEq1VS1o$0jN*E-tdUPuz*kHlfIJ`t<2i z#+9{CBvwH9JPGXg`@xOp0J0$MGdw(8@`-8=eIyDQEy0DNNJELsO8aIY2ml@vVQp=V zMJJx@tjdfdml9S{NS}FI@EpMDR1FA$ASWj9q(pjIF}Lnji6vRpx(Q-@0LdQW~00WdmWtw1Po(Qnt+ z*UOHWl#Qu=BD&RkY;D?srq;s_#r$wM%>09MpZsHRaIh}H8@50#8nXL3L5)CAqwGtR zI(FpkWWxGO7s~W9c6QkH0hI!Kz8%wxK#X69Yp+Zv^AYVwepxU z_1Uv$S^d)p_nU5kM)n~Z9kn@*!vFt;RkrHJ z76@Xhk74ZY$L{_#0AQrb;k!S|X0x|(xLX$hY*eVw|5N@(Yp5nP`dcZ9J;A@I{}(1P Vec_sJe0cx>002ovPDHLkV1iOFU`7A{ diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/epub.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/epub.png deleted file mode 100644 index 6f8a256bc99893e9eccde6f58786e967bc803289..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2772 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/f.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/f.png deleted file mode 100644 index 7cfb90a65a905147f8120d2d18deacd9905dcf00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2050 zcmV+d2>thoP)0JX^WhsIbT1{ z_nr57-{<}NiVhUlxpU_rFE0;fXJ@mEi;E8lf?$CpUyLyjMG+Pj7U(_meSLkGnwy*d z$j!|a$H&Lx-cP6e(%sz+O-)VUa5%DSYHAMY_4<5zXDUE=JRWelTwt@=-aUEpDPMFre1K=ksas67WOQ0;J$F7!2U|`w76VhK7c3jvYI8`1tYT7s|@Y z`~w36>Hv^t2*6rg^q#b|G)PZRhy48f&HMK4J56&P9UT`+N=p2s%(wxp^+gsY5L&Gk z3JVL%5X9FAf}u4om`o;dZfYEe;VglTU*=3^73-AzrTO| z0wBuLhXBxrz$if+J$m#m{<&ieG>HHZ!tKq- zEZicJg_H?Ts>#S_67m6_d?;cBHcety7MJ#9vhd+bo6zsCHH?OF47v7|l3b`Yl;iaW zAfW$o94Y}r-` zRn@z}U^GGB;~se7e9nPvsi*{tEgOFLu9HVAD~@Mo+~D(iM6u~T1@jk zuaC#=`T041-&R=-PY~FRYhC<%UVb6$tgeCEe_Rg^je&T`g`?ae2$~Rzq>w_9_-Ztn zpt9->c-s3AdhXvvnpxrf4;!JpVh6nS_B-(C-}~V8dSLgS2Hr;YBJC^|8|bkHy7T96 zFpu3ATiPGf%f0%=VX*>Y1(V4gmC2n+M`vf0VW5hiG{&d-!46htAVGm(?oux_u|Q3a2B{^nXI4wF^~`k(MTARU+7x^WeO8KAJ(j(Ot& zS>`H*-MOe!UFN@&B-qF>}>3#*!O_LKhPyoK6Q!ymZ3N>s{R3B&_7T z5>UERBsz~7S)GFaXiWUUC?S0iaj zwi*+IxXi~0R?)2RXChHZRTK){K#(_2)p4&7^xo7^h^64HJwid36bgl!kgb9E%33Jy zJP^)oD=a|uzQ}kFn=INa_YtC8PDjcEs>7(%$k;aJhHb7D9umFyW08+lsCNjQ34!`d z%tB(ZawCe>pMKs7A{_w&3r{n)5=tQRDr_VuC9(B52_Jfl?7H4ES?wMyLXQthwt6H7YYgrR0|)o4}@mD zc!dug6LsqA>v_c*jo)g8Uo{HFB7CH|jEoG(#E3%9E73;{-xF#n)lf+q6K#}-U-1YZ z3-_Z^C|)asdnS{|bC!_sA#=j2Q7GI|cB}~{^qJMF$VhuGm*7nP;ZG2x1{+{%YAP~- z($Z2G92|s+iHXUco}NyR$CJmF-Vl%WV%2Oc4vVsDMn^~g!r>zSm1uf8GJukj5;%D9 zAec<1alG1aL;ZR zEo5PIWdJfTF*7YOGA%JSR53F;H8MIfGb=DKIxsN9beeqt001R)MObugZ)9m^c`amN zbY%cCFflVNF)}SNHdHY)Iy5;tGB_(RFgh?Wr>vZW0000PbVXQnQ*UN;cVTj606}DL gVr3vnZDD6+Qe|Oed2z{QJOBUy07*qoM6N<$g5A2Fn*aa+ diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/f77.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/f77.png deleted file mode 100644 index 752fa8cbd9366a8247699e3608f124e485aa82c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2187 zcmV;62z2*}P)9snL(;b5N)SFT)v%*;$!SXfBS&CNZ*aa;;ScnE?3JkP`O@-nTnG%zr5qoJYU zenv(HKRG!W@_ZWkkFKsRsIRXFtJRuXUS57etJP-Fn$ZB^bUMLqw}a7WtUZ7J{8vp) zP3=2&?BEep_y9&nM*+1CE|*J%gTsSva}b3Q7Z(R^x0?X$tE#H{?#!7pC(oWed##|L zz&$iH6dnN53<21RLF>fC#6WCpEM#S6?W(D%xk&d~TU)Q?<>k3anIQw%>OmGJ5Nfp= zva_=b5X83#LO^R=i;s`z7Z(?|HvrN&fgk|rZ;+Fdv+Kx_BNy?W(A?a7-E21VgM)+H z7XVR~4gx?2fsunaefspzCXOiE^cAXB&QgpJV6;7omeVo3c)EhJBPVogRqvnd~7$%i6_XVM5}Wqxf=K@#3yY2*9*t%gxQjv>{)Vv_TdKF$g?}J#3*^5{feEL~EBr3&*K^C=x{qDe+Yo z9}gvE@4)lEr_j^=7-?pJ4?nI0b5Sw8`+hY%`?nibSDmo`Kox5v`;c}iDMrv@4fN>G z-(d;6FJW!Us8Yz=)a1Y#*uAF|cIMShekP9M6ArFViRv>L@B3p0D3C#2Ur?9-VB$=I@9ASbQ>-_ZeEVRgs zR3>`_;}}pimD5|1$i#_A;Dp2^%mF&qgiu}}$8^luy`FbC?5ttY>kXj6=7pk-O6}eM zYVm#YBb8KTMj;Bxor#>xh;@5WaTz@8`I~8-I80g{8ti9zK-?~QaJLhI#X)wi3G>Di zNYBiK@zG&)Xb0rx?_z*%|8^5>lmB5Oqi3oY1R=6f$oFNUgw1A!sn<5Rcc+7yn}ije zR|HCDibPj2Bdb(u7Vqh~o7aEz>_m{p@%-@KZRwr3IGtY#h2#TDXa!iG7$mK5%vY7P zBw0=1y|~P-5v;6PVb3U0D6A;tI{_z69s1x&qn1ux?Bzpr3R{H^+IFvI9)!Eqz{r&xr zk&ywVrKLdMxn^c&*oVBz%1Rg;8-uyIIhdWDh1%L$FqurupEjC*Q`KlN!i(4RIjEqZ z01h8M%ru;zpAQog6VTq?PW$~(R8$1?q2ku9Tg*aAG*SW)5`~l|-)MpE?rx^_Lx&DA z0Q7mtY&HXJi_^0M0|QW8Tnx#{$&60H3Lmr&_-4IegqNSo%gdprriN{sTdh_`qhrU8 zF^Um|=w5Yob-;B(5q`rc6pZlVbv*XOi5NlXOxo@3?PWYqOG{(UOuq{Y3$YJQQPjS_ z>rJ(k!BU9?BF)lb;#U@n#ln0+{J)~2f^C%tqwQe0ACN+!T7gDFLW0+OdcEH3J>q?! zFd4)>Zo??#Z!0_4gyQ?3Kc2tQTlkrCy#yDe4}TmdHrT*|gdzZn9K*xIFf}zb-P6<4 z=5#tUg|!tzF@3O_4aQ+ncGdX!_+NOr!oCt=E>Q%KmzM{}j~^#ToW#+L6Kc1^jx}a& z7drnkWpj#T^6@{}j{^j?{T-?R001R)MObuWa%Ew3Wi4c3bY%cCFflVNF)}SNHdHY) zIyEvnGBYbMFgh?W!*rT`0000bbVXQnZEs|0W_c}SVRU5xGB7bSEip1JF*Z~&GdeUm zIx#sbFfckWFppG_(*OVf8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`? N002ovPDHLkV1hia_QwDK diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/f90.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/f90.png deleted file mode 100644 index 32c9febbdc66e639396db28d461b65598c369148..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2212 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/flv.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/flv.png deleted file mode 100644 index c4e35d5ad096994829a6356a7f962e8ff2dc2f62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3181 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/gif.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/gif.png deleted file mode 100644 index 7cd9773bc44f74d9107e73449461b2c6393fdc8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2802 zcmVBEw#V~C9#lQbvIHq4$a_A4Dj927a0UpdV-$4|%4Hy9h=34K2o8&Y;Am9D2@4vK zKp-q3ftUqCcCv(>5V9a-fg~iIbdx<~A&`Cl&3A6`Rb^6b%`|C+U)8Dmb-MfB^FQa@ z`+fIzY=D0;p8F*+b@%tQ z@5=T6Y3+z7pM3KFot>R+y77pOh4l2-oPb9(Y=pG5v`VZ@QBe`&$B+N$;K747g4G2G zefsoKZFqQi7C>ofDYtIjve+ssE2*fcpuD_XIi8o7M@dNu!i*U+zWLP!goTCW=us0V z?#If?%9PV4lSv7?Cfj;0|QlNbjFSy`&svLvW5Ve#Mx#iaW5vch>$Wmdi1Eu2q2lzMXb{^ z@z4p-O$1081qTOHSXhYA)zw8qLj%H~L4(%q*s;Sp0wNmnCNJZ z967?CJ$pEO_%I&yQA`|fWH+jT<*q z3Dwuv%MH)aeL`C#AUZl)c`LOprBiqJF4;Fsw6(S4^X*FnZGM}8A6?k!GM?{0v1j=^ z!`ZlG5;X-0=!B-UH`hQJ0%=-d?Dg5x1Z+ zemGu^M`Q(Sy$xK<0jQ%mC!YF-Hj0W$)cle%)lJG)kSe%u0WmQ#N`Q2JSBrkLR{MGR zd2|60`_{5^^;lNS8H49`S9Gq`!}5JKn&T$E^)JOEq70Ala&||SvNya0pZHRC##hh@ zO6=XbI*i7fs_#1OT1-kuLF*^A*usH@^bw0#X{cZT&AR9h#bYfo$9KGC* zZ|qG%Qme_h4Z8y~v^74OKTSQvi!Xh_rcJ(FPEEw9Wfe7!ioTSp8dDG-dM!XEa8pwg zHMeW&Xl+6$ssUI3Dn8g|)mcIkYA5?e{Hg@oKDCfaRc*wD`j zk0@Zu)Jd#c`97bm{Ftx4bY)I^LM}2FXdux(MrJK-)Pf0c~w<+}5&?nsgpvr6yp_z9P1VR@s{52^HA#ELb3^c%93-M*;^`NcQUy4A`i3*lU92|;nUNV;?#_bvax{^eH? zT3T9E842RUeG7<>kI&X4BBWlvLS2=C)=pUFkO#W*2PnJHuZ4(OjJO z0zrGn;8%*;$BpgUFE3ES$HP zo-A;h%gZmmguZA<7J4n<)TvYY96;|dH#d*Ww95$I=c@3FyUDw6dhq$cwWhdH%Vv*go$-172AalTK0;GJzd1-~Js%lbG6A^4}*E4X^kE{=@;SW_ET-1WFW|RRuv#Ck(e$b zDLIMG<|-;%VRLXk#x4jtk&4~u-?MJ{O5Pgt0wW%OoT-1Df+07Ty*u1kv+N^u-hAzK zMvWN3sue5fXlW+=co3^sEyrjy(Pb?G+H<+SjH(WG(^rb7$a;4 ztLwL?&xFnvx|5Q4fxMjS2q$At@cyj#NVsrT?E!?2jt&Iz;l2fEn~ZF|vz{j884RSS zr6H7+)>4qyPEv{y7w0+Xr7=^RtU9vm^4aG_Nud#c?fRg0?dx*@e?K2mE+vwXaFOgA zH_%Ti1o5G_0wn4^1?U4vgtTn5QedbhK0cRDP%K&C$mzIvglpHX5qvxtpF@W@a>$$1 zOBdT@|cIkIumowu$4DVJX|9odY_mQahhCMb#SnESkx zh&=O4cBE`%p)mJZU4U$6#4KHf{;dGLlq7m0qQ1TX9eK~}=glMUTUUUr!8~AkeK5lY}>XCVZww72y^DlVfE_OczSwD z-9LN+#3}9PReGYGZ34)-r_}SqTSBswO7wM(9Xp0FZQ3*hiM|}%YG?ls?;Oy67$++$ z3!#7i{s}zaGKG#RWlL%fz-6@xh{l zEkQfdR&7E;LJkiY@u8bf|Cs=tl$4Ze9x&pA#s4dznegA5P0-BYp3VM^O&?c$5MPvU zmSo`3d#&WIzh?b@W9u(tclX885)%H)=E0-;U{=6C0c~-~|Hu}9R{#J207*qoM6N<$ Ef@j`bDgXcg diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/gz.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/gz.png deleted file mode 100644 index 987d4f04e8760b54c580ae29313607fd6a7c6a2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1480 zcmaJ=c{J2}6eq)sHH__K579#=M0K8eS+YI5vLs6=Tb2xF2Cp$l2xA$Qp_uH)o+LG$ zEMqsun(Z-`v2Pg$!|;Cf{(FDC&pF?F&%Nh<&i#D9_j?nqEsgnk&hfCZvGJRl7}^3J z_VYkE0P8-*{eg|`jIQ;c_C`R+&d%=U=9ZY4czSvYg#QmP7|hSlFYpUuVq(I=!vEGQ zDk>To85tND{D%%Cp-`x#q@<^(Cjd_t34z1mNF*{TDJeWWJS;3MDk>^8G!%_S zlSm|h&dtpYlmRSJQBk0UxVX5Kl$5lzw2X|5tgNh@oSeM8yn=!P&{0WANm*H0MMXtT zO-)xU3M!NJkd(aFil+1c6E)z#bE+sDVp*Vot2&(GiA zKOi6=FfcGEC@45M7!VK<5rIG;kP(11BnpKB^u)x(U@(~2*w_~@UZkX?q^71~vDmDv zEF2D(ot=%x<8yO!^YZcv3JM4W!n=3x3JVL1ii%1~N~)`?Yieq0YisN3>OMAnY;0<5 zYHIrY`7@D7{QC84b8~Y`OG|5OYg=0zaAi_^E2)Fj-rnBP(b3u2+11t6-QC^O)6?7A z+t=4eCX@U7`zifo3WYK-FfcecI6OQ&GBPqcI{N+l_p!0D@$vDAiHXU{$?557DwR6> z6LSFO=jRs|7HBlu;^N}c($ezs^2*A}>gwv++S>a1`o_k_=H}+s*4Fm+_KzPwc6N5? zbo%b@&hGB+-rgRA!Pwv12XJt3aCmsgWHOJAj*gFySuEDc$qDdJ?urOJ0!9Uc+gjTF znmGFz4iG077{bdZAbb9jhK7#5f!$pP4^J=ehv=lFoZMXCVTw!2%F4^>R~ke#+1NM) zO$~3^BPMW}`}c;dCF1AXt_N=sKN1Ly!3BipkwG?X>X)8D(;LK+8%pzSYwL@AbBb{f z@DFoulIu~Eit0i$vYYgUC}d{n+XdTLJ8S5LRCBGrdWShfm(+80vd zj>)<$L2juQR_ihghetm~JvrTEt%65JdPOQ>YM>l>N@2#SF}`xPh~yWDI6;1}geV9q zf+#M9_I|g&&CphtgFiiuIvQS~a0`K)&SaL``+!?D;c}fd0hGRInc}A$nPO*ZRB=f& z7v2ilT93-jTy|02#n2!D<+kbfMMLt#^hF9_@}S94Ra(4y`E!m(n!?Vb(xoa5zJyX! zx5Q+@t6wIO6#>cjp?j-w5-oahFlXLwRo>hjm0~EukPruvdCBgbrY%$roh$cEYkSE! zp320c?DbugAcwUW}g_8&mEcR=cx~aos_w3+;mQ5;Z9x^Kr@z z3e+DOaJ*;|3wrQjntZ;(!=n*=r7Ak| z?KN|&O~xN2N;j8O*Y!!L U><0CYIsDuwQzJ{mDt&j%KUT}bivR!s diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ico.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ico.png deleted file mode 100644 index b33287eccc343f2d5a18a99168d720fdc8f53d08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3130 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 Ud2z{QJOBUy07*qoM6N<$g2|z+ssI20 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/indd.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/indd.png deleted file mode 100644 index 24389f07af8ebfa69ccafeff012b2f69f110ddde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4031 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 KMNUMnLSTYH@A~`z diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/jpeg.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/jpeg.png deleted file mode 100644 index b1ba768a42c2638f35dfc02dcca1f6fb8904e703..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3319 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 AZ2$lO diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/m4a.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/m4a.png deleted file mode 100644 index f8f3ada661ef59a024177b5837d1918727980b98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3806 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 QJOBUy07*qoM6N<$f;P|n4*&oF diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/midi.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/midi.png deleted file mode 100644 index 85132d5e4f60c2b3600bb70eca188c9a10d85980..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3511 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 Bcz*x@ diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/mov.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/mov.png deleted file mode 100644 index 9799d32eebc606030900a5edd8c0e7500fa19022..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3197 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/mp3.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/mp3.png deleted file mode 100644 index 18394f586bd96471429e54de27c44ed7715d946f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4064 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 N002ovPDHLkV1n3M3Sa;L diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/odp.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/odp.png deleted file mode 100644 index 69f8663bfd82b7035ce89dc78889dbdeffaaa948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2895 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 BebfK| diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/odt.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/odt.png deleted file mode 100644 index 5e10765a12ad3159d15c061dadf014012635cb00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3701 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 Tnxaq000000NkvXXu0mjf;O8Ve diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/oga.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/oga.png deleted file mode 100644 index c2364645338b71577232605d6089e23b002d167f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3163 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 B%B27R diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ogg.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ogg.png deleted file mode 100644 index 1f70cb8afefbae212c399919175d53e5ae610b6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5100 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 D^|m?~ diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/pdf.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/pdf.png deleted file mode 100644 index 867f287ce969701f0798300c6b8dd4b9ce40b22a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3408 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 Q(*OVf07*qoM6N<$f?93ac>n+a diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ppsx.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ppsx.png deleted file mode 100644 index a9fd94ba9592f2e3f7ff6f24c8c0fe2f29858e25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3306 zcmVEW=_S^!C*&(m|H?82?Zq7Gz2IjG?D2;qm(LX zNv-|LTOZ5seK`(DOGJOO5F-@lQ<~`jP1s*8QU|AXU20oXJ*c2 z@4eRQ!`l1Y=A0SIOL^#)me$&9pV|BWegAKLw}Jn^{%D=(} za8^qBp#Z71Hj9gkwZ|WSy!POO4|4eM;mra(_uO+_xpKw5=bn2W9UmWmESt^l6hhEF zfWGVh&1H;f&fV+od#$yp)oSze^YefG`s=ShKQ=ZNKla#TEddT4I>hAUBuh(65AWT( z_isw2(va)ANGXw0B82EWe^3EZfLiO0IbC<}$8pTk(o%V9YU(ScQt8DLCrlTRWO zikO_76u$325(L4J5TZjH-CF6e!4C+2E1}YFbSuaA{UP7?ADNt-6k2Nl-1LtQ9z5u1 zt&6=h+RJ2m{Z5A!;__v}<%`6Xd32+OF(ADhZebj6MCwARIg2M;>Nn7Ao`Qi?DPJG9#iWUsRTnrP)`te^e|*4{osedavT+A2DVFdB@p zhALbiCs!mh@i7Vq9$@IUFA(h5-vPXP-EIl(IHD**Db->?YfT)-eGg?%VWdPiuCn&V zGpxM&J!;dJ(J>(HkRF(}*BBk5stc^2TVUh-t1Q3%45hoi#>m}YM`lJ)D(*1Jeykf~ zh@yxN6H-bMMNwa~*|aYm)apAdzx*xAC;kN$YJ>-F25_tZLL>qRz*r`X2BSbLgQ`q1 z_u}sphl0{wzlt+Bf#^DK-DhG;2BIk1^uwNl2#0v}4Oaf?t5i;%1OZMSgbTv40|$gm zz>5UDNx=g#)E8m?ZABD+hw9H>VC+lZCA0ezkZ88sL+Q5tb_QfW26_u3F^w52$9|iQ zvnP=OxOqFgJa_}(6~G%z#*iI;GQ1)1v(Q+9)k`pX6J&=Msn7hB`5%0fX!Sira)49N zN~tE;UJS_gGti5HPALqHbI(#e{Tds@zxCV_U#hWn5KUEd5i%!3r^Mw;pQ!PH_^IZOh&5t z9EdtpuYieR_!{sfumK_hsX+?Zc=;?*J{cdxA?Z1&kcv%ph zb(O*e=~xX)V>N1$SD6?@4OHDe3)}>(vBKykx5>VWh!)SYjUj(f1`O5ZItyn(`rrmu zTZbRiL&C znb6zP3jw_uNK=VkxkqY3t5e`^KrjHl05`T^O=8cImR%#D?%jwZAS)B^sO>NsgieCC z555ceA*hak&IDU(KQ*CEabPboPX%qAX4b^+@WB26bcp7#>Mh2=}I zx==*!xDL}6d3#l8JsC&^=vU$yt;y`#kAKUZoPQb0<*kKiY8Shg0`3+rV`x@^cueBQo3Q1>?2R2f)aBlVR;!;#tPD57VS3PE}Uy!N38}k zZ^Px|AcsdN{`zlGy#ABqbJ>o}vzIlrn~>Yjgu1JtbUj)s(YWN`YfAsUXAGwo}9lI%w45tPA){dlYe-i_} zB458*YmJnW;o=a5ftx5-_E1^<9P!`<7(9y^dlz}_9C~aYVGhjx2Z`Nr;{5ecypf=| zm%`8}#lZr;?{9nddSUC!!26log>YSm(Nd9-;UU6kFZIUVgpE2;)IcX65&I63a|8S! zAQSimzSnG>bZh7B^MhtFFNH+NwzUw=dm#jZr05rIEs?b4nx<1Gos7*mI|5ZJ z&a{H2L8td^>w3KoYwz)Z3wI2j=Y{kWr@jq4%D8W2C;q;0?I#`{7}<$*WfFXZ_2KC( zLCV$|DVq5VZF5)SJIR$>9SU>;JW1}1ZmqR4&AqfL&P`# zae9a&SQ&&|WtPF|Sq7GEz>%Jvg`3>FtqQC;x1|oWC1)M@O)DF1_J@)lQ987;MUII( zXB~r%>@2IGs<1j_F*i-fBtJ05=K5N-^>lF~$W|!^BqW9RelyDSN8gYF=0`6oXR9X4-&C zKugh9yBg32oS~1Cx$P;?As9nEf1G&sFLC!hfm6B{;tD$4AewpxQU5R4^G&=RcK`-8 z`;VB)J9ztkm+;JY(91u;J@6D%FVi@42%}6Bc#|2`R%IGnV{5lnPh%obwYI~iJ1Oj@ zQ+P#!J)g#0Jp#)wll!^fL5|*wTlyH@-~i^*pAwAjBDnPrkP`>V9{3vS^0TNj-@>f^ z2va_Tmv`{?e-%a_AbZ1o=&Q%kk>2#ZRFEb%V@p;ObumC42-=&mNwp=~sx4z}UB?Ea zLc*&T(DgO^TQ$-zV3bBxSEuf=~SwZgGOfJAY1i@dudLkh$^e_}AUf#*hCHJ@W$L+<5}kz$@Lr`fG2d z*4Pvvoj3JZ5)(?5-D05DYvig4~U;p`dPnU>aN>Dn@l=@Vc=0Q|iVAa~x2-k3*ZCQ!5giYVMn z?&e>kdg3Xfxwk2P;rj&pAEo-%_Y$Aq8+^)uu7hkp15pSo%TRDI^l3|`|7{TxqWN=_ zkA8!2;jC>DVhi}{$-h9j0XmACAB*OGN)Qa=1Vw5m{)ooKW5~jFtiSeq)Zcvt-PmCD z$P?9uzUzp#^Q9mV!nSLAI*V9}fU z)Q0IuC$>>maw!K^%3M5rietb4PzF@`DGwL}_WsgM-2TYjd}c6D&gl2?YSA@!Ju>tc zX4AU=H^j;sYcC$>$4Acc7BB_OVHE-E!`uJD?001R)MObuWa%Ew3Wi4c3bY%cC zFflVNFf}bPHdHY%Ix;mnH8U$PF*-0XD0wD00000bbVXQnZEs|0W_c}SVRU5xGB7bS oEig4LF*Q^$H##*jIx{gVFflqXFwb1BhX4Qo07*qoM6N<$f``K}{r~^~ diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ppt.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ppt.png deleted file mode 100644 index 0cb28ba7e5c1c2af4c1e1aa7ab26bf5e119ed14f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3390 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 Uc5l9zTmS$707*qoM6N<$g235swEzGB diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/pptx.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/pptx.png deleted file mode 100644 index d1d7785b2f129395d65296322160c19fcc9f06a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3942 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 A&Hw-a diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/psd.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/psd.png deleted file mode 100644 index 568684bc7285fac4a7d61a47217e90dbff09f733..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3898 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/pub.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/pub.png deleted file mode 100644 index ff2707658c5f7c6e0643e24e1040b3418aa7bbe0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3822 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/py.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/py.png deleted file mode 100644 index 4fadf04f68fd4128bacb7e69d2b0ef2a86c824df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2431 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ra.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ra.png deleted file mode 100644 index 0103372e5ae5bb9d106ce7380c1c80b72727aae2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3141 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ram.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/ram.png deleted file mode 100644 index ffdfa05932dd18ddc6a3d516ea5a5ac1e0212a1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3269 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 XWnpA_ami&o00000NkvXXu0mjfRF>CW diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/rpm.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/rpm.png deleted file mode 100644 index 5f3d6220d0b82f9c52aafb50c96360cfbfa1eb34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3278 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 M07*qoM6N<$g2U|!I{*Lx diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/rtf.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/rtf.png deleted file mode 100644 index c26ede1c70e15fc8dc60cd4eabd5df8e4147ebfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2400 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/sql.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/sql.png deleted file mode 100644 index bf6c1ab4427884ea9f426e1c23a05c2323a7b7e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1883 zcmZvc2{2sg7RPVv)^=KVV$FgWL1NNG$O}OPV{6l4v?U}WQzXb(!iW${ENyRs!Ptq8 zUC?%-?OR)7*Y%0WrK7E3 z2;R{@E>K!6G8aP8VPG#YJWWF#mkcMU5)uMJhJ}Uw!$}|zK)mSa=y&hlfdH|wv5AR^;AbB`d;lBi?CcyE7#JHH8y_F1 zQmGRY6Vubvb#-;d#>O}t4qOB?Gc&LSXJ=<`Z*Q;=XazdN$HylmBqSvzB_}7Rq@<*! zrDbMjW@Tk%XJ-?MM9?`WCnq;IH!m+QKR>^qprEj@u&AgAZ29BIk0m7~rKP21Wo0B1 zsl2?rqN1X*va+hGs=B(mrlzL0wic{jUtj;})2D`p1~Qr4*x1;rv$L~vb93|a^9u_Li;Ig(OH0ek%PT7@tE;PPYisN4>l+&zo12?k zTU#_5ZF_tB%a<=ZJ3G6(yI;S4{r2tK-rgRaPT$|(KR7sGFc^o2hu^<{KRP-(K0ZD< zIRVE*LWp7mZnLecp@GpqTmS!)vl#`a1Qd*!nHkQ)%F1?2)$FmIi_6QGf4aYV<>B$# z)5p(`1TNP9sHU!W=?4<1qsVS)~iO}jlXuG>-A_*`4VOIk|!Mb)>$qZn#G z5%bJkT{l-ZI!afORkTKpDdfDTf-l8p@MG;734)VGw;sGo~JDY?_%5zSB zU;gx0hdxR@zEz$^8N&41$P;Fgx0O~>J=a8hiCXS1fufwga|Kq7z)G;3SKYj?p_XaE^rA%KW_fELGE z7d}opU9C_1$uJHO5J7aR-K!`axX3C0;!r=?(ej}G#FJUqQ0+XRAvb)v%xLsZjNX-= zWmH^+n=Hxe>wgUm)0NjXPIZtEGjI<`L5S4z1U_~2+-y+Wf5rky-fI} zOP-_~=7nfbRafTD+6G4$8^is6fX8#e#_jl%cac|pO(iah%^W#MORQZYx7ZXKPY>2D zKDQAQlW>CM`S$e@l>r38*;MNM-%sbHN?^VL?@4uDO7WME=Oe1qWv%7`k#n55$O^ht z-osG&P-&S0^V0b`#);QrH4FM&5`v2t zV!kGXlX=X+@%lVb=awAfShzc)ad7LIT!o30Fv7)zTcTU{{f3;yqXO>BTyAy_*TskN zl6b0%(4$@+xkq+rX5UT;NDys3SBbGRPd${(20{nKf4Wyn*d!?6apuT9+;fUNL(@*( zOhH;D=C00Ksk&OETvwBp)meZG&(lw&ByHH7PEO_UzW>n$mF>9Zwkv((axXW1plF>wSnhZ!QEHBZ5=35 zwKVtSoHH!wv#m_FGD5FJvIz)SqYZVv5kxj1AqzOD$dH|g`r&~NlZM9c-sZ{mnso3? zsuV5qLERP4JRw3XroABKeU{$Y0r%qDLP~l}PLqsA{HVu;1h&?>Dah;U1Gg(2@C5ZH z8sPNDq2luSbh~5`25wI|cGQ!{u^@6rpuPHW>PXoN@6gJ`_}cXTwA1F;)X%Rxj;Tgj z0v^vx;vTm9txyvk@;rn9`mpB!{8!C*6nVxV7rE_bFE&OeAJ@$;zB;1a3f;?qU#}aE z`>qh`X>8qorG-$Cs7i>XaNEbet!|Gk1y)4>M}JstOU6c*3g@hkF}jAXn@d9cIFxiW L4K#|>t=|3{RMe3Y diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/sty.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/sty.png deleted file mode 100644 index 5512ae8f3c70d2a0b60631f1a5d994edcbb7a1e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1301 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/tex.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/tex.png deleted file mode 100644 index 36bf00e15d5d6e31d1fc36887c9a75c1ff0db538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2936 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/vob.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/vob.png deleted file mode 100644 index 70cc91d4567dc19a818b5f3f885015c678b670ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3184 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/wav.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/wav.png deleted file mode 100644 index 1dfa3209381ff1cd1c1fc3a7e405a105a96a91b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3169 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 Hu0mjfEkpBQ diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/wmv.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/wmv.png deleted file mode 100644 index c12050865fe6233efc2fbfac71556ebc304a707c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3205 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/xls.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/xls.png deleted file mode 100644 index cf5a2d0070a26ba97f289494d66241e435083b27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4439 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

^7(xAbD9%Ol1OQn)I zi~^U=fIp~t9|DHzcj@`j?}HT@D4)&I*f3bdv@vufsH3qnd0~y=7vT=>5}J9 z>cKu#H3TlmK~zMG$haw|Z*Yhmnb$dw=6B7PVm6B=GL%8)CWMtnGh^ZyXMp9rj>qS+ z(uM8%S)k^?(U(Uh0hO|Q(#jNnxx2hy7k!ES^U0#Wn6-Ts2b_u6`c+*C8et_CN+=DH zMu@u>r8VB+w#7QBv#rbM>gtHMx3@(T&GAT3535z@mUGUxL$XLc}VD3eo_~`BtNqaGG?;AUk*#!Nq;XREV&FZSEu$sa& zq8O+Roymxk=G{B_o2}FW!GJ#=kA-5fSfs7JB{64qf77g4vzq(+``TyC>TB!lX=`b2 zYHo~#BL;eh_wQp>R^+^K?_o7ssnN9SO@I~3du!s)Y4|rYX{4tBmAM zTu?WvXRuzk*bxIft@Ao}cEoq+;9=jcmv+~#)igC2iAE#c-JK1+y**8RvwAyb!?E7J z?)ILZ?vB=$)>u5A2*=}*5UABxy-o2TZ%{f@qtME`&_dI`CLdzc`9nfwG7ELiO=gIf zj)3Uti8L?mjRS8fb@v!SyjohDCBkj(#U2WE0^y3A=8)SKoNaq;)Xftj2u*L}9? d9GgO;{|($f8XLB=&RGBe002ovPDHLkV1lC$r0xI! diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/xlsx.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/xlsx.png deleted file mode 100644 index 454fd5dc332da2b86b1e38ff2ee10242bdf36d43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4560 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/xml.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/xml.png deleted file mode 100644 index 609f131eaccfdb66df127047c36408aa435d291b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1596 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/zip.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/fileicons/zip.png deleted file mode 100644 index 8caadb22b3b828541e0f02ae396845bf367bad2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2099 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/audio.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/audio.png deleted file mode 100644 index c0101346b611e7495861f4efe2c511f76b51e5e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1544 zcmZuxdpOg382_1#wYlcDP%Wj4+h|9w2Q!nE80M04nOQb$)AnPKVADonltl zL5HREOw8q+D5;PxatTMONfadx#+mciInQ&x&-;Gg=Y2n)_ws$7_xa|L{Pt@ij1d3; zXcB$A0+lv;UEylVd;BubQE8xDPa+wvJbZX;uF~I-6K5kW&<%wn zj+uR`M&*(DT~$eYas}1jLP%A>r5w}z6ZPsB9f^l3j7`ITF2BQLe)^b{n?>IuoIfcm zEm5SuXS-zxN4p=-(6<8jY&HIo<9Mj%<4;>2mRqb2g_zm>W|aVtCPNHgroh!(N`nK_ zQ<~#9w=68{I*@LlaoG{u7Y6ps8f2joYdbHGQO&k>d})pwX)Z^;Ky)gLfW%p(zS;|S zhq0bZqG5|MOKeB2ftAYB62Xfmt(YKfk!{`B;!kpKLB*r1)t#q5ui%^%MzJmM;M%13 zk}Qd+%b=65%lY8%(Y2h~IDw16)&P$VXgnJJI3Cag^}HM0Ic#M`(VmLA1Cfn;y7SWC z?3N-Vj_#s!&k${bt9F3_rW<;B;VS&EXZ8oj526(CF_?pEUw@7qW^0`d)42!9rKq&u z1Y*JfJF85Tp@#+%o%647;s;2GXL-;o=hc86t@f!4CIu_q@$IS5-Ags!P9W*3%CuQS z4|mm$qaG%0klZ{e;D%hU#Y{1mZ4}pru@!GB3tYwW^SaUTwT1_0?*AGEaVBJ5b3Ik6 ze)dAQPW0J|?IKONhRS`hh?e(cf+^_MxtTMm^tH%Bfsd|CEvv#lA#=P29wT3F#X?ao zfkhFyPfg@-mHTwON^C0b8)<7_Di8hFBCwIiQUN+w?8!ZAS__NX4(blQ{_}IrrKQ;5 z7CSQ|^vh(5B6T@`q=`D9%V2l5ZTWydwpL4@>(kDp!*b^tU$?kqPLwI;Rj19dWyh-F zB~s1Y`s+eGX3Awxm&{O+jEjX_)E+%OQzX>rZ|H`Ru_**Wx|df7&beK-x;0trxp*$z zZeu?Gy8Wk<@fH&EPHAPCZuAkK;W|71a&`X|8St00&W}Kkdh8GJjr6W>@!F?BS1D0SAL zxZ;T3&N)bu{|c(QglMKWcIar;P{EA=x07mnrAy!G?UV4fsV_`~-JAB+n?!(bdXGO( z7iyVCIW3zU*jl_-7}~9GD_y(ifg#7+7a&M}23(10r0G)fyU5@#BsY%n7xv~;)ioT1 zu^9$v*!6(K|1)hd)X2ED)qw6VK=PVLE(Uj{i?k=xTnbJu;liYBC?EEVrD$%N(6GyU z%Fm@y_BvJQ*^kx!eUOjLzqRdl3OS?e55>5vEYC7$jhM!2S~>pOZKs}&5eShx;A6D@ zyLbP$j&#@}>FsXB;d4F}2O3c|nYZTZqfS#p?gxyVxAC@&7Vpa#^mUr04nA8b32D39 z!7VLJWB2(IXRl54?~Jk(DtwKKdSQ==p%L@NNS7w*_l5c|k73`|Fb||N=Ss%qr|hKp zFcNPwoI@=KZ0n!Q419iA7#B6nT5v0>`HfkgGTQ5`MsO>O$XbkVT!UHdTL6(U;Cknq{Q{mCL=3J`#dGHam+6_rCl di=8|}I5;?NKlFb92xL>4nJ zNUsNB#yF{oGC)De64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1UVK#D># zOL9^f0)R3_3ZBXNc?uyJsky1DHrHsBf%ipdZ&9wFhW=V}MVHE09J8Z@~aA5*-~K z5fM>PP>_?8^XAPPi0p+67cO4Bc=_^WAotm`XF&4#^XCu}$awMM#mt#A=gyrwZ{EE5 z^XD&EuwdP~bsINs+_GiMwQJYz-@pIh!GlMS9=(438e*XO^6L^n`(#Rj{DK+SIFyvN zwDk>)J-vfMH*MLv|M1}tA3uHm{N?Lc&6p-z1_s79PZ!6KjC*fqlC<5TCeqS|*mRL?Kgc7(I8Vi=8|}I5;?NKlFb92xL>4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1UVK#D># zOL9^f0)R3_3ZBXNc?uyJsky1DHrHsBfZYpno_di4|!2nE;;ZdJgpSz-K{;CN})=gZxe$uiHlb3Cnx_r~r6&t6n*feeBrs*p;&sep2 z#_G*8S8tiQdMnTtp!q-(xF)ho0G+E>666=mz{teP#m&ttEFvl4>6lif#XQ z8W13Ilv$zc>xRv19^Jh6-?ox*^G&|HnMr59#~t{-#It^DV2glL{i@!-kE4TcEV%OT z-p;}>w+z1?PA#6E70US!LfC%He;CD4G5_F<15KQ|YZz6wZP-1z`D{=_^8Ki6{avaJ zN7k*_@#bs#uBW^^zIST;wfe&9^4sO*Om&4j>bpKNANjrI3)7R|Q=T#KpZwhZ_*dum zPKyse-tD=U{igWAzqi#}eLQv9Y-+XEJ!hQx&W=4!!(c)y8wWhvU6w0CUnUvw{_K};>3gl1wceg9u(=*FzrTHMS*!j2>yL7`K8m_0?z;72 ikl~}S#Zrnb|3dd~^!AY~RX+CuWU8mDpUXO@geCx;cxYb$ diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/doc.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/doc.png deleted file mode 100644 index f8388267bc53ad5b95537b2977873701ac3de87b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 702 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy#>i=8|}I5;?NKlFb92xL>4nJ zNUsNB#yF{oGC)De64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1U#L5e~$ zOL9^f0)R3_3ZBXNc?uyJskx~NA*s0qIf*5ykA0+kAalscA{WaJky1SjSyc%+tR zmXzFY>2w2127x4<^9w4AGSf3k7@VCI97{@yGLuS6GV}9vgEN3maLmcfPF2V#DJihh z*H11=O)SYQOHIzt&CSm%2DwN-Co?%UuQ;_>KdDl;I8onN&p zZ_9Puk?XiC-}6{u%6r8rAArhKrhnG%zo$Rxf&SbtZY#d}uKt>}<$cc94;{z8cOCoQ zef;}`Q$J^&|26ykuVq(%{r~^}l(nx4&>f;BL4LsuGV1!hQ>M<92A` za$u2V;P7(L&tTlTfNe{YTmTot0$~9MRfh(*0}QPUOht^WN18--M73=5e-P5pBywZE zqa&Bf?#D-!zU*O~{q@o;^8-1PL-!t-%^{%RaKQdUf!l(-hV)bR3I~jz$_qT0S@&69 z;D^cqV^xO-=8c(K|8@#XgfTm*UyupEDR0WO-Js**PYaPZ#^2g)85_AZEX$o=90q!r N!PC{xWt~$(69DZ(DkcB` diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/pdf.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/pdf.png deleted file mode 100644 index 9f40122a8e9ef281901e085651fa66de960cae4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 925 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy#>i=8|}I5;?NKlFb92xL>4nJ zNUsNB#yF{oGC)De64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1U#L5e~$ zOL9^f0)R3_3ZBXNc?uyJskx~NA*s0qIf*5ykA0+kAalscA{WaJky1SjSyc%+tR zmXzFY>2w2127x4<^9w4AGSf3k7@VCI97{@yGLuS6GV}9vgEN3maLmcfPF2V#DJihh z*H11=O)SYQOHIzt&CSm%2DwN-Co?%UuQ;_>KdDl;I8onN&pK?PTIAN%F-q_%-x$%8-V~{Ru^Jlh}&z$X_xi~y`b$XGV{4yf+ zWn?H&`^%{CSBbH&a#P=y6~8Sj`Mhk&=VePjFJJm)Mi|9-EZE1`1tA5moJqLU6Kq8j5VGvjv*QM-d>CJKja|7`e0Z0qDT7{ z@Ue=x9@zCTit+dV|C5)xEuOis`2EaGr$@H>bMLhORy~vHEa0IcWLx}nu9@QL5C7Jh zX&z=3(1Zr%7`Gi@ z+rcECz{PMtSfD}Gfx-O%LmLBA2_x$XCeaErj?Z?Dt0hEM9Jpw!5zzSR;LT>oh)-;D z-n^G8s(8a2u>7j+ zJjt8L#OQU^+W%$ol~c1VVm|%2De->yIiSp{$#TD@bqZhb;MWIIABs=S_AyQP;aJC9 z@7=`^``2qPQ>12fE92L^Z&7o_S!&dSSYtQ+%hYC)a9y}J+~C8l_ggjg7FAu;*!ziN zM)gzP8CSILH(b-+-*8WRe#6G_PuBw(7%L7eyZw(>d&4WXDQgbA*>(Eg)|m(N)`VR6 iI#nofzso27&zyp}+m6{Mw{HSQ6oaR$pUXO@geCx$l#&Sm diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/presentation.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/presentation.png deleted file mode 100644 index 3a339af593f4932996667370db88dbdc050f86b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 882 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy#>i=8|}I5;?NKlFb92xL>4nJ zNUsNB#yF{oGC)De64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1U#L5e~$ zOL9^f0)R3_3ZBXNc?uyJskx~NA*s0qIf*5ykA0+kAalscA{WaJky1SjSyc%+tR zmXzFY>2w2127x4<^9w4AGSf3k7@VCI97{@yGLuS6GV}9vgEN3maLmcfPF2V#DJihh z*H11=O)SYQOHIzt&CSm%2DwN-Co?%UuQ;_>KdDl;I8onN&pG({c6t+>by80{rP(O=NlPcPs@Hg1J-h0;pch9pXZf+o>%^PQTx|5 zr(f5ce_eC=b=?(Y$m7;ukK2AdZvXSF_s@$Ne_qZ6+WY6_>_4yO{&_X;&#U=B_xydm z2$g7u zy(C%^MBZ?E3;YYq@; zP29q_Hf(L_y2CGRR%D2_ugaMC>EHP$zLTdlCB8p;vvcF`{ZEo=ISURHn)rH$X~^?& zh(7%Ls^Ln8EX%38Wp@R3xwkT3+GD7vwS`yEq18%~fz_G)&hCqCIt-jT41yI53I>e( z4zS)}l77Hd)1b+~;P1dNje${yky(O?;{vOQ0(Zy*GuMdCoH08VIIx~u=h(<~#qWH6 zP>XN&fu|<}v#v1|hgwf#t@C7L6$x-?{LlGi@A>yXrfLN8E%<5_DY1cji=7a2S>tsN zu^0ZA7`pjycDFR@XDUo!JN7Z%Qf#;D<(k(Al4T^K>V2yp{_(l7vHrrm=jk?$lke2b zU%SUt#jfn^@|Uq(d)qEN-}U)cZ)+Sh vg(L2s-MoMEqZICF(UN^ZN^i1n34LRJ(>cXB_UJWGf@bh^^>bP0l+XkK!91hU diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/solarfm-64x64.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/solarfm-64x64.png deleted file mode 100644 index 1a403ae3ca0be18c3661898bdcd9bfb5dfd2b80a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16172 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 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/solarfm.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/solarfm.png deleted file mode 100644 index 1a403ae3ca0be18c3661898bdcd9bfb5dfd2b80a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16172 zcmeIZWmH_v5-vQ0yNBSG5F7@F!7WH|cNjFdyA2M(3GO7gySpVJc#z=k?hco{$JclN zoVC9D@64LLXYcN+r>dT=?&+T06Rs#PiH<^q0ssKerKQA`Up|HZ97qT+=MoEtB>;e| z*i%*0SsCI+Vee>XW?^kg;p|~=N@415VFm!W&*i6Uxl&hG=sxqJU{cP0?uE1_nXjyR zA*M=FtL@Hq_)bYl&Q`%C;f`g)n)A{odb1V9T%s^HoBif)Ewk-A zvV>OK`$vT;(kqFhKV%(0J!wwdKWw)=TCVt7d4F0aqF-+x_ggBm!>o9iifvtPd!ILY zZd25O?%`(lyV2jZ@G?*P?3(VvrE_#tcJR^ef;u6)_i1~3Xm40bXsLO#-0x=3yBYT6 z&MwMsp~~BZzYp3jl)Zkdy*!{9yF9(Sk2#v!uCMZNKZaTA?Niff!0o5Q&~%OcJVRAj zdEBYb&GqEc>vy^Cd!yhX)SNw&UV9(CQ#m#B+-^Q=J~H$rxKFvzO*y+bLxF#0S5)tH z@7ToWTXGAk?9Rka_)4;-9`Au)w|v(17*00C2X(`?ts~bEL@_j5!sOePg|2`WO>fsJ zbe4Pg$NG6wgU1Va28^Mj=Dm&qBZbCG!mSJS9S?0Xm!yF*-BqDStEXSDuheNZ?-MHP zjdVvWstH3F3oH3UBq~Vd4`%KBo}b>ddNLB!52C~k_FT=2$6R6J+!%ix4U9YHMzG1U zgJs0llSB|Rfs2?bi{YB3;Y%(zr9?%rL|eRF0pnM(w)~*bI}wDWuT64Rns|}9j62NQ zlY)A2#%Z#vk0PydcrpzKdjmWSz2^1*obEyHnydS>Ah zOKxAh40HbEL`f;xSS06^?uYVv&O7V61^3odVXH-#WwDro!Yr@d`bPizNYI+pn;5pe zkH6%Ex?@t!vP`FElk}Pdu*4kFHGXXUd)*9x=$?b%Lb-0gyb~4r4xoh1X_JYr;NBOWAa>HpU}I1IM&RnkSbx521eG**3}T;qy21Y zI{fB3pcgUd_{`LrO5*!_`0-hL;#_wI9_IuxxQFIS4T|53b!gF#+2$dGBb`Q;tfux- zf6#TbQqE9(iB(}NUp?g*C0n2GN;>eq-eLB72Zbpsd2z@x?d`9^;TUovE`UE}jHC@VyBy9H*`*vUVk9P{UInKX``aA8>A?`9K(z`t ziMyF95f2z>$FJ*-sc*Hu#MQiFPtNCspKBH0Fkafv(QL#tj)(fGANsjjj|2oiTXsEf zU!E}?j(Vn!=7c_L_jjr@Jd;O0_04oMbky?r zd^gG=m*Dfh`kNw4pZj%1xDUY>eBhIy;|wHk)|D>4 zLctP-zH+8u&YC_Z@vobt$k%7zm8@Sc7N5FY5lU`4eWa}+Dv%9zCH4D+6O%d z_2j8d1oeAw*IAm&_})$##wlwBjRLB!SyB{#4ImYnDnPAkeNI$4iGLt#*wH4WVzo@k z4e>i)nBM`8*LB%Ak?)!>Jb*A$=~iMy8_6HVnl85iLW9ogKJz}%ce$2lxa=p&-tQF?t#f~xl{ApJlUw(8mJQc9qpdtvU+E} zO%fUpm{t#L7q7=}H=p<3XYj^M1`u0*d}BcIX4deX)T)o1nA|%5Tw5bywiv;j^47Wh z+Z2$)!TrWTwpy427b@0`w?4s7h|33+R!uf;vg;U{KmuBl2dhCFGHox|J-_LG{m4Y0h zeJlArVZbp}DLMB&x!*U;Vw^W0X%gS_vvO^lg>LZ6uJNwEiX%RROTzjbilRX3CWnYP zAwnHco<=vy#~TF1Ek(7`(HCh)L;cEgq9$q#r){()GAbAa+k*UngWkn~K8vQ3wSIb%S;%&fgUQm11wZm7jwTv;J9TKJ0vWP zDKx|<0pX0BJLZxm@=!UZV^Lylt}F2Ps)m)I5eB1Y?iA6C;b=^+?=|@clXdfsn<>KF zhbVGC>h>Qg<1xwWl^;tysZyb(eH;D4zinA5obe{-(B+N~?$`USnN;RGKZXeU1=H}b zngjK51g8tM{BpEnujAPXJ8>NDC9Y0c($Dz;;9BJqZ2*zm8Cu!EE*{mYk)#L$Y2ZF0 zn)F<7$5whr3601a7Nd$xkNN{5L4St(44$?5ZFIjAHvjlp(62PIUNy8(4FC|I{&2Wo zuVB8LvWDv*a!9V!Vq%@8mT=&+gLxdlVDCQq_sjsWJ}{KaW)! zv3K9%z@-69V9G9r35&B+#cDWD;=?p;>$!4C4_UC+(yIGB5gnGid+W}D^n`azDZHa$ zxWVlx>i!Hz59!T*h*+&-`!d`T#nfr@ZaAYFGiS7J1D4PDL1u+Y$D#FC*8rqvt!I#U zW|Ah7_nIz$a*o#iL>Uqn#}^baZ0{8EkT*P>6xtQ~V-&7$wX#Pe3{M*)h^UjBr6Rgk zs7H4*=N{6ucRH_a{fLW0-hvJc#K1uUS(MF>I>(*SDq?E`G+*6wca#Grp;$hlqWuvc zYUDpB|H5-t&3Np)mp$9nJSO0P^U_Y}B=#u$+3?7hHGjA4`uSWUF7mTg0?Aow{y4{v ztH;WtU4DJdCtmq_*v~xst#%BzWr?|o`pV~iEOdM8*Wm)nmfTD&Li%IF1gni^bvO5~ zf3Zj4b)Ts$>83|_3cyMZejkmEly-hs@+N5E*PtMSAN(-`w{X-DVx`&FD;1IZGR%~OvkcV`BeomK?9O_0r;n&oSOvI!*y za{f;dms!X%X5oCuqb`aJv5vPDsy}#`DSgV=ko&Uvsz_@_$Y9RZ83TAelz2#98Sn*W%}phfhQ}WJAV@ zWO4CelL|7Q3lGe{u>_w>PHqZmbY3Vi<~P_+6aOU5@zb9QVYLINWYx7qRvv>S^%PLX z=HyUHuvwy|OyU+@VNETSuJwL7vSdeStfYLkZ^<4bu-$MZ9kYron@d?uaify*BW`L|0z%#2{oG-O2Sym&Ke=Ha0`3se*C_t@k(dT9%9E`nvDz7*~ZS zeM*G$Lr6Du<(oSyhIVV&eaQ*yA+r42u;olzG*XqHj5j84ro^lin^3Q1&WkHV&H83C z*Yu^&e&RiiO8gl2TwA67sIBMNS+I35lXKlX(tF7S`JFzz5LS;=Vn>lJZNoIxTJhdN z=sE^oHq@Jp96Pvau%)xZ)wYOku}Fj9Lrgl1`IDc4vieD+Mns}Pn_2VslXuIPqIM=6 z@KNNWQz{?E`q^I>(%UhG^+k3IFqB~6bpI^XmuwoQ zL)9E;Lwe0{t8?;bKs7OKp{mGxbf?`FO09v;EiS}R8eYmOV+MwT?5O`< zde~V`x86^^RNs;}0Gg_LH2O#h##5#5*~mv6%&dUVKX{e5bGt&fFVut?t67$ci0sZy z8VC-gLWY#TNc<`*=mAEH`#F5ox6ht7mfbmzi|>J6uT~`H5mWvgZ>{k}`n9P~uEIyh zXF{V(R#IJ}D^N0LYXYA_y+_qLRt9~Ij~)_1NU>S)0XB=gpC`n^zuLC=ZV&b+j!bP` zPM_4?`9`w5GSyerY2OU{6UFIUTA>g1)9+xS$OU9{N-4gaawHg(eIG-$5KG(?(yygx zg|K0r0K?qMW9ArD;Bi8*H?jld+>?Kkmk~Vc$I!D-LNH_wRg&gd!Y+)Tw%tMUe3xlL z{xHp-W@>X!Fnx(o#|s_%Yj(lL_TP{*`fM79Z=TPlm2G6;IWN=dO&!nsflDq7HunpP z{lgo$22a*a6w-*36~~tO} zBBq{<<`Cv6^SmTa$n@O1*woK3!1@Aof}X(!9#5hEyZkXFPK z+BC_YrpkW3!xV?x)29rgSpwFv%8K+m-L~^CkFshd*D3w5QZpsC^ILFm{m2NcR03kb z8)Kx5Fs6ugT2OS|N`z2MI(W==Afg zT67Eq*dlhF!s-cX1ah2477IEE_98xsKy2Ex0*nbhRGojlY_PyQ@AS_K48j8*JWe(St z8sbST3bdJjzkAf@IK1`dOTZ?%g=RI^gHZ^syiMe z$>&;*Dhw?KskFtYZSupQf-C`y0RWsGaCu(sJ62FgkAH5vg~V=-^qSi4G0Hm6Aq9t} z=+TA!-N`OaTkA3hZW&TTb}2N3Ab#(#@nv>tE*Q_Oze)6YI^RveCc8*!^0b^VD3$}S%%bat?--oqZq^2WHBboeo44-+uHp*O&k_@ z-z;wNiaK@|=rv&ihUK^nWYl#aSQ?4kOYO>sRc(9{SJOb%AmaW`FFyXz%Jtc|eual= zPsbb&&9oy-x_8Pg048hxjQ#_1+*GTsQBYrYp|XLmn~79!*VpHZcgT+)eqDU@)f#a~ zJ}><#G<{!LAZNFwoswUD8*-K#7Ph% z+jq3oYUWTE4iw5~chB#B4>!$$I7WJ8K33&7O2c7?C3mIJ*S>Yy#3Rw1>O@j_g-+kN zCmjvgcA`10iJybVyPfkS2qOPM8qQq|+vlV?m3;Lp=<)-YEM!@s zteD=Fn{%MpycF)as7tWIcQMB2lq@3iz~o$&(*lR(ggnuNpay=b%zVrqTZf3wYqgD& z<@EQqCfuZmLSbSAR~dN%u&+!jU(J1Bc9xf#9EpFwNxFv`?XYr+rYk@BR~CY|fTdp% z%7s&4(5c3@(gHoR(H{B?S={a-l{2#d$xOGUeWNa8*_$rsB&zNK_yf6&4}A3+M4jn9 zftbgMPjd5@hJBk6cwy0$Uo40SvEmWEE(^7xiKRl8l%-qcnI-vYYB5X&p1fIkK|k8> z-##T{F2+v{HZW^O2KfeEyn9t#|D1$xsl3TAS+Q7BaKSjNg*zmVLzS=JomV@I6`naq zmG-`F4SSE3!{EdYMSVGkd36aYpV zFcWBOphM~Co~X`(x{xgy6Nrg_#Kivj@tU`~XS)ouw=9x)#4r)2RaMJ<vfVM(zrB-V4n6Dgm_wDje^Xx!v##W`*rk!YMIu+BuVoRYIhFg z?9K8U723JF;q0$q9O_2}pr=`=6f$ncHDiz-f}Q&KiUNdiv}&)zA_nzNhMe<@`R8E) z^@u(X!TW%|R3j@GwE0LcdSt=E@KbF+I9jcFrF7&HI9>ltvW$AP)|Mg_3>>WvHAHqN zG8AGUmk8!lJ)X1Ul}O0=PDuj|%er{SS5x(5)QD64R}#xBOW=nq+X$cVf<#SLJf#Oo zY-&6uI3LxDlzUa=l~STE1RW+3D>bjAV?iS)t(7a)L*U|KyGlaBKw=2h&|wef*6A(F z!w0fj0-GfKSLSnC=*~!9% zH+sv%T(?p+n8$(Ch1i|9XK12@RZsJEdIB(D|K0KSJMypsXH8%qu5IlFryy=)S`n@k zw%9iqHO*Lz@@CZg;(W+8+jDu6nd9pt{nJW})jcwLkrF21>;?hNgD)G&OYDq70|C_u z=g;&P6%KPoq-oiSL2?sB-3o8O{%Dc-1Of98?5s)6H%?b(`A$a&n9)m?<<3|&h`OX& zQ&BG9_}>T!FuFhLrDQ**l_19ZtBt?+TmjG66X&zp;shVpTP*&H;3NQsMGYPsMk#ml zq|GRyc7S+NG^s!?aO+0E8LsS*CM;Ge;=$u`ON~1dYSMxk zEz+69#)L)El>C(ScdV_u$Abll8<%q zhMdLDKPa4o^w5R| zC8-0Z0y5J$KsZ7Tx}n5v$;jk7LXJGI&rF|MSedP0#A@8f83>qLP*_mm%@33yHwfX9 zFz-*#*rzz=C*zA$`KaJy8p~KfIv1JzdHJ{x9NoIKz5Q50|HA@NT>Rc``?dIoS?a`y z#iQRy?p8y@j3_?*!-YQ0#}m_N@4E}gMw5=PXsN$@al)aReVFS$HrQRoO8rv4f{I?^ zOEQj_!=czjQkk`m?)a(&-M+#=miCPIdz5ARsx^kfYW4&_&;j{X@#IehPjUA9+ncn} z*-zRb3|mfN?&zep<{r4tooaY+<}1c z6W#*z^#mu?hnpmW)*T~rB`mK#X|s_s;iZZZlgukVG+$W0Iwp?Hu1qiygV^V{4$?EV z1#uYqV$Tj#hjS75lN5H5rwdecVYe|Q0y&z;^^%7x>6Pa3zhgP+?FThle<^*repC?E z#E@k7*faTFJTC1^IyF^Drb3#D;6Jou|42{H)Z!HV;j4WJh3KXPAck|o0+7jR%@EAf zaa$;J&T)SsboA(N*^!jH|FjT{slzVm)1lX5pkO^FVu6~VzSHbH$HSCJNA(^lBrUUi z4n1`-^7C#4%UN>WIdAK`V>4e_EeR%NBWCl~RpK2j%?|lHBaAq~lqMOHhI1OzElOvhDhYwCx z2h2z<&mjN})ZTO4oalITo&S)OGe1(zRl#n-qs06weGC%mr%PVEg4UEP0-;J}TzCFA z^;jlK4h!abK?e%0NgYDd;b3!sIF5d}OflC_^GdNE+ox@Vh0`cQHRC@n*iyuiKBF9=R{pAjEqLg?V_t3A!N_U}^(0$%qlr zTis+#EML})DcDt|fa#lS$t4X_5FQg!5&!Gj{5pu1umUv#;!%XGQ1LX#C@ z_x9n(Puj5Vcp1+6&KYp1fbPwfGT_b}qNYN+w`r0$=$Qn{k#eVYE4WUs7U88BGAqi^kqWHjW%$m47)oC7eqWeX7E8;dh<-PjuXE1T@anccDf2=U z+6NFLf%x5ek@kSj4zujzfqdWku=M?7=w1n>O(phP*{|(hhaY#t(y&20Em8WyB@*}> zJPOe1kMim?@Y==SXn^?U9&7GJ@-lmRerC=MM^rT;t(;QSHVhmQE&Pa;A?mYhBPNOL4_kfp;p zHX<=#-{8uBn*M>xrom4(=rT2Yrhz@W>t;KKd((Ke6@h`SJ_R-Kapsn#R8oP@t1aKP z!>-L9aXR2su4)E`)Wx|g?LeHW&m~X z^7B-JPU(9VmPZsN`83o}J;W>bXApk0f_KNA`%u&)IPK`Tgt7&AG6_U0ibXe6!&vDT zrOtjNkA&atvi!nWJxGQ-l;3q;?x2b38?_AZ{^s=&H49Jt#^pwp*j!m$+l_8Wnd6O; z*Y*;7=|W%;kVz_nLWHK7usm6_F>x-xmH1<^QzI`>Cu*V zkv*rJoHPCMzLkf@lWAF^6w>L%l9uo+Sp1adwR9EP?p<X&d3nX3YG_>(ss&mo>vtZRdcmFlD?~O(<6}lg~(IldBhnRRhBI~Lj7{NrOLO!A~ zHf>QO!K#%ZuOoEC#&4dP4gJz=m87aB=sw?80ut(WI4=D?Gmf}$sX4R(T{s0{@~ebB zda{E261Ib(H-p~{qBWjea?1P8pBgSn(#;Y&XxjuUi~24lpgp9ZhVx-wg|z7J2J3HY zy-;@BpYIP1Y}1}cel9O_K4&I(E_3~LeixB<_4FQPwQV#$=?%CAiB`EhqGV98DC1={ zlvhSijipLzP&oB5OQ=7CY0>bB`xFKHxCVDE6#xJRTZoA%N{fm8fV^Z%#{|4Ut6PX!Y6sqECV<3?C-76 zBL$FC*xJf}Vpd*zP7{qFz>K~>Jz82nBBhv=k*x&}0OT5nRjHWGY8Z@GUJ2|-B4I~< zA7V43rb8Y*b-^SzI5y({dB2eTRbyBS?IgU9eF$W;=CW2SH^0)RKw>7LMJ-4}#$|S|v8s!`*9^=lN%9UK)uybDl_8Dj^sR&Hl=I+gHs;cdMjoqt6sx7rouHIo z$;nOfPFTo{hS)gbv_*!n)W5^VOFkP>O58hOJ`4A<#C@QgK_KAWQVKz6UPXKkTwc_^ z4R_$CBR~WjkZcXk~0RGC()6mhrK-!r{V6M;8&si2% z*RV;1j`i(aU9K;?3y3UUb`faG$%2jTY?vV?c1EVm?l$%>y9@vTej#^zh_RKaGlh|< zxrMC&)p2Vl6@`U~0F?%(97xVy%=Dv$l&7Pqil@A)v8R3NbrJQwk1d4rUOOgu8_+88gSy zH-8}hh9Pe1Wb9~R?`&abOYsL2Vr1vyEI>u|Qcv*@|7`5#-2XPUie^fhuE{Q zGJ{xbY*_wX!^v5~^#$bb4*g#>oK#;nW3VWjI@!568kbA#&5Nkhi&fVDFexc5r}$5eKNOf-*x3K2^+NW4NIF}X{fn&s@a<2{U*Y__ zBQNUz#QhKHf5iTm@Qak399Z1W*yWFV(&7SCf9!)z?2Ii;z<*tu8nJRhcukC$c-Xig zOdJp%2or=A0%0-L*-ifqO4`=R8DeW}`UmO-oY~?9hm)O?8^p@Z&GZ6g z#>8O)0Wlfz@|rTSavDQ8dD+Y$+&n!02BF|+@sgDg>wov^50uFZ6ptAQ!p>^S%f!J6 zGG*dmGXgR3@Nk$iadGi-aC5V4kX{6H``R zQwS&bf1*3tnK`>b98E>cUm|^p<|TptiiU#rFDmK&Q`+sL=^vgzY^+SItW0cds;ul_ zHcl`bFB6Ch3<6QH{5@cnKfU@N5%aVBe>ma)OW@yzffv2MmAwovFQXO9KZmQobM}YE z|A()?x5fWM3op?BGxA^Y`#-w=N7sMFz<(wDzwG)SUH=sW|CR9nvg`jhx={YL;4!s* znFYDMEN4c*>vAtkAq1ljlHz|YiU7A_t$r_8$o5iNP5=NZ?waR?%hMIWqeq8p`dDiZFK1Ce9!|c2| zMciHMkH8L_BNv`*>6i#@z3YJ=)jR3odd6MK*<&X`2;{w=l@!`Gi=#=~9IiC*%p|)# z6uLQC?G1fWwUU#e!@^EbR+RC_6N&4bAtl2K2n=)@#)_NPjp72mQm@GBwE|$7HG1w& zR07-&?t1`RE_WMtPt)C`e6IYhO-)sK2_e%&V0!cN+{A#1IapB}Vc}N*ePgPcOMB%2 z=-nfy{o2Dm6_$g&JOwqyzLnMXXtt2whDwb0-IN;%bkuM4bf-UA{^9W~YtvYXgz^(r zpAsDD?LJD-C-heUagM7IVY0w%XsMRIVUgCv&2u0!3Z zT8p1gXCx?w3?U%)vP*UyRQ!RZ_MhMM!5(`ZxP=P*uD^2A7u48Sluu!N?&7{-GBYs= zwAR(t;eEqit2<8V0B!-uS?T-^=ZQypCIdobJXRZROy=ysrXxdRc} zP7lx*^x5m^4aHbo+`qJJjafsI;TH8k=hoKXID#$0CFKX?Dtz<~H1|KF2!rJfP(gVM zqYOihrUZu#Ur1Vq^mZc5dP5|PQT?iN;c*RhboqXeVcGLwrTe<25x(nK=z$MW{bdvG zM_-74opOF}sdb05WxiXX;<<=>1_qQq!vj!+0L-@ltihqshoQky`8z?CQK%+v$jh-M zun*@O&&JmM?lBdB?xqZcm+CD150agQ6?!dKl^W{mOT_)GYqX;A?%S^|NO{^;v>P*X z$nl1Tk$hljFHoaACbvY346bd1EXQ=V3hAe@>y&pe5qwnexR*}5zZ%>W(qucbv*u)* zUX!&QtyJqzi{a2n#piAI>Hdrw@7th}{WNw4JRGVHzof>^IJ>HxS29vI`DmW_gvtJf z#Sz4gq3?F``(vF43sfi@jPh`5P9|vI8^!JG^gQ^Kf7=W%t~4p5_RXnInIMgW+e~?M zzTo?m+oZ1DgBUp4+b8Oy~Xw zp*w%_=hWNg;G|63&xwAWGBKsTJT#g*twEK~^E25zE_*_LSGeTQdGph7`hJ_Tc%>H= z<0qwttHQ*uB*ZTCh*7wi%|FoOm)m`dP6|A@1Il*H+=Tv^(YDfcKVQ=`AI*pWq}Tv8 zH8uN2GWiaN8y7NcZEe?XPS*)+qUpI1lv|PxU2=;24tQ8g$@TSZ&EMtI$-x-%tuhED zni3whonx42k$bS#@GZ4%4a!$7kCH@eIFMj|q3y}q)FVLK@};nPT(u9oz4ah}r*+nC zxKe>6Jh#saA%poX4VcjXv~S1raP^wxyVq4Lwg#8(C@mGyxl1j-e206@2rJ_}B*|0- z5StgBI)e;-)3g0_#Cd^1-qj&t$O>BrlR%W62!rQRfh-k%+Gp@U>3bF^b3%g%!TuS zi@9E+(e;owjj)5YIXEM{!Z0F>c~-y?On91(d&kGr0le48&nJ>5CE`-zjy#CUD5%K2 zT_U(3j;_+ut_38`G+6w5{hy|0bM9@^6bE2uxIzV?nEd?wVgQfN9fvC^80Mp;dfVVe zX@{%aO5B+*4?7>@1)R95dQ`kZCNg*%Wt)Tp8=rjzCQsI_T^$v;LAksIsm~isvCj^>qyCK(w0%i3P)up~)=ggV5Sa z23{=yRFW~KTi~$78n!kt@RN|50R=dXV%UL*rkqnbPjR5HCF(oR0=dRSFFXs3$Ea%a zqhmzp?}a%G4VdXc?A7enEwDleYZ{*fAf2~3kwL>y!axc1oO8h3G*X}#DjtAYhvEa& z7v|zs6$o+Ru0x>ScoHs1#6JK}4CdRrim#7~H^TRnSg!!hkiNl5C1`(z0y?zXb!wi7 zavY(jf%=93DKktM1vCO1&qomsWkgU$e_O)j&7C;ok1s7VtRi`i8{$k5OB^AaJ_jcY zQ7=Tup*>SeK-;0lplX;FRDy+3gBAf20BGetCQuj@L;{4aC%-S2v_ktJKJoeFCiN#? zt&<95yn(f}ykf-nw;w$L3Ch7?P{4&UJZrDzMb&;r%rb_rZ6z>G8S`z}L zl|_IdU1cz*-GMQTy=-%zX2UDq&CHnwo1ape#8TV8QL!rc8GujmS$GGjQ*Y**Dr2!1 zHXyMeXJyzp{=^mrwTzYE;*luC6gB_y0umd>6--DWI{kst+H!S&DpeW^cU-K@O#^5x z2>ivoIlpO)q?(98jF5tygq+mghfRcwQa_@GgQYKv;guV$r z(vEb}GnmlMg8}Ha)rAvZv)qt$5ux3|vU38ordd*Ev9YP816X|RgnT!)+M8U-!hX_& zCWP^BtMUWAv^i_1p*0xKclj*qzx5;?=Hspv;JZ%OznyN{@dsw#?+8E(CZ2xMD?aF| z`QfNSS1*6DwE3rF8k_+L)@vBk1w~Zw+DlE3TcMO_MsUyi=q9~+u0(ZRJ@6?C18zKn}rZS zDq*P8#cSxZv3`^l+)%p?;y}^1@|OVyZeFhx`#rIH@6SK`N@%PB9%gPEtInPb;EFDu z^t#2O?11m}Q(BBoA|15%cddXw+bm~Muy>`b!e%cF3ZQYokqThzme1zvEd+5>Bgw;Q z6}uT=*@8Wv>eHPnnr8FX;&)f_6k5%nXeL&mGb7x*BDfqZEAt}wkt~7MX1ilSAodrY zklJ4Svk?ErY5xF!QlCg_)>T(>#Fa6BIP;0@0a{EF)7CL7l2lkvx~iJ=t_AEd8yke& z6GmaB$Q)HnDwv<@FJCR(K2#h++=$rKaCr_Sfjo8{b#>D33~e^LfAb<<6v-KDaFS(m z2l})Yt0^nc2e&$8wu-j?m~+eA9)fc6ChUm?btfI>2&HuJEs&#S@DO5;Q-mASGS7vn zz>3@YH!{Pb3JB?P=oeaP6bw#OkYd@M^=xdIF|c%!0@MMlymixt5Y6hZ`qSwhylI!7 z^5R?o#+Urij9kvA+z2iVffolrk=Yg|`0|<&maBUh(h2ZSi7tt zWx=Li9%cYpr7||J&hZH3+xN)Agh1$svQ6j{^VowX4BmSTm3JRhnbRdZ*7~?2C@4|O z0Mnd3UgTY2^<6c=^=3b*Pi=q%QSVC`(Y8s}ep7NsW;8l@o}^V0@H}-Zj(%C z=2qeJBDS|E-&lr&CrDQVFSvEd-_Fg2%Ued>4q|97o=AUSL6~SN)8=FR_ysDFaF-7< zMi;(t?a7&EjPyr(BZnvZ13IS!-}52$R6@;*ap6!Kchb(sd0<8KLX2QCQ1`_SBw@FgQY!aFDwDUTu_n zL({RIn-3U%*PwCdC(Ssn47G4a-Rh^NH{CV9nV^P^^bac=MHANFC>?`dq|Cp`@1T7vIJIoS$X zuBzt8)U@*MfH0O-g9a*w(S$2!*n{c1taI^1TEFbB{%AUR1xO?hlL6q7;PKMlM8~DY z3iC)(*M9e7Mp{EUK$;%cticWF5{XJ?KRKiKUPABEj_4s0S28g}ppg6Z1=MV8ru-?k z2?oO3KXMz7fj|M<)#FcTNNYp@N?_12MUpi%0*=p~VATNO{9*XeL&(=S`Xn|h5(&P1 znGU7DLJqFSpJoXgAw#I2CYDg*u|mhjb}gkW^MEx8Rcr%FVW3bH2dOeC98;u_+zqrD z&QKR_KXa&Q3p z-Bz3KAW;kfISihaD`Lv+?Q@E~O03QfRBX6cBSoCf%D|~?rzE2FTn1!SSP&kqU{=19 z1vhrQ0%-jJFhu}Gx6R(6oc4@r^n8+G|8^vorcT~Z7QCpId5T+s!KcRQ>A^4GcYLj; zn$1=mYB};+iNOagdLDio@!JSa(lr-XNdJJnvCY=wzE?m*|3wHj}6Blx7lKs5WpT6+6ypxFcd_CssQ8x1S2R=m{`Ms n^ZsX4@&?8bxaVgAzXxusenRbOyd(5KKgCE($ctBq8V39yEL=TL diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/spreadsheet.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/spreadsheet.png deleted file mode 100644 index 710efa631bbe46a69e7d43808c675b0f5c2411c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 707 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy#>i=8|}I5;?NKlFb92xL>4nJ zNUsNB#yF{oGC)De64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1U#L5e~$ zOL9^f0)R3_3ZBXNc?uyJskx~NA*s0qIf*5ykA0+kAalscA{WaJky1SjSyc%+tR zmXzFY>2w2127x4<^9w4AGSf3k7@VCI97{@yGLuS6GV}9vgEN3maLmcfPF2V#DJihh z*H11=O)SYQOHIzt&CSm%2DwN-Co?%UuQ;_>KdDl;I8onN&pjHh&2juQ60FprD3nqb#g8ju=dvf#l z7rV~$aGeiCp6-jiz1R4Auk{DY`fUgbSP~q(B0PLcbk?3cpyJje?d?aq=3id8;PRq{ zmlrL)wtVfa_3LhJ*nV&4|NsBZl4mjk-62{MbP0l+XkKZ6g@< diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/text.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/text.png deleted file mode 100644 index 2546fcd90b78ab5752f74234520af202a6c3987b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 798 zcmXAlYe-XJ7{}kuB}=C`tC3Uis2C#YEF(%oowrN5E?>zZM=u=!!)$Hk)mC9(O>wRa ztp}7FMumD>MN&vAS7Q~pfuQN{Z5`z>l!S*Rq_&wNlqwpPlwd-drieN{O^})_sR}Fz z8;E)wQ_-|GPasfGxSS>$aRsSXlNw#vk)VN4;2IsS6Vx?l>Ewdk>>NQ&YxNMQKNTO7 zl|i&xt#-TJ@AuEm&3V0Ehr zKmx%31Q;lRal74+_xJaM_|(*t&1RdPo}QVRnVp@TpPvUFFc5()%gf6EgXYT0%IfMW z7=Vpn07O6&L}2y7b9YXF(PUauDMg&vSYE>31A3#Wwe5Px?T3%Y#>cG-&Ly`u5Dfiv z4d-1#h`|??3T3JV|KwQ-Q^;v|mUFqm$Q!9Hd?=PZ8S}+wB(iH?XMS864LScrkDYpO zq(^b9EU(~AbKi*BvGM%Z;IrkV9%D!xcquds+dsF6t-bHn;)u?m3SshkMqElKD#~Ft zzKiPIl3TmOXR1P|+k|#8n7f&gJ6UlP(HXtG0n2bYC&ctdZXd8H6DQQ7=*u#$Gc`@j zOG)MYU~KvaIr^iozD2e@aiyOuz+~qGBf=|9EOs1rC%K82rd64gp9(Qc?ox7`qifS$ zhy@>^@%xDRdtjr6wV$w*vv`E1m^CWO4=K1F!8X=g-_0UrwK;PvXzd%yk7wArTRwcf nSXpJ**OfNuzE@@2Gn)FB={Hgt{G?7Rd?*r?RhF8IYp?zTm=%Df diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/trash.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/trash.png deleted file mode 100644 index c6514b98b5644a1398e5b94566627683bdf8313c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 989 zcmV<310wv1P)15yzTLCe34-$-L*zeV%iVi<#7%{pXzDkMHky2mk=z;1Ymqjw*`_ z;l=cX!@yxS)3eMo)!7q(s1S;8XDeoIfk&q@7uoI?s zN^{=g#zud^U7~af3UN1l@tmQLOr|QHWPuroi5&@B4xE5LwSSN~G+$j==zSl}UMNQg zyH_50>t(Oi+-x&5w89uZw-ptSj&|nuPG2fiPCt#GwwmD#Jm6oxx$^wCcxirh-cQ9a ziluU6K|Pn5D~^E<4p7JT?N5^#IMVgKv(20OG$aWqB{-E1 z9oKKm#x_8Yf!EY3G??PhH00od3`|8Cr#dh|?Xc^Z-nF9>;EQ2fnv!5>XX9e5(~w%Q zWxxzw@&_hiR$9Lcoc|vHx!)lO6-mr}?nq6T47i&p1j1BE6+d+ySi293cx+=BS^bPd z2pc)RW6($#nyaDBQ#bUD)T*xo(~>w=@g&O4P0907%sO^H(WGl-(aW~-b3x1wa&{7m zuWn2M!9yrPfv)`{h@?zgx|KUDMpnH#&O}b58kogEan(fp3IGm{0yF@Eai?E1TUpQI zP%w=Iic?7KIfYR^3~mA204Ox%tPdgo9_IQMM*@lfDHI}T5|U27TT;IPe*mD6XwTM& zhIg`@LxX@qgMnb0tVSaItJ7O4fL$Dd0pPc<&*3~0q)-r0(BKH6aSoNuc<)UB0GrMp z6mp=g$)0LI{yHl_Lcst-1y5iV&y7F1{N=AVPXJ(u4pd6_>+}0v$EYsS1=O&N8hVrM zpZ|RC94JwwF%&23;_5K`+J-nN-|HR00000 LNkvXXu0mjfZ-lz6 diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/video.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/video.png deleted file mode 100644 index 55afa98662c7439702c4391be32151b59c65e253..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1313 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf4nJ zNUsNB#yF{oGC)De64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1UVK#D># zOL9^f0)R3_3ZBXNc?uyJsky1DHrHsBf%ipdZ&9wFl@+Mo$;Vkcv5P@A_uQq{heETG?y0yzC9fraSuz>xc-iKB^S-C2j9}#|+2Trc2JzJRTnfTzEQIH^v=t-uh~( zxc^nT;G^AFyj-F_E#k~I^^GcclIec6N$|KDEZ^HL2yRXD%)^JLrNU0ZK4B(tA;`e?y7+bL3Cv<0)SasI_CAaj~N#c(YL7*x>s=RUEzB;@PrBh& zH)D%og8`esF@{4D4id~9$qb1+3OxwHP0QHrcBOO2*;w_|95lANuJ3MPXxI5(O|0kK zRl|QgH_Ue({_&96Vc&zq|1bC+7nk<1Yuu@Ae>qY6-K)v7Yqj^V-D!HvaJ2dMZM$~H zu!p<&;w*k~%)4!W;alV}{X=v0Uhk~<**mx5&CKevXN-+f=bm`FyWqv#SP7|{IXP;~ zcdqPSDZPH*cNRIBH>Ot885zEOeQr=yWB#r(Ve!YC*VuRDXUi=Ow$PzK?rCL+Fg2guB&_nRD$dv!BcjdVIbiOV!A>s5L(B z_M7webFwb`{Y$Vp;Qn~>iWvW|`+K5R742;lemwcu^H&o81xx0 uulP@kQGh{%aR*z&{2E6WF!;j1pYh0Ho3#3@qwc_>hQZU-&t;ucLK6Tg{6(q& diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/web.png b/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/web.png deleted file mode 100644 index 17017ce3f5c04869fd808d91732939ea9b32b36d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1845 zcmX9-30PBC7JeZt0R&N&im4Vm5LuK(q#_nd0tCVUMu-({*@BToAxV=L*+e!GkXn@r ziUOk+5JanpgIGYI)*&h-ERqnyl7#n?m%Ok@b?nd&oyW}mzH{$?&iTLZo^$Vi%IPuT zRu-Er006L}MTEv;XY!g6@Yp_1EnQ3Cg%lctKp-eo`<0k$&W|`O1OVdwHNz!tzVs;; zbOgiV!8qPAFf&EK0x~l*JvrPH!qgN#%abQayT0({W{mXN8i~OH(^&u=%LtrksXVR| zgU!ldIWbrn{PYx%HMdbK!l)b8sALhy<_Unflnkc`Rwf4oXU~*Vv1II8GK9y^7I4zo zAP^GbLTopXZa#0EirfR|UQfRzGrPO?&Y85umTaIGS*bWSRZ zD`W}1nAtmpDPF#w-d>5tN4f#P=q^2q5r*9|K0dBcDCXzqr>3S*6jdsf7@nJ(TU=ax z^X84gV89~F%gakkOIT!KVF5u9wOXxGsW2B?7{Cbs2N(x)F^*QN#qdzr=R?%L4N;wk z!d-?UTqF@B32nP1(p3`aCW-QpM0-eLeI#+d!*tK#Sf62r@5n*Fk;8jOjs%P)QO1%f zW6aR8RO;B#@Yly8$2rmC=?Ab4>^;QlZta9Ma9XfOQ)x*il%Eyr)$clua!?v zPtV-AI9ppWTYp~JP^G+GgLR~8tyA6mhwA<qq?n0{jdpZeC|;T_Bc>935wYc z?RSIdZcyw_h~Wtx^oEXn0e#~Sb>4-#9zZ=0q23Ot{|WT03#PlnhkW70eQ_glMx^$_R@Y<)VrQXIbz5PntJ0g8Rbn*LUbxsP8jj*_-Z(cX zN{bSF%odkOt+)PVn?cJf{v^KG_!od*Z`y6_gfo9@lyz1e6<-f@N(DIgw^V+X{8VBDgh-5c#-s8%>=Ds{ zKfZ$B2p)baC-hl5^DPUkA4$M1z~aT=lsHFr2wwAQ^^hG?0?{1_9}F`e&AR*C-`<=x z*RYSBq9v~+{b;!tNT=fS*ot>s1gZ^;zlQsQ*$T>i*<;Y?y|^T*Id-^@z$QlD35-#i zJ2sI;MpjWp9kw)4zj?RIGhcdL7=G-=JU=#Yy(dm>A@;T}0CztyE+AaJ=M8AMMO$_| z7Id+bi9q0dam5HecC>c_tpmQK;`iVX>Wcn}ut+z3R7*7gNk8~2Q z1}q%HZJIat|JlfU$d-TD#L3I&q0rktK6eLt#iF1#&8Ilzqp1VwcF)ZjcT=&PXup+d zrtYX6^88blp$1-*%0m?Q_y0cl4qR{hAfh?`YOtxbIN6Bo?^I^~=S_`RJz#u_xuM8K zT55i|B_nE=rK5wevMuH?>Bb+{SGUyyyt<;S|E!pu1J}QO|8A5sa;v2BD^p^p&yHcv RE^NR6T3Afz&y?h%{{oe`z-j;h diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/key-bindings.json b/debs/solarfm-0-0-1-x64/usr/share/solarfm/key-bindings.json deleted file mode 100644 index 83e0081..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/solarfm/key-bindings.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "keybindings": { - "help" : "F1", - "rename_files" : ["F2", - "e"], - "open_terminal" : "F4", - "refresh_tab" : ["F5", - "r"], - "tggl_top_main_menubar" : "0", - "tear_down" : "q", - "go_up" : "Up", - "go_home" : "slash", - "grab_focus_path_entry" : "l", - "open_files" : "o", - "show_hide_hidden_files" : "h", - "create_tab" : "t", - "keyboard_close_tab" : "w", - "copy_files" : "c", - "cut_files" : "x", - "paste_files" : "v", - "create_files" : "n" - } -} diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/settings.json b/debs/solarfm-0-0-1-x64/usr/share/solarfm/settings.json deleted file mode 100644 index a67c142..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/solarfm/settings.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "config": { - "base_of_home": "", - "hide_hidden_files": "true", - "thumbnailer_path": "ffmpegthumbnailer", - "blender_thumbnailer_path": "", - "go_past_home": "true", - "lock_folder": "false", - "locked_folders": "venv::::flasks", - "mplayer_options": "-quiet -really-quiet -xy 1600 -geometry 50%:50%", - "music_app": "deadbeef", - "media_app": "mpv", - "image_app": "mirage2", - "office_app": "libreoffice", - "pdf_app": "evince", - "code_app": "newton", - "text_app": "mousepad", - "terminal_app": "terminator", - "container_icon_wh": [128, 128], - "video_icon_wh": [128, 64], - "sys_icon_wh": [56, 56], - "file_manager_app": "solarfm", - "steam_cdn_url": "https://steamcdn-a.akamaihd.net/steam/apps/", - "remux_folder_max_disk_usage": "8589934592" - }, - "filters": { - "meshs": [".dae", ".fbx", ".gltf", ".obj", ".stl"], - "code": [".cpp", ".css", ".c", ".go", ".html", ".htm", ".java", ".js", ".json", ".lua", ".md", ".py", ".rs", ".toml", ".xml", ".pom"], - "videos": [".mkv", ".mp4", ".webm", ".avi", ".mov", ".m4v", ".mpg", ".mpeg", ".wmv", ".flv"], - "office": [".doc", ".docx", ".xls", ".xlsx", ".xlt", ".xltx", ".xlm", ".ppt", ".pptx", ".pps", ".ppsx", ".odt", ".rtf"], - "images": [".png", ".jpg", ".jpeg", ".gif", ".ico", ".tga", ".webp"], - "text": [".txt", ".text", ".sh", ".cfg", ".conf", ".log"], - "music": [".psf", ".mp3", ".ogg", ".flac", ".m4a"], - "pdf": [".pdf"] - }, - "theming":{ - "success_color": "#88cc27", - "warning_color": "#ffa800", - "error_color": "#ff0000" - }, - "debugging": { - "ch_log_lvl": 20, - "fh_log_lvl": 10 - } -} \ No newline at end of file diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/stylesheet.css b/debs/solarfm-0-0-1-x64/usr/share/solarfm/stylesheet.css deleted file mode 100644 index e802040..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/solarfm/stylesheet.css +++ /dev/null @@ -1,165 +0,0 @@ -/* Set fm to have transparent window */ - -/* * {*/ -/* background: rgba(39, 43, 52, 0.24);*/ -/* color: rgba(255, 255, 255, 1);*/ -/* }*/ - -box, -iconview, -notebook, -paned, -stack, -scrolledwindow, -treeview.view, -.content-view, -.view { - background: rgba(19, 21, 25, 0.14); - /* background: rgba(39, 43, 52, 0.14); */ - color: rgba(255, 255, 255, 1); -} - -button:hover { - background-color: rgba(255, 185, 25, 0.34); -} - -/* ---- top controls ---- */ -window > box > box > button, -window > box > box > buttonbox > button { - background: rgba(39, 43, 52, 0.64); -} - -buttonbox > button * { - background: rgba(116, 0, 0, 0.0); - color: rgba(255, 255, 255, 1.0); -} - - -buttonbox > button:checked { - background-color: rgba(255, 125, 25, 0.34); -} - -buttonbox > button:hover { - background-color: rgba(255, 185, 25, 0.34); -} - -/* ---- notebook headers ---- */ -notebook > header { - background: rgba(39, 43, 52, 0.46); -} - -notebook > header > tabs > tab { - color: rgba(255, 255, 255, 1); -} - -notebook > header > tabs > tab:active { - background: rgba(0, 0, 0, 0.0); -} - -notebook > header > tabs > tab:checked { - /* Neon Blue 00e8ff */ - background-color: rgba(0, 232, 255, 0.2); - /* Dark Bergundy */ - /* background-color: rgba(116, 0, 0, 0.25); */ - - color: rgba(255, 255, 255, 0.8); -} - -popover { - background: rgba(39, 43, 52, 0.86); - color: rgba(255, 255, 255, 1); -} - -/* ---- make text selection slightly transparent ---- */ -* selection { - background-color: rgba(0, 115, 115, 0.34); - /* Bergundy */ - /* background-color: rgba(116, 0, 0, 0.64); */ - color: rgba(255, 255, 255, 0.5); -} - - -/* ---- notebook tab buttons ---- */ -tab > box > button { - background: rgba(116, 0, 0, 0.64); -} - -tab > box > button:hover { - background: rgba(256, 0, 0, 0.64); -} - - - - - - - - - - - - - -#message_view { - font: 16px "Monospace"; -} - -.view:selected, -.view:selected:hover { - box-shadow: inset 0 0 0 9999px rgba(21, 158, 167, 0.34); - color: rgba(255, 255, 255, 0.5); -} - -.alert-border { - border: 2px solid rgba(116, 0, 0, 0.64); -} - -.search-border { - border: 2px solid rgba(136, 204, 39, 1); -} - -.notebook-selected-focus { - /* Neon Blue 00e8ff border */ - border: 2px solid rgba(0, 232, 255, 0.34); - /* Dark Bergundy */ - /* border: 2px solid rgba(116, 0, 0, 0.64); */ -} - -.notebook-unselected-focus { - /* Neon Blue 00e8ff border */ - /* border: 2px solid rgba(0, 232, 255, 0.25); */ - /* Dark Bergundy */ - /* border: 2px solid rgba(116, 0, 0, 0.64); */ - /* Snow White */ - border: 2px solid rgba(255, 255, 255, 0.24); -} - - - - - -/* * { - background: rgba(0, 0, 0, 0.14); - color: rgba(255, 255, 255, 1); -} */ - -/* * selection { - background-color: rgba(116, 0, 0, 0.65); - color: rgba(255, 255, 255, 0.5); -} */ - -/* Rubberband coloring */ -/* .rubberband, -rubberband, -flowbox rubberband, -treeview.view rubberband, -.content-view rubberband, -.content-view .rubberband, -XfdesktopIconView.view .rubberband { - border: 1px solid #6c6c6c; - background-color: rgba(21, 158, 167, 0.57); -} - -XfdesktopIconView.view:active { - background-color: rgba(172, 102, 21, 1); -} */ \ No newline at end of file diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/about_ui.glade b/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/about_ui.glade deleted file mode 100644 index f559f6c..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/about_ui.glade +++ /dev/null @@ -1,390 +0,0 @@ - - - - - - 320 - 480 - False - 5 - center-on-parent - ../icons/solarfm.png - dialog - True - True - False - center - SolarFM - 0.0.1 - Copyright (C) 2021 GPL2 - by ITDominator - https://code.itdominator.com/itdominator/SolarFM - SolarFM - Copyright (C) 2021 ITDominator GPL2 - - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. - - Lead Developer: - ITDominator <1itdominator@gmail.com> - - -SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspection. - translator-credits - ../icons/solarfm-64x64.png - True - custom - - - False - - - False - - - False - False - 0 - - - - - - diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/appchooser_ui.glade b/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/appchooser_ui.glade deleted file mode 100644 index 6959306..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/appchooser_ui.glade +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - False - mouse - splashscreen - south - - - - False - vertical - 2 - - - False - end - - - gtk-cancel - True - True - True - True - - - True - True - 0 - - - - - Select - True - True - True - - - True - True - 1 - - - - - False - False - 0 - - - - - True - False - False - True - - - - False - True - 1 - - - - - - button31 - appchooser_select_btn - - - diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/bottom_status_info_ui.glade b/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/bottom_status_info_ui.glade deleted file mode 100644 index b2dd13d..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/bottom_status_info_ui.glade +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - True - False - 10 - 10 - 10 - 10 - 6 - 6 - 15 - top - - - True - False - - - False - True - 0 - - - - - True - False - - - False - True - 1 - - - - - True - False - - - False - True - 2 - - - - diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/file_exists_ui.glade b/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/file_exists_ui.glade deleted file mode 100644 index 70d7291..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/file_exists_ui.glade +++ /dev/null @@ -1,337 +0,0 @@ - - - - - - 120 - False - False - True - center-always - True - dialog - True - True - True - False - False - center - - - False - 5 - 5 - 5 - 5 - vertical - 2 - - - False - end - - - Overwrite - True - True - True - - - True - True - 0 - - - - - Overwrite (All) - True - True - True - - - True - True - 1 - - - - - Skip - True - True - True - - - True - True - 2 - - - - - Skip (All) - True - True - True - - - True - True - 3 - - - - - False - False - 0 - - - - - True - False - vertical - - - True - False - Filename already exists. Please rename or select an action. - 0.10000000149011612 - - - - - - False - True - 0 - - - - - True - False - 15 - 10 - - - True - False - Moving From: - - - False - True - 0 - - - - - True - False - - - True - True - 1 - - - - - False - True - 1 - - - - - True - False - 0 - - - True - True - 2 - - - - - True - False - 20 - 10 - - - True - False - Moving To: - - - False - True - 0 - - - - - True - False - - - True - True - 1 - - - - - False - True - 3 - - - - - True - False - 0 - - - True - True - 4 - - - - - True - False - 20 - - - True - False - Filename: - - - False - True - 0 - - - - - True - False - - - True - True - 1 - - - - - False - True - 5 - - - - - True - True - - - - False - True - 6 - - - - - True - False - 20 - top - start - - - - - - Rename - True - False - True - True - - - - True - True - 1 - True - - - - - Auto Rename - True - True - True - - - - True - True - 2 - True - - - - - Auto Rename All - True - True - True - - - - True - True - 3 - True - - - - - False - True - 7 - - - - - True - True - 1 - - - - - - button5 - button6 - button7 - button8 - - - - diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/new_file_ui.glade b/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/new_file_ui.glade deleted file mode 100644 index 8b11ea8..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/new_file_ui.glade +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - True - False - gtk-new - - - False - False - True - center-always - True - dialog - True - True - False - False - center - - - False - 5 - 5 - 5 - 5 - vertical - 2 - - - False - end - - - gtk-cancel - True - True - True - True - True - - - True - True - 0 - - - - - Create - create - True - True - True - Create File/Folder... - create_img - True - - - False - True - 1 - - - - - False - False - 0 - - - - - True - False - vertical - - - 500 - 26 - True - True - True - New File/Dir Name... - True - gtk-edit - False - False - False - False - New File/Dir Name... - - - - False - True - 0 - - - - - True - False - 20 - vertical - True - - - True - False - - - True - False - 15 - Folder - - - - - - True - True - 0 - - - - - True - False - 15 - File - - - - - - True - True - 1 - - - - - False - False - 0 - - - - - True - True - File/Folder - True - - - False - False - 1 - - - - - False - True - 1 - - - - - False - True - 1 - - - - - - button9 - button10 - - - diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/rename_ui.glade b/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/rename_ui.glade deleted file mode 100644 index d06e7a9..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/rename_ui.glade +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - True - False - gtk-edit - 3 - - - True - False - gtk-media-forward - - - False - False - True - center-always - True - dialog - True - True - False - False - center - - - False - 5 - 5 - 5 - 5 - vertical - 2 - - - False - end - - - gtk-cancel - cancel_renames - True - True - True - True - - - True - True - 0 - - - - - Skip - skip_renames - True - True - True - skip_img - True - - - True - True - 1 - - - - - False - False - 0 - - - - - True - False - vertical - - - True - False - - - True - False - Rename: - - - False - True - 0 - - - - - True - False - - - True - True - 1 - - - - - False - True - 0 - - - - - 500 - 26 - True - True - True - Rename To: - True - gtk-edit - False - False - False - False - To: - - - - False - True - 1 - - - - - True - False - True - expand - - - Title Case - True - True - True - - - - True - True - 0 - - - - - Upper Case - True - True - True - - - - True - True - 1 - - - - - Lower Case - True - True - True - - - - True - True - 2 - - - - - Invert Case - True - True - True - - - - True - True - 3 - - - - - False - True - 2 - - - - - Rename - rename - True - True - True - rename_img - True - - - - False - True - 3 - - - - - True - True - 1 - - - - - - button2 - button1 - - - diff --git a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/save_load_ui.glade b/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/save_load_ui.glade deleted file mode 100644 index ba42cba..0000000 --- a/debs/solarfm-0-0-1-x64/usr/share/solarfm/ui_widgets/save_load_ui.glade +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - False - dialog - True - - - False - vertical - 2 - - - False - end - - - gtk-cancel - True - True - True - True - True - - - True - True - 0 - - - - - gtk-ok - True - True - True - True - True - - - True - True - 1 - - - - - False - False - 0 - - - - - - - - - button11 - button12 - - - diff --git a/plugins/thumbnailer/icons/icon.py b/plugins/thumbnailer/icons/icon.py index 79903ca..5d742e0 100644 --- a/plugins/thumbnailer/icons/icon.py +++ b/plugins/thumbnailer/icons/icon.py @@ -29,13 +29,17 @@ class IconException(Exception): class Icon(DesktopIconMixin, VideoIconMixin, MeshsIconMixin): + cache = {} + def create_icon(self, dir, file): full_path = f"{dir}/{file}" return self.get_icon_image(dir, file, full_path) def get_icon_image(self, dir, file, full_path): try: - thumbnl = None + thumbnl = self.cache.get(full_path) + if thumbnl: + return thumbnl if file.lower().endswith(self.fmeshs): # 3D Mesh icon ... @@ -55,7 +59,7 @@ class Icon(DesktopIconMixin, VideoIconMixin, MeshsIconMixin): if not thumbnl: raise IconException("No known icons found.") - + self.cache[full_path] = thumbnl return thumbnl except IconException: ... diff --git a/plugins/youtube_download/yt_dlp/YoutubeDL.py b/plugins/youtube_download/yt_dlp/YoutubeDL.py index ef42ba6..aceaa59 100644 --- a/plugins/youtube_download/yt_dlp/YoutubeDL.py +++ b/plugins/youtube_download/yt_dlp/YoutubeDL.py @@ -42,6 +42,8 @@ from .globals import ( plugin_pps, all_plugins_loaded, plugin_dirs, + supported_js_runtimes, + supported_remote_components, ) from .minicurses import format_text from .networking import HEADRequest, Request, RequestDirector @@ -533,6 +535,18 @@ class YoutubeDL: See "EXTRACTOR ARGUMENTS" for details. Argument values must always be a list of string(s). E.g. {'youtube': {'skip': ['dash', 'hls']}} + js_runtimes: A dictionary of JavaScript runtime keys (in lower case) to enable + and a dictionary of additional configuration for the runtime. + Currently supported runtimes are 'deno', 'node', 'bun', and 'quickjs'. + If None, the default runtime of "deno" will be enabled. + The runtime configuration dictionary can have the following keys: + - path: Path to the executable (optional) + E.g. {'deno': {'path': '/path/to/deno'} + remote_components: A list of remote components that are allowed to be fetched when required. + Supported components: + - ejs:npm (external JavaScript components from npm) + - ejs:github (external JavaScript components from yt-dlp-ejs GitHub) + By default, no remote components are allowed to be fetched. mark_watched: Mark videos watched (even with --simulate). Only for YouTube The following options are deprecated and may be removed in the future: @@ -581,7 +595,7 @@ class YoutubeDL: 'width', 'height', 'asr', 'audio_channels', 'fps', 'tbr', 'abr', 'vbr', 'filesize', 'filesize_approx', 'timestamp', 'release_timestamp', 'available_at', - 'duration', 'view_count', 'like_count', 'dislike_count', 'repost_count', + 'duration', 'view_count', 'like_count', 'dislike_count', 'repost_count', 'save_count', 'average_rating', 'comment_count', 'age_limit', 'start_time', 'end_time', 'chapter_number', 'season_number', 'episode_number', @@ -717,6 +731,13 @@ class YoutubeDL: else: raise + # Note: this must be after plugins are loaded + self.params['js_runtimes'] = self.params.get('js_runtimes', {'deno': {}}) + self._clean_js_runtimes(self.params['js_runtimes']) + + self.params['remote_components'] = set(self.params.get('remote_components', ())) + self._clean_remote_components(self.params['remote_components']) + self.params['compat_opts'] = set(self.params.get('compat_opts', ())) self.params['http_headers'] = HTTPHeaderDict(std_headers, self.params.get('http_headers')) self._load_cookies(self.params['http_headers'].get('Cookie')) # compat @@ -829,6 +850,36 @@ class YoutubeDL: self.archive = preload_download_archive(self.params.get('download_archive')) + def _clean_js_runtimes(self, runtimes): + if not ( + isinstance(runtimes, dict) + and all(isinstance(k, str) and (v is None or isinstance(v, dict)) for k, v in runtimes.items()) + ): + raise ValueError('Invalid js_runtimes format, expected a dict of {runtime: {config}}') + + if unsupported_runtimes := runtimes.keys() - supported_js_runtimes.value.keys(): + self.report_warning( + f'Ignoring unsupported JavaScript runtime(s): {", ".join(unsupported_runtimes)}.' + f' Supported runtimes: {", ".join(supported_js_runtimes.value.keys())}.') + for rt in unsupported_runtimes: + runtimes.pop(rt) + + def _clean_remote_components(self, remote_components: set): + if unsupported_remote_components := set(remote_components) - set(supported_remote_components.value): + self.report_warning( + f'Ignoring unsupported remote component(s): {", ".join(unsupported_remote_components)}.' + f' Supported remote components: {", ".join(supported_remote_components.value)}.') + for rt in unsupported_remote_components: + remote_components.remove(rt) + + @functools.cached_property + def _js_runtimes(self): + runtimes = {} + for name, config in self.params.get('js_runtimes', {}).items(): + runtime_cls = supported_js_runtimes.value.get(name) + runtimes[name] = runtime_cls(path=config.get('path')) if runtime_cls else None + return runtimes + def warn_if_short_id(self, argv): # short YouTube ID starting with dash? idxs = [ @@ -2975,6 +3026,10 @@ class YoutubeDL: format_selector = self.format_selector while True: if interactive_format_selection: + if not formats: + # Bypass interactive format selection if no formats & --ignore-no-formats-error + formats_to_download = None + break req_format = input(self._format_screen('\nEnter format selector ', self.Styles.EMPHASIS) + '(Press ENTER for default, or Ctrl+C to quit)' + self._format_screen(': ', self.Styles.EMPHASIS)) @@ -4064,6 +4119,18 @@ class YoutubeDL: join_nonempty(*get_package_info(m)) for m in available_dependencies.values() })) or 'none')) + if not self.params.get('js_runtimes'): + write_debug('JS runtimes: none (disabled)') + else: + write_debug('JS runtimes: %s' % (', '.join(sorted( + f'{name} (unknown)' if runtime is None + else join_nonempty( + runtime.info.name, + runtime.info.version + (' (unsupported)' if runtime.info.supported is False else ''), + ) + for name, runtime in self._js_runtimes.items() if runtime is None or runtime.info is not None + )) or 'none')) + write_debug(f'Proxy map: {self.proxies}') write_debug(f'Request Handlers: {", ".join(rh.RH_NAME for rh in self._request_director.handlers.values())}') diff --git a/plugins/youtube_download/yt_dlp/__init__.py b/plugins/youtube_download/yt_dlp/__init__.py index 8aee126..2f6ba47 100644 --- a/plugins/youtube_download/yt_dlp/__init__.py +++ b/plugins/youtube_download/yt_dlp/__init__.py @@ -61,8 +61,15 @@ from .utils import ( shell_quote, variadic, write_string, + ) from .utils._utils import _UnsafeExtensionError +from .utils._jsruntime import ( + BunJsRuntime as _BunJsRuntime, + DenoJsRuntime as _DenoJsRuntime, + NodeJsRuntime as _NodeJsRuntime, + QuickJsRuntime as _QuickJsRuntime, +) from .YoutubeDL import YoutubeDL @@ -773,6 +780,10 @@ def parse_options(argv=None): else opts.audioformat if (opts.extractaudio and opts.audioformat in FFmpegExtractAudioPP.SUPPORTED_EXTS) else None) + js_runtimes = { + runtime.lower(): {'path': path} for runtime, path in ( + [*arg.split(':', 1), None][:2] for arg in opts.js_runtimes)} + return ParsedOptions(parser, opts, urls, { 'usenetrc': opts.usenetrc, 'netrc_location': opts.netrc_location, @@ -940,6 +951,8 @@ def parse_options(argv=None): 'geo_bypass_country': opts.geo_bypass_country, 'geo_bypass_ip_block': opts.geo_bypass_ip_block, 'useid': opts.useid or None, + 'js_runtimes': js_runtimes, + 'remote_components': opts.remote_components, 'warn_when_outdated': opts.update_self is None, '_warnings': warnings, '_deprecation_warnings': deprecation_warnings, @@ -1081,6 +1094,16 @@ def main(argv=None): from .extractor import gen_extractors, list_extractors +# Register JS runtimes and remote components +from .globals import supported_js_runtimes, supported_remote_components +supported_js_runtimes.value['deno'] = _DenoJsRuntime +supported_js_runtimes.value['node'] = _NodeJsRuntime +supported_js_runtimes.value['bun'] = _BunJsRuntime +supported_js_runtimes.value['quickjs'] = _QuickJsRuntime + +supported_remote_components.value.append('ejs:github') +supported_remote_components.value.append('ejs:npm') + __all__ = [ 'YoutubeDL', 'gen_extractors', diff --git a/plugins/youtube_download/yt_dlp/__pyinstaller/hook-yt_dlp.py b/plugins/youtube_download/yt_dlp/__pyinstaller/hook-yt_dlp.py index 8e7f42f..0c4bf7d 100644 --- a/plugins/youtube_download/yt_dlp/__pyinstaller/hook-yt_dlp.py +++ b/plugins/youtube_download/yt_dlp/__pyinstaller/hook-yt_dlp.py @@ -34,3 +34,4 @@ print(f'Adding imports: {hiddenimports}') excludedimports = ['youtube_dl', 'youtube_dlc', 'test', 'ytdlp_plugins', 'devscripts', 'bundle'] datas = collect_data_files('curl_cffi', includes=['cacert.pem']) +datas += collect_data_files('yt_dlp_ejs', includes=['**/*.js']) diff --git a/plugins/youtube_download/yt_dlp/cookies.py b/plugins/youtube_download/yt_dlp/cookies.py index 4fdc0b8..23f90d6 100644 --- a/plugins/youtube_download/yt_dlp/cookies.py +++ b/plugins/youtube_download/yt_dlp/cookies.py @@ -125,7 +125,7 @@ def extract_cookies_from_browser(browser_name, profile=None, logger=YDLLogger(), def _extract_firefox_cookies(profile, container, logger): - MAX_SUPPORTED_DB_SCHEMA_VERSION = 16 + MAX_SUPPORTED_DB_SCHEMA_VERSION = 17 logger.info('Extracting cookies from firefox') if not sqlite3: @@ -166,6 +166,8 @@ def _extract_firefox_cookies(profile, container, logger): db_schema_version = cursor.execute('PRAGMA user_version;').fetchone()[0] if db_schema_version > MAX_SUPPORTED_DB_SCHEMA_VERSION: logger.warning(f'Possibly unsupported firefox cookies database version: {db_schema_version}') + else: + logger.debug(f'Firefox cookies database version: {db_schema_version}') if isinstance(container_id, int): logger.debug( f'Only loading cookies from firefox container "{container}", ID {container_id}') @@ -210,9 +212,16 @@ def _firefox_browser_dirs(): else: yield from map(os.path.expanduser, ( + # New installations of FF147+ respect the XDG base directory specification + # Ref: https://bugzilla.mozilla.org/show_bug.cgi?id=259356 + os.path.join(_config_home(), 'mozilla/firefox'), + # Existing FF version<=146 installations '~/.mozilla/firefox', - '~/snap/firefox/common/.mozilla/firefox', + # Flatpak XDG: https://docs.flatpak.org/en/latest/conventions.html#xdg-base-directories + '~/.var/app/org.mozilla.firefox/config/mozilla/firefox', '~/.var/app/org.mozilla.firefox/.mozilla/firefox', + # Snap installations do not respect the XDG base directory specification + '~/snap/firefox/common/.mozilla/firefox', )) @@ -557,7 +566,7 @@ class WindowsChromeCookieDecryptor(ChromeCookieDecryptor): def _extract_safari_cookies(profile, logger): - if sys.platform != 'darwin': + if sys.platform not in ('darwin', 'ios'): raise ValueError(f'unsupported platform: {sys.platform}') if profile: diff --git a/plugins/youtube_download/yt_dlp/dependencies/__init__.py b/plugins/youtube_download/yt_dlp/dependencies/__init__.py index 0d58da2..cf2bcfb 100644 --- a/plugins/youtube_download/yt_dlp/dependencies/__init__.py +++ b/plugins/youtube_download/yt_dlp/dependencies/__init__.py @@ -81,6 +81,12 @@ except ImportError: from . import Cryptodome +try: + import yt_dlp_ejs +except ImportError: + yt_dlp_ejs = None + + all_dependencies = {k: v for k, v in globals().items() if not k.startswith('_')} available_dependencies = {k: v for k, v in all_dependencies.items() if v} diff --git a/plugins/youtube_download/yt_dlp/downloader/common.py b/plugins/youtube_download/yt_dlp/downloader/common.py index 122c479..6f15607 100644 --- a/plugins/youtube_download/yt_dlp/downloader/common.py +++ b/plugins/youtube_download/yt_dlp/downloader/common.py @@ -461,7 +461,8 @@ class FileDownloader: min_sleep_interval = self.params.get('sleep_interval') or 0 max_sleep_interval = self.params.get('max_sleep_interval') or 0 - if available_at := info_dict.get('available_at'): + requested_formats = info_dict.get('requested_formats') or [info_dict] + if available_at := max(f.get('available_at') or 0 for f in requested_formats): forced_sleep_interval = available_at - int(time.time()) if forced_sleep_interval > min_sleep_interval: sleep_note = 'as required by the site' diff --git a/plugins/youtube_download/yt_dlp/downloader/external.py b/plugins/youtube_download/yt_dlp/downloader/external.py index 3b8fd27..14879b3 100644 --- a/plugins/youtube_download/yt_dlp/downloader/external.py +++ b/plugins/youtube_download/yt_dlp/downloader/external.py @@ -457,6 +457,8 @@ class FFmpegFD(ExternalFD): @classmethod def available(cls, path=None): + # TODO: Fix path for ffmpeg + # Fixme: This may be wrong when --ffmpeg-location is used return FFmpegPostProcessor().available def on_process_started(self, proc, stdin): @@ -488,20 +490,6 @@ class FFmpegFD(ExternalFD): if not self.params.get('verbose'): args += ['-hide_banner'] - args += traverse_obj(info_dict, ('downloader_options', 'ffmpeg_args', ...)) - - # These exists only for compatibility. Extractors should use - # info_dict['downloader_options']['ffmpeg_args'] instead - args += info_dict.get('_ffmpeg_args') or [] - seekable = info_dict.get('_seekable') - if seekable is not None: - # setting -seekable prevents ffmpeg from guessing if the server - # supports seeking(by adding the header `Range: bytes=0-`), which - # can cause problems in some cases - # https://github.com/ytdl-org/youtube-dl/issues/11800#issuecomment-275037127 - # http://trac.ffmpeg.org/ticket/6125#comment:10 - args += ['-seekable', '1' if seekable else '0'] - env = None proxy = self.params.get('proxy') if proxy: @@ -521,39 +509,10 @@ class FFmpegFD(ExternalFD): env['HTTP_PROXY'] = proxy env['http_proxy'] = proxy - protocol = info_dict.get('protocol') - - if protocol == 'rtmp': - player_url = info_dict.get('player_url') - page_url = info_dict.get('page_url') - app = info_dict.get('app') - play_path = info_dict.get('play_path') - tc_url = info_dict.get('tc_url') - flash_version = info_dict.get('flash_version') - live = info_dict.get('rtmp_live', False) - conn = info_dict.get('rtmp_conn') - if player_url is not None: - args += ['-rtmp_swfverify', player_url] - if page_url is not None: - args += ['-rtmp_pageurl', page_url] - if app is not None: - args += ['-rtmp_app', app] - if play_path is not None: - args += ['-rtmp_playpath', play_path] - if tc_url is not None: - args += ['-rtmp_tcurl', tc_url] - if flash_version is not None: - args += ['-rtmp_flashver', flash_version] - if live: - args += ['-rtmp_live', 'live'] - if isinstance(conn, list): - for entry in conn: - args += ['-rtmp_conn', entry] - elif isinstance(conn, str): - args += ['-rtmp_conn', conn] - start_time, end_time = info_dict.get('section_start') or 0, info_dict.get('section_end') + fallback_input_args = traverse_obj(info_dict, ('downloader_options', 'ffmpeg_args', ...)) + selected_formats = info_dict.get('requested_formats') or [info_dict] for i, fmt in enumerate(selected_formats): is_http = re.match(r'https?://', fmt['url']) @@ -572,6 +531,44 @@ class FFmpegFD(ExternalFD): if end_time: args += ['-t', str(end_time - start_time)] + protocol = fmt.get('protocol') + + if protocol == 'rtmp': + player_url = fmt.get('player_url') + page_url = fmt.get('page_url') + app = fmt.get('app') + play_path = fmt.get('play_path') + tc_url = fmt.get('tc_url') + flash_version = fmt.get('flash_version') + live = fmt.get('rtmp_live', False) + conn = fmt.get('rtmp_conn') + if player_url is not None: + args += ['-rtmp_swfverify', player_url] + if page_url is not None: + args += ['-rtmp_pageurl', page_url] + if app is not None: + args += ['-rtmp_app', app] + if play_path is not None: + args += ['-rtmp_playpath', play_path] + if tc_url is not None: + args += ['-rtmp_tcurl', tc_url] + if flash_version is not None: + args += ['-rtmp_flashver', flash_version] + if live: + args += ['-rtmp_live', 'live'] + if isinstance(conn, list): + for entry in conn: + args += ['-rtmp_conn', entry] + elif isinstance(conn, str): + args += ['-rtmp_conn', conn] + + elif protocol == 'http_dash_segments' and info_dict.get('is_live'): + # ffmpeg may try to read past the latest available segments for + # live DASH streams unless we pass `-re`. In modern ffmpeg, this + # is an alias of `-readrate 1`, but `-readrate` was not added + # until ffmpeg 5.0, so we must stick to using `-re` + args += ['-re'] + url = fmt['url'] if self.params.get('enable_file_urls') and url.startswith('file:'): # The default protocol_whitelist is 'file,crypto,data' when reading local m3u8 URLs, @@ -586,6 +583,7 @@ class FFmpegFD(ExternalFD): # https://trac.ffmpeg.org/ticket/2702 url = re.sub(r'^file://(?:localhost)?/', 'file:' if os.name == 'nt' else 'file:/', url) + args += traverse_obj(fmt, ('downloader_options', 'ffmpeg_args', ...)) or fallback_input_args args += [*self._configuration_args((f'_i{i + 1}', '_i')), '-i', url] if not (start_time or end_time) or not self.params.get('force_keyframes_at_cuts'): diff --git a/plugins/youtube_download/yt_dlp/extractor/_extractors.py b/plugins/youtube_download/yt_dlp/extractor/_extractors.py index 072169d..ea49a25 100644 --- a/plugins/youtube_download/yt_dlp/extractor/_extractors.py +++ b/plugins/youtube_download/yt_dlp/extractor/_extractors.py @@ -75,6 +75,7 @@ from .afreecatv import ( AfreecaTVLiveIE, AfreecaTVUserIE, ) +from .agalega import AGalegaIE from .agora import ( TokFMAuditionIE, TokFMPodcastIE, @@ -83,6 +84,7 @@ from .agora import ( ) from .airtv import AirTVIE from .aitube import AitubeKZVideoIE +from .alibaba import AlibabaIE from .aliexpress import AliExpressLiveIE from .aljazeera import AlJazeeraIE from .allocine import AllocineIE @@ -143,6 +145,8 @@ from .archiveorg import ( from .arcpublishing import ArcPublishingIE from .ard import ( ARDIE, + ARDAudiothekIE, + ARDAudiothekPlaylistIE, ARDBetaMediathekIE, ARDMediathekCollectionIE, ) @@ -266,6 +270,7 @@ from .bitchute import ( BitChuteChannelIE, BitChuteIE, ) +from .bitmovin import BitmovinIE from .blackboardcollaborate import ( BlackboardCollaborateIE, BlackboardCollaborateLaunchIE, @@ -426,6 +431,7 @@ from .cpac import ( ) from .cracked import CrackedIE from .craftsy import CraftsyIE +from .croatianfilm import CroatianFilmIE from .crooksandliars import CrooksAndLiarsIE from .crowdbunker import ( CrowdBunkerChannelIE, @@ -633,12 +639,16 @@ from .fc2 import ( ) from .fczenit import FczenitIE from .fifa import FifaIE +from .filmarchiv import FilmArchivIE from .filmon import ( FilmOnChannelIE, FilmOnIE, ) from .filmweb import FilmwebIE -from .firsttv import FirstTVIE +from .firsttv import ( + FirstTVIE, + FirstTVLiveIE, +) from .fivetv import FiveTVIE from .flextv import FlexTVIE from .flickr import FlickrIE @@ -685,6 +695,10 @@ from .frontendmasters import ( FrontendMastersIE, FrontendMastersLessonIE, ) +from .frontro import ( + TheChosenGroupIE, + TheChosenIE, +) from .fujitv import FujiTVFODPlus7IE from .funk import FunkIE from .funker530 import Funker530IE @@ -1074,11 +1088,6 @@ from .mangomolo import ( MangomoloLiveIE, MangomoloVideoIE, ) -from .manoto import ( - ManotoTVIE, - ManotoTVLiveIE, - ManotoTVShowIE, -) from .manyvids import ManyVidsIE from .maoritv import MaoriTVIE from .markiza import ( @@ -1088,7 +1097,10 @@ from .markiza import ( from .massengeschmacktv import MassengeschmackTVIE from .masters import MastersIE from .matchtv import MatchTVIE -from .mave import MaveIE +from .mave import ( + MaveChannelIE, + MaveIE, +) from .mbn import MBNIE from .mdr import MDRIE from .medaltv import MedalTVIE @@ -1195,6 +1207,7 @@ from .musicdex import ( MusicdexPlaylistIE, MusicdexSongIE, ) +from .mux import MuxIE from .mx3 import ( Mx3IE, Mx3NeoIE, @@ -1216,6 +1229,7 @@ from .n1 import ( N1InfoAssetIE, N1InfoIIE, ) +from .nascar import NascarClassicsIE from .nate import ( NateIE, NateProgramIE, @@ -1261,6 +1275,7 @@ from .nebula import ( NebulaChannelIE, NebulaClassIE, NebulaIE, + NebulaSeasonIE, NebulaSubscriptionsIE, ) from .nekohacker import NekoHackerIE @@ -1269,6 +1284,10 @@ from .nest import ( NestClipIE, NestIE, ) +from .netapp import ( + NetAppCollectionIE, + NetAppVideoIE, +) from .neteasemusic import ( NetEaseMusicAlbumIE, NetEaseMusicDjRadioIE, @@ -1291,12 +1310,6 @@ from .newgrounds import ( ) from .newspicks import NewsPicksIE from .newsy import NewsyIE -from .nextmedia import ( - AppleDailyIE, - NextMediaActionNewsIE, - NextMediaIE, - NextTVIE, -) from .nexx import ( NexxEmbedIE, NexxIE, @@ -1361,6 +1374,7 @@ from .nova import ( NovaIE, ) from .novaplay import NovaPlayIE +from .nowcanal import NowCanalIE from .nowness import ( NownessIE, NownessPlaylistIE, @@ -1464,6 +1478,7 @@ from .palcomp3 import ( PalcoMP3IE, PalcoMP3VideoIE, ) +from .pandatv import PandaTvIE from .panopto import ( PanoptoIE, PanoptoListIE, @@ -1812,10 +1827,6 @@ from .scrippsnetworks import ( ScrippsNetworksWatchIE, ) from .scrolller import ScrolllerIE -from .scte import ( - SCTEIE, - SCTECourseIE, -) from .sejmpl import SejmIE from .sen import SenIE from .senalcolombia import SenalColombiaLiveIE @@ -1997,6 +2008,11 @@ from .taptap import ( TapTapMomentIE, TapTapPostIntlIE, ) +from .tarangplus import ( + TarangPlusEpisodesIE, + TarangPlusPlaylistIE, + TarangPlusVideoIE, +) from .tass import TassIE from .tbs import TBSIE from .tbsjp import ( @@ -2514,6 +2530,7 @@ from .yappy import ( YappyIE, YappyProfileIE, ) +from .yfanefa import YfanefaIE from .yle_areena import YleAreenaIE from .youjizz import YouJizzIE from .youku import ( diff --git a/plugins/youtube_download/yt_dlp/extractor/abc.py b/plugins/youtube_download/yt_dlp/extractor/abc.py index 2e66178..cff54d3 100644 --- a/plugins/youtube_download/yt_dlp/extractor/abc.py +++ b/plugins/youtube_download/yt_dlp/extractor/abc.py @@ -321,6 +321,8 @@ class ABCIViewIE(InfoExtractor): entry_protocol='m3u8_native', m3u8_id='hls', fatal=False) if formats: break + else: + formats = [] subtitles = {} src_vtt = stream.get('captions', {}).get('src-vtt') diff --git a/plugins/youtube_download/yt_dlp/extractor/agalega.py b/plugins/youtube_download/yt_dlp/extractor/agalega.py new file mode 100644 index 0000000..c02d4ae --- /dev/null +++ b/plugins/youtube_download/yt_dlp/extractor/agalega.py @@ -0,0 +1,91 @@ +import json +import time + +from .common import InfoExtractor +from ..utils import jwt_decode_hs256, url_or_none +from ..utils.traversal import traverse_obj + + +class AGalegaBaseIE(InfoExtractor): + _access_token = None + + @staticmethod + def _jwt_is_expired(token): + return jwt_decode_hs256(token)['exp'] - time.time() < 120 + + def _refresh_access_token(self, video_id): + AGalegaBaseIE._access_token = self._download_json( + 'https://www.agalega.gal/api/fetch-api/jwt/token', video_id, + note='Downloading access token', + data=json.dumps({ + 'username': None, + 'password': None, + 'client': 'crtvg', + 'checkExistsCookies': False, + }).encode())['access'] + + def _call_api(self, endpoint, display_id, note, fatal=True, query=None): + if not AGalegaBaseIE._access_token or self._jwt_is_expired(AGalegaBaseIE._access_token): + self._refresh_access_token(endpoint) + return self._download_json( + f'https://api-agalega.interactvty.com/api/2.0/contents/{endpoint}', display_id, + note=note, fatal=fatal, query=query, + headers={'Authorization': f'jwtok {AGalegaBaseIE._access_token}'}) + + +class AGalegaIE(AGalegaBaseIE): + IE_NAME = 'agalega:videos' + _VALID_URL = r'https?://(?:www\.)?agalega\.gal/videos/(?:detail/)?(?P[0-9]+)' + _TESTS = [{ + 'url': 'https://www.agalega.gal/videos/288664-lr-ninguencheconta', + 'md5': '04533a66c5f863d08dd9724b11d1c223', + 'info_dict': { + 'id': '288664', + 'title': 'Roberto e Ángel Martín atenden consultas dos espectadores', + 'description': 'O cómico ademais fai un repaso dalgúns momentos da súa traxectoria profesional', + 'thumbnail': 'https://crtvg-bucket.flumotion.cloud/content_cards/2ef32c3b9f6249d9868fd8f11d389d3d.png', + 'ext': 'mp4', + }, + }, { + 'url': 'https://www.agalega.gal/videos/detail/296152-pulso-activo-7', + 'md5': '26df7fdcf859f38ad92d837279d6b56d', + 'info_dict': { + 'id': '296152', + 'title': 'Pulso activo | 18-11-2025', + 'description': 'Anxo, Noemí, Silvia e Estrella comparten as sensacións da clase de Eddy.', + 'thumbnail': 'https://crtvg-bucket.flumotion.cloud/content_cards/a6bb7da6c8994b82bf961ac6cad1707b.png', + 'ext': 'mp4', + }, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + content_data = self._call_api( + f'content/{video_id}/', video_id, note='Downloading content data', fatal=False, + query={ + 'optional_fields': 'image,is_premium,short_description,has_subtitle', + }) + resource_data = self._call_api( + f'content_resources/{video_id}/', video_id, note='Downloading resource data', + query={ + 'optional_fields': 'media_url', + }) + + formats = [] + subtitles = {} + for m3u8_url in traverse_obj(resource_data, ('results', ..., 'media_url', {url_or_none})): + fmts, subs = self._extract_m3u8_formats_and_subtitles( + m3u8_url, video_id, ext='mp4', m3u8_id='hls') + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + **traverse_obj(content_data, { + 'title': ('name', {str}), + 'description': (('description', 'short_description'), {str}, any), + 'thumbnail': ('image', {url_or_none}), + }), + } diff --git a/plugins/youtube_download/yt_dlp/extractor/alibaba.py b/plugins/youtube_download/yt_dlp/extractor/alibaba.py new file mode 100644 index 0000000..0912535 --- /dev/null +++ b/plugins/youtube_download/yt_dlp/extractor/alibaba.py @@ -0,0 +1,42 @@ +from .common import InfoExtractor +from ..utils import int_or_none, str_or_none, url_or_none +from ..utils.traversal import traverse_obj + + +class AlibabaIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?alibaba\.com/product-detail/[\w-]+_(?P\d+)\.html' + _TESTS = [{ + 'url': 'https://www.alibaba.com/product-detail/Kids-Entertainment-Bouncer-Bouncy-Castle-Waterslide_1601271126969.html', + 'info_dict': { + 'id': '6000280444270', + 'display_id': '1601271126969', + 'ext': 'mp4', + 'title': 'Kids Entertainment Bouncer Bouncy Castle Waterslide Juex Gonflables Commercial Inflatable Tropical Water Slide', + 'duration': 30, + 'thumbnail': 'https://sc04.alicdn.com/kf/Hc5bb391974454af18c7a4f91cbe4062bg.jpg_120x120.jpg', + }, + }] + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + product_data = self._search_json( + r'window\.detailData\s*=', webpage, 'detail data', display_id)['globalData']['product'] + + return { + **traverse_obj(product_data, ('mediaItems', lambda _, v: v['type'] == 'video' and v['videoId'], any, { + 'id': ('videoId', {int}, {str_or_none}), + 'duration': ('duration', {int_or_none}), + 'thumbnail': ('videoCoverUrl', {url_or_none}), + 'formats': ('videoUrl', lambda _, v: url_or_none(v['videoUrl']), { + 'url': 'videoUrl', + 'format_id': ('definition', {str_or_none}), + 'tbr': ('bitrate', {int_or_none}), + 'width': ('width', {int_or_none}), + 'height': ('height', {int_or_none}), + 'filesize': ('length', {int_or_none}), + }), + })), + 'title': traverse_obj(product_data, ('subject', {str})), + 'display_id': display_id, + } diff --git a/plugins/youtube_download/yt_dlp/extractor/archiveorg.py b/plugins/youtube_download/yt_dlp/extractor/archiveorg.py index 9a4e0b8..7bf5199 100644 --- a/plugins/youtube_download/yt_dlp/extractor/archiveorg.py +++ b/plugins/youtube_download/yt_dlp/extractor/archiveorg.py @@ -5,12 +5,9 @@ import re import urllib.parse from .common import InfoExtractor -from .youtube import YoutubeBaseInfoExtractor, YoutubeIE -from ..networking import HEADRequest -from ..networking.exceptions import HTTPError +from .youtube import YoutubeBaseInfoExtractor from ..utils import ( KNOWN_EXTENSIONS, - ExtractorError, bug_reports_message, clean_html, dict_get, @@ -21,18 +18,14 @@ from ..utils import ( join_nonempty, js_to_json, merge_dicts, - mimetype2ext, orderedSet, parse_duration, parse_qs, str_or_none, - str_to_int, traverse_obj, - try_get, unified_strdate, unified_timestamp, url_or_none, - urlhandle_detect_ext, ) @@ -286,7 +279,7 @@ class ArchiveOrgIE(InfoExtractor): 'url': 'https://archive.org/' + track['file'].lstrip('/'), } - metadata = self._download_json('http://archive.org/metadata/' + identifier, identifier) + metadata = self._download_json(f'https://archive.org/metadata/{identifier}', identifier) m = metadata['metadata'] identifier = m['identifier'] @@ -471,7 +464,7 @@ class YoutubeWebArchiveIE(InfoExtractor): 'url': 'https://web.archive.org/web/20110712231407/http://www.youtube.com/watch?v=lTx3G6h2xyA', 'info_dict': { 'id': 'lTx3G6h2xyA', - 'ext': 'flv', + 'ext': 'mp4', 'title': 'Madeon - Pop Culture (live mashup)', 'upload_date': '20110711', 'uploader': 'Madeon', @@ -578,7 +571,7 @@ class YoutubeWebArchiveIE(InfoExtractor): 'url': 'https://web.archive.org/web/20110126141719/http://www.youtube.com/watch?v=Q_yjX80U7Yc', 'info_dict': { 'id': 'Q_yjX80U7Yc', - 'ext': 'flv', + 'ext': 'webm', 'title': 'Spray Paint Art by Clay Butler: Purple Fantasy Forest', 'uploader_id': 'claybutlermusic', 'description': 'md5:4595264559e3d0a0ceb3f011f6334543', @@ -680,6 +673,55 @@ class YoutubeWebArchiveIE(InfoExtractor): 'upload_date': '20120407', 'uploader_id': 'thecomputernerd01', }, + }, { + # Contains split audio/video formats + 'url': 'ytarchive:o_T_S_TU12M', + 'info_dict': { + 'id': 'o_T_S_TU12M', + 'ext': 'mp4', + 'title': 'Prairie Pulse 1218; Lin Enger, Paul Olson', + 'description': 'md5:36e7a34cdc8508e35a920ec042e799c7', + 'uploader': 'Prairie Public', + 'channel_id': 'UC4BOzQel6tvJm7OEDd3vZlw', + 'channel_url': 'https://www.youtube.com/channel/UC4BOzQel6tvJm7OEDd3vZlw', + 'duration': 1606, + 'upload_date': '20150213', + }, + }, { + # Video unavailable through wayback-fakeurl + 'url': 'ytarchive:SQCom7wjGDs', + 'info_dict': { + 'id': 'SQCom7wjGDs', + 'ext': 'mp4', + 'title': 'Jamin Warren from PBS Game/Show decides that Portal is a feminist Game [Top Hats and No Brain]', + 'description': 'md5:c0cb876dd075483ead9afcc86798efb0', + 'uploader': 'Top Hats and Champagne', + 'uploader_id': 'sparrowtm', + 'uploader_url': 'https://www.youtube.com/user/sparrowtm', + 'channel_id': 'UCW3T5nG4iEkI7HjG-Du3HQA', + 'channel_url': 'https://www.youtube.com/channel/UCW3T5nG4iEkI7HjG-Du3HQA', + 'duration': 1500, + 'thumbnail': 'https://web.archive.org/web/20160108040020if_/https://i.ytimg.com/vi/SQCom7wjGDs/maxresdefault.jpg', + 'upload_date': '20160107', + }, + }, { + # dmuxed formats + 'url': 'https://web.archive.org/web/20240922160632/https://www.youtube.com/watch?v=z7hzvTL3k1k', + 'info_dict': { + 'id': 'z7hzvTL3k1k', + 'ext': 'webm', + 'title': 'Praise the Lord and Pass the Ammunition (BARRXN REMIX)', + 'description': 'md5:45dbf2c71c23b0734c8dfb82dd1e94b6', + 'uploader': 'Barrxn', + 'uploader_id': 'TheRockstar6086', + 'uploader_url': 'https://www.youtube.com/user/TheRockstar6086', + 'channel_id': 'UCjJPGUTtvR9uizmawn2ThqA', + 'channel_url': 'https://www.youtube.com/channel/UCjJPGUTtvR9uizmawn2ThqA', + 'duration': 125, + 'thumbnail': r're:https?://.*\.(jpg|webp)', + 'upload_date': '20201207', + }, + 'params': {'format': 'bv'}, }, { 'url': 'https://web.archive.org/web/http://www.youtube.com/watch?v=kH-G_aIBlFw', 'only_matching': True, @@ -724,6 +766,113 @@ class YoutubeWebArchiveIE(InfoExtractor): _OLDEST_CAPTURE_DATE = 20050214000000 _NEWEST_CAPTURE_DATE = 20500101000000 + _FORMATS = { + '5': {'ext': 'flv', 'width': 400, 'height': 240, 'acodec': 'mp3', 'vcodec': 'h263'}, + '6': {'ext': 'flv', 'width': 450, 'height': 270, 'acodec': 'mp3', 'vcodec': 'h263'}, + '13': {'ext': '3gp', 'acodec': 'aac', 'vcodec': 'mp4v'}, + '17': {'ext': '3gp', 'width': 176, 'height': 144, 'acodec': 'aac', 'vcodec': 'mp4v'}, + '18': {'ext': 'mp4', 'width': 640, 'height': 360, 'acodec': 'aac', 'vcodec': 'h264'}, + '22': {'ext': 'mp4', 'width': 1280, 'height': 720, 'acodec': 'aac', 'vcodec': 'h264'}, + '34': {'ext': 'flv', 'width': 640, 'height': 360, 'acodec': 'aac', 'vcodec': 'h264'}, + '35': {'ext': 'flv', 'width': 854, 'height': 480, 'acodec': 'aac', 'vcodec': 'h264'}, + # itag 36 videos are either 320x180 (BaW_jenozKc) or 320x240 (__2ABJjxzNo), abr varies as well + '36': {'ext': '3gp', 'width': 320, 'acodec': 'aac', 'vcodec': 'mp4v'}, + '37': {'ext': 'mp4', 'width': 1920, 'height': 1080, 'acodec': 'aac', 'vcodec': 'h264'}, + '38': {'ext': 'mp4', 'width': 4096, 'height': 3072, 'acodec': 'aac', 'vcodec': 'h264'}, + '43': {'ext': 'webm', 'width': 640, 'height': 360, 'acodec': 'vorbis', 'vcodec': 'vp8'}, + '44': {'ext': 'webm', 'width': 854, 'height': 480, 'acodec': 'vorbis', 'vcodec': 'vp8'}, + '45': {'ext': 'webm', 'width': 1280, 'height': 720, 'acodec': 'vorbis', 'vcodec': 'vp8'}, + '46': {'ext': 'webm', 'width': 1920, 'height': 1080, 'acodec': 'vorbis', 'vcodec': 'vp8'}, + '59': {'ext': 'mp4', 'width': 854, 'height': 480, 'acodec': 'aac', 'vcodec': 'h264'}, + '78': {'ext': 'mp4', 'width': 854, 'height': 480, 'acodec': 'aac', 'vcodec': 'h264'}, + + + # 3D videos + '82': {'ext': 'mp4', 'height': 360, 'format_note': '3D', 'acodec': 'aac', 'vcodec': 'h264', 'preference': -20}, + '83': {'ext': 'mp4', 'height': 480, 'format_note': '3D', 'acodec': 'aac', 'vcodec': 'h264', 'preference': -20}, + '84': {'ext': 'mp4', 'height': 720, 'format_note': '3D', 'acodec': 'aac', 'vcodec': 'h264', 'preference': -20}, + '85': {'ext': 'mp4', 'height': 1080, 'format_note': '3D', 'acodec': 'aac', 'vcodec': 'h264', 'preference': -20}, + '100': {'ext': 'webm', 'height': 360, 'format_note': '3D', 'acodec': 'vorbis', 'vcodec': 'vp8', 'preference': -20}, + '101': {'ext': 'webm', 'height': 480, 'format_note': '3D', 'acodec': 'vorbis', 'vcodec': 'vp8', 'preference': -20}, + '102': {'ext': 'webm', 'height': 720, 'format_note': '3D', 'acodec': 'vorbis', 'vcodec': 'vp8', 'preference': -20}, + + # Apple HTTP Live Streaming + '91': {'ext': 'mp4', 'height': 144, 'format_note': 'HLS', 'acodec': 'aac', 'vcodec': 'h264'}, + '92': {'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'acodec': 'aac', 'vcodec': 'h264'}, + '93': {'ext': 'mp4', 'height': 360, 'format_note': 'HLS', 'acodec': 'aac', 'vcodec': 'h264'}, + '94': {'ext': 'mp4', 'height': 480, 'format_note': 'HLS', 'acodec': 'aac', 'vcodec': 'h264'}, + '95': {'ext': 'mp4', 'height': 720, 'format_note': 'HLS', 'acodec': 'aac', 'vcodec': 'h264'}, + '96': {'ext': 'mp4', 'height': 1080, 'format_note': 'HLS', 'acodec': 'aac', 'vcodec': 'h264'}, + '132': {'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'acodec': 'aac', 'vcodec': 'h264'}, + '151': {'ext': 'mp4', 'height': 72, 'format_note': 'HLS', 'acodec': 'aac', 'vcodec': 'h264'}, + + # DASH mp4 video + '133': {'ext': 'mp4', 'height': 240, 'vcodec': 'h264', 'acodec': 'none'}, + '134': {'ext': 'mp4', 'height': 360, 'vcodec': 'h264', 'acodec': 'none'}, + '135': {'ext': 'mp4', 'height': 480, 'vcodec': 'h264', 'acodec': 'none'}, + '136': {'ext': 'mp4', 'height': 720, 'vcodec': 'h264', 'acodec': 'none'}, + '137': {'ext': 'mp4', 'height': 1080, 'vcodec': 'h264', 'acodec': 'none'}, + '138': {'ext': 'mp4', 'vcodec': 'h264', 'acodec': 'none'}, # Height can vary (https://github.com/ytdl-org/youtube-dl/issues/4559) + '160': {'ext': 'mp4', 'height': 144, 'vcodec': 'h264', 'acodec': 'none'}, + '212': {'ext': 'mp4', 'height': 480, 'vcodec': 'h264', 'acodec': 'none'}, + '264': {'ext': 'mp4', 'height': 1440, 'vcodec': 'h264', 'acodec': 'none'}, + '298': {'ext': 'mp4', 'height': 720, 'vcodec': 'h264', 'fps': 60, 'acodec': 'none'}, + '299': {'ext': 'mp4', 'height': 1080, 'vcodec': 'h264', 'fps': 60, 'acodec': 'none'}, + '266': {'ext': 'mp4', 'height': 2160, 'vcodec': 'h264', 'acodec': 'none'}, + + # Dash mp4 audio + '139': {'ext': 'm4a', 'acodec': 'aac', 'vcodec': 'none'}, + '140': {'ext': 'm4a', 'acodec': 'aac', 'vcodec': 'none'}, + '141': {'ext': 'm4a', 'acodec': 'aac', 'vcodec': 'none'}, + '256': {'ext': 'm4a', 'acodec': 'aac', 'vcodec': 'none'}, + '258': {'ext': 'm4a', 'acodec': 'aac', 'vcodec': 'none'}, + '325': {'ext': 'm4a', 'acodec': 'dtse', 'vcodec': 'none'}, + '328': {'ext': 'm4a', 'acodec': 'ec-3', 'vcodec': 'none'}, + + # Dash webm + '167': {'ext': 'webm', 'height': 360, 'width': 640, 'vcodec': 'vp8'}, + '168': {'ext': 'webm', 'height': 480, 'width': 854, 'vcodec': 'vp8'}, + '169': {'ext': 'webm', 'height': 720, 'width': 1280, 'vcodec': 'vp8'}, + '170': {'ext': 'webm', 'height': 1080, 'width': 1920, 'vcodec': 'vp8'}, + '218': {'ext': 'webm', 'height': 480, 'width': 854, 'vcodec': 'vp8'}, + '219': {'ext': 'webm', 'height': 480, 'width': 854, 'vcodec': 'vp8'}, + '278': {'ext': 'webm', 'height': 144, 'vcodec': 'vp9', 'acodec': 'none'}, + '242': {'ext': 'webm', 'height': 240, 'vcodec': 'vp9', 'acodec': 'none'}, + '243': {'ext': 'webm', 'height': 360, 'vcodec': 'vp9', 'acodec': 'none'}, + '244': {'ext': 'webm', 'height': 480, 'vcodec': 'vp9', 'acodec': 'none'}, + '245': {'ext': 'webm', 'height': 480, 'vcodec': 'vp9', 'acodec': 'none'}, + '246': {'ext': 'webm', 'height': 480, 'vcodec': 'vp9', 'acodec': 'none'}, + '247': {'ext': 'webm', 'height': 720, 'vcodec': 'vp9', 'acodec': 'none'}, + '248': {'ext': 'webm', 'height': 1080, 'vcodec': 'vp9', 'acodec': 'none'}, + '271': {'ext': 'webm', 'height': 1440, 'vcodec': 'vp9', 'acodec': 'none'}, + # itag 272 videos are either 3840x2160 (e.g. RtoitU2A-3E) or 7680x4320 (sLprVF6d7Ug) + '272': {'ext': 'webm', 'height': 2160, 'vcodec': 'vp9', 'acodec': 'none'}, + '302': {'ext': 'webm', 'height': 720, 'vcodec': 'vp9', 'fps': 60, 'acodec': 'none'}, + '303': {'ext': 'webm', 'height': 1080, 'vcodec': 'vp9', 'fps': 60, 'acodec': 'none'}, + '308': {'ext': 'webm', 'height': 1440, 'vcodec': 'vp9', 'fps': 60, 'acodec': 'none'}, + '313': {'ext': 'webm', 'height': 2160, 'vcodec': 'vp9', 'acodec': 'none'}, + '315': {'ext': 'webm', 'height': 2160, 'vcodec': 'vp9', 'fps': 60, 'acodec': 'none'}, + + # Dash webm audio + '171': {'ext': 'webm', 'acodec': 'vorbis', 'vcodec': 'none'}, + '172': {'ext': 'webm', 'acodec': 'vorbis', 'vcodec': 'none'}, + + # Dash webm audio with opus inside + '249': {'ext': 'webm', 'acodec': 'opus', 'vcodec': 'none'}, + '250': {'ext': 'webm', 'acodec': 'opus', 'vcodec': 'none'}, + '251': {'ext': 'webm', 'acodec': 'opus', 'vcodec': 'none'}, + + # av01 video only formats sometimes served with "unknown" codecs + '394': {'ext': 'mp4', 'height': 144, 'vcodec': 'av01.0.00M.08', 'acodec': 'none'}, + '395': {'ext': 'mp4', 'height': 240, 'vcodec': 'av01.0.00M.08', 'acodec': 'none'}, + '396': {'ext': 'mp4', 'height': 360, 'vcodec': 'av01.0.01M.08', 'acodec': 'none'}, + '397': {'ext': 'mp4', 'height': 480, 'vcodec': 'av01.0.04M.08', 'acodec': 'none'}, + '398': {'ext': 'mp4', 'height': 720, 'vcodec': 'av01.0.05M.08', 'acodec': 'none'}, + '399': {'ext': 'mp4', 'height': 1080, 'vcodec': 'av01.0.08M.08', 'acodec': 'none'}, + '400': {'ext': 'mp4', 'height': 1440, 'vcodec': 'av01.0.12M.08', 'acodec': 'none'}, + '401': {'ext': 'mp4', 'height': 2160, 'vcodec': 'av01.0.12M.08', 'acodec': 'none'}, + } + def _call_cdx_api(self, item_id, url, filters: list | None = None, collapse: list | None = None, query: dict | None = None, note=None, fatal=False): # CDX docs: https://github.com/internetarchive/wayback/blob/master/wayback-cdx-server/README.md query = { @@ -929,27 +1078,30 @@ class YoutubeWebArchiveIE(InfoExtractor): capture_dates.extend([self._OLDEST_CAPTURE_DATE, self._NEWEST_CAPTURE_DATE]) return orderedSet(filter(None, capture_dates)) + def _parse_fmt(self, fmt, extra_info=None): + format_id = traverse_obj(fmt, ('url', {parse_qs}, 'itag', 0)) + return { + 'format_id': format_id, + **self._FORMATS.get(format_id, {}), + **traverse_obj(fmt, { + 'url': ('url', {lambda x: f'https://web.archive.org/web/2id_/{x}'}), + 'ext': ('ext', {str}), + 'filesize': ('url', {parse_qs}, 'clen', 0, {int_or_none}), + }), + **(extra_info or {}), + } + def _real_extract(self, url): video_id, url_date, url_date_2 = self._match_valid_url(url).group('id', 'date', 'date2') url_date = url_date or url_date_2 - urlh = None - retry_manager = self.RetryManager(fatal=False) - for retry in retry_manager: - try: - urlh = self._request_webpage( - HEADRequest(f'https://web.archive.org/web/2oe_/http://wayback-fakeurl.archive.org/yt/{video_id}'), - video_id, note='Fetching archived video file url', expected_status=True) - except ExtractorError as e: - # HTTP Error 404 is expected if the video is not saved. - if isinstance(e.cause, HTTPError) and e.cause.status == 404: - self.raise_no_formats( - 'The requested video is not archived, indexed, or there is an issue with web.archive.org (try again later)', expected=True) - else: - retry.error = e + video_info = self._download_json( + 'https://web.archive.org/__wb/videoinfo', video_id, + query={'vtype': 'youtube', 'vid': video_id}) - if retry_manager.error: - self.raise_no_formats(retry_manager.error, expected=True, video_id=video_id) + if not traverse_obj(video_info, 'formats'): + self.raise_no_formats( + 'The requested video is not archived or indexed', expected=True) capture_dates = self._get_capture_dates(video_id, int_or_none(url_date)) self.write_debug('Captures to try: ' + join_nonempty(*capture_dates, delim=', ')) @@ -968,25 +1120,15 @@ class YoutubeWebArchiveIE(InfoExtractor): info['thumbnails'] = self._extract_thumbnails(video_id) - if urlh: - url = urllib.parse.unquote(urlh.url) - video_file_url_qs = parse_qs(url) - # Attempt to recover any ext & format info from playback url & response headers - fmt = {'url': url, 'filesize': int_or_none(urlh.headers.get('x-archive-orig-content-length'))} - itag = try_get(video_file_url_qs, lambda x: x['itag'][0]) - if itag and itag in YoutubeIE._formats: - fmt.update(YoutubeIE._formats[itag]) - fmt.update({'format_id': itag}) - else: - mime = try_get(video_file_url_qs, lambda x: x['mime'][0]) - ext = (mimetype2ext(mime) - or urlhandle_detect_ext(urlh) - or mimetype2ext(urlh.headers.get('x-archive-guessed-content-type'))) - fmt.update({'ext': ext}) - info['formats'] = [fmt] - if not info.get('duration'): - info['duration'] = str_to_int(try_get(video_file_url_qs, lambda x: x['dur'][0])) + formats = [] + if video_info.get('dmux'): + for vf in traverse_obj(video_info, ('formats', 'video', lambda _, v: url_or_none(v['url']))): + formats.append(self._parse_fmt(vf, {'acodec': 'none'})) + for af in traverse_obj(video_info, ('formats', 'audio', lambda _, v: url_or_none(v['url']))): + formats.append(self._parse_fmt(af, {'vcodec': 'none'})) + else: + for fmt in traverse_obj(video_info, ('formats', lambda _, v: url_or_none(v['url']))): + formats.append(self._parse_fmt(fmt)) + info['formats'] = formats - if not info.get('title'): - info['title'] = video_id return info diff --git a/plugins/youtube_download/yt_dlp/extractor/ard.py b/plugins/youtube_download/yt_dlp/extractor/ard.py index 89d3299..5bcf74e 100644 --- a/plugins/youtube_download/yt_dlp/extractor/ard.py +++ b/plugins/youtube_download/yt_dlp/extractor/ard.py @@ -1,4 +1,5 @@ import functools +import json import re from .common import InfoExtractor @@ -15,11 +16,12 @@ from ..utils import ( remove_start, str_or_none, unified_strdate, + update_url, update_url_query, url_or_none, xpath_text, ) -from ..utils.traversal import traverse_obj +from ..utils.traversal import traverse_obj, value class ARDMediathekBaseIE(InfoExtractor): @@ -601,3 +603,163 @@ class ARDMediathekCollectionIE(InfoExtractor): return self.playlist_result( OnDemandPagedList(fetch_page, self._PAGE_SIZE), full_id, display_id=display_id, title=page_data.get('title'), description=page_data.get('synopsis')) + + +class ARDAudiothekBaseIE(InfoExtractor): + def _graphql_query(self, urn, query): + return self._download_json( + 'https://api.ardaudiothek.de/graphql', urn, + data=json.dumps({ + 'query': query, + 'variables': {'id': urn}, + }).encode(), headers={ + 'Content-Type': 'application/json', + })['data'] + + +class ARDAudiothekIE(ARDAudiothekBaseIE): + _VALID_URL = r'https:?//(?:www\.)?ardaudiothek\.de/episode/(?Purn:ard:(?:episode|section|extra):[a-f0-9]{16})' + + _TESTS = [{ + 'url': 'https://www.ardaudiothek.de/episode/urn:ard:episode:eabead1add170e93/', + 'info_dict': { + 'id': 'urn:ard:episode:eabead1add170e93', + 'ext': 'mp3', + 'upload_date': '20240717', + 'duration': 3339, + 'title': 'CAIMAN CLUB (S04E04): Cash Out', + 'thumbnail': 'https://api.ardmediathek.de/image-service/images/urn:ard:image:ed64411a07a4b405', + 'description': 'md5:0e5d127a3832ae59e8bab40a91a5dadc', + 'display_id': 'urn:ard:episode:eabead1add170e93', + 'timestamp': 1721181641, + 'series': '1LIVE Caiman Club', + 'channel': 'WDR', + 'episode': 'Episode 4', + 'episode_number': 4, + }, + }, { + 'url': 'https://www.ardaudiothek.de/episode/urn:ard:section:855c7a53dac72e0a/', + 'info_dict': { + 'id': 'urn:ard:section:855c7a53dac72e0a', + 'ext': 'mp4', + 'upload_date': '20241231', + 'duration': 3304, + 'title': 'Illegaler DDR-Detektiv: Doberschütz und die letzte Staatsjagd (1/2) - Wendezeit', + 'thumbnail': 'https://api.ardmediathek.de/image-service/images/urn:ard:image:b9b4f1e8b93da4dd', + 'description': 'md5:3552d571e1959754cff66c1da6c0fdae', + 'display_id': 'urn:ard:section:855c7a53dac72e0a', + 'timestamp': 1735629900, + 'series': 'Auf der Spur – Die ARD Ermittlerkrimis', + 'channel': 'ARD', + 'episode': 'Episode 1', + 'episode_number': 1, + }, + }, { + 'url': 'https://www.ardaudiothek.de/episode/urn:ard:extra:d2fe7303d2dcbf5d/', + 'info_dict': { + 'id': 'urn:ard:extra:d2fe7303d2dcbf5d', + 'ext': 'mp3', + 'title': 'Trailer: Fanta Vier Forever, Baby!?!', + 'description': 'md5:b64a586f2e976b8bb5ea0a79dbd8751c', + 'channel': 'SWR', + 'duration': 62, + 'thumbnail': 'https://api.ardmediathek.de/image-service/images/urn:ard:image:48d3c255969be803', + 'series': 'Fanta Vier Forever, Baby!?!', + 'timestamp': 1732108217, + 'upload_date': '20241120', + }, + }] + + _QUERY_ITEM = '''\ + query($id: ID!) { + item(id: $id) { + audioList { + href + distributionType + audioBitrate + audioCodec + } + show { + title + } + image { + url1X1 + } + programSet { + publicationService { + organizationName + } + } + description + title + duration + startDate + episodeNumber + } + }''' + + def _real_extract(self, url): + urn = self._match_id(url) + item = self._graphql_query(urn, self._QUERY_ITEM)['item'] + return { + 'id': urn, + **traverse_obj(item, { + 'formats': ('audioList', lambda _, v: url_or_none(v['href']), { + 'url': 'href', + 'format_id': ('distributionType', {str}), + 'abr': ('audioBitrate', {int_or_none}), + 'acodec': ('audioCodec', {str}), + 'vcodec': {value('none')}, + }), + 'channel': ('programSet', 'publicationService', 'organizationName', {str}), + 'description': ('description', {str}), + 'duration': ('duration', {int_or_none}), + 'series': ('show', 'title', {str}), + 'episode_number': ('episodeNumber', {int_or_none}), + 'thumbnail': ('image', 'url1X1', {url_or_none}, {update_url(query=None)}), + 'timestamp': ('startDate', {parse_iso8601}), + 'title': ('title', {str}), + }), + } + + +class ARDAudiothekPlaylistIE(ARDAudiothekBaseIE): + _VALID_URL = r'https:?//(?:www\.)?ardaudiothek\.de/sendung/(?P[\w-]+)/(?Purn:ard:show:[a-f0-9]{16})' + + _TESTS = [{ + 'url': 'https://www.ardaudiothek.de/sendung/mia-insomnia/urn:ard:show:c405aa26d9a4060a/', + 'info_dict': { + 'display_id': 'mia-insomnia', + 'title': 'Mia Insomnia', + 'id': 'urn:ard:show:c405aa26d9a4060a', + 'description': 'md5:d9ceb7a6b4d26a4db3316573bb564292', + }, + 'playlist_mincount': 37, + }, { + 'url': 'https://www.ardaudiothek.de/sendung/100-berlin/urn:ard:show:4d248e0806ce37bc/', + 'only_matching': True, + }] + + _QUERY_PLAYLIST = ''' + query($id: ID!) { + show(id: $id) { + title + description + items(filter: { isPublished: { equalTo: true } }) { + nodes { + url + } + } + } + }''' + + def _real_extract(self, url): + urn, playlist = self._match_valid_url(url).group('id', 'playlist') + playlist_info = self._graphql_query(urn, self._QUERY_PLAYLIST)['show'] + entries = [] + for url in traverse_obj(playlist_info, ('items', 'nodes', ..., 'url', {url_or_none})): + entries.append(self.url_result(url, ie=ARDAudiothekIE)) + return self.playlist_result(entries, urn, display_id=playlist, **traverse_obj(playlist_info, { + 'title': ('title', {str}), + 'description': ('description', {str}), + })) diff --git a/plugins/youtube_download/yt_dlp/extractor/bandcamp.py b/plugins/youtube_download/yt_dlp/extractor/bandcamp.py index 0a8f88f..510fc5f 100644 --- a/plugins/youtube_download/yt_dlp/extractor/bandcamp.py +++ b/plugins/youtube_download/yt_dlp/extractor/bandcamp.py @@ -5,16 +5,18 @@ import time from .common import InfoExtractor from ..utils import ( - KNOWN_EXTENSIONS, ExtractorError, clean_html, extract_attributes, float_or_none, + format_field, int_or_none, + join_nonempty, parse_filesize, + parse_qs, str_or_none, + strftime_or_none, try_get, - unified_strdate, unified_timestamp, update_url_query, url_or_none, @@ -411,70 +413,67 @@ class BandcampAlbumIE(BandcampIE): # XXX: Do not subclass from concrete IE class BandcampWeeklyIE(BandcampIE): # XXX: Do not subclass from concrete IE IE_NAME = 'Bandcamp:weekly' - _VALID_URL = r'https?://(?:www\.)?bandcamp\.com/?\?(?:.*?&)?show=(?P\d+)' + _VALID_URL = r'https?://(?:www\.)?bandcamp\.com/radio/?\?(?:[^#]+&)?show=(?P\d+)' _TESTS = [{ - 'url': 'https://bandcamp.com/?show=224', + 'url': 'https://bandcamp.com/radio?show=224', 'md5': '61acc9a002bed93986b91168aa3ab433', 'info_dict': { 'id': '224', 'ext': 'mp3', - 'title': 'BC Weekly April 4th 2017 - Magic Moments', + 'title': 'Bandcamp Weekly, 2017-04-04', 'description': 'md5:5d48150916e8e02d030623a48512c874', - 'duration': 5829.77, - 'release_date': '20170404', + 'thumbnail': 'https://f4.bcbits.com/img/9982549_0.jpg', 'series': 'Bandcamp Weekly', - 'episode': 'Magic Moments', 'episode_id': '224', + 'release_timestamp': 1491264000, + 'release_date': '20170404', + 'duration': 5829.77, }, 'params': { 'format': 'mp3-128', }, }, { - 'url': 'https://bandcamp.com/?blah/blah@&show=228', + 'url': 'https://bandcamp.com/radio/?foo=bar&show=224', 'only_matching': True, }] def _real_extract(self, url): show_id = self._match_id(url) - webpage = self._download_webpage(url, show_id) + audio_data = self._download_json( + 'https://bandcamp.com/api/bcradio_api/1/get_show', + show_id, 'Downloading radio show JSON', + data=json.dumps({'id': show_id}).encode(), + headers={'Content-Type': 'application/json'})['radioShowAudio'] - blob = self._extract_data_attr(webpage, show_id, 'blob') + stream_url = audio_data['streamUrl'] + format_id = traverse_obj(stream_url, ({parse_qs}, 'enc', -1)) + encoding, _, bitrate_str = (format_id or '').partition('-') - show = blob['bcw_data'][show_id] + webpage = self._download_webpage(url, show_id, fatal=False) + metadata = traverse_obj( + self._extract_data_attr(webpage, show_id, 'blob', fatal=False), + ('appData', 'shows', lambda _, v: str(v['showId']) == show_id, any)) or {} - formats = [] - for format_id, format_url in show['audio_stream'].items(): - if not url_or_none(format_url): - continue - for known_ext in KNOWN_EXTENSIONS: - if known_ext in format_id: - ext = known_ext - break - else: - ext = None - formats.append({ - 'format_id': format_id, - 'url': format_url, - 'ext': ext, - 'vcodec': 'none', - }) - - title = show.get('audio_title') or 'Bandcamp Weekly' - subtitle = show.get('subtitle') - if subtitle: - title += f' - {subtitle}' + series_title = audio_data.get('title') or metadata.get('title') + release_timestamp = unified_timestamp(audio_data.get('date')) or unified_timestamp(metadata.get('date')) return { 'id': show_id, - 'title': title, - 'description': show.get('desc') or show.get('short_desc'), - 'duration': float_or_none(show.get('audio_duration')), - 'is_live': False, - 'release_date': unified_strdate(show.get('published_date')), - 'series': 'Bandcamp Weekly', - 'episode': show.get('subtitle'), 'episode_id': show_id, - 'formats': formats, + 'title': join_nonempty(series_title, strftime_or_none(release_timestamp, '%Y-%m-%d'), delim=', '), + 'series': series_title, + 'thumbnail': format_field(metadata, 'imageId', 'https://f4.bcbits.com/img/%s_0.jpg', default=None), + 'description': metadata.get('desc') or metadata.get('short_desc'), + 'duration': float_or_none(audio_data.get('duration')), + 'release_timestamp': release_timestamp, + 'formats': [{ + 'url': stream_url, + 'format_id': format_id, + 'ext': encoding or 'mp3', + 'acodec': encoding or None, + 'vcodec': 'none', + 'abr': int_or_none(bitrate_str), + }], } diff --git a/plugins/youtube_download/yt_dlp/extractor/bigo.py b/plugins/youtube_download/yt_dlp/extractor/bigo.py index b1c230f..3e51173 100644 --- a/plugins/youtube_download/yt_dlp/extractor/bigo.py +++ b/plugins/youtube_download/yt_dlp/extractor/bigo.py @@ -1,5 +1,5 @@ from .common import InfoExtractor -from ..utils import ExtractorError, urlencode_postdata +from ..utils import ExtractorError, UserNotLive, urlencode_postdata class BigoIE(InfoExtractor): @@ -40,7 +40,7 @@ class BigoIE(InfoExtractor): info = info_raw.get('data') or {} if not info.get('alive'): - raise ExtractorError('This user is offline.', expected=True) + raise UserNotLive(video_id=user_id) formats, subs = self._extract_m3u8_formats_and_subtitles( info.get('hls_src'), user_id, 'mp4', 'm3u8') diff --git a/plugins/youtube_download/yt_dlp/extractor/bitmovin.py b/plugins/youtube_download/yt_dlp/extractor/bitmovin.py new file mode 100644 index 0000000..f999393 --- /dev/null +++ b/plugins/youtube_download/yt_dlp/extractor/bitmovin.py @@ -0,0 +1,74 @@ +import re + +from .common import InfoExtractor +from ..utils.traversal import traverse_obj + + +class BitmovinIE(InfoExtractor): + _VALID_URL = r'https?://streams\.bitmovin\.com/(?P\w+)' + _EMBED_REGEX = [r']+\bsrc=["\'](?P(?:https?:)?//streams\.bitmovin\.com/(?P\w+)[^"\']+)'] + _TESTS = [{ + 'url': 'https://streams.bitmovin.com/cqkl1t5giv3lrce7pjbg/embed', + 'info_dict': { + 'id': 'cqkl1t5giv3lrce7pjbg', + 'ext': 'mp4', + 'title': 'Developing Osteopathic Residents as Faculty', + 'thumbnail': 'https://streams.bitmovin.com/cqkl1t5giv3lrce7pjbg/poster', + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'url': 'https://streams.bitmovin.com/cgl9rh94uvs51rqc8jhg/share', + 'info_dict': { + 'id': 'cgl9rh94uvs51rqc8jhg', + 'ext': 'mp4', + 'title': 'Big Buck Bunny (Streams Docs)', + 'thumbnail': 'https://streams.bitmovin.com/cgl9rh94uvs51rqc8jhg/poster', + }, + 'params': {'skip_download': 'm3u8'}, + }] + _WEBPAGE_TESTS = [{ + # bitmovin-stream web component + 'url': 'https://www.institutionalinvestor.com/article/2bsw1in1l9k68mp9kritc/video-war-stories-over-board-games/best-case-i-get-fired-war-stories', + 'info_dict': { + 'id': 'cuiumeil6g115lc4li3g', + 'ext': 'mp4', + 'title': '[media] War Stories over Board Games: ‚ÄúBest Case: I Get Fired‚Äù ', + 'thumbnail': 'https://streams.bitmovin.com/cuiumeil6g115lc4li3g/poster', + }, + 'params': {'skip_download': 'm3u8'}, + }, { + # iframe embed + 'url': 'https://www.clearblueionizer.com/en/pool-ionizers/mineral-pool-vs-saltwater-pool/', + 'info_dict': { + 'id': 'cvpvfsm1pf7itg7cfvtg', + 'ext': 'mp4', + 'title': 'Pool Ionizer vs. Salt Chlorinator', + 'thumbnail': 'https://streams.bitmovin.com/cvpvfsm1pf7itg7cfvtg/poster', + }, + 'params': {'skip_download': 'm3u8'}, + }] + + @classmethod + def _extract_embed_urls(cls, url, webpage): + yield from super()._extract_embed_urls(url, webpage) + for stream_id in re.findall(r']*\bstream-id=["\'](?P\w+)', webpage): + yield f'https://streams.bitmovin.com/{stream_id}' + + def _real_extract(self, url): + video_id = self._match_id(url) + + player_config = self._download_json( + f'https://streams.bitmovin.com/{video_id}/config', video_id)['sources'] + + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + player_config['hls'], video_id, 'mp4') + + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + **traverse_obj(player_config, { + 'title': ('title', {str}), + 'thumbnail': ('poster', {str}), + }), + } diff --git a/plugins/youtube_download/yt_dlp/extractor/bunnycdn.py b/plugins/youtube_download/yt_dlp/extractor/bunnycdn.py index d787533..d4a4a23 100644 --- a/plugins/youtube_download/yt_dlp/extractor/bunnycdn.py +++ b/plugins/youtube_download/yt_dlp/extractor/bunnycdn.py @@ -16,7 +16,7 @@ from ..utils.traversal import find_element, traverse_obj class BunnyCdnIE(InfoExtractor): - _VALID_URL = r'https?://(?:iframe\.mediadelivery\.net|video\.bunnycdn\.com)/(?:embed|play)/(?P\d+)/(?P[\da-f-]+)' + _VALID_URL = r'https?://(?:(?:iframe|player)\.mediadelivery\.net|video\.bunnycdn\.com)/(?:embed|play)/(?P\d+)/(?P[\da-f-]+)' _EMBED_REGEX = [rf']+src=[\'"](?P{_VALID_URL}[^\'"]*)[\'"]'] _TESTS = [{ 'url': 'https://iframe.mediadelivery.net/embed/113933/e73edec1-e381-4c8b-ae73-717a140e0924', @@ -39,7 +39,7 @@ class BunnyCdnIE(InfoExtractor): 'timestamp': 1691145748, 'thumbnail': r're:^https?://.*\.b-cdn\.net/32e34c4b-0d72-437c-9abb-05e67657da34/thumbnail_9172dc16\.jpg', 'duration': 106.0, - 'description': 'md5:981a3e899a5c78352b21ed8b2f1efd81', + 'description': 'md5:11452bcb31f379ee3eaf1234d3264e44', 'upload_date': '20230804', 'title': 'Sanela ist Teil der #arbeitsmarktkraft', }, @@ -58,6 +58,23 @@ class BunnyCdnIE(InfoExtractor): 'thumbnail': r're:^https?://.*\.b-cdn\.net/2e8545ec-509d-4571-b855-4cf0235ccd75/thumbnail\.jpg', }, 'params': {'skip_download': True}, + }, { + # Requires any Referer + 'url': 'https://iframe.mediadelivery.net/embed/289162/6372f5a3-68df-4ef7-a115-e1110186c477', + 'info_dict': { + 'id': '6372f5a3-68df-4ef7-a115-e1110186c477', + 'ext': 'mp4', + 'title': '12-Creating Small Asset Blockouts -Timelapse.mp4', + 'description': '', + 'duration': 263.0, + 'timestamp': 1724485440, + 'upload_date': '20240824', + 'thumbnail': r're:^https?://.*\.b-cdn\.net/6372f5a3-68df-4ef7-a115-e1110186c477/thumbnail\.jpg', + }, + 'params': {'skip_download': True}, + }, { + 'url': 'https://player.mediadelivery.net/embed/519128/875880a9-bcc2-4038-9e05-e5024bba9b70', + 'only_matching': True, }] _WEBPAGE_TESTS = [{ # Stream requires Referer @@ -100,7 +117,7 @@ class BunnyCdnIE(InfoExtractor): video_id, library_id = self._match_valid_url(url).group('id', 'library_id') webpage = self._download_webpage( f'https://iframe.mediadelivery.net/embed/{library_id}/{video_id}', video_id, - headers=traverse_obj(smuggled_data, {'Referer': 'Referer'}), + headers={'Referer': smuggled_data.get('Referer') or 'https://iframe.mediadelivery.net/'}, query=traverse_obj(parse_qs(url), {'token': 'token', 'expires': 'expires'})) if html_title := self._html_extract_title(webpage, default=None) == '403': diff --git a/plugins/youtube_download/yt_dlp/extractor/cda.py b/plugins/youtube_download/yt_dlp/extractor/cda.py index 027b37d..f8fb606 100644 --- a/plugins/youtube_download/yt_dlp/extractor/cda.py +++ b/plugins/youtube_download/yt_dlp/extractor/cda.py @@ -27,7 +27,7 @@ from ..utils.traversal import traverse_obj class CDAIE(InfoExtractor): - _VALID_URL = r'https?://(?:(?:www\.)?cda\.pl/video|ebd\.cda\.pl/[0-9]+x[0-9]+)/(?P[0-9a-z]+)' + _VALID_URL = r'https?://(?:(?:(?:www|m)\.)?cda\.pl/video|ebd\.cda\.pl/[0-9]+x[0-9]+)/(?P[0-9a-z]+)' _NETRC_MACHINE = 'cdapl' _BASE_URL = 'https://www.cda.pl' @@ -110,6 +110,9 @@ class CDAIE(InfoExtractor): }, { 'url': 'http://ebd.cda.pl/0x0/5749950c', 'only_matching': True, + }, { + 'url': 'https://m.cda.pl/video/617297677', + 'only_matching': True, }] def _download_age_confirm_page(self, url, video_id, *args, **kwargs): @@ -367,35 +370,35 @@ class CDAIE(InfoExtractor): class CDAFolderIE(InfoExtractor): _MAX_PAGE_SIZE = 36 - _VALID_URL = r'https?://(?:www\.)?cda\.pl/(?P[\w-]+)/folder/(?P\d+)' - _TESTS = [ - { - 'url': 'https://www.cda.pl/domino264/folder/31188385', - 'info_dict': { - 'id': '31188385', - 'title': 'SERIA DRUGA', - }, - 'playlist_mincount': 13, + _VALID_URL = r'https?://(?:(?:www|m)\.)?cda\.pl/(?P[\w-]+)/folder/(?P\d+)' + _TESTS = [{ + 'url': 'https://www.cda.pl/domino264/folder/31188385', + 'info_dict': { + 'id': '31188385', + 'title': 'SERIA DRUGA', }, - { - 'url': 'https://www.cda.pl/smiechawaTV/folder/2664592/vfilm', - 'info_dict': { - 'id': '2664592', - 'title': 'VideoDowcipy - wszystkie odcinki', - }, - 'playlist_mincount': 71, + 'playlist_mincount': 13, + }, { + 'url': 'https://www.cda.pl/smiechawaTV/folder/2664592/vfilm', + 'info_dict': { + 'id': '2664592', + 'title': 'VideoDowcipy - wszystkie odcinki', }, - { - 'url': 'https://www.cda.pl/DeliciousBeauty/folder/19129979/vfilm', - 'info_dict': { - 'id': '19129979', - 'title': 'TESTY KOSMETYKÓW', - }, - 'playlist_mincount': 139, - }, { - 'url': 'https://www.cda.pl/FILMY-SERIALE-ANIME-KRESKOWKI-BAJKI/folder/18493422', - 'only_matching': True, - }] + 'playlist_mincount': 71, + }, { + 'url': 'https://www.cda.pl/DeliciousBeauty/folder/19129979/vfilm', + 'info_dict': { + 'id': '19129979', + 'title': 'TESTY KOSMETYKÓW', + }, + 'playlist_mincount': 139, + }, { + 'url': 'https://www.cda.pl/FILMY-SERIALE-ANIME-KRESKOWKI-BAJKI/folder/18493422', + 'only_matching': True, + }, { + 'url': 'https://m.cda.pl/smiechawaTV/folder/2664592/vfilm', + 'only_matching': True, + }] def _real_extract(self, url): folder_id, channel = self._match_valid_url(url).group('id', 'channel') diff --git a/plugins/youtube_download/yt_dlp/extractor/common.py b/plugins/youtube_download/yt_dlp/extractor/common.py index d6e2596..70f1433 100644 --- a/plugins/youtube_download/yt_dlp/extractor/common.py +++ b/plugins/youtube_download/yt_dlp/extractor/common.py @@ -348,6 +348,7 @@ class InfoExtractor: duration: Length of the video in seconds, as an integer or float. view_count: How many users have watched the video on the platform. concurrent_view_count: How many users are currently watching the video on the platform. + save_count: Number of times the video has been saved or bookmarked like_count: Number of positive ratings of the video dislike_count: Number of negative ratings of the video repost_count: Number of reposts of the video diff --git a/plugins/youtube_download/yt_dlp/extractor/croatianfilm.py b/plugins/youtube_download/yt_dlp/extractor/croatianfilm.py new file mode 100644 index 0000000..de68829 --- /dev/null +++ b/plugins/youtube_download/yt_dlp/extractor/croatianfilm.py @@ -0,0 +1,79 @@ +from .common import InfoExtractor +from .vimeo import VimeoIE +from ..utils import ( + ExtractorError, + join_nonempty, +) +from ..utils.traversal import traverse_obj + + +class CroatianFilmIE(InfoExtractor): + IE_NAME = 'croatian.film' + _VALID_URL = r'https://?(?:www\.)?croatian\.film/[a-z]{2}/[^/?#]+/(?P\d+)' + _GEO_COUNTRIES = ['HR'] + + _TESTS = [{ + 'url': 'https://www.croatian.film/hr/films/72472', + 'info_dict': { + 'id': '1078340774', + 'ext': 'mp4', + 'title': '“ŠKAFETIN”, r. Paško Vukasović', + 'uploader': 'croatian.film', + 'uploader_id': 'user94192658', + 'uploader_url': 'https://vimeo.com/user94192658', + 'duration': 1357, + 'thumbnail': 'https://i.vimeocdn.com/video/2008556407-40eb1315ec11be5fcb8dda4d7059675b0881e182b9fc730892e267db72cb57f5-d', + }, + 'params': {'skip_download': 'm3u8'}, + 'expected_warnings': ['Failed to parse XML: not well-formed'], + }, { + # geo-restricted but works with xff + 'url': 'https://www.croatian.film/en/films/77144', + 'info_dict': { + 'id': '1144997795', + 'ext': 'mp4', + 'title': '“ROKO” r. Ivana Marinić Kragić', + 'uploader': 'croatian.film', + 'uploader_id': 'user94192658', + 'uploader_url': 'https://vimeo.com/user94192658', + 'duration': 1023, + 'thumbnail': 'https://i.vimeocdn.com/video/2093793231-11c2928698ff8347489e679b4d563a576e7acd0681ce95b383a9a25f6adb5e8f-d', + }, + 'params': {'skip_download': 'm3u8'}, + 'expected_warnings': ['Failed to parse XML: not well-formed'], + }, { + 'url': 'https://www.croatian.film/en/films/75904/watch', + 'info_dict': { + 'id': '1134883757', + 'ext': 'mp4', + 'title': '"CARPE DIEM" r. Nina Damjanović', + 'uploader': 'croatian.film', + 'uploader_id': 'user94192658', + 'uploader_url': 'https://vimeo.com/user94192658', + 'duration': 1123, + 'thumbnail': 'https://i.vimeocdn.com/video/2080022187-bb691c470c28c4d979258cf235e594bf9a11c14b837a0784326c25c95edd83f9-d', + }, + 'params': {'skip_download': 'm3u8'}, + 'expected_warnings': ['Failed to parse XML: not well-formed'], + }] + + def _real_extract(self, url): + display_id = self._match_id(url) + api_data = self._download_json( + f'https://api.croatian.film/api/videos/{display_id}', + display_id) + + if errors := traverse_obj(api_data, ('errors', lambda _, v: v['code'])): + codes = traverse_obj(errors, (..., 'code', {str})) + if 'INVALID_COUNTRY' in codes: + self.raise_geo_restricted(countries=self._GEO_COUNTRIES) + raise ExtractorError(join_nonempty( + *(traverse_obj(errors, (..., 'details', {str})) or codes), + delim='; ')) + + vimeo_id = self._search_regex( + r'/videos/(\d+)', api_data['video']['vimeoURL'], 'vimeo ID') + + return self.url_result( + VimeoIE._smuggle_referrer(f'https://player.vimeo.com/video/{vimeo_id}', url), + VimeoIE, vimeo_id) diff --git a/plugins/youtube_download/yt_dlp/extractor/digiteka.py b/plugins/youtube_download/yt_dlp/extractor/digiteka.py index e56ec63..1bbec62 100644 --- a/plugins/youtube_download/yt_dlp/extractor/digiteka.py +++ b/plugins/youtube_download/yt_dlp/extractor/digiteka.py @@ -1,5 +1,6 @@ from .common import InfoExtractor -from ..utils import int_or_none +from ..utils import int_or_none, url_or_none +from ..utils.traversal import traverse_obj class DigitekaIE(InfoExtractor): @@ -25,74 +26,56 @@ class DigitekaIE(InfoExtractor): )/(?P[\d+a-z]+)''' _EMBED_REGEX = [r'<(?:iframe|script)[^>]+src=["\'](?P(?:https?:)?//(?:www\.)?ultimedia\.com/deliver/(?:generic|musique)(?:/[^/]+)*/(?:src|article)/[\d+a-z]+)'] _TESTS = [{ - # news - 'url': 'https://www.ultimedia.com/default/index/videogeneric/id/s8uk0r', - 'md5': '276a0e49de58c7e85d32b057837952a2', + 'url': 'https://www.ultimedia.com/default/index/videogeneric/id/3x5x55k', 'info_dict': { - 'id': 's8uk0r', + 'id': '3x5x55k', 'ext': 'mp4', - 'title': 'Loi sur la fin de vie: le texte prévoit un renforcement des directives anticipées', + 'title': 'Il est passionné de DS', 'thumbnail': r're:^https?://.*\.jpg', - 'duration': 74, - 'upload_date': '20150317', - 'timestamp': 1426604939, - 'uploader_id': '3fszv', + 'duration': 89, + 'upload_date': '20251012', + 'timestamp': 1760285363, + 'uploader_id': '3pz33', }, - }, { - # music - 'url': 'https://www.ultimedia.com/default/index/videomusic/id/xvpfp8', - 'md5': '2ea3513813cf230605c7e2ffe7eca61c', - 'info_dict': { - 'id': 'xvpfp8', - 'ext': 'mp4', - 'title': 'Two - C\'est La Vie (clip)', - 'thumbnail': r're:^https?://.*\.jpg', - 'duration': 233, - 'upload_date': '20150224', - 'timestamp': 1424760500, - 'uploader_id': '3rfzk', - }, - }, { - 'url': 'https://www.digiteka.net/deliver/generic/iframe/mdtk/01637594/src/lqm3kl/zone/1/showtitle/1/autoplay/yes', - 'only_matching': True, + 'params': {'skip_download': True}, }] + _IFRAME_MD_ID = '01836272' # One static ID working for Ultimedia iframes def _real_extract(self, url): - mobj = self._match_valid_url(url) - video_id = mobj.group('id') - video_type = mobj.group('embed_type') or mobj.group('site_type') - if video_type == 'music': - video_type = 'musique' + video_id = self._match_id(url) - deliver_info = self._download_json( - f'http://www.ultimedia.com/deliver/video?video={video_id}&topic={video_type}', - video_id) - - yt_id = deliver_info.get('yt_id') - if yt_id: - return self.url_result(yt_id, 'Youtube') - - jwconf = deliver_info['jwconf'] + video_info = self._download_json( + f'https://www.ultimedia.com/player/getConf/{self._IFRAME_MD_ID}/1/{video_id}', video_id, + note='Downloading player configuration')['video'] formats = [] - for source in jwconf['playlist'][0]['sources']: - formats.append({ - 'url': source['file'], - 'format_id': source.get('label'), - }) + subtitles = {} - title = deliver_info['title'] - thumbnail = jwconf.get('image') - duration = int_or_none(deliver_info.get('duration')) - timestamp = int_or_none(deliver_info.get('release_time')) - uploader_id = deliver_info.get('owner_id') + if hls_url := traverse_obj(video_info, ('media_sources', 'hls', 'hls_auto', {url_or_none})): + fmts, subs = self._extract_m3u8_formats_and_subtitles( + hls_url, video_id, 'mp4', m3u8_id='hls', fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + + for format_id, mp4_url in traverse_obj(video_info, ('media_sources', 'mp4', {dict.items}, ...)): + if not mp4_url: + continue + formats.append({ + 'url': mp4_url, + 'format_id': format_id, + 'height': int_or_none(format_id.partition('_')[2]), + 'ext': 'mp4', + }) return { 'id': video_id, - 'title': title, - 'thumbnail': thumbnail, - 'duration': duration, - 'timestamp': timestamp, - 'uploader_id': uploader_id, 'formats': formats, + 'subtitles': subtitles, + **traverse_obj(video_info, { + 'title': ('title', {str}), + 'thumbnail': ('image', {url_or_none}), + 'duration': ('duration', {int_or_none}), + 'timestamp': ('creationDate', {int_or_none}), + 'uploader_id': ('ownerId', {str}), + }), } diff --git a/plugins/youtube_download/yt_dlp/extractor/dplay.py b/plugins/youtube_download/yt_dlp/extractor/dplay.py index 86950b2..798c3f0 100644 --- a/plugins/youtube_download/yt_dlp/extractor/dplay.py +++ b/plugins/youtube_download/yt_dlp/extractor/dplay.py @@ -13,6 +13,7 @@ from ..utils import ( try_get, unified_timestamp, ) +from ..utils.traversal import traverse_obj class DPlayBaseIE(InfoExtractor): @@ -1053,7 +1054,7 @@ class DiscoveryPlusIndiaIE(DiscoveryPlusBaseIE): class DiscoveryNetworksDeIE(DiscoveryPlusBaseIE): - _VALID_URL = r'https?://(?:www\.)?(?P(?:tlc|dmax)\.de|dplay\.co\.uk)/(?:programme|show|sendungen)/(?P[^/]+)/(?:video/)?(?P[^/]+)' + _VALID_URL = r'https?://(?:www\.)?(?P(?:tlc|dmax)\.de)/(?:programme|show|sendungen)/(?P[^/?#]+)/(?:video/)?(?P[^/?#]+)' _TESTS = [{ 'url': 'https://dmax.de/sendungen/goldrausch-in-australien/german-gold', @@ -1074,6 +1075,7 @@ class DiscoveryNetworksDeIE(DiscoveryPlusBaseIE): 'creators': ['DMAX'], 'thumbnail': 'https://eu1-prod-images.disco-api.com/2023/05/09/f72fb510-7992-3b12-af7f-f16a2c22d1e3.jpeg', 'tags': ['schatzsucher', 'schatz', 'nugget', 'bodenschätze', 'down under', 'australien', 'goldrausch'], + 'categories': ['Gold', 'Schatzsucher'], }, 'params': {'skip_download': 'm3u8'}, }, { @@ -1100,20 +1102,96 @@ class DiscoveryNetworksDeIE(DiscoveryPlusBaseIE): }, { 'url': 'https://www.dmax.de/programme/dmax-highlights/video/tuning-star-sidney-hoffmann-exklusiv-bei-dmax/191023082312316', 'only_matching': True, - }, { - 'url': 'https://www.dplay.co.uk/show/ghost-adventures/video/hotel-leger-103620/EHD_280313B', - 'only_matching': True, }, { 'url': 'https://tlc.de/sendungen/breaking-amish/die-welt-da-drauen/', 'only_matching': True, + }, { + 'url': 'https://dmax.de/sendungen/feuerwache-3-alarm-in-muenchen/24-stunden-auf-der-feuerwache-3', + 'info_dict': { + 'id': '8873549', + 'ext': 'mp4', + 'title': '24 Stunden auf der Feuerwache 3', + 'description': 'md5:f3084ef6170bfb79f9a6e0c030e09330', + 'display_id': 'feuerwache-3-alarm-in-muenchen/24-stunden-auf-der-feuerwache-3', + 'episode': 'Episode 1', + 'episode_number': 1, + 'season': 'Season 1', + 'season_number': 1, + 'series': 'Feuerwache 3 - Alarm in München', + 'duration': 2632.0, + 'upload_date': '20251016', + 'timestamp': 1760645100, + 'creators': ['DMAX'], + 'thumbnail': 'https://eu1-prod-images.disco-api.com/2025/10/14/0bdee68c-a8d8-33d9-9204-16eb61108552.jpeg', + 'tags': [], + 'categories': ['DMAX Originals', 'Jobs', 'Blaulicht'], + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'url': 'https://tlc.de/sendungen/ghost-adventures/der-poltergeist-im-kostumladen', + 'info_dict': { + 'id': '4550602', + 'ext': 'mp4', + 'title': 'Der Poltergeist im Kostümladen', + 'description': 'md5:20b52b9736a0a3a7873d19a238fad7fc', + 'display_id': 'ghost-adventures/der-poltergeist-im-kostumladen', + 'episode': 'Episode 1', + 'episode_number': 1, + 'season': 'Season 25', + 'season_number': 25, + 'series': 'Ghost Adventures', + 'duration': 2493.0, + 'upload_date': '20241223', + 'timestamp': 1734948900, + 'creators': ['TLC'], + 'thumbnail': 'https://eu1-prod-images.disco-api.com/2023/04/05/59941d26-a81b-365f-829f-69d8cd81fd0f.jpeg', + 'tags': [], + 'categories': ['Paranormal', 'Gruselig!'], + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'url': 'https://tlc.de/sendungen/evil-gesichter-des-boesen/das-geheimnis-meines-bruders', + 'info_dict': { + 'id': '7792288', + 'ext': 'mp4', + 'title': 'Das Geheimnis meines Bruders', + 'description': 'md5:3167550bb582eb9c92875c86a0a20882', + 'display_id': 'evil-gesichter-des-boesen/das-geheimnis-meines-bruders', + 'episode': 'Episode 1', + 'episode_number': 1, + 'season': 'Season 1', + 'season_number': 1, + 'series': 'Evil - Gesichter des Bösen', + 'duration': 2626.0, + 'upload_date': '20240926', + 'timestamp': 1727388000, + 'creators': ['TLC'], + 'thumbnail': 'https://eu1-prod-images.disco-api.com/2024/11/29/e9f3e3ae-74ec-3631-81b7-fc7bbe844741.jpeg', + 'tags': 'count:13', + 'categories': ['True Crime', 'Mord'], + }, + 'params': {'skip_download': 'm3u8'}, }] def _real_extract(self, url): domain, programme, alternate_id = self._match_valid_url(url).groups() - country = 'GB' if domain == 'dplay.co.uk' else 'DE' - realm = 'questuk' if country == 'GB' else domain.replace('.', '') - return self._get_disco_api_info( - url, f'{programme}/{alternate_id}', 'eu1-prod.disco-api.com', realm, country) + display_id = f'{programme}/{alternate_id}' + meta = self._download_json( + f'https://de-api.loma-cms.com/feloma/videos/{alternate_id}/', + display_id, query={ + 'environment': domain.split('.')[0], + 'v': '2', + 'filter[show.slug]': programme, + }, fatal=False) + video_id = traverse_obj(meta, ('uid', {str}, {lambda s: s[-7:]})) or display_id + + disco_api_info = self._get_disco_api_info( + url, video_id, 'eu1-prod.disco-api.com', domain.replace('.', ''), 'DE') + disco_api_info['display_id'] = display_id + disco_api_info['categories'] = traverse_obj(meta, ( + 'taxonomies', lambda _, v: v['category'] == 'genre', 'title', {str.strip}, filter, all, filter)) + + return disco_api_info def _update_disco_api_headers(self, headers, disco_base, display_id, realm): headers.update({ diff --git a/plugins/youtube_download/yt_dlp/extractor/dropbox.py b/plugins/youtube_download/yt_dlp/extractor/dropbox.py index ce8435c..2c1f1a4 100644 --- a/plugins/youtube_download/yt_dlp/extractor/dropbox.py +++ b/plugins/youtube_download/yt_dlp/extractor/dropbox.py @@ -14,7 +14,7 @@ from ..utils import ( class DropboxIE(InfoExtractor): - _VALID_URL = r'https?://(?:www\.)?dropbox\.com/(?:(?:e/)?scl/fi|sh?)/(?P\w+)' + _VALID_URL = r'https?://(?:www\.)?dropbox\.com/(?:(?:e/)?scl/f[io]|sh?)/(?P\w+)' _TESTS = [ { 'url': 'https://www.dropbox.com/s/nelirfsxnmcfbfh/youtube-dl%20test%20video%20%27%C3%A4%22BaW_jenozKc.mp4?dl=0', @@ -35,6 +35,9 @@ class DropboxIE(InfoExtractor): }, { 'url': 'https://www.dropbox.com/e/scl/fi/r2kd2skcy5ylbbta5y1pz/DJI_0003.MP4?dl=0&rlkey=wcdgqangn7t3lnmmv6li9mu9h', 'only_matching': True, + }, { + 'url': 'https://www.dropbox.com/scl/fo/zjfqse5txqfd7twa8iewj/AOfZzSYWUSKle2HD7XF7kzQ/A-BEAT%20C.mp4?rlkey=6tg3jkp4tv6a5vt58a6dag0mm&dl=0', + 'only_matching': True, }, ] diff --git a/plugins/youtube_download/yt_dlp/extractor/facebook.py b/plugins/youtube_download/yt_dlp/extractor/facebook.py index 2c35013..99f6427 100644 --- a/plugins/youtube_download/yt_dlp/extractor/facebook.py +++ b/plugins/youtube_download/yt_dlp/extractor/facebook.py @@ -4,8 +4,6 @@ import urllib.parse from .common import InfoExtractor from ..compat import compat_etree_fromstring -from ..networking import Request -from ..networking.exceptions import network_exceptions from ..utils import ( ExtractorError, clean_html, @@ -64,9 +62,6 @@ class FacebookIE(InfoExtractor): class=(?P[\'"])[^\'"]*\bfb-(?:video|post)\b[^\'"]*(?P=q1)[^>]+ data-href=(?P[\'"])(?P(?:https?:)?//(?:www\.)?facebook.com/.+?)(?P=q2)''', ] - _LOGIN_URL = 'https://www.facebook.com/login.php?next=http%3A%2F%2Ffacebook.com%2Fhome.php&login_attempt=1' - _CHECKPOINT_URL = 'https://www.facebook.com/checkpoint/?next=http%3A%2F%2Ffacebook.com%2Fhome.php&_fb_noscript=1' - _NETRC_MACHINE = 'facebook' IE_NAME = 'facebook' _VIDEO_PAGE_TEMPLATE = 'https://www.facebook.com/video/video.php?v=%s' @@ -469,65 +464,6 @@ class FacebookIE(InfoExtractor): 'graphURI': '/api/graphql/', } - def _perform_login(self, username, password): - login_page_req = Request(self._LOGIN_URL) - self._set_cookie('facebook.com', 'locale', 'en_US') - login_page = self._download_webpage(login_page_req, None, - note='Downloading login page', - errnote='Unable to download login page') - lsd = self._search_regex( - r'', login_results) is not None: - error = self._html_search_regex( - r'(?s)]+class=(["\']).*?login_error_box.*?\1[^>]*>]*>.*?]*>(?P.+?)', - login_results, 'login error', default=None, group='error') - if error: - raise ExtractorError(f'Unable to login: {error}', expected=True) - self.report_warning('unable to log in: bad username/password, or exceeded login rate limit (~3/min). Check credentials or wait.') - return - - fb_dtsg = self._search_regex( - r'name="fb_dtsg" value="(.+?)"', login_results, 'fb_dtsg', default=None) - h = self._search_regex( - r'name="h"\s+(?:\w+="[^"]+"\s+)*?value="([^"]+)"', login_results, 'h', default=None) - - if not fb_dtsg or not h: - return - - check_form = { - 'fb_dtsg': fb_dtsg, - 'h': h, - 'name_action_selected': 'dont_save', - } - check_req = Request(self._CHECKPOINT_URL, urlencode_postdata(check_form)) - check_req.headers['Content-Type'] = 'application/x-www-form-urlencoded' - check_response = self._download_webpage(check_req, None, - note='Confirming login') - if re.search(r'id="checkpointSubmitButton"', check_response) is not None: - self.report_warning('Unable to confirm login, you have to login in your browser and authorize the login.') - except network_exceptions as err: - self.report_warning(f'unable to log in: {err}') - return - def _extract_from_url(self, url, video_id): webpage = self._download_webpage( url.replace('://m.facebook.com/', '://www.facebook.com/'), video_id) diff --git a/plugins/youtube_download/yt_dlp/extractor/fc2.py b/plugins/youtube_download/yt_dlp/extractor/fc2.py index d343069..aa6ff63 100644 --- a/plugins/youtube_download/yt_dlp/extractor/fc2.py +++ b/plugins/youtube_download/yt_dlp/extractor/fc2.py @@ -5,6 +5,7 @@ from .common import InfoExtractor from ..networking import Request from ..utils import ( ExtractorError, + UserNotLive, js_to_json, traverse_obj, update_url_query, @@ -205,6 +206,9 @@ class FC2LiveIE(InfoExtractor): 'client_app': 'browser_hls', 'ipv6': '', }), headers={'X-Requested-With': 'XMLHttpRequest'}) + # A non-zero 'status' indicates the stream is not live, so check truthiness + if traverse_obj(control_server, ('status', {int})) and 'control_token' not in control_server: + raise UserNotLive(video_id=video_id) self._set_cookie('live.fc2.com', 'l_ortkn', control_server['orz_raw']) ws_url = update_url_query(control_server['url'], {'control_token': control_server['control_token']}) diff --git a/plugins/youtube_download/yt_dlp/extractor/filmarchiv.py b/plugins/youtube_download/yt_dlp/extractor/filmarchiv.py new file mode 100644 index 0000000..50fde2a --- /dev/null +++ b/plugins/youtube_download/yt_dlp/extractor/filmarchiv.py @@ -0,0 +1,52 @@ +from .common import InfoExtractor +from ..utils import clean_html +from ..utils.traversal import ( + find_element, + find_elements, + traverse_obj, +) + + +class FilmArchivIE(InfoExtractor): + IE_DESC = 'FILMARCHIV ON' + _VALID_URL = r'https?://(?:www\.)?filmarchiv\.at/de/filmarchiv-on/video/(?Pf_[0-9a-zA-Z]{5,})' + _TESTS = [{ + 'url': 'https://www.filmarchiv.at/de/filmarchiv-on/video/f_0305p7xKrXUPBwoNE9x6mh', + 'md5': '54a6596f6a84624531866008a77fa27a', + 'info_dict': { + 'id': 'f_0305p7xKrXUPBwoNE9x6mh', + 'ext': 'mp4', + 'title': 'Der Wurstelprater zur Kaiserzeit', + 'description': 'md5:9843f92df5cc9a4975cee7aabcf6e3b2', + 'thumbnail': r're:https://cdn\.filmarchiv\.at/f_0305/p7xKrXUPBwoNE9x6mh_v1/poster\.jpg', + }, + }, { + 'url': 'https://www.filmarchiv.at/de/filmarchiv-on/video/f_0306vI3wO0tJIsfrqYFQXF', + 'md5': '595385d7f54cb6529140ee8de7d1c3c7', + 'info_dict': { + 'id': 'f_0306vI3wO0tJIsfrqYFQXF', + 'ext': 'mp4', + 'title': 'Vor 70 Jahren: Wettgehen der Briefträger in Wien', + 'description': 'md5:b2a2e4230923cd1969d471c552e62811', + 'thumbnail': r're:https://cdn\.filmarchiv\.at/f_0306/vI3wO0tJIsfrqYFQXF_v1/poster\.jpg', + }, + }] + + def _real_extract(self, url): + media_id = self._match_id(url) + webpage = self._download_webpage(url, media_id) + path = '/'.join((media_id[:6], media_id[6:])) + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + f'https://cdn.filmarchiv.at/{path}_v1_sv1/playlist.m3u8', media_id) + + return { + 'id': media_id, + 'title': traverse_obj(webpage, ({find_element(tag='title-div')}, {clean_html})), + 'description': traverse_obj(webpage, ( + {find_elements(tag='div', attr='class', value=r'.*\bborder-base-content\b', regex=True)}, ..., + {find_elements(tag='div', attr='class', value=r'.*\bprose\b', html=False, regex=True)}, ..., + {clean_html}, any)), + 'thumbnail': f'https://cdn.filmarchiv.at/{path}_v1/poster.jpg', + 'formats': formats, + 'subtitles': subtitles, + } diff --git a/plugins/youtube_download/yt_dlp/extractor/firsttv.py b/plugins/youtube_download/yt_dlp/extractor/firsttv.py index 878732c..86ad7d7 100644 --- a/plugins/youtube_download/yt_dlp/extractor/firsttv.py +++ b/plugins/youtube_download/yt_dlp/extractor/firsttv.py @@ -10,7 +10,7 @@ from ..utils import ( unified_strdate, url_or_none, ) -from ..utils.traversal import traverse_obj +from ..utils.traversal import require, traverse_obj class FirstTVIE(InfoExtractor): @@ -129,3 +129,36 @@ class FirstTVIE(InfoExtractor): return self.playlist_result( self._entries(items), display_id, self._og_search_title(webpage, default=None), thumbnail=self._og_search_thumbnail(webpage, default=None)) + + +class FirstTVLiveIE(InfoExtractor): + IE_NAME = '1tv:live' + IE_DESC = 'Первый канал (прямой эфир)' + _VALID_URL = r'https?://(?:www\.)?1tv\.ru/live' + + _TESTS = [{ + 'url': 'https://www.1tv.ru/live', + 'info_dict': { + 'id': 'live', + 'ext': 'mp4', + 'title': r're:ПЕРВЫЙ КАНАЛ ПРЯМОЙ ЭФИР СМОТРЕТЬ ОНЛАЙН \d{4}-\d{2}-\d{2} \d{2}:\d{2}$', + 'live_status': 'is_live', + }, + 'params': {'skip_download': 'livestream'}, + }] + + def _real_extract(self, url): + display_id = 'live' + webpage = self._download_webpage(url, display_id, fatal=False) + + streams_list = self._download_json('https://stream.1tv.ru/api/playlist/1tvch-v1_as_array.json', display_id) + mpd_url = traverse_obj(streams_list, ('mpd', ..., {url_or_none}, any, {require('mpd url')})) + # FFmpeg needs to be passed -re to not seek past live window. This is handled by core + formats, _ = self._extract_mpd_formats_and_subtitles(mpd_url, display_id, mpd_id='dash') + + return { + 'id': display_id, + 'title': self._html_extract_title(webpage), + 'formats': formats, + 'is_live': True, + } diff --git a/plugins/youtube_download/yt_dlp/extractor/floatplane.py b/plugins/youtube_download/yt_dlp/extractor/floatplane.py index 7dd3b0e..31723c2 100644 --- a/plugins/youtube_download/yt_dlp/extractor/floatplane.py +++ b/plugins/youtube_download/yt_dlp/extractor/floatplane.py @@ -6,15 +6,15 @@ from ..utils import ( OnDemandPagedList, clean_html, determine_ext, + float_or_none, format_field, int_or_none, join_nonempty, - parse_codecs, parse_iso8601, url_or_none, urljoin, ) -from ..utils.traversal import traverse_obj +from ..utils.traversal import require, traverse_obj class FloatplaneBaseIE(InfoExtractor): @@ -50,37 +50,31 @@ class FloatplaneBaseIE(InfoExtractor): media_id = media['id'] media_typ = media.get('type') or 'video' - metadata = self._download_json( - f'{self._BASE_URL}/api/v3/content/{media_typ}', media_id, query={'id': media_id}, - note=f'Downloading {media_typ} metadata', impersonate=self._IMPERSONATE_TARGET) - stream = self._download_json( - f'{self._BASE_URL}/api/v2/cdn/delivery', media_id, query={ - 'type': 'vod' if media_typ == 'video' else 'aod', - 'guid': metadata['guid'], - }, note=f'Downloading {media_typ} stream data', + f'{self._BASE_URL}/api/v3/delivery/info', media_id, + query={'scenario': 'onDemand', 'entityId': media_id}, + note=f'Downloading {media_typ} stream data', impersonate=self._IMPERSONATE_TARGET) - path_template = traverse_obj(stream, ('resource', 'uri', {str})) + metadata = self._download_json( + f'{self._BASE_URL}/api/v3/content/{media_typ}', media_id, + f'Downloading {media_typ} metadata', query={'id': media_id}, + fatal=False, impersonate=self._IMPERSONATE_TARGET) - def format_path(params): - path = path_template - for i, val in (params or {}).items(): - path = path.replace(f'{{qualityLevelParams.{i}}}', val) - return path + cdn_base_url = traverse_obj(stream, ( + 'groups', 0, 'origins', ..., 'url', {url_or_none}, any, {require('cdn base url')})) formats = [] - for quality in traverse_obj(stream, ('resource', 'data', 'qualityLevels', ...)): - url = urljoin(stream['cdn'], format_path(traverse_obj( - stream, ('resource', 'data', 'qualityLevelParams', quality['name'], {dict})))) - format_id = traverse_obj(quality, ('name', {str})) + for variant in traverse_obj(stream, ('groups', 0, 'variants', lambda _, v: v['url'])): + format_url = urljoin(cdn_base_url, variant['url']) + format_id = traverse_obj(variant, ('name', {str})) hls_aes = {} m3u8_data = None # If we need impersonation for the API, then we need it for HLS keys too: extract in advance if self._IMPERSONATE_TARGET is not None: m3u8_data = self._download_webpage( - url, media_id, fatal=False, impersonate=self._IMPERSONATE_TARGET, headers=self._HEADERS, + format_url, media_id, fatal=False, impersonate=self._IMPERSONATE_TARGET, headers=self._HEADERS, note=join_nonempty('Downloading', format_id, 'm3u8 information', delim=' '), errnote=join_nonempty('Failed to download', format_id, 'm3u8 information', delim=' ')) if not m3u8_data: @@ -98,18 +92,34 @@ class FloatplaneBaseIE(InfoExtractor): hls_aes['key'] = urlh.read().hex() formats.append({ - **traverse_obj(quality, { + **traverse_obj(variant, { 'format_note': ('label', {str}), - 'width': ('width', {int}), - 'height': ('height', {int}), + 'width': ('meta', 'video', 'width', {int_or_none}), + 'height': ('meta', 'video', 'height', {int_or_none}), + 'vcodec': ('meta', 'video', 'codec', {str}), + 'acodec': ('meta', 'audio', 'codec', {str}), + 'vbr': ('meta', 'video', 'bitrate', 'average', {int_or_none(scale=1000)}), + 'abr': ('meta', 'audio', 'bitrate', 'average', {int_or_none(scale=1000)}), + 'audio_channels': ('meta', 'audio', 'channelCount', {int_or_none}), + 'fps': ('meta', 'video', 'fps', {float_or_none}), }), - **parse_codecs(quality.get('codecs')), - 'url': url, - 'ext': determine_ext(url.partition('/chunk.m3u8')[0], 'mp4'), + 'url': format_url, + 'ext': determine_ext(format_url.partition('/chunk.m3u8')[0], 'mp4'), 'format_id': format_id, 'hls_media_playlist_data': m3u8_data, 'hls_aes': hls_aes or None, }) + + subtitles = {} + automatic_captions = {} + for sub_data in traverse_obj(metadata, ('textTracks', lambda _, v: url_or_none(v['src']))): + sub_lang = sub_data.get('language') or 'en' + sub_entry = {'url': sub_data['src']} + if sub_data.get('generated'): + automatic_captions.setdefault(sub_lang, []).append(sub_entry) + else: + subtitles.setdefault(sub_lang, []).append(sub_entry) + items.append({ **common_info, 'id': media_id, @@ -119,6 +129,8 @@ class FloatplaneBaseIE(InfoExtractor): 'thumbnail': ('thumbnail', 'path', {url_or_none}), }), 'formats': formats, + 'subtitles': subtitles, + 'automatic_captions': automatic_captions, }) post_info = { diff --git a/plugins/youtube_download/yt_dlp/extractor/frontro.py b/plugins/youtube_download/yt_dlp/extractor/frontro.py new file mode 100644 index 0000000..e86c4af --- /dev/null +++ b/plugins/youtube_download/yt_dlp/extractor/frontro.py @@ -0,0 +1,164 @@ +import json + +from .common import InfoExtractor +from ..utils import int_or_none, parse_iso8601, url_or_none +from ..utils.traversal import traverse_obj + + +class FrontoBaseIE(InfoExtractor): + def _get_auth_headers(self, url): + return traverse_obj(self._get_cookies(url), { + 'authorization': ('frAccessToken', 'value', {lambda token: f'Bearer {token}' if token else None}), + }) + + +class FrontroVideoBaseIE(FrontoBaseIE): + _CHANNEL_ID = None + + def _real_extract(self, url): + video_id = self._match_id(url) + + metadata = self._download_json( + 'https://api.frontrow.cc/query', video_id, data=json.dumps({ + 'operationName': 'Video', + 'variables': {'channelID': self._CHANNEL_ID, 'videoID': video_id}, + 'query': '''query Video($channelID: ID!, $videoID: ID!) { + video(ChannelID: $channelID, VideoID: $videoID) { + ... on Video {title description updatedAt thumbnail createdAt duration likeCount comments views url hasAccess} + } + }''', + }).encode(), headers={ + 'content-type': 'application/json', + **self._get_auth_headers(url), + })['data']['video'] + if not traverse_obj(metadata, 'hasAccess'): + self.raise_login_required() + + formats, subtitles = self._extract_m3u8_formats_and_subtitles(metadata['url'], video_id) + + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + **traverse_obj(metadata, { + 'title': ('title', {str}), + 'description': ('description', {str}), + 'thumbnail': ('thumbnail', {url_or_none}), + 'timestamp': ('createdAt', {parse_iso8601}), + 'modified_timestamp': ('updatedAt', {parse_iso8601}), + 'duration': ('duration', {int_or_none}), + 'like_count': ('likeCount', {int_or_none}), + 'comment_count': ('comments', {int_or_none}), + 'view_count': ('views', {int_or_none}), + }), + } + + +class FrontroGroupBaseIE(FrontoBaseIE): + _CHANNEL_ID = None + _VIDEO_EXTRACTOR = None + _VIDEO_URL_TMPL = None + + def _real_extract(self, url): + group_id = self._match_id(url) + + metadata = self._download_json( + 'https://api.frontrow.cc/query', group_id, note='Downloading playlist metadata', + data=json.dumps({ + 'operationName': 'PaginatedStaticPageContainer', + 'variables': {'channelID': self._CHANNEL_ID, 'first': 500, 'pageContainerID': group_id}, + 'query': '''query PaginatedStaticPageContainer($channelID: ID!, $pageContainerID: ID!) { + pageContainer(ChannelID: $channelID, PageContainerID: $pageContainerID) { + ... on StaticPageContainer { id title updatedAt createdAt itemRefs {edges {node { + id contentItem { ... on ItemVideo { videoItem: item { + id + }}} + }}} + } + } + }''', + }).encode(), headers={ + 'content-type': 'application/json', + **self._get_auth_headers(url), + })['data']['pageContainer'] + + entries = [] + for video_id in traverse_obj(metadata, ( + 'itemRefs', 'edges', ..., 'node', 'contentItem', 'videoItem', 'id', {str}), + ): + entries.append(self.url_result( + self._VIDEO_URL_TMPL % video_id, self._VIDEO_EXTRACTOR, video_id)) + + return { + '_type': 'playlist', + 'id': group_id, + 'entries': entries, + **traverse_obj(metadata, { + 'title': ('title', {str}), + 'timestamp': ('createdAt', {parse_iso8601}), + 'modified_timestamp': ('updatedAt', {parse_iso8601}), + }), + } + + +class TheChosenIE(FrontroVideoBaseIE): + _CHANNEL_ID = '12884901895' + + _VALID_URL = r'https?://(?:www\.)?watch\.thechosen\.tv/video/(?P[0-9]+)' + _TESTS = [{ + 'url': 'https://watch.thechosen.tv/video/184683594325', + 'md5': '3f878b689588c71b38ec9943c54ff5b0', + 'info_dict': { + 'id': '184683594325', + 'ext': 'mp4', + 'title': 'Season 3 Episode 2: Two by Two', + 'description': 'md5:174c373756ecc8df46b403f4fcfbaf8c', + 'comment_count': int, + 'view_count': int, + 'like_count': int, + 'duration': 4212, + 'thumbnail': r're:https://fastly\.frontrowcdn\.com/channels/12884901895/VIDEO_THUMBNAIL/184683594325/', + 'timestamp': 1698954546, + 'upload_date': '20231102', + 'modified_timestamp': int, + 'modified_date': str, + }, + }, { + 'url': 'https://watch.thechosen.tv/video/184683596189', + 'md5': 'd581562f9d29ce82f5b7770415334151', + 'info_dict': { + 'id': '184683596189', + 'ext': 'mp4', + 'title': 'Season 4 Episode 8: Humble', + 'description': 'md5:20a57bead43da1cf77cd5b0fe29bbc76', + 'comment_count': int, + 'view_count': int, + 'like_count': int, + 'duration': 5092, + 'thumbnail': r're:https://fastly\.frontrowcdn\.com/channels/12884901895/VIDEO_THUMBNAIL/184683596189/', + 'timestamp': 1715019474, + 'upload_date': '20240506', + 'modified_timestamp': int, + 'modified_date': str, + }, + }] + + +class TheChosenGroupIE(FrontroGroupBaseIE): + _CHANNEL_ID = '12884901895' + _VIDEO_EXTRACTOR = TheChosenIE + _VIDEO_URL_TMPL = 'https://watch.thechosen.tv/video/%s' + + _VALID_URL = r'https?://(?:www\.)?watch\.thechosen\.tv/group/(?P[0-9]+)' + _TESTS = [{ + 'url': 'https://watch.thechosen.tv/group/309237658592', + 'info_dict': { + 'id': '309237658592', + 'title': 'Season 3', + 'timestamp': 1746203969, + 'upload_date': '20250502', + 'modified_timestamp': int, + 'modified_date': str, + }, + 'playlist_count': 8, + }] diff --git a/plugins/youtube_download/yt_dlp/extractor/generic.py b/plugins/youtube_download/yt_dlp/extractor/generic.py index d44e6d3..7c7bb71 100644 --- a/plugins/youtube_download/yt_dlp/extractor/generic.py +++ b/plugins/youtube_download/yt_dlp/extractor/generic.py @@ -821,13 +821,17 @@ class GenericIE(InfoExtractor): 'Referer': smuggled_data.get('referer'), }), impersonate=impersonate) except ExtractorError as e: - if not (isinstance(e.cause, HTTPError) and e.cause.status == 403 - and e.cause.response.get_header('cf-mitigated') == 'challenge' - and e.cause.response.extensions.get('impersonate') is None): + if not isinstance(e.cause, HTTPError) or e.cause.status != 403: + raise + res = e.cause.response + already_impersonating = res.extensions.get('impersonate') is not None + if already_impersonating or ( + res.get_header('cf-mitigated') != 'challenge' + and b'Attention Required! | Cloudflare' not in res.read() + ): raise cf_cookie_domain = traverse_obj( - LenientSimpleCookie(e.cause.response.get_header('set-cookie')), - ('__cf_bm', 'domain')) + LenientSimpleCookie(res.get_header('set-cookie')), ('__cf_bm', 'domain')) if cf_cookie_domain: self.write_debug(f'Clearing __cf_bm cookie for {cf_cookie_domain}') self.cookiejar.clear(domain=cf_cookie_domain, path='/', name='__cf_bm') diff --git a/plugins/youtube_download/yt_dlp/extractor/gofile.py b/plugins/youtube_download/yt_dlp/extractor/gofile.py index a9777a5..e2144d7 100644 --- a/plugins/youtube_download/yt_dlp/extractor/gofile.py +++ b/plugins/youtube_download/yt_dlp/extractor/gofile.py @@ -46,6 +46,7 @@ class GofileIE(InfoExtractor): 'videopassword': 'password', }, }] + _STATIC_TOKEN = '4fd6sg89d7s6' # From https://gofile.io/dist/js/config.js _TOKEN = None def _real_initialize(self): @@ -60,13 +61,16 @@ class GofileIE(InfoExtractor): self._set_cookie('.gofile.io', 'accountToken', self._TOKEN) def _entries(self, file_id): - query_params = {'wt': '4fd6sg89d7s6'} # From https://gofile.io/dist/js/alljs.js - password = self.get_param('videopassword') - if password: + query_params = {} + if password := self.get_param('videopassword'): query_params['password'] = hashlib.sha256(password.encode()).hexdigest() + files = self._download_json( f'https://api.gofile.io/contents/{file_id}', file_id, 'Getting filelist', - query=query_params, headers={'Authorization': f'Bearer {self._TOKEN}'}) + query=query_params, headers={ + 'Authorization': f'Bearer {self._TOKEN}', + 'X-Website-Token': self._STATIC_TOKEN, + }) status = files['status'] if status == 'error-passwordRequired': diff --git a/plugins/youtube_download/yt_dlp/extractor/googledrive.py b/plugins/youtube_download/yt_dlp/extractor/googledrive.py index 0c84f0b..91c9f60 100644 --- a/plugins/youtube_download/yt_dlp/extractor/googledrive.py +++ b/plugins/youtube_download/yt_dlp/extractor/googledrive.py @@ -1,21 +1,20 @@ import re -import urllib.parse from .common import InfoExtractor -from .youtube import YoutubeIE from ..utils import ( - ExtractorError, - bug_reports_message, determine_ext, extract_attributes, + filter_dict, get_element_by_class, get_element_html_by_id, int_or_none, - lowercase_escape, - parse_qs, - try_get, + mimetype2ext, + parse_duration, + str_or_none, update_url_query, + url_or_none, ) +from ..utils.traversal import traverse_obj, value class GoogleDriveIE(InfoExtractor): @@ -38,8 +37,8 @@ class GoogleDriveIE(InfoExtractor): 'id': '0ByeS4oOUV-49Zzh4R1J6R09zazQ', 'ext': 'mp4', 'title': 'Big Buck Bunny.mp4', - 'duration': 45, - 'thumbnail': 'https://drive.google.com/thumbnail?id=0ByeS4oOUV-49Zzh4R1J6R09zazQ', + 'duration': 45.069, + 'thumbnail': r're:https://lh3\.googleusercontent\.com/drive-storage/', }, }, { # has itag 50 which is not in YoutubeIE._formats (royalty Free music from 1922) @@ -49,8 +48,29 @@ class GoogleDriveIE(InfoExtractor): 'id': '1IP0o8dHcQrIHGgVyp0Ofvx2cGfLzyO1x', 'ext': 'mp3', 'title': 'My Buddy - Henry Burr - Gus Kahn - Walter Donaldson.mp3', - 'duration': 184, - 'thumbnail': 'https://drive.google.com/thumbnail?id=1IP0o8dHcQrIHGgVyp0Ofvx2cGfLzyO1x', + 'duration': 184.68, + }, + }, { + # Has subtitle track + 'url': 'https://drive.google.com/file/d/1RAGWRgzn85TXCaCk4gxnwF6TGUaZatzE/view', + 'md5': '05488c528da6ef737ec8c962bfa9724e', + 'info_dict': { + 'id': '1RAGWRgzn85TXCaCk4gxnwF6TGUaZatzE', + 'ext': 'mp4', + 'title': 'test.mp4', + 'duration': 9.999, + 'thumbnail': r're:https://lh3\.googleusercontent\.com/drive-storage/', + }, + }, { + # Has subtitle track with kind 'asr' + 'url': 'https://drive.google.com/file/d/1Prvv9-mtDDfN_gkJgtt1OFvIULK8c3Ev/view', + 'md5': 'ccae12d07f18b5988900b2c8b92801fc', + 'info_dict': { + 'id': '1Prvv9-mtDDfN_gkJgtt1OFvIULK8c3Ev', + 'ext': 'mp4', + 'title': 'LEE NA GYUNG-3410-VOICE_MESSAGE.mp4', + 'duration': 8.766, + 'thumbnail': r're:https://lh3\.googleusercontent\.com/drive-storage/', }, }, { # video can't be watched anonymously due to view count limit reached, @@ -71,17 +91,6 @@ class GoogleDriveIE(InfoExtractor): 'url': 'https://drive.usercontent.google.com/download?id=0ByeS4oOUV-49Zzh4R1J6R09zazQ', 'only_matching': True, }] - _FORMATS_EXT = { - **{k: v['ext'] for k, v in YoutubeIE._formats.items() if v.get('ext')}, - '50': 'm4a', - } - _BASE_URL_CAPTIONS = 'https://drive.google.com/timedtext' - _CAPTIONS_ENTRY_TAG = { - 'subtitles': 'track', - 'automatic_captions': 'target', - } - _caption_formats_ext = [] - _captions_xml = None @classmethod def _extract_embed_urls(cls, url, webpage): @@ -91,129 +100,73 @@ class GoogleDriveIE(InfoExtractor): if mobj: yield 'https://drive.google.com/file/d/{}'.format(mobj.group('id')) - def _download_subtitles_xml(self, video_id, subtitles_id, hl): - if self._captions_xml: - return - self._captions_xml = self._download_xml( - self._BASE_URL_CAPTIONS, video_id, query={ - 'id': video_id, - 'vid': subtitles_id, - 'hl': hl, + @staticmethod + def _construct_subtitle_url(base_url, video_id, language, fmt, kind): + return update_url_query( + base_url, filter_dict({ + 'hl': 'en-US', 'v': video_id, + 'type': 'track', + 'lang': language, + 'fmt': fmt, + 'kind': kind, + })) + + def _get_subtitles(self, video_id, video_info): + subtitles = {} + timed_text_base_url = traverse_obj(video_info, ('timedTextDetails', 'timedTextBaseUrl', {url_or_none})) + if not timed_text_base_url: + return subtitles + subtitle_data = self._download_xml( + timed_text_base_url, video_id, 'Downloading subtitles XML', fatal=False, query={ + 'hl': 'en-US', 'type': 'list', - 'tlangs': '1', - 'fmts': '1', - 'vssids': '1', - }, note='Downloading subtitles XML', - errnote='Unable to download subtitles XML', fatal=False) - if self._captions_xml: - for f in self._captions_xml.findall('format'): - if f.attrib.get('fmt_code') and not f.attrib.get('default'): - self._caption_formats_ext.append(f.attrib['fmt_code']) - - def _get_captions_by_type(self, video_id, subtitles_id, caption_type, - origin_lang_code=None, origin_lang_name=None): - if not subtitles_id or not caption_type: - return - captions = {} - for caption_entry in self._captions_xml.findall( - self._CAPTIONS_ENTRY_TAG[caption_type]): - caption_lang_code = caption_entry.attrib.get('lang_code') - caption_name = caption_entry.attrib.get('name') or origin_lang_name - if not caption_lang_code or not caption_name: - self.report_warning(f'Missing necessary caption metadata. ' - f'Need lang_code and name attributes. ' - f'Found: {caption_entry.attrib}') - continue - caption_format_data = [] - for caption_format in self._caption_formats_ext: - query = { - 'vid': subtitles_id, - 'v': video_id, - 'fmt': caption_format, - 'lang': (caption_lang_code if origin_lang_code is None - else origin_lang_code), - 'type': 'track', - 'name': caption_name, - 'kind': '', - } - if origin_lang_code is not None: - query.update({'tlang': caption_lang_code}) - caption_format_data.append({ - 'url': update_url_query(self._BASE_URL_CAPTIONS, query), - 'ext': caption_format, - }) - captions[caption_lang_code] = caption_format_data - return captions - - def _get_subtitles(self, video_id, subtitles_id, hl): - if not subtitles_id or not hl: - return - self._download_subtitles_xml(video_id, subtitles_id, hl) - if not self._captions_xml: - return - return self._get_captions_by_type(video_id, subtitles_id, 'subtitles') - - def _get_automatic_captions(self, video_id, subtitles_id, hl): - if not subtitles_id or not hl: - return - self._download_subtitles_xml(video_id, subtitles_id, hl) - if not self._captions_xml: - return - track = next((t for t in self._captions_xml.findall('track') if t.attrib.get('cantran') == 'true'), None) - if track is None: - return - origin_lang_code = track.attrib.get('lang_code') - origin_lang_name = track.attrib.get('name') - if not origin_lang_code or not origin_lang_name: - return - return self._get_captions_by_type( - video_id, subtitles_id, 'automatic_captions', origin_lang_code, origin_lang_name) + 'tlangs': 1, + 'v': video_id, + 'vssids': 1, + }) + subtitle_formats = traverse_obj(subtitle_data, (lambda _, v: v.tag == 'format', {lambda x: x.get('fmt_code')}, {str})) + for track in traverse_obj(subtitle_data, (lambda _, v: v.tag == 'track' and v.get('lang_code'))): + language = track.get('lang_code') + subtitles.setdefault(language, []).extend([{ + 'url': self._construct_subtitle_url( + timed_text_base_url, video_id, language, sub_fmt, track.get('kind')), + 'name': track.get('lang_original'), + 'ext': sub_fmt, + } for sub_fmt in subtitle_formats]) + return subtitles def _real_extract(self, url): video_id = self._match_id(url) - video_info = urllib.parse.parse_qs(self._download_webpage( - 'https://drive.google.com/get_video_info', - video_id, 'Downloading video webpage', query={'docid': video_id})) - - def get_value(key): - return try_get(video_info, lambda x: x[key][0]) - - reason = get_value('reason') - title = get_value('title') + video_info = self._download_json( + f'https://content-workspacevideo-pa.googleapis.com/v1/drive/media/{video_id}/playback', + video_id, 'Downloading video webpage', query={'key': 'AIzaSyDVQw45DwoYh632gvsP5vPDqEKvb-Ywnb8'}, + headers={'Referer': 'https://drive.google.com/'}) formats = [] - fmt_stream_map = (get_value('fmt_stream_map') or '').split(',') - fmt_list = (get_value('fmt_list') or '').split(',') - if fmt_stream_map and fmt_list: - resolutions = {} - for fmt in fmt_list: - mobj = re.search( - r'^(?P\d+)/(?P\d+)[xX](?P\d+)', fmt) - if mobj: - resolutions[mobj.group('format_id')] = ( - int(mobj.group('width')), int(mobj.group('height'))) + for fmt in traverse_obj(video_info, ( + 'mediaStreamingData', 'formatStreamingData', ('adaptiveTranscodes', 'progressiveTranscodes'), + lambda _, v: url_or_none(v['url']))): + formats.append({ + **traverse_obj(fmt, { + 'url': 'url', + 'format_id': ('itag', {int}, {str_or_none}), + }), + **traverse_obj(fmt, ('transcodeMetadata', { + 'ext': ('mimeType', {mimetype2ext}), + 'width': ('width', {int_or_none}), + 'height': ('height', {int_or_none}), + 'fps': ('videoFps', {int_or_none}), + 'filesize': ('contentLength', {int_or_none}), + 'vcodec': ((('videoCodecString', {str}), {value('none')}), any), + 'acodec': ((('audioCodecString', {str}), {value('none')}), any), + })), + 'downloader_options': { + 'http_chunk_size': 10 << 20, + }, + }) - for fmt_stream in fmt_stream_map: - fmt_stream_split = fmt_stream.split('|') - if len(fmt_stream_split) < 2: - continue - format_id, format_url = fmt_stream_split[:2] - ext = self._FORMATS_EXT.get(format_id) - if not ext: - self.report_warning(f'Unknown format {format_id}{bug_reports_message()}') - f = { - 'url': lowercase_escape(format_url), - 'format_id': format_id, - 'ext': ext, - } - resolution = resolutions.get(format_id) - if resolution: - f.update({ - 'width': resolution[0], - 'height': resolution[1], - }) - formats.append(f) + title = traverse_obj(video_info, ('mediaMetadata', 'title', {str})) source_url = update_url_query( 'https://drive.usercontent.google.com/download', { @@ -264,30 +217,20 @@ class GoogleDriveIE(InfoExtractor): or get_element_by_class('uc-error-caption', confirmation_webpage) or 'unable to extract confirmation code') - if not formats and reason: - if title: - self.raise_no_formats(reason, expected=True) - else: - raise ExtractorError(reason, expected=True) - - hl = get_value('hl') - subtitles_id = None - ttsurl = get_value('ttsurl') - if ttsurl: - # the subtitles ID is the vid param of the ttsurl query - subtitles_id = parse_qs(ttsurl).get('vid', [None])[-1] - - self.cookiejar.clear(domain='.google.com', path='/', name='NID') - return { 'id': video_id, 'title': title, - 'thumbnail': 'https://drive.google.com/thumbnail?id=' + video_id, - 'duration': int_or_none(get_value('length_seconds')), + **traverse_obj(video_info, { + 'duration': ('mediaMetadata', 'duration', {parse_duration}), + 'thumbnails': ('thumbnails', lambda _, v: url_or_none(v['url']), { + 'url': 'url', + 'ext': ('mimeType', {mimetype2ext}), + 'width': ('width', {int}), + 'height': ('height', {int}), + }), + }), 'formats': formats, - 'subtitles': self.extract_subtitles(video_id, subtitles_id, hl), - 'automatic_captions': self.extract_automatic_captions( - video_id, subtitles_id, hl), + 'subtitles': self.extract_subtitles(video_id, video_info), } diff --git a/plugins/youtube_download/yt_dlp/extractor/goplay.py b/plugins/youtube_download/yt_dlp/extractor/goplay.py index 2e959ce..fb9b046 100644 --- a/plugins/youtube_download/yt_dlp/extractor/goplay.py +++ b/plugins/youtube_download/yt_dlp/extractor/goplay.py @@ -13,12 +13,14 @@ from ..utils.traversal import get_first, traverse_obj class GoPlayIE(InfoExtractor): - _VALID_URL = r'https?://(www\.)?goplay\.be/video/([^/?#]+/[^/?#]+/|)(?P[^/#]+)' + IE_NAME = 'play.tv' + IE_DESC = 'PLAY (formerly goplay.be)' + _VALID_URL = r'https?://(www\.)?play\.tv/video/([^/?#]+/[^/?#]+/|)(?P[^/#]+)' _NETRC_MACHINE = 'goplay' _TESTS = [{ - 'url': 'https://www.goplay.be/video/de-slimste-mens-ter-wereld/de-slimste-mens-ter-wereld-s22/de-slimste-mens-ter-wereld-s22-aflevering-1', + 'url': 'https://www.play.tv/video/de-slimste-mens-ter-wereld/de-slimste-mens-ter-wereld-s22/de-slimste-mens-ter-wereld-s22-aflevering-1', 'info_dict': { 'id': '2baa4560-87a0-421b-bffc-359914e3c387', 'ext': 'mp4', @@ -33,7 +35,7 @@ class GoPlayIE(InfoExtractor): 'params': {'skip_download': True}, 'skip': 'This video is only available for registered users', }, { - 'url': 'https://www.goplay.be/video/1917', + 'url': 'https://www.play.tv/video/1917', 'info_dict': { 'id': '40cac41d-8d29-4ef5-aa11-75047b9f0907', 'ext': 'mp4', @@ -43,7 +45,7 @@ class GoPlayIE(InfoExtractor): 'params': {'skip_download': True}, 'skip': 'This video is only available for registered users', }, { - 'url': 'https://www.goplay.be/video/de-mol/de-mol-s11/de-mol-s11-aflevering-1#autoplay', + 'url': 'https://www.play.tv/video/de-mol/de-mol-s11/de-mol-s11-aflevering-1#autoplay', 'info_dict': { 'id': 'ecb79672-92b9-4cd9-a0d7-e2f0250681ee', 'ext': 'mp4', @@ -101,7 +103,7 @@ class GoPlayIE(InfoExtractor): break api = self._download_json( - f'https://api.goplay.be/web/v1/videos/long-form/{video_id}', + f'https://api.play.tv/web/v1/videos/long-form/{video_id}', video_id, headers={ 'Authorization': f'Bearer {self._id_token}', **self.geo_verification_headers(), diff --git a/plugins/youtube_download/yt_dlp/extractor/hotstar.py b/plugins/youtube_download/yt_dlp/extractor/hotstar.py index 2ae527a..6bbb538 100644 --- a/plugins/youtube_download/yt_dlp/extractor/hotstar.py +++ b/plugins/youtube_download/yt_dlp/extractor/hotstar.py @@ -27,7 +27,7 @@ class HotStarBaseIE(InfoExtractor): _TOKEN_NAME = 'userUP' _BASE_URL = 'https://www.hotstar.com' _API_URL = 'https://api.hotstar.com' - _API_URL_V2 = 'https://apix.hotstar.com/v2' + _API_URL_V2 = 'https://www.hotstar.com/api/internal/bff/v2' _AKAMAI_ENCRYPTION_KEY = b'\x05\xfc\x1a\x01\xca\xc9\x4b\xc4\x12\xfc\x53\x12\x07\x75\xf9\xee' _FREE_HEADERS = { diff --git a/plugins/youtube_download/yt_dlp/extractor/iqiyi.py b/plugins/youtube_download/yt_dlp/extractor/iqiyi.py index 735b446..f8b4afa 100644 --- a/plugins/youtube_download/yt_dlp/extractor/iqiyi.py +++ b/plugins/youtube_download/yt_dlp/extractor/iqiyi.py @@ -9,14 +9,12 @@ from .openload import PhantomJSwrapper from ..utils import ( ExtractorError, clean_html, - decode_packed_codes, float_or_none, format_field, get_element_by_attribute, get_element_by_id, int_or_none, js_to_json, - ohdave_rsa_encrypt, parse_age_limit, parse_duration, parse_iso8601, @@ -33,143 +31,12 @@ def md5_text(text): return hashlib.md5(text.encode()).hexdigest() -class IqiyiSDK: - def __init__(self, target, ip, timestamp): - self.target = target - self.ip = ip - self.timestamp = timestamp - - @staticmethod - def split_sum(data): - return str(sum(int(p, 16) for p in data)) - - @staticmethod - def digit_sum(num): - if isinstance(num, int): - num = str(num) - return str(sum(map(int, num))) - - def even_odd(self): - even = self.digit_sum(str(self.timestamp)[::2]) - odd = self.digit_sum(str(self.timestamp)[1::2]) - return even, odd - - def preprocess(self, chunksize): - self.target = md5_text(self.target) - chunks = [] - for i in range(32 // chunksize): - chunks.append(self.target[chunksize * i:chunksize * (i + 1)]) - if 32 % chunksize: - chunks.append(self.target[32 - 32 % chunksize:]) - return chunks, list(map(int, self.ip.split('.'))) - - def mod(self, modulus): - chunks, ip = self.preprocess(32) - self.target = chunks[0] + ''.join(str(p % modulus) for p in ip) - - def split(self, chunksize): - modulus_map = { - 4: 256, - 5: 10, - 8: 100, - } - - chunks, ip = self.preprocess(chunksize) - ret = '' - for i in range(len(chunks)): - ip_part = str(ip[i] % modulus_map[chunksize]) if i < 4 else '' - if chunksize == 8: - ret += ip_part + chunks[i] - else: - ret += chunks[i] + ip_part - self.target = ret - - def handle_input16(self): - self.target = md5_text(self.target) - self.target = self.split_sum(self.target[:16]) + self.target + self.split_sum(self.target[16:]) - - def handle_input8(self): - self.target = md5_text(self.target) - ret = '' - for i in range(4): - part = self.target[8 * i:8 * (i + 1)] - ret += self.split_sum(part) + part - self.target = ret - - def handleSum(self): - self.target = md5_text(self.target) - self.target = self.split_sum(self.target) + self.target - - def date(self, scheme): - self.target = md5_text(self.target) - d = time.localtime(self.timestamp) - strings = { - 'y': str(d.tm_year), - 'm': '%02d' % d.tm_mon, - 'd': '%02d' % d.tm_mday, - } - self.target += ''.join(strings[c] for c in scheme) - - def split_time_even_odd(self): - even, odd = self.even_odd() - self.target = odd + md5_text(self.target) + even - - def split_time_odd_even(self): - even, odd = self.even_odd() - self.target = even + md5_text(self.target) + odd - - def split_ip_time_sum(self): - chunks, ip = self.preprocess(32) - self.target = str(sum(ip)) + chunks[0] + self.digit_sum(self.timestamp) - - def split_time_ip_sum(self): - chunks, ip = self.preprocess(32) - self.target = self.digit_sum(self.timestamp) + chunks[0] + str(sum(ip)) - - -class IqiyiSDKInterpreter: - def __init__(self, sdk_code): - self.sdk_code = sdk_code - - def run(self, target, ip, timestamp): - self.sdk_code = decode_packed_codes(self.sdk_code) - - functions = re.findall(r'input=([a-zA-Z0-9]+)\(input', self.sdk_code) - - sdk = IqiyiSDK(target, ip, timestamp) - - other_functions = { - 'handleSum': sdk.handleSum, - 'handleInput8': sdk.handle_input8, - 'handleInput16': sdk.handle_input16, - 'splitTimeEvenOdd': sdk.split_time_even_odd, - 'splitTimeOddEven': sdk.split_time_odd_even, - 'splitIpTimeSum': sdk.split_ip_time_sum, - 'splitTimeIpSum': sdk.split_time_ip_sum, - } - for function in functions: - if re.match(r'mod\d+', function): - sdk.mod(int(function[3:])) - elif re.match(r'date[ymd]{3}', function): - sdk.date(function[4:]) - elif re.match(r'split\d+', function): - sdk.split(int(function[5:])) - elif function in other_functions: - other_functions[function]() - else: - raise ExtractorError(f'Unknown function {function}') - - return sdk.target - - class IqiyiIE(InfoExtractor): IE_NAME = 'iqiyi' IE_DESC = '爱奇艺' _VALID_URL = r'https?://(?:(?:[^.]+\.)?iqiyi\.com|www\.pps\.tv)/.+\.html' - _NETRC_MACHINE = 'iqiyi' - _TESTS = [{ 'url': 'http://www.iqiyi.com/v_19rrojlavg.html', # MD5 checksum differs on my machine and Travis CI @@ -234,57 +101,6 @@ class IqiyiIE(InfoExtractor): '18': 7, # 1080p } - @staticmethod - def _rsa_fun(data): - # public key extracted from http://static.iqiyi.com/js/qiyiV2/20160129180840/jobs/i18n/i18nIndex.js - N = 0xab86b6371b5318aaa1d3c9e612a9f1264f372323c8c0f19875b5fc3b3fd3afcc1e5bec527aa94bfa85bffc157e4245aebda05389a5357b75115ac94f074aefcd - e = 65537 - - return ohdave_rsa_encrypt(data, e, N) - - def _perform_login(self, username, password): - - data = self._download_json( - 'http://kylin.iqiyi.com/get_token', None, - note='Get token for logging', errnote='Unable to get token for logging') - sdk = data['sdk'] - timestamp = int(time.time()) - target = ( - f'/apis/reglogin/login.action?lang=zh_TW&area_code=null&email={username}' - f'&passwd={self._rsa_fun(password.encode())}&agenttype=1&from=undefined&keeplogin=0&piccode=&fromurl=&_pos=1') - - interp = IqiyiSDKInterpreter(sdk) - sign = interp.run(target, data['ip'], timestamp) - - validation_params = { - 'target': target, - 'server': 'BEA3AA1908656AABCCFF76582C4C6660', - 'token': data['token'], - 'bird_src': 'f8d91d57af224da7893dd397d52d811a', - 'sign': sign, - 'bird_t': timestamp, - } - validation_result = self._download_json( - 'http://kylin.iqiyi.com/validate?' + urllib.parse.urlencode(validation_params), None, - note='Validate credentials', errnote='Unable to validate credentials') - - MSG_MAP = { - 'P00107': 'please login via the web interface and enter the CAPTCHA code', - 'P00117': 'bad username or password', - } - - code = validation_result['code'] - if code != 'A00000': - msg = MSG_MAP.get(code) - if not msg: - msg = f'error {code}' - if validation_result.get('msg'): - msg += ': ' + validation_result['msg'] - self.report_warning('unable to log in: ' + msg) - return False - - return True - def get_raw_data(self, tvid, video_id): tm = int(time.time() * 1000) diff --git a/plugins/youtube_download/yt_dlp/extractor/jtbc.py b/plugins/youtube_download/yt_dlp/extractor/jtbc.py index 573f749..7532983 100644 --- a/plugins/youtube_download/yt_dlp/extractor/jtbc.py +++ b/plugins/youtube_download/yt_dlp/extractor/jtbc.py @@ -98,7 +98,7 @@ class JTBCIE(InfoExtractor): formats = [] for stream_url in traverse_obj(playback_data, ('sources', 'HLS', ..., 'file', {url_or_none})): - stream_url = re.sub(r'/playlist(?:_pd\d+)?\.m3u8', '/index.m3u8', stream_url) + stream_url = re.sub(r'/playlist_pd\d+\.m3u8', '/playlist.m3u8', stream_url) formats.extend(self._extract_m3u8_formats(stream_url, video_id, fatal=False)) metadata = self._download_json( diff --git a/plugins/youtube_download/yt_dlp/extractor/kika.py b/plugins/youtube_download/yt_dlp/extractor/kika.py index e277564..94798b9 100644 --- a/plugins/youtube_download/yt_dlp/extractor/kika.py +++ b/plugins/youtube_download/yt_dlp/extractor/kika.py @@ -17,57 +17,60 @@ class KikaIE(InfoExtractor): _GEO_COUNTRIES = ['DE'] _TESTS = [{ - 'url': 'https://www.kika.de/logo/videos/logo-vom-samstag-einunddreissig-august-zweitausendvierundzwanzig-100', - 'md5': 'fbfc8da483719ef06f396e5e5b938c69', + # Video without season/episode info + 'url': 'https://www.kika.de/logo/videos/logo-vom-dienstag-achtundzwanzig-oktober-zweitausendfuenfundzwanzig-100', + 'md5': '4a9f6e0f9c6bfcc82394c294f186d6db', 'info_dict': { - 'id': 'logo-vom-samstag-einunddreissig-august-zweitausendvierundzwanzig-100', + 'id': 'logo-vom-dienstag-achtundzwanzig-oktober-zweitausendfuenfundzwanzig-100', 'ext': 'mp4', - 'upload_date': '20240831', - 'timestamp': 1725126600, - 'season_number': 2024, - 'modified_date': '20240831', - 'episode': 'Episode 476', - 'episode_number': 476, - 'season': 'Season 2024', - 'duration': 634, - 'title': 'logo! vom Samstag, 31. August 2024', - 'modified_timestamp': 1725129983, + 'title': 'logo! vom Dienstag, 28. Oktober 2025', + 'description': 'md5:4d28b92cef423bec99740ffaa3e7ec04', + 'duration': 651, + 'timestamp': 1761678000, + 'upload_date': '20251028', + 'modified_timestamp': 1761682624, + 'modified_date': '20251028', }, }, { + # Video with season/episode info + # Also: Video with subtitles 'url': 'https://www.kika.de/kaltstart/videos/video92498', - 'md5': '710ece827e5055094afeb474beacb7aa', + 'md5': 'e58073070acb195906c55c4ad31dceb3', 'info_dict': { 'id': 'video92498', 'ext': 'mp4', 'title': '7. Wo ist Leo?', 'description': 'md5:fb48396a5b75068bcac1df74f1524920', 'duration': 436, + 'season': 'Season 1', + 'season_number': 1, + 'episode': 'Episode 7', + 'episode_number': 7, 'timestamp': 1702926876, 'upload_date': '20231218', - 'episode_number': 7, - 'modified_date': '20240319', 'modified_timestamp': 1710880610, - 'episode': 'Episode 7', - 'season_number': 1, - 'season': 'Season 1', + 'modified_date': '20240319', + 'subtitles': 'count:1', }, }, { - 'url': 'https://www.kika.de/bernd-das-brot/astrobrot/videos/video90088', - 'md5': 'ffd1b700d7de0a6616a1d08544c77294', + # Video without subtitles + 'url': 'https://www.kika.de/die-pfefferkoerner/videos/abgezogen-102', + 'md5': '62e97961ce5343c19f0f330a1b6dd736', 'info_dict': { - 'id': 'video90088', + 'id': 'abgezogen-102', 'ext': 'mp4', - 'upload_date': '20221102', - 'timestamp': 1667390580, - 'duration': 197, - 'modified_timestamp': 1711093771, - 'episode_number': 8, - 'title': 'Es ist nicht leicht, ein Astrobrot zu sein', - 'modified_date': '20240322', - 'description': 'md5:d3641deaf1b5515a160788b2be4159a9', - 'season_number': 1, - 'episode': 'Episode 8', + 'title': '1. Abgezogen', + 'description': 'md5:42d87963364391f9f8eba8affcb30bd2', + 'duration': 1574, 'season': 'Season 1', + 'season_number': 1, + 'episode': 'Episode 1', + 'episode_number': 1, + 'timestamp': 1735382700, + 'upload_date': '20241228', + 'modified_timestamp': 1757344051, + 'modified_date': '20250908', + 'subtitles': 'count:0', }, }] @@ -78,16 +81,19 @@ class KikaIE(InfoExtractor): video_assets = self._download_json(doc['assets']['url'], video_id) subtitles = {} - if ttml_resource := url_or_none(video_assets.get('videoSubtitle')): - subtitles['de'] = [{ - 'url': ttml_resource, - 'ext': 'ttml', - }] - if webvtt_resource := url_or_none(video_assets.get('webvttUrl')): - subtitles.setdefault('de', []).append({ - 'url': webvtt_resource, - 'ext': 'vtt', - }) + # Subtitle API endpoints may be present in the JSON even if there are no subtitles. + # They then return HTTP 200 with invalid data. So we must check explicitly. + if doc.get('hasSubtitle'): + if ttml_resource := url_or_none(video_assets.get('videoSubtitle')): + subtitles['de'] = [{ + 'url': ttml_resource, + 'ext': 'ttml', + }] + if webvtt_resource := url_or_none(video_assets.get('webvttUrl')): + subtitles.setdefault('de', []).append({ + 'url': webvtt_resource, + 'ext': 'vtt', + }) return { 'id': video_id, diff --git a/plugins/youtube_download/yt_dlp/extractor/loom.py b/plugins/youtube_download/yt_dlp/extractor/loom.py index b0878c3..ad989fc 100644 --- a/plugins/youtube_download/yt_dlp/extractor/loom.py +++ b/plugins/youtube_download/yt_dlp/extractor/loom.py @@ -8,12 +8,10 @@ from ..utils import ( ExtractorError, determine_ext, filter_dict, - get_first, int_or_none, parse_iso8601, update_url, url_or_none, - variadic, ) from ..utils.traversal import traverse_obj @@ -51,7 +49,7 @@ class LoomIE(InfoExtractor): }, { # m3u8 raw-url, mp4 transcoded-url, cdn url == raw-url, vtt sub and json subs 'url': 'https://www.loom.com/share/9458bcbf79784162aa62ffb8dd66201b', - 'md5': '51737ec002969dd28344db4d60b9cbbb', + 'md5': '7b6bfdef8181c4ffc376e18919a4dcc2', 'info_dict': { 'id': '9458bcbf79784162aa62ffb8dd66201b', 'ext': 'mp4', @@ -71,12 +69,13 @@ class LoomIE(InfoExtractor): 'ext': 'webm', 'title': 'OMFG clown', 'description': 'md5:285c5ee9d62aa087b7e3271b08796815', - 'uploader': 'MrPumkin B', + 'uploader': 'Brailey Bragg', 'upload_date': '20210924', 'timestamp': 1632519618, 'duration': 210, }, 'params': {'skip_download': 'dash'}, + 'expected_warnings': ['Failed to parse JSON'], # transcoded-url no longer available }, { # password-protected 'url': 'https://www.loom.com/share/50e26e8aeb7940189dff5630f95ce1f4', @@ -91,10 +90,11 @@ class LoomIE(InfoExtractor): 'duration': 35, }, 'params': {'videopassword': 'seniorinfants2'}, + 'expected_warnings': ['Failed to parse JSON'], # transcoded-url no longer available }, { # embed, transcoded-url endpoint sends empty JSON response, split video and audio HLS formats 'url': 'https://www.loom.com/embed/ddcf1c1ad21f451ea7468b1e33917e4e', - 'md5': 'b321d261656848c184a94e3b93eae28d', + 'md5': 'f983a0f02f24331738b2f43aecb05256', 'info_dict': { 'id': 'ddcf1c1ad21f451ea7468b1e33917e4e', 'ext': 'mp4', @@ -119,11 +119,12 @@ class LoomIE(InfoExtractor): 'duration': 247, 'timestamp': 1676274030, }, + 'skip': '404 Not Found', }] _GRAPHQL_VARIABLES = { 'GetVideoSource': { - 'acceptableMimes': ['DASH', 'M3U8', 'MP4'], + 'acceptableMimes': ['DASH', 'M3U8', 'MP4', 'WEBM'], }, } _GRAPHQL_QUERIES = { @@ -192,6 +193,12 @@ class LoomIE(InfoExtractor): id nullableRawCdnUrl(acceptableMimes: $acceptableMimes, password: $password) { url + credentials { + Policy + Signature + KeyPairId + __typename + } __typename } __typename @@ -240,9 +247,9 @@ class LoomIE(InfoExtractor): } }\n'''), } - _APOLLO_GRAPHQL_VERSION = '0a1856c' + _APOLLO_GRAPHQL_VERSION = '45a5bd4' - def _call_graphql_api(self, operations, video_id, note=None, errnote=None): + def _call_graphql_api(self, operation_name, video_id, note=None, errnote=None, fatal=True): password = self.get_param('videopassword') return self._download_json( 'https://www.loom.com/graphql', video_id, note or 'Downloading GraphQL JSON', @@ -252,7 +259,9 @@ class LoomIE(InfoExtractor): 'x-loom-request-source': f'loom_web_{self._APOLLO_GRAPHQL_VERSION}', 'apollographql-client-name': 'web', 'apollographql-client-version': self._APOLLO_GRAPHQL_VERSION, - }, data=json.dumps([{ + 'graphql-operation-name': operation_name, + 'Origin': 'https://www.loom.com', + }, data=json.dumps({ 'operationName': operation_name, 'variables': { 'videoId': video_id, @@ -260,7 +269,7 @@ class LoomIE(InfoExtractor): **self._GRAPHQL_VARIABLES.get(operation_name, {}), }, 'query': self._GRAPHQL_QUERIES[operation_name], - } for operation_name in variadic(operations)], separators=(',', ':')).encode()) + }, separators=(',', ':')).encode(), fatal=fatal) def _call_url_api(self, endpoint, video_id): response = self._download_json( @@ -275,7 +284,7 @@ class LoomIE(InfoExtractor): }, separators=(',', ':')).encode()) return traverse_obj(response, ('url', {url_or_none})) - def _extract_formats(self, video_id, metadata, gql_data): + def _extract_formats(self, video_id, metadata, video_data): formats = [] video_properties = traverse_obj(metadata, ('video_properties', { 'width': ('width', {int_or_none}), @@ -330,7 +339,7 @@ class LoomIE(InfoExtractor): transcoded_url = self._call_url_api('transcoded-url', video_id) formats.extend(get_formats(transcoded_url, 'transcoded', quality=-1)) # transcoded quality - cdn_url = get_first(gql_data, ('data', 'getVideo', 'nullableRawCdnUrl', 'url', {url_or_none})) + cdn_url = traverse_obj(video_data, ('data', 'getVideo', 'nullableRawCdnUrl', 'url', {url_or_none})) # cdn_url is usually a dupe, but the raw-url/transcoded-url endpoints could return errors valid_urls = [update_url(url, query=None) for url in (raw_url, transcoded_url) if url] if cdn_url and update_url(cdn_url, query=None) not in valid_urls: @@ -338,10 +347,21 @@ class LoomIE(InfoExtractor): return formats + def _get_subtitles(self, video_id): + subs_data = self._call_graphql_api( + 'FetchVideoTranscript', video_id, 'Downloading GraphQL subtitles JSON', fatal=False) + return filter_dict({ + 'en': traverse_obj(subs_data, ( + 'data', 'fetchVideoTranscript', + ('source_url', 'captions_source_url'), { + 'url': {url_or_none}, + })) or None, + }) + def _real_extract(self, url): video_id = self._match_id(url) - metadata = get_first( - self._call_graphql_api('GetVideoSSR', video_id, 'Downloading GraphQL metadata JSON'), + metadata = traverse_obj( + self._call_graphql_api('GetVideoSSR', video_id, 'Downloading GraphQL metadata JSON', fatal=False), ('data', 'getVideo', {dict})) or {} if metadata.get('__typename') == 'VideoPasswordMissingOrIncorrect': @@ -350,22 +370,19 @@ class LoomIE(InfoExtractor): 'This video is password-protected, use the --video-password option', expected=True) raise ExtractorError('Invalid video password', expected=True) - gql_data = self._call_graphql_api(['FetchChapters', 'FetchVideoTranscript', 'GetVideoSource'], video_id) + video_data = self._call_graphql_api( + 'GetVideoSource', video_id, 'Downloading GraphQL video JSON') + chapter_data = self._call_graphql_api( + 'FetchChapters', video_id, 'Downloading GraphQL chapters JSON', fatal=False) duration = traverse_obj(metadata, ('video_properties', 'duration', {int_or_none})) return { 'id': video_id, 'duration': duration, 'chapters': self._extract_chapters_from_description( - get_first(gql_data, ('data', 'fetchVideoChapters', 'content', {str})), duration) or None, - 'formats': self._extract_formats(video_id, metadata, gql_data), - 'subtitles': filter_dict({ - 'en': traverse_obj(gql_data, ( - ..., 'data', 'fetchVideoTranscript', - ('source_url', 'captions_source_url'), { - 'url': {url_or_none}, - })) or None, - }), + traverse_obj(chapter_data, ('data', 'fetchVideoChapters', 'content', {str})), duration) or None, + 'formats': self._extract_formats(video_id, metadata, video_data), + 'subtitles': self.extract_subtitles(video_id), **traverse_obj(metadata, { 'title': ('name', {str}), 'description': ('description', {str}), @@ -376,6 +393,7 @@ class LoomIE(InfoExtractor): class LoomFolderIE(InfoExtractor): + _WORKING = False IE_NAME = 'loom:folder' _VALID_URL = r'https?://(?:www\.)?loom\.com/share/folder/(?P[\da-f]{32})' _TESTS = [{ diff --git a/plugins/youtube_download/yt_dlp/extractor/manoto.py b/plugins/youtube_download/yt_dlp/extractor/manoto.py deleted file mode 100644 index 1dd0b15..0000000 --- a/plugins/youtube_download/yt_dlp/extractor/manoto.py +++ /dev/null @@ -1,128 +0,0 @@ -from .common import InfoExtractor -from ..utils import clean_html, int_or_none, traverse_obj - -_API_URL = 'https://dak1vd5vmi7x6.cloudfront.net/api/v1/publicrole/{}/{}?id={}' - - -class ManotoTVIE(InfoExtractor): - IE_DESC = 'Manoto TV (Episode)' - _VALID_URL = r'https?://(?:www\.)?manototv\.com/episode/(?P[0-9]+)' - _TESTS = [{ - 'url': 'https://www.manototv.com/episode/8475', - 'info_dict': { - 'id': '8475', - 'series': 'خانه های رویایی با برادران اسکات', - 'season_number': 7, - 'episode_number': 25, - 'episode_id': 'My Dream Home S7: Carol & John', - 'duration': 3600, - 'categories': ['سرگرمی'], - 'title': 'کارول و جان', - 'description': 'md5:d0fff1f8ba5c6775d312a00165d1a97e', - 'thumbnail': r're:^https?://.*\.(jpeg|png|jpg)$', - 'ext': 'mp4', - }, - 'params': { - 'skip_download': 'm3u8', - }, - }, { - 'url': 'https://www.manototv.com/episode/12576', - 'info_dict': { - 'id': '12576', - 'series': 'فیلم های ایرانی', - 'episode_id': 'Seh Mah Taatili', - 'duration': 5400, - 'view_count': int, - 'categories': ['سرگرمی'], - 'title': 'سه ماه تعطیلی', - 'description': 'سه ماه تعطیلی فیلمی به کارگردانی و نویسندگی شاپور قریب ساختهٔ سال ۱۳۵۶ است.', - 'thumbnail': r're:^https?://.*\.(jpeg|png|jpg)$', - 'ext': 'mp4', - }, - 'params': { - 'skip_download': 'm3u8', - }, - }] - - def _real_extract(self, url): - video_id = self._match_id(url) - episode_json = self._download_json(_API_URL.format('showmodule', 'episodedetails', video_id), video_id) - details = episode_json.get('details', {}) - formats = self._extract_m3u8_formats(details.get('videoM3u8Url'), video_id, 'mp4') - return { - 'id': video_id, - 'series': details.get('showTitle'), - 'season_number': int_or_none(details.get('analyticsSeasonNumber')), - 'episode_number': int_or_none(details.get('episodeNumber')), - 'episode_id': details.get('analyticsEpisodeTitle'), - 'duration': int_or_none(details.get('durationInMinutes'), invscale=60), - 'view_count': details.get('viewCount'), - 'categories': [details.get('videoCategory')], - 'title': details.get('episodeTitle'), - 'description': clean_html(details.get('episodeDescription')), - 'thumbnail': details.get('episodelandscapeImgIxUrl'), - 'formats': formats, - } - - -class ManotoTVShowIE(InfoExtractor): - IE_DESC = 'Manoto TV (Show)' - _VALID_URL = r'https?://(?:www\.)?manototv\.com/show/(?P[0-9]+)' - _TESTS = [{ - 'url': 'https://www.manototv.com/show/2526', - 'playlist_mincount': 68, - 'info_dict': { - 'id': '2526', - 'title': 'فیلم های ایرانی', - 'description': 'مجموعه ای از فیلم های سینمای کلاسیک ایران', - }, - }] - - def _real_extract(self, url): - show_id = self._match_id(url) - show_json = self._download_json(_API_URL.format('showmodule', 'details', show_id), show_id) - show_details = show_json.get('details', {}) - title = show_details.get('showTitle') - description = show_details.get('showSynopsis') - - series_json = self._download_json(_API_URL.format('showmodule', 'serieslist', show_id), show_id) - playlist_id = str(traverse_obj(series_json, ('details', 'list', 0, 'id'))) - - playlist_json = self._download_json(_API_URL.format('showmodule', 'episodelist', playlist_id), playlist_id) - playlist = traverse_obj(playlist_json, ('details', 'list')) or [] - - entries = [ - self.url_result( - 'https://www.manototv.com/episode/{}'.format(item['slideID']), ie=ManotoTVIE.ie_key(), video_id=item['slideID']) - for item in playlist] - return self.playlist_result(entries, show_id, title, description) - - -class ManotoTVLiveIE(InfoExtractor): - IE_DESC = 'Manoto TV (Live)' - _VALID_URL = r'https?://(?:www\.)?manototv\.com/live/' - _TEST = { - 'url': 'https://www.manototv.com/live/', - 'info_dict': { - 'id': 'live', - 'title': 'Manoto TV Live', - 'ext': 'mp4', - 'is_live': True, - }, - 'params': { - 'skip_download': 'm3u8', - }, - } - - def _real_extract(self, url): - video_id = 'live' - json = self._download_json(_API_URL.format('livemodule', 'details', ''), video_id) - details = json.get('details', {}) - video_url = details.get('liveUrl') - formats = self._extract_m3u8_formats(video_url, video_id, 'mp4', live=True) - return { - 'id': video_id, - 'title': 'Manoto TV Live', - 'is_live': True, - 'formats': formats, - } diff --git a/plugins/youtube_download/yt_dlp/extractor/mave.py b/plugins/youtube_download/yt_dlp/extractor/mave.py index 86d8d8b..aa026f8 100644 --- a/plugins/youtube_download/yt_dlp/extractor/mave.py +++ b/plugins/youtube_download/yt_dlp/extractor/mave.py @@ -1,7 +1,9 @@ -import re +import functools +import math from .common import InfoExtractor from ..utils import ( + InAdvancePagedList, clean_html, int_or_none, parse_iso8601, @@ -10,15 +12,64 @@ from ..utils import ( from ..utils.traversal import require, traverse_obj -class MaveIE(InfoExtractor): - _VALID_URL = r'https?://(?P[\w-]+)\.mave\.digital/(?Pep-\d+)' +class MaveBaseIE(InfoExtractor): + _API_BASE_URL = 'https://api.mave.digital/v1/website' + _API_BASE_STORAGE_URL = 'https://store.cloud.mts.ru/mave/' + + def _load_channel_meta(self, channel_id, display_id): + return traverse_obj(self._download_json( + f'{self._API_BASE_URL}/{channel_id}/', display_id, + note='Downloading channel metadata'), 'podcast') + + def _load_episode_meta(self, channel_id, episode_code, display_id): + return self._download_json( + f'{self._API_BASE_URL}/{channel_id}/episodes/{episode_code}', + display_id, note='Downloading episode metadata') + + def _create_entry(self, channel_id, channel_meta, episode_meta): + episode_code = traverse_obj(episode_meta, ('code', {int}, {require('episode code')})) + return { + 'display_id': f'{channel_id}-{episode_code}', + 'extractor_key': MaveIE.ie_key(), + 'extractor': MaveIE.IE_NAME, + 'webpage_url': f'https://{channel_id}.mave.digital/ep-{episode_code}', + 'channel_id': channel_id, + 'channel_url': f'https://{channel_id}.mave.digital/', + 'vcodec': 'none', + **traverse_obj(episode_meta, { + 'id': ('id', {str}), + 'url': ('audio', {urljoin(self._API_BASE_STORAGE_URL)}), + 'title': ('title', {str}), + 'description': ('description', {clean_html}), + 'thumbnail': ('image', {urljoin(self._API_BASE_STORAGE_URL)}), + 'duration': ('duration', {int_or_none}), + 'season_number': ('season', {int_or_none}), + 'episode_number': ('number', {int_or_none}), + 'view_count': ('listenings', {int_or_none}), + 'like_count': ('reactions', lambda _, v: v['type'] == 'like', 'count', {int_or_none}, any), + 'dislike_count': ('reactions', lambda _, v: v['type'] == 'dislike', 'count', {int_or_none}, any), + 'age_limit': ('is_explicit', {bool}, {lambda x: 18 if x else None}), + 'timestamp': ('publish_date', {parse_iso8601}), + }), + **traverse_obj(channel_meta, { + 'series_id': ('id', {str}), + 'series': ('title', {str}), + 'channel': ('title', {str}), + 'uploader': ('author', {str}), + }), + } + + +class MaveIE(MaveBaseIE): + IE_NAME = 'mave' + _VALID_URL = r'https?://(?P[\w-]+)\.mave\.digital/ep-(?P\d+)' _TESTS = [{ 'url': 'https://ochenlichnoe.mave.digital/ep-25', 'md5': 'aa3e513ef588b4366df1520657cbc10c', 'info_dict': { 'id': '4035f587-914b-44b6-aa5a-d76685ad9bc2', 'ext': 'mp3', - 'display_id': 'ochenlichnoe-ep-25', + 'display_id': 'ochenlichnoe-25', 'title': 'Между мной и миром: психология самооценки', 'description': 'md5:4b7463baaccb6982f326bce5c700382a', 'uploader': 'Самарский университет', @@ -45,7 +96,7 @@ class MaveIE(InfoExtractor): 'info_dict': { 'id': '41898bb5-ff57-4797-9236-37a8e537aa21', 'ext': 'mp3', - 'display_id': 'budem-ep-12', + 'display_id': 'budem-12', 'title': 'Екатерина Михайлова: "Горе от ума" не про женщин написана', 'description': 'md5:fa3bdd59ee829dfaf16e3efcb13f1d19', 'uploader': 'Полина Цветкова+Евгения Акопова', @@ -68,40 +119,72 @@ class MaveIE(InfoExtractor): 'upload_date': '20241230', }, }] - _API_BASE_URL = 'https://api.mave.digital/' def _real_extract(self, url): - channel_id, slug = self._match_valid_url(url).group('channel', 'id') - display_id = f'{channel_id}-{slug}' - webpage = self._download_webpage(url, display_id) - data = traverse_obj( - self._search_nuxt_json(webpage, display_id), - ('data', lambda _, v: v['activeEpisodeData'], any, {require('podcast data')})) + channel_id, episode_code = self._match_valid_url(url).group( + 'channel_id', 'episode_code') + display_id = f'{channel_id}-{episode_code}' + + channel_meta = self._load_channel_meta(channel_id, display_id) + episode_meta = self._load_episode_meta(channel_id, episode_code, display_id) + + return self._create_entry(channel_id, channel_meta, episode_meta) + + +class MaveChannelIE(MaveBaseIE): + IE_NAME = 'mave:channel' + _VALID_URL = r'https?://(?P[\w-]+)\.mave\.digital/?(?:$|[?#])' + _TESTS = [{ + 'url': 'https://budem.mave.digital/', + 'info_dict': { + 'id': 'budem', + 'title': 'Все там будем', + 'description': 'md5:f04ae12a42be0f1d765c5e326b41987a', + }, + 'playlist_mincount': 15, + }, { + 'url': 'https://ochenlichnoe.mave.digital/', + 'info_dict': { + 'id': 'ochenlichnoe', + 'title': 'Очень личное', + 'description': 'md5:ee36a6a52546b91b487fe08c552fdbb2', + }, + 'playlist_mincount': 20, + }, { + 'url': 'https://geekcity.mave.digital/', + 'info_dict': { + 'id': 'geekcity', + 'title': 'Мужчины в трико', + 'description': 'md5:4164d425d60a0d97abdce9d1f6f8e049', + }, + 'playlist_mincount': 80, + }] + _PAGE_SIZE = 50 + + def _entries(self, channel_id, channel_meta, page_num): + page_data = self._download_json( + f'{self._API_BASE_URL}/{channel_id}/episodes', channel_id, query={ + 'view': 'all', + 'page': page_num + 1, + 'sort': 'newest', + 'format': 'all', + }, note=f'Downloading page {page_num + 1}') + for ep in traverse_obj(page_data, ('episodes', lambda _, v: v['audio'] and v['id'])): + yield self._create_entry(channel_id, channel_meta, ep) + + def _real_extract(self, url): + channel_id = self._match_id(url) + + channel_meta = self._load_channel_meta(channel_id, channel_id) return { - 'display_id': display_id, - 'channel_id': channel_id, - 'channel_url': f'https://{channel_id}.mave.digital/', - 'vcodec': 'none', - 'thumbnail': re.sub(r'_\d+(?=\.(?:jpg|png))', '', self._og_search_thumbnail(webpage, default='')) or None, - **traverse_obj(data, ('activeEpisodeData', { - 'url': ('audio', {urljoin(self._API_BASE_URL)}), - 'id': ('id', {str}), + '_type': 'playlist', + 'id': channel_id, + **traverse_obj(channel_meta, { 'title': ('title', {str}), - 'description': ('description', {clean_html}), - 'duration': ('duration', {int_or_none}), - 'season_number': ('season', {int_or_none}), - 'episode_number': ('number', {int_or_none}), - 'view_count': ('listenings', {int_or_none}), - 'like_count': ('reactions', lambda _, v: v['type'] == 'like', 'count', {int_or_none}, any), - 'dislike_count': ('reactions', lambda _, v: v['type'] == 'dislike', 'count', {int_or_none}, any), - 'age_limit': ('is_explicit', {bool}, {lambda x: 18 if x else None}), - 'timestamp': ('publish_date', {parse_iso8601}), - })), - **traverse_obj(data, ('podcast', 'podcast', { - 'series_id': ('id', {str}), - 'series': ('title', {str}), - 'channel': ('title', {str}), - 'uploader': ('author', {str}), - })), + 'description': ('description', {str}), + }), + 'entries': InAdvancePagedList( + functools.partial(self._entries, channel_id, channel_meta), + math.ceil(channel_meta['episodes_count'] / self._PAGE_SIZE), self._PAGE_SIZE), } diff --git a/plugins/youtube_download/yt_dlp/extractor/medaltv.py b/plugins/youtube_download/yt_dlp/extractor/medaltv.py index 94c51ed..d294d8d 100644 --- a/plugins/youtube_download/yt_dlp/extractor/medaltv.py +++ b/plugins/youtube_download/yt_dlp/extractor/medaltv.py @@ -1,14 +1,9 @@ -import re - from .common import InfoExtractor from ..utils import ( - ExtractorError, - float_or_none, - format_field, int_or_none, - str_or_none, - traverse_obj, + url_or_none, ) +from ..utils.traversal import traverse_obj class MedalTVIE(InfoExtractor): @@ -30,25 +25,8 @@ class MedalTVIE(InfoExtractor): 'view_count': int, 'like_count': int, 'duration': 13, - }, - }, { - 'url': 'https://medal.tv/games/cod-cold-war/clips/2mA60jWAGQCBH', - 'md5': 'fc7a3e4552ae8993c1c4006db46be447', - 'info_dict': { - 'id': '2mA60jWAGQCBH', - 'ext': 'mp4', - 'title': 'Quad Cold', - 'description': 'Medal,https://medal.tv/desktop/', - 'uploader': 'MowgliSB', - 'timestamp': 1603165266, - 'upload_date': '20201020', - 'uploader_id': '10619174', - 'thumbnail': 'https://cdn.medal.tv/10619174/thumbnail-34934644-720p.jpg?t=1080p&c=202042&missing', - 'uploader_url': 'https://medal.tv/users/10619174', - 'comment_count': int, - 'view_count': int, - 'like_count': int, - 'duration': 23, + 'thumbnail': r're:https://cdn\.medal\.tv/ugcp/content-thumbnail/.*\.jpg', + 'tags': ['headshot', 'valorant', '4k', 'clutch', 'mornu'], }, }, { 'url': 'https://medal.tv/games/cod-cold-war/clips/2um24TWdty0NA', @@ -57,12 +35,12 @@ class MedalTVIE(InfoExtractor): 'id': '2um24TWdty0NA', 'ext': 'mp4', 'title': 'u tk me i tk u bigger', - 'description': 'Medal,https://medal.tv/desktop/', - 'uploader': 'Mimicc', + 'description': '', + 'uploader': 'zahl', 'timestamp': 1605580939, 'upload_date': '20201117', 'uploader_id': '5156321', - 'thumbnail': 'https://cdn.medal.tv/5156321/thumbnail-36787208-360p.jpg?t=1080p&c=202046&missing', + 'thumbnail': r're:https://cdn\.medal\.tv/source/.*\.png', 'uploader_url': 'https://medal.tv/users/5156321', 'comment_count': int, 'view_count': int, @@ -70,91 +48,77 @@ class MedalTVIE(InfoExtractor): 'duration': 9, }, }, { - 'url': 'https://medal.tv/games/valorant/clips/37rMeFpryCC-9', - 'only_matching': True, - }, { + # API requires auth 'url': 'https://medal.tv/games/valorant/clips/2WRj40tpY_EU9', + 'md5': '6c6bb6569777fd8b4ef7b33c09de8dcf', + 'info_dict': { + 'id': '2WRj40tpY_EU9', + 'ext': 'mp4', + 'title': '1v5 clutch', + 'description': '', + 'uploader': 'adny', + 'uploader_id': '6256941', + 'uploader_url': 'https://medal.tv/users/6256941', + 'comment_count': int, + 'view_count': int, + 'like_count': int, + 'duration': 25, + 'thumbnail': r're:https://cdn\.medal\.tv/source/.*\.jpg', + 'timestamp': 1612896680, + 'upload_date': '20210209', + }, + 'expected_warnings': ['Video formats are not available through API'], + }, { + 'url': 'https://medal.tv/games/valorant/clips/37rMeFpryCC-9', 'only_matching': True, }] def _real_extract(self, url): video_id = self._match_id(url) - webpage = self._download_webpage(url, video_id, query={'mobilebypass': 'true'}) - - hydration_data = self._search_json( - r']*>[^<]*\bhydrationData\s*=', webpage, - 'next data', video_id, end_pattern='', fatal=False) - - clip = traverse_obj(hydration_data, ('clips', ...), get_all=False) - if not clip: - raise ExtractorError( - 'Could not find video information.', video_id=video_id) - - title = clip['contentTitle'] - - source_width = int_or_none(clip.get('sourceWidth')) - source_height = int_or_none(clip.get('sourceHeight')) - - aspect_ratio = source_width / source_height if source_width and source_height else 16 / 9 - - def add_item(container, item_url, height, id_key='format_id', item_id=None): - item_id = item_id or '%dp' % height - if item_id not in item_url: - return - container.append({ - 'url': item_url, - id_key: item_id, - 'width': round(aspect_ratio * height), - 'height': height, - }) + content_data = self._download_json( + f'https://medal.tv/api/content/{video_id}', video_id, + headers={'Accept': 'application/json'}) formats = [] - thumbnails = [] - for k, v in clip.items(): - if not (v and isinstance(v, str)): - continue - mobj = re.match(r'(contentUrl|thumbnail)(?:(\d+)p)?$', k) - if not mobj: - continue - prefix = mobj.group(1) - height = int_or_none(mobj.group(2)) - if prefix == 'contentUrl': - add_item( - formats, v, height or source_height, - item_id=None if height else 'source') - elif prefix == 'thumbnail': - add_item(thumbnails, v, height, 'id') - - error = clip.get('error') - if not formats and error: - if error == 404: - self.raise_no_formats( - 'That clip does not exist.', - expected=True, video_id=video_id) - else: - self.raise_no_formats( - f'An unknown error occurred ({error}).', - video_id=video_id) - - # Necessary because the id of the author is not known in advance. - # Won't raise an issue if no profile can be found as this is optional. - author = traverse_obj(hydration_data, ('profiles', ...), get_all=False) or {} - author_id = str_or_none(author.get('userId')) - author_url = format_field(author_id, None, 'https://medal.tv/users/%s') + if m3u8_url := url_or_none(content_data.get('contentUrlHls')): + formats.extend(self._extract_m3u8_formats(m3u8_url, video_id, 'mp4', m3u8_id='hls')) + if http_url := url_or_none(content_data.get('contentUrl')): + formats.append({ + 'url': http_url, + 'format_id': 'http-source', + 'ext': 'mp4', + 'quality': 1, + }) + formats = [fmt for fmt in formats if 'video/privacy-protected-guest' not in fmt['url']] + if not formats: + # Fallback, does not require auth + self.report_warning('Video formats are not available through API, falling back to social video URL') + urlh = self._request_webpage( + f'https://medal.tv/api/content/{video_id}/socialVideoUrl', video_id, + note='Checking social video URL') + formats.append({ + 'url': urlh.url, + 'format_id': 'social-video', + 'ext': 'mp4', + 'quality': -1, + }) return { 'id': video_id, - 'title': title, 'formats': formats, - 'thumbnails': thumbnails, - 'description': clip.get('contentDescription'), - 'uploader': author.get('displayName'), - 'timestamp': float_or_none(clip.get('created'), 1000), - 'uploader_id': author_id, - 'uploader_url': author_url, - 'duration': int_or_none(clip.get('videoLengthSeconds')), - 'view_count': int_or_none(clip.get('views')), - 'like_count': int_or_none(clip.get('likes')), - 'comment_count': int_or_none(clip.get('comments')), + **traverse_obj(content_data, { + 'title': ('contentTitle', {str}), + 'description': ('contentDescription', {str}), + 'timestamp': ('created', {int_or_none(scale=1000)}), + 'duration': ('videoLengthSeconds', {int_or_none}), + 'view_count': ('views', {int_or_none}), + 'like_count': ('likes', {int_or_none}), + 'comment_count': ('comments', {int_or_none}), + 'uploader': ('poster', 'displayName', {str}), + 'uploader_id': ('poster', 'userId', {str}), + 'uploader_url': ('poster', 'userId', {str}, filter, {lambda x: x and f'https://medal.tv/users/{x}'}), + 'tags': ('tags', ..., {str}), + 'thumbnail': ('thumbnailUrl', {url_or_none}), + }), } diff --git a/plugins/youtube_download/yt_dlp/extractor/mux.py b/plugins/youtube_download/yt_dlp/extractor/mux.py new file mode 100644 index 0000000..34a56f4 --- /dev/null +++ b/plugins/youtube_download/yt_dlp/extractor/mux.py @@ -0,0 +1,92 @@ +import re + +from .common import InfoExtractor +from ..utils import ( + extract_attributes, + filter_dict, + parse_qs, + smuggle_url, + unsmuggle_url, + update_url_query, +) +from ..utils.traversal import traverse_obj + + +class MuxIE(InfoExtractor): + _VALID_URL = r'https?://(?:stream\.new/v|player\.mux\.com)/(?P[A-Za-z0-9-]+)' + _EMBED_REGEX = [r']+\bsrc=["\'](?P(?:https?:)?//(?:stream\.new/v|player\.mux\.com)/(?P[A-Za-z0-9-]+)[^"\']+)'] + _TESTS = [{ + 'url': 'https://stream.new/v/OCtRWZiZqKvLbnZ32WSEYiGNvHdAmB01j/embed', + 'info_dict': { + 'ext': 'mp4', + 'id': 'OCtRWZiZqKvLbnZ32WSEYiGNvHdAmB01j', + 'title': 'OCtRWZiZqKvLbnZ32WSEYiGNvHdAmB01j', + }, + }, { + 'url': 'https://player.mux.com/OCtRWZiZqKvLbnZ32WSEYiGNvHdAmB01j', + 'info_dict': { + 'ext': 'mp4', + 'id': 'OCtRWZiZqKvLbnZ32WSEYiGNvHdAmB01j', + 'title': 'OCtRWZiZqKvLbnZ32WSEYiGNvHdAmB01j', + }, + }] + _WEBPAGE_TESTS = [{ + # iframe embed + 'url': 'https://www.redbrickai.com/blog/2025-07-14-FAST-brush', + 'info_dict': { + 'ext': 'mp4', + 'id': 'cXhzAiW1AmsHY01eRbEYFcTEAn0102aGN8sbt8JprP6Dfw', + 'title': 'cXhzAiW1AmsHY01eRbEYFcTEAn0102aGN8sbt8JprP6Dfw', + }, + }, { + # mux-player embed + 'url': 'https://muxvideo.2coders.com/download/', + 'info_dict': { + 'ext': 'mp4', + 'id': 'JBuasdg35Hw7tYmTe9k68QLPQKixL300YsWHDz5Flit8', + 'title': 'JBuasdg35Hw7tYmTe9k68QLPQKixL300YsWHDz5Flit8', + }, + }, { + # mux-player with title metadata + 'url': 'https://datastar-todomvc.cross.stream/', + 'info_dict': { + 'ext': 'mp4', + 'id': 'KX01ZSZ8CXv5SVfVwMZKJTcuBcUQmo1ReS9U5JjoHm4k', + 'title': 'TodoMVC with Datastar Tutorial', + }, + }] + + @classmethod + def _extract_embed_urls(cls, url, webpage): + yield from super()._extract_embed_urls(url, webpage) + for mux_player in re.findall(r']*\bplayback-id=[^>]+>', webpage): + attrs = extract_attributes(mux_player) + playback_id = attrs.get('playback-id') + if not playback_id: + continue + token = attrs.get('playback-token') or traverse_obj(playback_id, ({parse_qs}, 'token', -1)) + playback_id = playback_id.partition('?')[0] + + embed_url = update_url_query( + f'https://player.mux.com/{playback_id}', + filter_dict({'playback-token': token})) + if title := attrs.get('metadata-video-title'): + embed_url = smuggle_url(embed_url, {'title': title}) + yield embed_url + + def _real_extract(self, url): + url, smuggled_data = unsmuggle_url(url, {}) + video_id = self._match_id(url) + + token = traverse_obj(parse_qs(url), ('playback-token', -1)) + + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + f'https://stream.mux.com/{video_id}.m3u8', video_id, 'mp4', + query=filter_dict({'token': token})) + + return { + 'id': video_id, + 'title': smuggled_data.get('title') or video_id, + 'formats': formats, + 'subtitles': subtitles, + } diff --git a/plugins/youtube_download/yt_dlp/extractor/nascar.py b/plugins/youtube_download/yt_dlp/extractor/nascar.py new file mode 100644 index 0000000..b14a3b0 --- /dev/null +++ b/plugins/youtube_download/yt_dlp/extractor/nascar.py @@ -0,0 +1,60 @@ +from .common import InfoExtractor +from ..utils import ( + float_or_none, + parse_iso8601, + url_or_none, +) +from ..utils.traversal import traverse_obj + + +class NascarClassicsIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?classics\.nascar\.com/video/(?P[\w~-]+)' + _TESTS = [{ + 'url': 'https://classics.nascar.com/video/Ka5qGuxzZ~SIvJii7uAC~wszPshklHN', + 'md5': '81d712eccffa7169c328281b8cc28f77', + 'info_dict': { + 'id': 'Ka5qGuxzZ~SIvJii7uAC~wszPshklHN', + 'ext': 'mp4', + 'title': 'Cook Out 400 2023', + 'thumbnail': 'https://va.aws.nascar.com/IMAGES/CUP_2023_22_RICHMOND_THUMB_NCD.jpg', + 'timestamp': 1690732800, + 'upload_date': '20230730', + 'tags': ['2023', 'race #22', 'richmond', 'chris buescher', 'cup'], + 'chapters': 'count:18', + }, + }, { + 'url': 'https://classics.nascar.com/video/UASvPDOwEha~SIvJii7uAC~wszPshklHN', + 'md5': 'a5e8d6ec6005da3857d25ba2df5e7133', + 'info_dict': { + 'id': 'UASvPDOwEha~SIvJii7uAC~wszPshklHN', + 'ext': 'mp4', + 'title': 'I Love New York 355 at the Glen 2017', + 'thumbnail': 'https://va.aws.nascar.com/IMAGES/CUP_2017_22_WATKINSGLEN_THUMB_NCD.jpg', + 'timestamp': 1501995600, + 'upload_date': '20170806', + 'tags': ['watkins glen', 'race #22', '2017', 'martin truex jr.', 'cup'], + 'chapters': 'count:13', + }, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + content_data = self._search_nextjs_data( + webpage, video_id)['props']['pageProps']['contentData'] + + return { + 'id': video_id, + 'formats': self._extract_m3u8_formats(content_data['input']['src'], video_id, 'mp4'), + **traverse_obj(content_data, { + 'title': ('input', 'name', {str}), + 'description': ('input', 'description', {str}, filter), + 'thumbnail': ('input', 'thumbnail', {url_or_none}), + 'tags': ('input', 'settings', 'tags', ..., {str}), + 'timestamp': ('input', 'start_time', {parse_iso8601}), + 'chapters': ('overlay', 'data', 'timelines', 0, 'events', lambda _, v: float(v['timestamp']) is not None, { + 'start_time': ('timestamp', {float_or_none}), + 'title': ('name', {str}), + }), + }), + } diff --git a/plugins/youtube_download/yt_dlp/extractor/nbc.py b/plugins/youtube_download/yt_dlp/extractor/nbc.py index caa9dc0..41811b8 100644 --- a/plugins/youtube_download/yt_dlp/extractor/nbc.py +++ b/plugins/youtube_download/yt_dlp/extractor/nbc.py @@ -63,7 +63,7 @@ class NBCUniversalBaseIE(ThePlatformBaseIE): # formats='mpeg4' will return either a working m3u8 URL or an m3u8 template for non-DRM HLS # formats='m3u+none,mpeg4' may return DRM HLS but w/the "folders" needed for non-DRM template query['formats'] = 'm3u+none,mpeg4' - m3u8_url = self._download_nbcu_smil_and_extract_m3u8_url(tp_path, video_id, query) + orig_m3u8_url = m3u8_url = self._download_nbcu_smil_and_extract_m3u8_url(tp_path, video_id, query) if mobj := re.fullmatch(self._M3U8_RE, m3u8_url): query['formats'] = 'mpeg4' @@ -76,7 +76,17 @@ class NBCUniversalBaseIE(ThePlatformBaseIE): if '/mpeg_cenc' in m3u8_url or '/mpeg_cbcs' in m3u8_url: self.report_drm(video_id) - return self._extract_m3u8_formats_and_subtitles(m3u8_url, video_id, 'mp4', m3u8_id='hls') + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + m3u8_url, video_id, 'mp4', m3u8_id='hls', fatal=False) + + if not formats and m3u8_url != orig_m3u8_url: + orig_fmts, subtitles = self._extract_m3u8_formats_and_subtitles( + orig_m3u8_url, video_id, 'mp4', m3u8_id='hls', fatal=False) + formats = [f for f in orig_fmts if not f.get('has_drm')] + if orig_fmts and not formats: + self.report_drm(video_id) + + return formats, subtitles def _extract_nbcu_video(self, url, display_id, old_ie_key=None): webpage = self._download_webpage(url, display_id) diff --git a/plugins/youtube_download/yt_dlp/extractor/nebula.py b/plugins/youtube_download/yt_dlp/extractor/nebula.py index 6ced19d..2708c72 100644 --- a/plugins/youtube_download/yt_dlp/extractor/nebula.py +++ b/plugins/youtube_download/yt_dlp/extractor/nebula.py @@ -478,3 +478,64 @@ class NebulaChannelIE(NebulaBaseIE): playlist_id=collection_slug, playlist_title=channel.get('title'), playlist_description=channel.get('description')) + + +class NebulaSeasonIE(NebulaBaseIE): + IE_NAME = 'nebula:season' + _VALID_URL = rf'{_BASE_URL_RE}/(?P[\w-]+)/season/(?P[\w-]+)' + _TESTS = [{ + 'url': 'https://nebula.tv/jetlag/season/15', + 'info_dict': { + 'id': 'jetlag_15', + 'title': 'Tag: All Stars', + 'description': 'md5:5aa5b8abf3de71756448dc44ffebb674', + }, + 'playlist_count': 8, + }, { + 'url': 'https://nebula.tv/jetlag/season/14', + 'info_dict': { + 'id': 'jetlag_14', + 'title': 'Snake', + 'description': 'md5:6da9040f1c2ac559579738bfb6919d1e', + }, + 'playlist_count': 8, + }, { + 'url': 'https://nebula.tv/jetlag/season/13-5', + 'info_dict': { + 'id': 'jetlag_13-5', + 'title': 'Hide + Seek Across NYC', + 'description': 'md5:5b87bb9acc6dcdff289bb4c71a2ad59f', + }, + 'playlist_count': 3, + }] + + def _build_url_result(self, item): + url = ( + traverse_obj(item, ('share_url', {url_or_none})) + or urljoin('https://nebula.tv/', item.get('app_path')) + or f'https://nebula.tv/videos/{item["slug"]}') + return self.url_result( + smuggle_url(url, {'id': item['id']}), + NebulaIE, url_transparent=True, + **self._extract_video_metadata(item)) + + def _entries(self, data): + for episode in traverse_obj(data, ('episodes', lambda _, v: v['video']['id'], 'video')): + yield self._build_url_result(episode) + for extra in traverse_obj(data, ('extras', ..., 'items', lambda _, v: v['id'])): + yield self._build_url_result(extra) + for trailer in traverse_obj(data, ('trailers', lambda _, v: v['id'])): + yield self._build_url_result(trailer) + + def _real_extract(self, url): + series, season_id = self._match_valid_url(url).group('series', 'season_number') + playlist_id = f'{series}_{season_id}' + data = self._call_api( + f'https://content.api.nebula.app/content/{series}/season/{season_id}', playlist_id) + + return self.playlist_result( + self._entries(data), playlist_id, + **traverse_obj(data, { + 'title': ('title', {str}), + 'description': ('description', {str}), + })) diff --git a/plugins/youtube_download/yt_dlp/extractor/netapp.py b/plugins/youtube_download/yt_dlp/extractor/netapp.py new file mode 100644 index 0000000..a665472 --- /dev/null +++ b/plugins/youtube_download/yt_dlp/extractor/netapp.py @@ -0,0 +1,79 @@ +from .brightcove import BrightcoveNewIE +from .common import InfoExtractor +from ..utils import parse_iso8601 +from ..utils.traversal import require, traverse_obj + + +class NetAppBaseIE(InfoExtractor): + _BC_URL = 'https://players.brightcove.net/6255154784001/default_default/index.html?videoId={}' + + @staticmethod + def _parse_metadata(item): + return traverse_obj(item, { + 'title': ('name', {str}), + 'description': ('description', {str}), + 'timestamp': ('createdAt', {parse_iso8601}), + }) + + +class NetAppVideoIE(NetAppBaseIE): + _VALID_URL = r'https?://media\.netapp\.com/video-detail/(?P[0-9a-f-]+)' + + _TESTS = [{ + 'url': 'https://media.netapp.com/video-detail/da25fc01-82ad-5284-95bc-26920200a222/seamless-storage-for-modern-kubernetes-deployments', + 'info_dict': { + 'id': '1843620950167202073', + 'ext': 'mp4', + 'title': 'Seamless storage for modern Kubernetes deployments', + 'description': 'md5:1ee39e315243fe71fb90af2796037248', + 'uploader_id': '6255154784001', + 'duration': 2159.41, + 'thumbnail': r're:https://house-fastly-signed-us-east-1-prod\.brightcovecdn\.com/image/.*\.jpg', + 'tags': 'count:15', + 'timestamp': 1758213949, + 'upload_date': '20250918', + }, + }, { + 'url': 'https://media.netapp.com/video-detail/45593e5d-cf1c-5996-978c-c9081906e69f/unleash-ai-innovation-with-your-data-with-the-netapp-platform', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_uuid = self._match_id(url) + metadata = self._download_json( + f'https://api.media.netapp.com/client/detail/{video_uuid}', video_uuid) + + brightcove_video_id = traverse_obj(metadata, ( + 'sections', lambda _, v: v['type'] == 'Player', 'video', {str}, any, {require('brightcove video id')})) + + video_item = traverse_obj(metadata, ('sections', lambda _, v: v['type'] == 'VideoDetail', any)) + + return self.url_result( + self._BC_URL.format(brightcove_video_id), BrightcoveNewIE, brightcove_video_id, + url_transparent=True, **self._parse_metadata(video_item)) + + +class NetAppCollectionIE(NetAppBaseIE): + _VALID_URL = r'https?://media\.netapp\.com/collection/(?P[0-9a-f-]+)' + _TESTS = [{ + 'url': 'https://media.netapp.com/collection/9820e190-f2a6-47ac-9c0a-98e5e64234a4', + 'info_dict': { + 'title': 'Featured sessions', + 'id': '9820e190-f2a6-47ac-9c0a-98e5e64234a4', + }, + 'playlist_count': 4, + }] + + def _entries(self, metadata): + for item in traverse_obj(metadata, ('items', lambda _, v: v['brightcoveVideoId'])): + brightcove_video_id = item['brightcoveVideoId'] + yield self.url_result( + self._BC_URL.format(brightcove_video_id), BrightcoveNewIE, brightcove_video_id, + url_transparent=True, **self._parse_metadata(item)) + + def _real_extract(self, url): + collection_uuid = self._match_id(url) + metadata = self._download_json( + f'https://api.media.netapp.com/client/collection/{collection_uuid}', collection_uuid) + + return self.playlist_result(self._entries(metadata), collection_uuid, playlist_title=metadata.get('name')) diff --git a/plugins/youtube_download/yt_dlp/extractor/neteasemusic.py b/plugins/youtube_download/yt_dlp/extractor/neteasemusic.py index 6c47086..8f3a7d2 100644 --- a/plugins/youtube_download/yt_dlp/extractor/neteasemusic.py +++ b/plugins/youtube_download/yt_dlp/extractor/neteasemusic.py @@ -528,7 +528,7 @@ class NetEaseMusicMvIE(NetEaseMusicBaseIE): class NetEaseMusicProgramIE(NetEaseMusicBaseIE): IE_NAME = 'netease:program' IE_DESC = '网易云音乐 - 电台节目' - _VALID_URL = r'https?://music\.163\.com/(?:#/)?program\?id=(?P[0-9]+)' + _VALID_URL = r'https?://music\.163\.com/(?:#/)?(?:dj|program)\?id=(?P[0-9]+)' _TESTS = [{ 'url': 'http://music.163.com/#/program?id=10109055', 'info_dict': { @@ -572,6 +572,9 @@ class NetEaseMusicProgramIE(NetEaseMusicBaseIE): 'params': { 'noplaylist': True, }, + }, { + 'url': 'https://music.163.com/#/dj?id=3706179315', + 'only_matching': True, }] def _real_extract(self, url): diff --git a/plugins/youtube_download/yt_dlp/extractor/netzkino.py b/plugins/youtube_download/yt_dlp/extractor/netzkino.py index c07b171..05f6c23 100644 --- a/plugins/youtube_download/yt_dlp/extractor/netzkino.py +++ b/plugins/youtube_download/yt_dlp/extractor/netzkino.py @@ -2,84 +2,59 @@ from .common import InfoExtractor from ..utils import ( clean_html, int_or_none, - js_to_json, - parse_iso8601, + url_or_none, + urljoin, ) +from ..utils.traversal import traverse_obj class NetzkinoIE(InfoExtractor): - _WORKING = False - _VALID_URL = r'https?://(?:www\.)?netzkino\.de/\#!/[^/]+/(?P[^/]+)' - + _GEO_COUNTRIES = ['DE'] + _VALID_URL = r'https?://(?:www\.)?netzkino\.de/details/(?P[^/?#]+)' _TESTS = [{ - 'url': 'https://www.netzkino.de/#!/scifikino/rakete-zum-mond', - 'md5': '92a3f8b76f8d7220acce5377ea5d4873', + 'url': 'https://www.netzkino.de/details/snow-beast', + 'md5': '1a4c90fe40d3ccabce163287e45e56dd', 'info_dict': { - 'id': 'rakete-zum-mond', + 'id': 'snow-beast', 'ext': 'mp4', - 'title': 'Rakete zum Mond \u2013 Jules Verne', - 'description': 'md5:f0a8024479618ddbfa450ff48ffa6c60', - 'upload_date': '20120813', - 'thumbnail': r're:https?://.*\.jpg$', - 'timestamp': 1344858571, + 'title': 'Snow Beast', 'age_limit': 12, - }, - 'params': { - 'skip_download': 'Download only works from Germany', - }, - }, { - 'url': 'https://www.netzkino.de/#!/filme/dr-jekyll-mrs-hyde-2', - 'md5': 'c7728b2dadd04ff6727814847a51ef03', - 'info_dict': { - 'id': 'dr-jekyll-mrs-hyde-2', - 'ext': 'mp4', - 'title': 'Dr. Jekyll & Mrs. Hyde 2', - 'description': 'md5:c2e9626ebd02de0a794b95407045d186', - 'upload_date': '20190130', - 'thumbnail': r're:https?://.*\.jpg$', - 'timestamp': 1548849437, - 'age_limit': 18, - }, - 'params': { - 'skip_download': 'Download only works from Germany', + 'alt_title': 'Snow Beast', + 'cast': 'count:3', + 'categories': 'count:7', + 'creators': 'count:2', + 'description': 'md5:e604a954a7f827a80e96a3a97d48b269', + 'location': 'US', + 'release_year': 2011, + 'thumbnail': r're:https?://.+\.jpg', }, }] def _real_extract(self, url): - mobj = self._match_valid_url(url) - video_id = mobj.group('id') + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + next_js_data = self._search_nextjs_data(webpage, video_id) - api_url = f'https://api.netzkino.de.simplecache.net/capi-2.0a/movies/{video_id}.json?d=www' - info = self._download_json(api_url, video_id) - custom_fields = info['custom_fields'] - - production_js = self._download_webpage( - 'http://www.netzkino.de/beta/dist/production.min.js', video_id, - note='Downloading player code') - avo_js = self._search_regex( - r'var urlTemplate=(\{.*?"\})', - production_js, 'URL templates') - templates = self._parse_json( - avo_js, video_id, transform_source=js_to_json) - - suffix = { - 'hds': '.mp4/manifest.f4m', - 'hls': '.mp4/master.m3u8', - 'pmd': '.mp4', - } - film_fn = custom_fields['Streaming'][0] - formats = [{ - 'format_id': key, - 'ext': 'mp4', - 'url': tpl.replace('{}', film_fn) + suffix[key], - } for key, tpl in templates.items()] + query = traverse_obj(next_js_data, ( + 'props', '__dehydratedState', 'queries', ..., 'state', + 'data', 'data', lambda _, v: v['__typename'] == 'CmsMovie', any)) + if 'DRM' in traverse_obj(query, ('licenses', 'nodes', ..., 'properties', {str})): + self.report_drm(video_id) return { 'id': video_id, - 'formats': formats, - 'title': info['title'], - 'age_limit': int_or_none(custom_fields.get('FSK')[0]), - 'timestamp': parse_iso8601(info.get('date'), delimiter=' '), - 'description': clean_html(info.get('content')), - 'thumbnail': info.get('thumbnail'), + **traverse_obj(query, { + 'title': ('originalTitle', {clean_html}), + 'age_limit': ('fskRating', {int_or_none}), + 'alt_title': ('originalTitle', {clean_html}, filter), + 'cast': ('cast', 'nodes', ..., 'person', 'name', {clean_html}, filter), + 'creators': (('directors', 'writers'), 'nodes', ..., 'person', 'name', {clean_html}, filter), + 'categories': ('categories', 'nodes', ..., 'category', 'title', {clean_html}, filter), + 'description': ('longSynopsis', {clean_html}, filter), + 'duration': ('runtimeInSeconds', {int_or_none}), + 'location': ('productionCountry', {clean_html}, filter), + 'release_year': ('productionYear', {int_or_none}), + 'thumbnail': ('coverImage', 'masterUrl', {url_or_none}), + 'url': ('videoSource', 'pmdUrl', {urljoin('https://pmd.netzkino-seite.netzkino.de/')}), + }), } diff --git a/plugins/youtube_download/yt_dlp/extractor/nextmedia.py b/plugins/youtube_download/yt_dlp/extractor/nextmedia.py deleted file mode 100644 index 81da3ff..0000000 --- a/plugins/youtube_download/yt_dlp/extractor/nextmedia.py +++ /dev/null @@ -1,238 +0,0 @@ -import urllib.parse - -from .common import InfoExtractor -from ..utils import ( - clean_html, - get_element_by_class, - int_or_none, - parse_iso8601, - remove_start, - unified_timestamp, -) - - -class NextMediaIE(InfoExtractor): - IE_DESC = '蘋果日報' - _VALID_URL = r'https?://hk\.apple\.nextmedia\.com/[^/]+/[^/]+/(?P\d+)/(?P\d+)' - _TESTS = [{ - 'url': 'http://hk.apple.nextmedia.com/realtime/news/20141108/53109199', - 'md5': 'dff9fad7009311c421176d1ac90bfe4f', - 'info_dict': { - 'id': '53109199', - 'ext': 'mp4', - 'title': '【佔領金鐘】50外國領事議員撐場 讚學生勇敢香港有希望', - 'thumbnail': r're:^https?://.*\.jpg$', - 'description': 'md5:28222b9912b6665a21011b034c70fcc7', - 'timestamp': 1415456273, - 'upload_date': '20141108', - }, - }] - - _URL_PATTERN = r'\{ url: \'(.+)\' \}' - - def _real_extract(self, url): - news_id = self._match_id(url) - page = self._download_webpage(url, news_id) - return self._extract_from_nextmedia_page(news_id, url, page) - - def _extract_from_nextmedia_page(self, news_id, url, page): - redirection_url = self._search_regex( - r'window\.location\.href\s*=\s*([\'"])(?P(?!\1).+)\1', - page, 'redirection URL', default=None, group='url') - if redirection_url: - return self.url_result(urllib.parse.urljoin(url, redirection_url)) - - title = self._fetch_title(page) - video_url = self._search_regex(self._URL_PATTERN, page, 'video url') - - attrs = { - 'id': news_id, - 'title': title, - 'url': video_url, # ext can be inferred from url - 'thumbnail': self._fetch_thumbnail(page), - 'description': self._fetch_description(page), - } - - timestamp = self._fetch_timestamp(page) - if timestamp: - attrs['timestamp'] = timestamp - else: - attrs['upload_date'] = self._fetch_upload_date(url) - - return attrs - - def _fetch_title(self, page): - return self._og_search_title(page) - - def _fetch_thumbnail(self, page): - return self._og_search_thumbnail(page) - - def _fetch_timestamp(self, page): - date_created = self._search_regex('"dateCreated":"([^"]+)"', page, 'created time') - return parse_iso8601(date_created) - - def _fetch_upload_date(self, url): - return self._search_regex(self._VALID_URL, url, 'upload date', group='date') - - def _fetch_description(self, page): - return self._og_search_property('description', page) - - -class NextMediaActionNewsIE(NextMediaIE): # XXX: Do not subclass from concrete IE - IE_DESC = '蘋果日報 - 動新聞' - _VALID_URL = r'https?://hk\.dv\.nextmedia\.com/actionnews/[^/]+/(?P\d+)/(?P\d+)/\d+' - _TESTS = [{ - 'url': 'http://hk.dv.nextmedia.com/actionnews/hit/20150121/19009428/20061460', - 'md5': '05fce8ffeed7a5e00665d4b7cf0f9201', - 'info_dict': { - 'id': '19009428', - 'ext': 'mp4', - 'title': '【壹週刊】細10年男友偷食 50歲邵美琪再失戀', - 'thumbnail': r're:^https?://.*\.jpg$', - 'description': 'md5:cd802fad1f40fd9ea178c1e2af02d659', - 'timestamp': 1421791200, - 'upload_date': '20150120', - }, - }] - - def _real_extract(self, url): - news_id = self._match_id(url) - actionnews_page = self._download_webpage(url, news_id) - article_url = self._og_search_url(actionnews_page) - article_page = self._download_webpage(article_url, news_id) - return self._extract_from_nextmedia_page(news_id, url, article_page) - - -class AppleDailyIE(NextMediaIE): # XXX: Do not subclass from concrete IE - IE_DESC = '臺灣蘋果日報' - _VALID_URL = r'https?://(www|ent)\.appledaily\.com\.tw/[^/]+/[^/]+/[^/]+/(?P\d+)/(?P\d+)(/.*)?' - _TESTS = [{ - 'url': 'http://ent.appledaily.com.tw/enews/article/entertainment/20150128/36354694', - 'md5': 'a843ab23d150977cc55ef94f1e2c1e4d', - 'info_dict': { - 'id': '36354694', - 'ext': 'mp4', - 'title': '周亭羽走過摩鐵陰霾2男陪吃 九把刀孤寒看醫生', - 'thumbnail': r're:^https?://.*\.jpg$', - 'description': 'md5:2acd430e59956dc47cd7f67cb3c003f4', - 'upload_date': '20150128', - }, - }, { - 'url': 'http://www.appledaily.com.tw/realtimenews/article/strange/20150128/550549/%E4%B8%8D%E6%BB%BF%E8%A2%AB%E8%B8%A9%E8%85%B3%E3%80%80%E5%B1%B1%E6%9D%B1%E5%85%A9%E5%A4%A7%E5%AA%BD%E4%B8%80%E8%B7%AF%E6%89%93%E4%B8%8B%E8%BB%8A', - 'md5': '86b4e9132d158279c7883822d94ccc49', - 'info_dict': { - 'id': '550549', - 'ext': 'mp4', - 'title': '不滿被踩腳 山東兩大媽一路打下車', - 'thumbnail': r're:^https?://.*\.jpg$', - 'description': 'md5:175b4260c1d7c085993474217e4ab1b4', - 'upload_date': '20150128', - }, - }, { - 'url': 'http://www.appledaily.com.tw/animation/realtimenews/new/20150128/5003671', - 'md5': '03df296d95dedc2d5886debbb80cb43f', - 'info_dict': { - 'id': '5003671', - 'ext': 'mp4', - 'title': '20正妹熱舞 《刀龍傳說Online》火辣上市', - 'thumbnail': r're:^https?://.*\.jpg$', - 'description': 'md5:23c0aac567dc08c9c16a3161a2c2e3cd', - 'upload_date': '20150128', - }, - 'skip': 'redirect to http://www.appledaily.com.tw/animation/', - }, { - # No thumbnail - 'url': 'http://www.appledaily.com.tw/animation/realtimenews/new/20150128/5003673/', - 'md5': 'b06182cd386ea7bc6115ec7ff0f72aeb', - 'info_dict': { - 'id': '5003673', - 'ext': 'mp4', - 'title': '半夜尿尿 好像會看到___', - 'description': 'md5:61d2da7fe117fede148706cdb85ac066', - 'upload_date': '20150128', - }, - 'expected_warnings': [ - 'video thumbnail', - ], - 'skip': 'redirect to http://www.appledaily.com.tw/animation/', - }, { - 'url': 'http://www.appledaily.com.tw/appledaily/article/supplement/20140417/35770334/', - 'md5': 'eaa20e6b9df418c912d7f5dec2ba734d', - 'info_dict': { - 'id': '35770334', - 'ext': 'mp4', - 'title': '咖啡占卜測 XU裝熟指數', - 'thumbnail': r're:^https?://.*\.jpg$', - 'description': 'md5:7b859991a6a4fedbdf3dd3b66545c748', - 'upload_date': '20140417', - }, - }, { - 'url': 'http://www.appledaily.com.tw/actionnews/appledaily/7/20161003/960588/', - 'only_matching': True, - }, { - # Redirected from http://ent.appledaily.com.tw/enews/article/entertainment/20150128/36354694 - 'url': 'http://ent.appledaily.com.tw/section/article/headline/20150128/36354694', - 'only_matching': True, - }] - - _URL_PATTERN = r'\{url: \'(.+)\'\}' - - def _fetch_title(self, page): - return (self._html_search_regex(r'

([^<>]+)

', page, 'news title', default=None) - or self._html_search_meta('description', page, 'news title')) - - def _fetch_thumbnail(self, page): - return self._html_search_regex(r"setInitialImage\(\'([^']+)'\)", page, 'video thumbnail', fatal=False) - - def _fetch_timestamp(self, page): - return None - - def _fetch_description(self, page): - return self._html_search_meta('description', page, 'news description') - - -class NextTVIE(InfoExtractor): - _WORKING = False - _ENABLED = None # XXX: pass through to GenericIE - IE_DESC = '壹電視' - _VALID_URL = r'https?://(?:www\.)?nexttv\.com\.tw/(?:[^/]+/)+(?P\d+)' - - _TEST = { - 'url': 'http://www.nexttv.com.tw/news/realtime/politics/11779671', - 'info_dict': { - 'id': '11779671', - 'ext': 'mp4', - 'title': '「超收稅」近4千億! 藍議員籲發消費券', - 'thumbnail': r're:^https?://.*\.jpg$', - 'timestamp': 1484825400, - 'upload_date': '20170119', - 'view_count': int, - }, - } - - def _real_extract(self, url): - video_id = self._match_id(url) - - webpage = self._download_webpage(url, video_id) - - title = self._html_search_regex( - r']*>([^<]+)', webpage, 'title') - - data = self._hidden_inputs(webpage) - - video_url = data['ntt-vod-src-detailview'] - - date_str = get_element_by_class('date', webpage) - timestamp = unified_timestamp(date_str + '+0800') if date_str else None - - view_count = int_or_none(remove_start( - clean_html(get_element_by_class('click', webpage)), '點閱:')) - - return { - 'id': video_id, - 'title': title, - 'url': video_url, - 'thumbnail': data.get('ntt-vod-img-src'), - 'timestamp': timestamp, - 'view_count': view_count, - } diff --git a/plugins/youtube_download/yt_dlp/extractor/nhk.py b/plugins/youtube_download/yt_dlp/extractor/nhk.py index eef3ed8..99186ad 100644 --- a/plugins/youtube_download/yt_dlp/extractor/nhk.py +++ b/plugins/youtube_download/yt_dlp/extractor/nhk.py @@ -23,96 +23,38 @@ from ..utils import ( class NhkBaseIE(InfoExtractor): - _API_URL_TEMPLATE = 'https://nwapi.nhk.jp/nhkworld/%sod%slist/v7b/%s/%s/%s/all%s.json' + _API_URL_TEMPLATE = 'https://api.nhkworld.jp/showsapi/v1/{lang}/{content_format}_{page_type}/{m_id}{extra_page}' _BASE_URL_REGEX = r'https?://www3\.nhk\.or\.jp/nhkworld/(?P[a-z]{2})/' def _call_api(self, m_id, lang, is_video, is_episode, is_clip): + content_format = 'video' if is_video else 'audio' + content_type = 'clips' if is_clip else 'episodes' + if not is_episode: + extra_page = f'/{content_format}_{content_type}' + page_type = 'programs' + else: + extra_page = '' + page_type = content_type + return self._download_json( - self._API_URL_TEMPLATE % ( - 'v' if is_video else 'r', - 'clip' if is_clip else 'esd', - 'episode' if is_episode else 'program', - m_id, lang, '/all' if is_video else ''), - m_id, query={'apikey': 'EJfK8jdS57GqlupFgAfAAwr573q01y6k'})['data']['episodes'] or [] - - def _get_api_info(self, refresh=True): - if not refresh: - return self.cache.load('nhk', 'api_info') - - self.cache.store('nhk', 'api_info', {}) - movie_player_js = self._download_webpage( - 'https://movie-a.nhk.or.jp/world/player/js/movie-player.js', None, - note='Downloading stream API information') - api_info = { - 'url': self._search_regex( - r'prod:[^;]+\bapiUrl:\s*[\'"]([^\'"]+)[\'"]', movie_player_js, None, 'stream API url'), - 'token': self._search_regex( - r'prod:[^;]+\btoken:\s*[\'"]([^\'"]+)[\'"]', movie_player_js, None, 'stream API token'), - } - self.cache.store('nhk', 'api_info', api_info) - return api_info - - def _extract_stream_info(self, vod_id): - for refresh in (False, True): - api_info = self._get_api_info(refresh) - if not api_info: - continue - - api_url = api_info.pop('url') - meta = traverse_obj( - self._download_json( - api_url, vod_id, 'Downloading stream url info', fatal=False, query={ - **api_info, - 'type': 'json', - 'optional_id': vod_id, - 'active_flg': 1, - }), ('meta', 0)) - stream_url = traverse_obj( - meta, ('movie_url', ('mb_auto', 'auto_sp', 'auto_pc'), {url_or_none}), get_all=False) - - if stream_url: - formats, subtitles = self._extract_m3u8_formats_and_subtitles(stream_url, vod_id) - return { - **traverse_obj(meta, { - 'duration': ('duration', {int_or_none}), - 'timestamp': ('publication_date', {unified_timestamp}), - 'release_timestamp': ('insert_date', {unified_timestamp}), - 'modified_timestamp': ('update_date', {unified_timestamp}), - }), - 'formats': formats, - 'subtitles': subtitles, - } - raise ExtractorError('Unable to extract stream url') + self._API_URL_TEMPLATE.format( + lang=lang, content_format=content_format, page_type=page_type, + m_id=m_id, extra_page=extra_page), + join_nonempty(m_id, lang)) def _extract_episode_info(self, url, episode=None): fetch_episode = episode is None lang, m_type, episode_id = NhkVodIE._match_valid_url(url).group('lang', 'type', 'id') is_video = m_type != 'audio' - if is_video: - episode_id = episode_id[:4] + '-' + episode_id[4:] - if fetch_episode: episode = self._call_api( - episode_id, lang, is_video, True, episode_id[:4] == '9999')[0] + episode_id, lang, is_video, is_episode=True, is_clip=episode_id[:4] == '9999') - def get_clean_field(key): - return clean_html(episode.get(key + '_clean') or episode.get(key)) + video_id = join_nonempty('id', 'lang', from_dict=episode) - title = get_clean_field('sub_title') - series = get_clean_field('title') - - thumbnails = [] - for s, w, h in [('', 640, 360), ('_l', 1280, 720)]: - img_path = episode.get('image' + s) - if not img_path: - continue - thumbnails.append({ - 'id': f'{h}p', - 'height': h, - 'width': w, - 'url': 'https://www3.nhk.or.jp' + img_path, - }) + title = episode.get('title') + series = traverse_obj(episode, (('video_program', 'audio_program'), any, 'title')) episode_name = title if series and title: @@ -125,37 +67,52 @@ class NhkBaseIE(InfoExtractor): episode_name = None info = { - 'id': episode_id + '-' + lang, + 'id': video_id, 'title': title, - 'description': get_clean_field('description'), - 'thumbnails': thumbnails, 'series': series, 'episode': episode_name, + **traverse_obj(episode, { + 'description': ('description', {str}), + 'release_timestamp': ('first_broadcasted_at', {unified_timestamp}), + 'categories': ('categories', ..., 'name', {str}), + 'tags': ('tags', ..., 'name', {str}), + 'thumbnails': ('images', lambda _, v: v['url'], { + 'url': ('url', {urljoin(url)}), + 'width': ('width', {int_or_none}), + 'height': ('height', {int_or_none}), + }), + 'webpage_url': ('url', {urljoin(url)}), + }), + 'extractor_key': NhkVodIE.ie_key(), + 'extractor': NhkVodIE.IE_NAME, } - if is_video: - vod_id = episode['vod_id'] - info.update({ - **self._extract_stream_info(vod_id), - 'id': vod_id, - }) - + # XXX: We are assuming that 'video' and 'audio' are mutually exclusive + stream_info = traverse_obj(episode, (('video', 'audio'), {dict}, any)) or {} + if not stream_info.get('url'): + self.raise_no_formats('Stream not found; it has most likely expired', expected=True) else: - if fetch_episode: + stream_url = stream_info['url'] + if is_video: + formats, subtitles = self._extract_m3u8_formats_and_subtitles(stream_url, video_id) + info.update({ + 'formats': formats, + 'subtitles': subtitles, + **traverse_obj(stream_info, ({ + 'duration': ('duration', {int_or_none}), + 'timestamp': ('published_at', {unified_timestamp}), + })), + }) + else: # From https://www3.nhk.or.jp/nhkworld/common/player/radio/inline/rod.html - audio_path = remove_end(episode['audio']['audio'], '.m4a') + audio_path = remove_end(stream_url, '.m4a') info['formats'] = self._extract_m3u8_formats( f'{urljoin("https://vod-stream.nhk.jp", audio_path)}/index.m3u8', episode_id, 'm4a', entry_protocol='m3u8_native', m3u8_id='hls', fatal=False) for f in info['formats']: f['language'] = lang - else: - info.update({ - '_type': 'url_transparent', - 'ie_key': NhkVodIE.ie_key(), - 'url': url, - }) + return info @@ -168,29 +125,29 @@ class NhkVodIE(NhkBaseIE): # Content available only for a limited period of time. Visit # https://www3.nhk.or.jp/nhkworld/en/ondemand/ for working samples. _TESTS = [{ - 'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/video/2049126/', + 'url': 'https://www3.nhk.or.jp/nhkworld/en/shows/2049165/', 'info_dict': { - 'id': 'nw_vod_v_en_2049_126_20230413233000_01_1681398302', + 'id': '2049165-en', 'ext': 'mp4', - 'title': 'Japan Railway Journal - The Tohoku Shinkansen: Full Speed Ahead', - 'description': 'md5:49f7c5b206e03868a2fdf0d0814b92f6', + 'title': 'Japan Railway Journal - Choshi Electric Railway: Fighting to Get Back on Track', + 'description': 'md5:ab57df2fca7f04245148c2e787bb203d', 'thumbnail': r're:https://.+/.+\.jpg', - 'episode': 'The Tohoku Shinkansen: Full Speed Ahead', + 'episode': 'Choshi Electric Railway: Fighting to Get Back on Track', 'series': 'Japan Railway Journal', - 'modified_timestamp': 1707217907, - 'timestamp': 1681428600, - 'release_timestamp': 1693883728, - 'duration': 1679, - 'upload_date': '20230413', - 'modified_date': '20240206', - 'release_date': '20230905', + 'duration': 1680, + 'categories': ['Biz & Tech'], + 'tags': ['Akita', 'Chiba', 'Trains', 'Transcript', 'All (Japan Navigator)'], + 'timestamp': 1759055880, + 'upload_date': '20250928', + 'release_timestamp': 1758810600, + 'release_date': '20250925', }, }, { # video clip 'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/video/9999011/', 'md5': '153c3016dfd252ba09726588149cf0e7', 'info_dict': { - 'id': 'lpZXIwaDE6_Z-976CPsFdxyICyWUzlT5', + 'id': '9999011-en', 'ext': 'mp4', 'title': 'Dining with the Chef - Chef Saito\'s Family recipe: MENCHI-KATSU', 'description': 'md5:5aee4a9f9d81c26281862382103b0ea5', @@ -198,24 +155,23 @@ class NhkVodIE(NhkBaseIE): 'series': 'Dining with the Chef', 'episode': 'Chef Saito\'s Family recipe: MENCHI-KATSU', 'duration': 148, - 'upload_date': '20190816', - 'release_date': '20230902', - 'release_timestamp': 1693619292, - 'modified_timestamp': 1707217907, - 'modified_date': '20240206', - 'timestamp': 1565997540, + 'categories': ['Food'], + 'tags': ['Washoku'], + 'timestamp': 1548212400, + 'upload_date': '20190123', }, }, { # radio - 'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/audio/livinginjapan-20231001-1/', + 'url': 'https://www3.nhk.or.jp/nhkworld/en/shows/audio/livinginjapan-20240901-1/', 'info_dict': { - 'id': 'livinginjapan-20231001-1-en', + 'id': 'livinginjapan-20240901-1-en', 'ext': 'm4a', - 'title': 'Living in Japan - Tips for Travelers to Japan / Ramen Vending Machines', + 'title': 'Living in Japan - Weekend Hiking / Self-protection from crime', 'series': 'Living in Japan', - 'description': 'md5:0a0e2077d8f07a03071e990a6f51bfab', + 'description': 'md5:4d0e14ab73bdbfedb60a53b093954ed6', 'thumbnail': r're:https://.+/.+\.jpg', - 'episode': 'Tips for Travelers to Japan / Ramen Vending Machines', + 'episode': 'Weekend Hiking / Self-protection from crime', + 'categories': ['Interactive'], }, }, { 'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/video/2015173/', @@ -256,96 +212,51 @@ class NhkVodIE(NhkBaseIE): }, 'skip': 'expires 2023-10-15', }, { - # a one-off (single-episode series). title from the api is just '

' - 'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/video/3004952/', + # a one-off (single-episode series). title from the api is just null + 'url': 'https://www3.nhk.or.jp/nhkworld/en/shows/3026036/', 'info_dict': { - 'id': 'nw_vod_v_en_3004_952_20230723091000_01_1690074552', + 'id': '3026036-en', 'ext': 'mp4', - 'title': 'Barakan Discovers - AMAMI OSHIMA: Isson\'s Treasure Isla', - 'description': 'md5:5db620c46a0698451cc59add8816b797', - 'thumbnail': r're:https://.+/.+\.jpg', - 'release_date': '20230905', - 'timestamp': 1690103400, - 'duration': 2939, - 'release_timestamp': 1693898699, - 'upload_date': '20230723', - 'modified_timestamp': 1707217907, - 'modified_date': '20240206', - 'episode': 'AMAMI OSHIMA: Isson\'s Treasure Isla', - 'series': 'Barakan Discovers', + 'title': 'STATELESS: The Japanese Left Behind in the Philippines', + 'description': 'md5:9a2fd51cdfa9f52baae28569e0053786', + 'duration': 2955, + 'thumbnail': 'https://www3.nhk.or.jp/nhkworld/en/shows/3026036/images/wide_l_QPtWpt4lzVhm3NzPAMIIF35MCg4CdNwcikPaTS5Q.jpg', + 'categories': ['Documentary', 'Culture & Lifestyle'], + 'tags': ['Transcript', 'Documentary 360', 'The Pursuit of PEACE'], + 'timestamp': 1758931800, + 'upload_date': '20250927', + 'release_timestamp': 1758931800, + 'release_date': '20250927', }, }, { # /ondemand/video/ url with alphabetical character in 5th position of id 'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/video/9999a07/', 'info_dict': { - 'id': 'nw_c_en_9999-a07', + 'id': '9999a07-en', 'ext': 'mp4', 'episode': 'Mini-Dramas on SDGs: Ep 1 Close the Gender Gap [Director\'s Cut]', 'series': 'Mini-Dramas on SDGs', - 'modified_date': '20240206', 'title': 'Mini-Dramas on SDGs - Mini-Dramas on SDGs: Ep 1 Close the Gender Gap [Director\'s Cut]', 'description': 'md5:3f9dcb4db22fceb675d90448a040d3f6', - 'timestamp': 1621962360, - 'duration': 189, - 'release_date': '20230903', - 'modified_timestamp': 1707217907, + 'timestamp': 1621911600, + 'duration': 190, 'upload_date': '20210525', 'thumbnail': r're:https://.+/.+\.jpg', - 'release_timestamp': 1693713487, + 'categories': ['Current Affairs', 'Entertainment'], }, }, { 'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/video/9999d17/', 'info_dict': { - 'id': 'nw_c_en_9999-d17', + 'id': '9999d17-en', 'ext': 'mp4', 'title': 'Flowers of snow blossom - The 72 Pentads of Yamato', 'description': 'Today’s focus: Snow', - 'release_timestamp': 1693792402, - 'release_date': '20230904', - 'upload_date': '20220128', - 'timestamp': 1643370960, 'thumbnail': r're:https://.+/.+\.jpg', 'duration': 136, - 'series': '', - 'modified_date': '20240206', - 'modified_timestamp': 1707217907, - }, - }, { - # new /shows/ url format - 'url': 'https://www3.nhk.or.jp/nhkworld/en/shows/2032307/', - 'info_dict': { - 'id': 'nw_vod_v_en_2032_307_20240321113000_01_1710990282', - 'ext': 'mp4', - 'title': 'Japanology Plus - 20th Anniversary Special Part 1', - 'description': 'md5:817d41fc8e54339ad2a916161ea24faf', - 'episode': '20th Anniversary Special Part 1', - 'series': 'Japanology Plus', - 'thumbnail': r're:https://.+/.+\.jpg', - 'duration': 1680, - 'timestamp': 1711020600, - 'upload_date': '20240321', - 'release_timestamp': 1711022683, - 'release_date': '20240321', - 'modified_timestamp': 1711031012, - 'modified_date': '20240321', - }, - }, { - 'url': 'https://www3.nhk.or.jp/nhkworld/en/shows/3020025/', - 'info_dict': { - 'id': 'nw_vod_v_en_3020_025_20230325144000_01_1679723944', - 'ext': 'mp4', - 'title': '100 Ideas to Save the World - Working Styles Evolve', - 'description': 'md5:9e6c7778eaaf4f7b4af83569649f84d9', - 'episode': 'Working Styles Evolve', - 'series': '100 Ideas to Save the World', - 'thumbnail': r're:https://.+/.+\.jpg', - 'duration': 899, - 'upload_date': '20230325', - 'timestamp': 1679755200, - 'release_date': '20230905', - 'release_timestamp': 1693880540, - 'modified_date': '20240206', - 'modified_timestamp': 1707217907, + 'categories': ['Culture & Lifestyle', 'Science & Nature'], + 'tags': ['Nara', 'Temples & Shrines', 'Winter', 'Snow'], + 'timestamp': 1643339040, + 'upload_date': '20220128', }, }, { # new /shows/audio/ url format @@ -373,6 +284,7 @@ class NhkVodProgramIE(NhkBaseIE): 'id': 'sumo', 'title': 'GRAND SUMO Highlights', 'description': 'md5:fc20d02dc6ce85e4b72e0273aa52fdbf', + 'series': 'GRAND SUMO Highlights', }, 'playlist_mincount': 1, }, { @@ -381,6 +293,7 @@ class NhkVodProgramIE(NhkBaseIE): 'id': 'japanrailway', 'title': 'Japan Railway Journal', 'description': 'md5:ea39d93af7d05835baadf10d1aae0e3f', + 'series': 'Japan Railway Journal', }, 'playlist_mincount': 12, }, { @@ -390,6 +303,7 @@ class NhkVodProgramIE(NhkBaseIE): 'id': 'japanrailway', 'title': 'Japan Railway Journal', 'description': 'md5:ea39d93af7d05835baadf10d1aae0e3f', + 'series': 'Japan Railway Journal', }, 'playlist_mincount': 12, }, { @@ -399,17 +313,9 @@ class NhkVodProgramIE(NhkBaseIE): 'id': 'livinginjapan', 'title': 'Living in Japan', 'description': 'md5:665bb36ec2a12c5a7f598ee713fc2b54', + 'series': 'Living in Japan', }, - 'playlist_mincount': 12, - }, { - # /tv/ program url - 'url': 'https://www3.nhk.or.jp/nhkworld/en/tv/designtalksplus/', - 'info_dict': { - 'id': 'designtalksplus', - 'title': 'DESIGN TALKS plus', - 'description': 'md5:47b3b3a9f10d4ac7b33b53b70a7d2837', - }, - 'playlist_mincount': 20, + 'playlist_mincount': 11, }, { 'url': 'https://www3.nhk.or.jp/nhkworld/en/shows/10yearshayaomiyazaki/', 'only_matching': True, @@ -430,9 +336,8 @@ class NhkVodProgramIE(NhkBaseIE): program_id, lang, m_type != 'audio', False, episode_type == 'clip') def entries(): - for episode in episodes: - if episode_path := episode.get('url'): - yield self._extract_episode_info(urljoin(url, episode_path), episode) + for episode in traverse_obj(episodes, ('items', lambda _, v: v['url'])): + yield self._extract_episode_info(urljoin(url, episode['url']), episode) html = self._download_webpage(url, program_id) program_title = self._extract_meta_from_class_elements([ @@ -446,7 +351,7 @@ class NhkVodProgramIE(NhkBaseIE): 'tAudioProgramMain__info', # /shows/audio/programs/ 'p-program-description'], html) # /tv/ - return self.playlist_result(entries(), program_id, program_title, program_description) + return self.playlist_result(entries(), program_id, program_title, program_description, series=program_title) class NhkForSchoolBangumiIE(InfoExtractor): diff --git a/plugins/youtube_download/yt_dlp/extractor/nowcanal.py b/plugins/youtube_download/yt_dlp/extractor/nowcanal.py new file mode 100644 index 0000000..46a1eeb --- /dev/null +++ b/plugins/youtube_download/yt_dlp/extractor/nowcanal.py @@ -0,0 +1,37 @@ +from .brightcove import BrightcoveNewIE +from .common import InfoExtractor + + +class NowCanalIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?nowcanal\.pt(?:/[\w-]+)+/detalhe/(?P[\w-]+)' + _TESTS = [{ + 'url': 'https://www.nowcanal.pt/ultimas/detalhe/pedro-sousa-hjulmand-pode-ter-uma-saida-limpa-do-sporting-daqui-a-um-ano', + 'md5': '047f17cb783e66e467d703e704bbc95d', + 'info_dict': { + 'id': '6376598467112', + 'ext': 'mp4', + 'title': 'Pedro Sousa «Hjulmand pode ter uma saída limpa do Sporting daqui a um ano»', + 'description': '', + 'uploader_id': '6108484330001', + 'duration': 65.237, + 'thumbnail': r're:^https://.+\.jpg', + 'timestamp': 1754440620, + 'upload_date': '20250806', + 'tags': ['now'], + }, + }, { + 'url': 'https://www.nowcanal.pt/programas/frente-a-frente/detalhe/frente-a-frente-eva-cruzeiro-ps-e-rita-matias-chega', + 'only_matching': True, + }] + + _BC_URL_TMPL = 'https://players.brightcove.net/6108484330001/chhIqzukMq_default/index.html?videoId={}' + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + + video_id = self._search_json( + r'videoHandler\.addBrightcoveVideoWithJson\(\[', + webpage, 'video data', display_id)['brightcoveVideoId'] + + return self.url_result(self._BC_URL_TMPL.format(video_id), BrightcoveNewIE) diff --git a/plugins/youtube_download/yt_dlp/extractor/ntvru.py b/plugins/youtube_download/yt_dlp/extractor/ntvru.py index 1ab1be0..07710c1 100644 --- a/plugins/youtube_download/yt_dlp/extractor/ntvru.py +++ b/plugins/youtube_download/yt_dlp/extractor/ntvru.py @@ -1,17 +1,40 @@ from .common import InfoExtractor from ..utils import ( int_or_none, - strip_or_none, + parse_iso8601, unescapeHTML, + url_or_none, xpath_text, ) +from ..utils.traversal import traverse_obj class NTVRuIE(InfoExtractor): IE_NAME = 'ntv.ru' - _VALID_URL = r'https?://(?:www\.)?ntv\.ru/(?:[^/]+/)*(?P[^/?#&]+)' + _VALID_URL = r'https?://(?:www\.)?ntv\.ru/(?:[^/#?]+/)*(?P[^/?#&]+)' _TESTS = [{ + # JSON Api is geo restricted + 'url': 'https://www.ntv.ru/peredacha/svoya_igra/m58980/o818800', + 'md5': '818962a1b52747d446db7cd5be43e142', + 'info_dict': { + 'id': '2520563', + 'ext': 'mp4', + 'title': 'Участники: Ирина Петрова, Сергей Коновалов, Кристина Кораблина', + 'description': 'md5:fcbd21cd45238a940b95550f9e178e3e', + 'thumbnail': r're:^http://.*\.jpg', + 'duration': 2462, + 'view_count': int, + 'comment_count': int, + 'tags': ['игры и игрушки'], + 'timestamp': 1761821096, + 'upload_date': '20251030', + 'release_timestamp': 1761821096, + 'release_date': '20251030', + 'modified_timestamp': 1761821096, + 'modified_date': '20251030', + }, + }, { 'url': 'http://www.ntv.ru/novosti/863142/', 'md5': 'ba7ea172a91cb83eb734cad18c10e723', 'info_dict': { @@ -22,31 +45,35 @@ class NTVRuIE(InfoExtractor): 'thumbnail': r're:^http://.*\.jpg', 'duration': 136, 'view_count': int, + 'comment_count': int, + 'tags': ['ВМС', 'захват', 'митинги', 'Севастополь', 'Украина'], + 'timestamp': 1395222013, + 'upload_date': '20140319', + 'release_timestamp': 1395222013, + 'release_date': '20140319', + 'modified_timestamp': 1395222013, + 'modified_date': '20140319', }, }, { - 'url': 'http://www.ntv.ru/video/novosti/750370/', - 'md5': 'adecff79691b4d71e25220a191477124', - 'info_dict': { - 'id': '750370', - 'ext': 'mp4', - 'title': 'Родные пассажиров пропавшего Boeing не верят в трагический исход', - 'description': 'Родные пассажиров пропавшего Boeing не верят в трагический исход', - 'thumbnail': r're:^http://.*\.jpg', - 'duration': 172, - 'view_count': int, - }, - 'skip': '404 Not Found', - }, { + # Requires unescapeHTML 'url': 'http://www.ntv.ru/peredacha/segodnya/m23700/o232416', 'md5': '82dbd49b38e3af1d00df16acbeab260c', 'info_dict': { 'id': '747480', 'ext': 'mp4', - 'title': '«Сегодня». 21 марта 2014 года. 16:00', - 'description': '«Сегодня». 21 марта 2014 года. 16:00', + 'title': '"Сегодня". 21 марта 2014 года. 16:00 ', + 'description': 'md5:bed80745ca72af557433195f51a02785', 'thumbnail': r're:^http://.*\.jpg', 'duration': 1496, 'view_count': int, + 'comment_count': int, + 'tags': ['Брюссель', 'гражданство', 'ЕС', 'Крым', 'ОСАГО', 'саммит', 'санкции', 'события', 'чиновники', 'рейтинг'], + 'timestamp': 1395406951, + 'upload_date': '20140321', + 'release_timestamp': 1395406951, + 'release_date': '20140321', + 'modified_timestamp': 1395406951, + 'modified_date': '20140321', }, }, { 'url': 'https://www.ntv.ru/kino/Koma_film/m70281/o336036/video/', @@ -54,11 +81,19 @@ class NTVRuIE(InfoExtractor): 'info_dict': { 'id': '1126480', 'ext': 'mp4', - 'title': 'Остросюжетный фильм «Кома»', - 'description': 'Остросюжетный фильм «Кома»', + 'title': 'Остросюжетный фильм "Кома"', + 'description': 'md5:e79ffd0887425a0f05a58885c408d7d8', 'thumbnail': r're:^http://.*\.jpg', - 'duration': 5592, + 'duration': 5608, 'view_count': int, + 'comment_count': int, + 'tags': ['кино'], + 'timestamp': 1432868572, + 'upload_date': '20150529', + 'release_timestamp': 1432868572, + 'release_date': '20150529', + 'modified_timestamp': 1432868572, + 'modified_date': '20150529', }, }, { 'url': 'http://www.ntv.ru/serial/Delo_vrachey/m31760/o233916/', @@ -66,11 +101,19 @@ class NTVRuIE(InfoExtractor): 'info_dict': { 'id': '751482', 'ext': 'mp4', - 'title': '«Дело врачей»: «Деревце жизни»', - 'description': '«Дело врачей»: «Деревце жизни»', + 'title': '"Дело врачей": "Деревце жизни"', + 'description': 'md5:d6fbf9193f880f50d9cbfbcc954161c1', 'thumbnail': r're:^http://.*\.jpg', 'duration': 2590, 'view_count': int, + 'comment_count': int, + 'tags': ['врачи', 'больницы'], + 'timestamp': 1395882300, + 'upload_date': '20140327', + 'release_timestamp': 1395882300, + 'release_date': '20140327', + 'modified_timestamp': 1395882300, + 'modified_date': '20140327', }, }, { # Schemeless file URL @@ -78,48 +121,26 @@ class NTVRuIE(InfoExtractor): 'only_matching': True, }] - _VIDEO_ID_REGEXES = [ - r']+?src=["\'](?P(?:https?:)?//(?:www\.)?pornhub(?:premium)?\.(?:com|net|org)/embed/[\da-z]+)'] _TESTS = [{ 'url': 'http://www.pornhub.com/view_video.php?viewkey=648719015', - 'md5': 'a6391306d050e4547f62b3f485dd9ba9', + 'md5': '4d4a4e9178b655776f86cf89ecaf0edf', 'info_dict': { 'id': '648719015', 'ext': 'mp4', 'title': 'Seductive Indian beauty strips down and fingers her pink pussy', - 'uploader': 'Babes', + 'uploader': 'BABES-COM', + 'uploader_id': '/users/babes-com', 'upload_date': '20130628', 'timestamp': 1372447216, 'duration': 361, 'view_count': int, 'like_count': int, - 'dislike_count': int, 'comment_count': int, 'age_limit': 18, 'tags': list, 'categories': list, 'cast': list, + 'thumbnail': r're:https?://.+', }, }, { # non-ASCII title @@ -480,13 +482,6 @@ class PornHubIE(PornHubBaseIE): comment_count = self._extract_count( r'All Comments\s*\(([\d,.]+)\)', webpage, 'comment') - def extract_list(meta_key): - div = self._search_regex( - rf'(?s)]+\bclass=["\'].*?\b{meta_key}Wrapper[^>]*>(.+?)', - webpage, meta_key, default=None) - if div: - return [clean_html(x).strip() for x in re.findall(r'(?s)]+\bhref=[^>]+>.+?
', div)] - info = self._search_json_ld(webpage, video_id, default={}) # description provided in JSON-LD is irrelevant info['description'] = None @@ -505,9 +500,11 @@ class PornHubIE(PornHubBaseIE): 'comment_count': comment_count, 'formats': formats, 'age_limit': 18, - 'tags': extract_list('tags'), - 'categories': extract_list('categories'), - 'cast': extract_list('pornstars'), + **traverse_obj(webpage, { + 'tags': ({find_elements(attr='data-label', value='tag')}, ..., {clean_html}), + 'categories': ({find_elements(attr='data-label', value='category')}, ..., {clean_html}), + 'cast': ({find_elements(attr='data-label', value='pornstar')}, ..., {clean_html}), + }), 'subtitles': subtitles, }, info) diff --git a/plugins/youtube_download/yt_dlp/extractor/rinsefm.py b/plugins/youtube_download/yt_dlp/extractor/rinsefm.py index 5bc2eb8..202446e 100644 --- a/plugins/youtube_download/yt_dlp/extractor/rinsefm.py +++ b/plugins/youtube_download/yt_dlp/extractor/rinsefm.py @@ -3,12 +3,14 @@ from ..utils import ( MEDIA_EXTENSIONS, determine_ext, parse_iso8601, - traverse_obj, url_or_none, ) +from ..utils.traversal import traverse_obj class RinseFMBaseIE(InfoExtractor): + _API_BASE = 'https://rinse.fm/api/query/v1' + @staticmethod def _parse_entry(entry): return { @@ -45,8 +47,10 @@ class RinseFMIE(RinseFMBaseIE): def _real_extract(self, url): display_id = self._match_id(url) - webpage = self._download_webpage(url, display_id) - entry = self._search_nextjs_data(webpage, display_id)['props']['pageProps']['entry'] + + entry = self._download_json( + f'{self._API_BASE}/episodes/{display_id}', display_id, + note='Downloading episode data from API')['entry'] return self._parse_entry(entry) @@ -58,32 +62,35 @@ class RinseFMArtistPlaylistIE(RinseFMBaseIE): 'info_dict': { 'id': 'resources', 'title': '[re]sources', - 'description': '[re]sources est un label parisien piloté par le DJ et producteur Tommy Kid.', + 'description': 'md5:fd6a7254e8273510e6d49fbf50edf392', }, 'playlist_mincount': 40, }, { - 'url': 'https://rinse.fm/shows/ivy/', + 'url': 'https://www.rinse.fm/shows/esk', 'info_dict': { - 'id': 'ivy', - 'title': '[IVY]', - 'description': 'A dedicated space for DNB/Turbo House and 4x4.', + 'id': 'esk', + 'title': 'Esk', + 'description': 'md5:5893d7c1d411ae8dea7fba12f109aa98', }, - 'playlist_mincount': 7, + 'playlist_mincount': 139, }] def _entries(self, data): for episode in traverse_obj(data, ( - 'props', 'pageProps', 'episodes', lambda _, v: determine_ext(v['fileUrl']) in MEDIA_EXTENSIONS.audio), + 'episodes', lambda _, v: determine_ext(v['fileUrl']) in MEDIA_EXTENSIONS.audio), ): yield self._parse_entry(episode) def _real_extract(self, url): playlist_id = self._match_id(url) - webpage = self._download_webpage(url, playlist_id) - title = self._og_search_title(webpage) or self._html_search_meta('title', webpage) - description = self._og_search_description(webpage) or self._html_search_meta( - 'description', webpage) - data = self._search_nextjs_data(webpage, playlist_id) + + api_data = self._download_json( + f'{self._API_BASE}/shows/{playlist_id}', playlist_id, + note='Downloading show data from API') return self.playlist_result( - self._entries(data), playlist_id, title, description=description) + self._entries(api_data), playlist_id, + **traverse_obj(api_data, ('entry', { + 'title': ('title', {str}), + 'description': ('description', {str}), + }))) diff --git a/plugins/youtube_download/yt_dlp/extractor/s4c.py b/plugins/youtube_download/yt_dlp/extractor/s4c.py index 6eb8b2b..d35436d 100644 --- a/plugins/youtube_download/yt_dlp/extractor/s4c.py +++ b/plugins/youtube_download/yt_dlp/extractor/s4c.py @@ -15,14 +15,15 @@ class S4CIE(InfoExtractor): 'thumbnail': 'https://www.s4c.cymru/amg/1920x1080/Y_Swn_2023S4C_099_ii.jpg', }, }, { - 'url': 'https://www.s4c.cymru/clic/programme/856636948', + # Geo restricted to the UK + 'url': 'https://www.s4c.cymru/clic/programme/886303048', 'info_dict': { - 'id': '856636948', + 'id': '886303048', 'ext': 'mp4', - 'title': 'Am Dro', + 'title': 'Pennod 1', + 'description': 'md5:7e3f364b70f61fcdaa8b4cb4a3eb3e7a', 'duration': 2880, - 'description': 'md5:100d8686fc9a632a0cb2db52a3433ffe', - 'thumbnail': 'https://www.s4c.cymru/amg/1920x1080/Am_Dro_2022-23S4C_P6_4005.jpg', + 'thumbnail': 'https://www.s4c.cymru/amg/1920x1080/Stad_2025S4C_P1_210053.jpg', }, }] @@ -51,7 +52,7 @@ class S4CIE(InfoExtractor): 'https://player-api.s4c-cdn.co.uk/streaming-urls/prod', video_id, query={ 'mode': 'od', 'application': 'clic', - 'region': 'WW', + 'region': 'UK' if player_config.get('application') == 's4chttpl' else 'WW', 'extra': 'false', 'thirdParty': 'false', 'filename': player_config['filename'], diff --git a/plugins/youtube_download/yt_dlp/extractor/scte.py b/plugins/youtube_download/yt_dlp/extractor/scte.py deleted file mode 100644 index 3971132..0000000 --- a/plugins/youtube_download/yt_dlp/extractor/scte.py +++ /dev/null @@ -1,137 +0,0 @@ -import re - -from .common import InfoExtractor -from ..utils import ( - ExtractorError, - decode_packed_codes, - urlencode_postdata, -) - - -class SCTEBaseIE(InfoExtractor): - _LOGIN_URL = 'https://www.scte.org/SCTE/Sign_In.aspx' - _NETRC_MACHINE = 'scte' - - def _perform_login(self, username, password): - login_popup = self._download_webpage( - self._LOGIN_URL, None, 'Downloading login popup') - - def is_logged(webpage): - return any(re.search(p, webpage) for p in ( - r'class=["\']welcome\b', r'>Sign Out<')) - - # already logged in - if is_logged(login_popup): - return - - login_form = self._hidden_inputs(login_popup) - - login_form.update({ - 'ctl01$TemplateBody$WebPartManager1$gwpciNewContactSignInCommon$ciNewContactSignInCommon$signInUserName': username, - 'ctl01$TemplateBody$WebPartManager1$gwpciNewContactSignInCommon$ciNewContactSignInCommon$signInPassword': password, - 'ctl01$TemplateBody$WebPartManager1$gwpciNewContactSignInCommon$ciNewContactSignInCommon$RememberMe': 'on', - }) - - response = self._download_webpage( - self._LOGIN_URL, None, 'Logging in', - data=urlencode_postdata(login_form)) - - if '|pageRedirect|' not in response and not is_logged(response): - error = self._html_search_regex( - r'(?s)<[^>]+class=["\']AsiError["\'][^>]*>(.+?)\d+)' - _TESTS = [{ - 'url': 'https://learning.scte.org/mod/scorm/view.php?id=31484', - 'info_dict': { - 'title': 'Introduction to DOCSIS Engineering Professional', - 'id': '31484', - }, - 'playlist_count': 5, - 'skip': 'Requires account credentials', - }] - - def _real_extract(self, url): - video_id = self._match_id(url) - - webpage = self._download_webpage(url, video_id) - - title = self._search_regex(r'

(.+?)

', webpage, 'title') - - context_id = self._search_regex(r'context-(\d+)', webpage, video_id) - content_base = f'https://learning.scte.org/pluginfile.php/{context_id}/mod_scorm/content/8/' - context = decode_packed_codes(self._download_webpage( - f'{content_base}mobile/data.js', video_id)) - - data = self._parse_xml( - self._search_regex( - r'CreateData\(\s*"(.+?)"', context, 'data').replace(r"\'", "'"), - video_id) - - entries = [] - for asset in data.findall('.//asset'): - asset_url = asset.get('url') - if not asset_url or not asset_url.endswith('.mp4'): - continue - asset_id = self._search_regex( - r'video_([^_]+)_', asset_url, 'asset id', default=None) - if not asset_id: - continue - entries.append({ - 'id': asset_id, - 'title': title, - 'url': content_base + asset_url, - }) - - return self.playlist_result(entries, video_id, title) - - -class SCTECourseIE(SCTEBaseIE): - _WORKING = False - _VALID_URL = r'https?://learning\.scte\.org/(?:mod/sub)?course/view\.php?.*?\bid=(?P\d+)' - _TESTS = [{ - 'url': 'https://learning.scte.org/mod/subcourse/view.php?id=31491', - 'only_matching': True, - }, { - 'url': 'https://learning.scte.org/course/view.php?id=3639', - 'only_matching': True, - }, { - 'url': 'https://learning.scte.org/course/view.php?id=3073', - 'only_matching': True, - }] - - def _real_extract(self, url): - course_id = self._match_id(url) - - webpage = self._download_webpage(url, course_id) - - title = self._search_regex( - r'

(.+?)

', webpage, 'title', default=None) - - entries = [] - for mobj in re.finditer( - r'''(?x) - ]+ - href=(["\']) - (?P - https?://learning\.scte\.org/mod/ - (?Pscorm|subcourse)/view\.php?(?:(?!\1).)*? - \bid=\d+ - ) - ''', - webpage): - item_url = mobj.group('url') - if item_url == url: - continue - ie = (SCTEIE.ie_key() if mobj.group('kind') == 'scorm' - else SCTECourseIE.ie_key()) - entries.append(self.url_result(item_url, ie=ie)) - - return self.playlist_result(entries, course_id, title) diff --git a/plugins/youtube_download/yt_dlp/extractor/soundcloud.py b/plugins/youtube_download/yt_dlp/extractor/soundcloud.py index 7833081..5c3ff28 100644 --- a/plugins/youtube_download/yt_dlp/extractor/soundcloud.py +++ b/plugins/youtube_download/yt_dlp/extractor/soundcloud.py @@ -1064,7 +1064,7 @@ class SoundcloudRelatedIE(SoundcloudPagedPlaylistBaseIE): class SoundcloudPlaylistIE(SoundcloudPlaylistBaseIE): - _VALID_URL = r'https?://api(?:-v2)?\.soundcloud\.com/playlists/(?P[0-9]+)(?:/?\?secret_token=(?P[^&]+?))?$' + _VALID_URL = r'https?://api(?:-v2)?\.soundcloud\.com/playlists/(?:soundcloud(?:%3A|:)playlists(?:%3A|:))?(?P[0-9]+)(?:/?\?secret_token=(?P[^&]+?))?$' IE_NAME = 'soundcloud:playlist' _TESTS = [{ 'url': 'https://api.soundcloud.com/playlists/4110309', @@ -1079,6 +1079,12 @@ class SoundcloudPlaylistIE(SoundcloudPlaylistBaseIE): 'album': 'TILT Brass - Bowery Poetry Club, August \'03 [Non-Site SCR 02]', }, 'playlist_count': 6, + }, { + 'url': 'https://api.soundcloud.com/playlists/soundcloud%3Aplaylists%3A1759227795', + 'only_matching': True, + }, { + 'url': 'https://api.soundcloud.com/playlists/soundcloud:playlists:2104769627?secret_token=s-wmpCLuExeYX', + 'only_matching': True, }] def _real_extract(self, url): diff --git a/plugins/youtube_download/yt_dlp/extractor/sportdeutschland.py b/plugins/youtube_download/yt_dlp/extractor/sportdeutschland.py index 0b7d90a..cba026c 100644 --- a/plugins/youtube_download/yt_dlp/extractor/sportdeutschland.py +++ b/plugins/youtube_download/yt_dlp/extractor/sportdeutschland.py @@ -8,10 +8,11 @@ from ..utils import ( class SportDeutschlandIE(InfoExtractor): - _VALID_URL = r'https?://(?:player\.)?sportdeutschland\.tv/(?P(?:[^/?#]+/)?[^?#/&]+)' + IE_NAME = 'sporteurope' + _VALID_URL = r'https?://(?:player\.)?sporteurope\.tv/(?P(?:[^/?#]+/)?[^?#/&]+)' _TESTS = [{ # Single-part video, direct link - 'url': 'https://sportdeutschland.tv/rostock-griffins/gfl2-rostock-griffins-vs-elmshorn-fighting-pirates', + 'url': 'https://sporteurope.tv/rostock-griffins/gfl2-rostock-griffins-vs-elmshorn-fighting-pirates', 'md5': '35c11a19395c938cdd076b93bda54cde', 'info_dict': { 'id': '9f27a97d-1544-4d0b-aa03-48d92d17a03a', @@ -19,9 +20,9 @@ class SportDeutschlandIE(InfoExtractor): 'title': 'GFL2: Rostock Griffins vs. Elmshorn Fighting Pirates', 'display_id': 'rostock-griffins/gfl2-rostock-griffins-vs-elmshorn-fighting-pirates', 'channel': 'Rostock Griffins', - 'channel_url': 'https://sportdeutschland.tv/rostock-griffins', + 'channel_url': 'https://sporteurope.tv/rostock-griffins', 'live_status': 'was_live', - 'description': 'md5:60cb00067e55dafa27b0933a43d72862', + 'description': r're:Video-Livestream des Spiels Rostock Griffins vs\. Elmshorn Fighting Pirates.+', 'channel_id': '9635f21c-3f67-4584-9ce4-796e9a47276b', 'timestamp': 1749913117, 'upload_date': '20250614', @@ -29,16 +30,16 @@ class SportDeutschlandIE(InfoExtractor): }, }, { # Single-part video, embedded player link - 'url': 'https://player.sportdeutschland.tv/9e9619c4-7d77-43c4-926d-49fb57dc06dc', + 'url': 'https://player.sporteurope.tv/9e9619c4-7d77-43c4-926d-49fb57dc06dc', 'info_dict': { 'id': '9f27a97d-1544-4d0b-aa03-48d92d17a03a', 'ext': 'mp4', 'title': 'GFL2: Rostock Griffins vs. Elmshorn Fighting Pirates', 'display_id': '9e9619c4-7d77-43c4-926d-49fb57dc06dc', 'channel': 'Rostock Griffins', - 'channel_url': 'https://sportdeutschland.tv/rostock-griffins', + 'channel_url': 'https://sporteurope.tv/rostock-griffins', 'live_status': 'was_live', - 'description': 'md5:60cb00067e55dafa27b0933a43d72862', + 'description': r're:Video-Livestream des Spiels Rostock Griffins vs\. Elmshorn Fighting Pirates.+', 'channel_id': '9635f21c-3f67-4584-9ce4-796e9a47276b', 'timestamp': 1749913117, 'upload_date': '20250614', @@ -47,7 +48,7 @@ class SportDeutschlandIE(InfoExtractor): 'params': {'skip_download': True}, }, { # Multi-part video - 'url': 'https://sportdeutschland.tv/rhine-ruhr-2025-fisu-world-university-games/volleyball-w-japan-vs-brasilien-halbfinale-2', + 'url': 'https://sporteurope.tv/rhine-ruhr-2025-fisu-world-university-games/volleyball-w-japan-vs-brasilien-halbfinale-2', 'info_dict': { 'id': '9f63d737-2444-4e3a-a1ea-840df73fd481', 'display_id': 'rhine-ruhr-2025-fisu-world-university-games/volleyball-w-japan-vs-brasilien-halbfinale-2', @@ -55,7 +56,7 @@ class SportDeutschlandIE(InfoExtractor): 'description': 'md5:0a17da15e48a687e6019639c3452572b', 'channel': 'Rhine-Ruhr 2025 FISU World University Games', 'channel_id': '9f5216be-a49d-470b-9a30-4fe9df993334', - 'channel_url': 'https://sportdeutschland.tv/rhine-ruhr-2025-fisu-world-university-games', + 'channel_url': 'https://sporteurope.tv/rhine-ruhr-2025-fisu-world-university-games', 'live_status': 'was_live', }, 'playlist_count': 2, @@ -66,7 +67,7 @@ class SportDeutschlandIE(InfoExtractor): 'title': 'Volleyball w: Japan vs. Braslien - Halbfinale 2 Part 1', 'channel': 'Rhine-Ruhr 2025 FISU World University Games', 'channel_id': '9f5216be-a49d-470b-9a30-4fe9df993334', - 'channel_url': 'https://sportdeutschland.tv/rhine-ruhr-2025-fisu-world-university-games', + 'channel_url': 'https://sporteurope.tv/rhine-ruhr-2025-fisu-world-university-games', 'duration': 14773.0, 'timestamp': 1753085197, 'upload_date': '20250721', @@ -79,16 +80,17 @@ class SportDeutschlandIE(InfoExtractor): 'title': 'Volleyball w: Japan vs. Braslien - Halbfinale 2 Part 2', 'channel': 'Rhine-Ruhr 2025 FISU World University Games', 'channel_id': '9f5216be-a49d-470b-9a30-4fe9df993334', - 'channel_url': 'https://sportdeutschland.tv/rhine-ruhr-2025-fisu-world-university-games', + 'channel_url': 'https://sporteurope.tv/rhine-ruhr-2025-fisu-world-university-games', 'duration': 14773.0, 'timestamp': 1753128421, 'upload_date': '20250721', 'live_status': 'was_live', }, }], + 'skip': '404 Not Found', }, { # Livestream - 'url': 'https://sportdeutschland.tv/dtb/gymnastik-international-tag-1', + 'url': 'https://sporteurope.tv/dtb/gymnastik-international-tag-1', 'info_dict': { 'id': '95d71b8a-370a-4b87-ad16-94680da18528', 'ext': 'mp4', @@ -96,7 +98,7 @@ class SportDeutschlandIE(InfoExtractor): 'display_id': 'dtb/gymnastik-international-tag-1', 'channel_id': '936ecef1-2f4a-4e08-be2f-68073cb7ecab', 'channel': 'Deutscher Turner-Bund', - 'channel_url': 'https://sportdeutschland.tv/dtb', + 'channel_url': 'https://sporteurope.tv/dtb', 'description': 'md5:07a885dde5838a6f0796ee21dc3b0c52', 'live_status': 'is_live', }, @@ -106,9 +108,9 @@ class SportDeutschlandIE(InfoExtractor): def _process_video(self, asset_id, video): is_live = video['type'] == 'mux_live' token = self._download_json( - f'https://api.sportdeutschland.tv/api/web/personal/asset-token/{asset_id}', + f'https://api.sporteurope.tv/api/web/personal/asset-token/{asset_id}', video['id'], query={'type': video['type'], 'playback_id': video['src']}, - headers={'Referer': 'https://sportdeutschland.tv/'})['token'] + headers={'Referer': 'https://sporteurope.tv/'})['token'] formats, subtitles = self._extract_m3u8_formats_and_subtitles( f'https://stream.mux.com/{video["src"]}.m3u8?token={token}', video['id'], live=is_live) @@ -126,7 +128,7 @@ class SportDeutschlandIE(InfoExtractor): def _real_extract(self, url): display_id = self._match_id(url) meta = self._download_json( - f'https://api.sportdeutschland.tv/api/stateless/frontend/assets/{display_id}', + f'https://api.sporteurope.tv/api/stateless/frontend/assets/{display_id}', display_id, query={'access_token': 'true'}) info = { @@ -139,7 +141,7 @@ class SportDeutschlandIE(InfoExtractor): 'channel_id': ('profile', 'id'), 'is_live': 'currently_live', 'was_live': 'was_live', - 'channel_url': ('profile', 'slug', {lambda x: f'https://sportdeutschland.tv/{x}'}), + 'channel_url': ('profile', 'slug', {lambda x: f'https://sporteurope.tv/{x}'}), }, get_all=False), } diff --git a/plugins/youtube_download/yt_dlp/extractor/sproutvideo.py b/plugins/youtube_download/yt_dlp/extractor/sproutvideo.py index ff9dc7d..80fc6d2 100644 --- a/plugins/youtube_download/yt_dlp/extractor/sproutvideo.py +++ b/plugins/youtube_download/yt_dlp/extractor/sproutvideo.py @@ -101,8 +101,8 @@ class SproutVideoIE(InfoExtractor): webpage = self._download_webpage( url, video_id, headers=traverse_obj(smuggled_data, {'Referer': 'referer'})) data = self._search_json( - r'(?:var|const|let)\s+(?:dat|(?:player|video)Info|)\s*=\s*["\']', webpage, 'player info', - video_id, contains_pattern=r'[A-Za-z0-9+/=]+', end_pattern=r'["\'];', + r'(?:window\.|(?:var|const|let)\s+)(?:dat|(?:player|video)Info|)\s*=\s*["\']', webpage, + 'player info', video_id, contains_pattern=r'[A-Za-z0-9+/=]+', end_pattern=r'["\'];', transform_source=lambda x: base64.b64decode(x).decode()) # SproutVideo may send player info for 'SMPTE Color Monitor Test' [a791d7b71b12ecc52e] diff --git a/plugins/youtube_download/yt_dlp/extractor/tarangplus.py b/plugins/youtube_download/yt_dlp/extractor/tarangplus.py new file mode 100644 index 0000000..62f254d --- /dev/null +++ b/plugins/youtube_download/yt_dlp/extractor/tarangplus.py @@ -0,0 +1,243 @@ +import base64 +import binascii +import functools +import re +import urllib.parse + +from .common import InfoExtractor +from ..dependencies import Cryptodome +from ..utils import ( + ExtractorError, + OnDemandPagedList, + clean_html, + extract_attributes, + urljoin, +) +from ..utils.traversal import ( + find_element, + find_elements, + require, + traverse_obj, +) + + +class TarangPlusBaseIE(InfoExtractor): + _BASE_URL = 'https://tarangplus.in' + + +class TarangPlusVideoIE(TarangPlusBaseIE): + IE_NAME = 'tarangplus:video' + _VALID_URL = r'https?://(?:www\.)?tarangplus\.in/(?:movies|[^#?/]+/[^#?/]+)/(?!episodes)(?P[^#?/]+)' + _TESTS = [{ + 'url': 'https://tarangplus.in/tarangaplus-originals/khitpit/khitpit-ep-10', + 'md5': '78ce056cee755687b8a48199909ecf53', + 'info_dict': { + 'id': '67b8206719521d054c0059b7', + 'display_id': 'khitpit-ep-10', + 'ext': 'mp4', + 'title': 'Khitpit Ep-10', + 'description': 'md5:a45b805cb628e15c853d78b0406eab48', + 'thumbnail': r're:https?://.+/.+\.jpg', + 'duration': 756.0, + 'timestamp': 1740355200, + 'upload_date': '20250224', + 'media_type': 'episode', + 'categories': ['Originals'], + }, + }, { + 'url': 'https://tarangplus.in/tarang-serials/bada-bohu/bada-bohu-ep-233', + 'md5': 'b4f9beb15172559bb362203b4f48382e', + 'info_dict': { + 'id': '680b9d6c19521d054c007782', + 'display_id': 'bada-bohu-ep-233', + 'ext': 'mp4', + 'title': 'Bada Bohu | Ep -233', + 'description': 'md5:e6b8e7edc9e60b92c1b390f8789ecd69', + 'thumbnail': r're:https?://.+/.+\.jpg', + 'duration': 1392.0, + 'timestamp': 1745539200, + 'upload_date': '20250425', + 'media_type': 'episode', + 'categories': ['Prime'], + }, + }, { + # Decrypted m3u8 URL has trailing control characters that need to be stripped + 'url': 'https://tarangplus.in/tarangaplus-originals/ichha/ichha-teaser-1', + 'md5': '16ee43fe21ad8b6e652ec65eba38a64e', + 'info_dict': { + 'id': '5f0f252d3326af0720000342', + 'ext': 'mp4', + 'display_id': 'ichha-teaser-1', + 'title': 'Ichha Teaser', + 'description': 'md5:c724b0b0669a2cefdada3711cec792e6', + 'media_type': 'episode', + 'duration': 21.0, + 'thumbnail': r're:https?://.+/.+\.jpg', + 'categories': ['Originals'], + 'timestamp': 1758153600, + 'upload_date': '20250918', + }, + }, { + 'url': 'https://tarangplus.in/short/ai-maa/ai-maa', + 'only_matching': True, + }, { + 'url': 'https://tarangplus.in/shows/tarang-cine-utsav-2024/tarang-cine-utsav-2024-seg-1', + 'only_matching': True, + }, { + 'url': 'https://tarangplus.in/music-videos/chori-chori-bohu-chori-songs/nijara-laguchu-dhire-dhire', + 'only_matching': True, + }, { + 'url': 'https://tarangplus.in/kids-shows/chhota-jaga/chhota-jaga-ep-33-jamidar-ra-khajana-adaya', + 'only_matching': True, + }, { + 'url': 'https://tarangplus.in/movies/swayambara', + 'only_matching': True, + }] + + def decrypt(self, data, key): + if not Cryptodome.AES: + raise ExtractorError('pycryptodomex not found. Please install', expected=True) + iv = binascii.unhexlify('00000000000000000000000000000000') + cipher = Cryptodome.AES.new(base64.b64decode(key), Cryptodome.AES.MODE_CBC, iv) + return cipher.decrypt(base64.b64decode(data)).decode('utf-8') + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + hidden_inputs_data = self._hidden_inputs(webpage) + json_ld_data = self._search_json_ld(webpage, display_id) + json_ld_data.pop('url', None) + + iframe_url = traverse_obj(webpage, ( + {find_element(tag='iframe', attr='src', value=r'.+[?&]contenturl=.+', html=True, regex=True)}, + {extract_attributes}, 'src', {require('iframe URL')})) + # Can't use parse_qs here since it would decode the encrypted base64 `+` chars to spaces + content = self._search_regex(r'[?&]contenturl=(.+)', iframe_url, 'content') + encrypted_data, _, attrs = content.partition('|') + metadata = { + m.group('k'): m.group('v') + for m in re.finditer(r'(?:^|\|)(?P[a-z_]+)=(?P(?:(?!\|[a-z_]+=).)+)', attrs) + } + m3u8_url = urllib.parse.unquote( + self.decrypt(encrypted_data, metadata['key'])).rstrip('\x0e\x0f') + + return { + 'id': display_id, # Fallback + 'display_id': display_id, + **json_ld_data, + **traverse_obj(metadata, { + 'id': ('content_id', {str}), + 'title': ('title', {str}), + 'thumbnail': ('image', {str}), + }), + **traverse_obj(hidden_inputs_data, { + 'id': ('content_id', {str}), + 'media_type': ('theme_type', {str}), + 'categories': ('genre', {str}, filter, all, filter), + }), + 'formats': self._extract_m3u8_formats(m3u8_url, display_id), + } + + +class TarangPlusEpisodesIE(TarangPlusBaseIE): + IE_NAME = 'tarangplus:episodes' + _VALID_URL = r'https?://(?:www\.)?tarangplus\.in/(?P[^#?/]+)/(?P[^#?/]+)/episodes/?(?:$|[?#])' + _TESTS = [{ + 'url': 'https://tarangplus.in/tarangaplus-originals/balijatra/episodes', + 'info_dict': { + 'id': 'balijatra', + 'title': 'Balijatra', + }, + 'playlist_mincount': 7, + }, { + 'url': 'https://tarangplus.in/tarang-serials/bada-bohu/episodes', + 'info_dict': { + 'id': 'bada-bohu', + 'title': 'Bada Bohu', + }, + 'playlist_mincount': 236, + }, { + 'url': 'https://tarangplus.in/shows/dr-nonsense/episodes', + 'info_dict': { + 'id': 'dr-nonsense', + 'title': 'Dr. Nonsense', + }, + 'playlist_mincount': 15, + }] + _PAGE_SIZE = 20 + + def _entries(self, playlist_url, playlist_id, page): + data = self._download_json( + playlist_url, playlist_id, f'Downloading playlist JSON page {page + 1}', + query={'page_no': page}) + for item in traverse_obj(data, ('items', ..., {str})): + yield self.url_result( + urljoin(self._BASE_URL, item.split('$')[3]), TarangPlusVideoIE) + + def _real_extract(self, url): + url_type, display_id = self._match_valid_url(url).group('type', 'id') + series_url = f'{self._BASE_URL}/{url_type}/{display_id}' + webpage = self._download_webpage(series_url, display_id) + + entries = OnDemandPagedList( + functools.partial(self._entries, f'{series_url}/episodes', display_id), + self._PAGE_SIZE) + return self.playlist_result( + entries, display_id, self._hidden_inputs(webpage).get('title')) + + +class TarangPlusPlaylistIE(TarangPlusBaseIE): + IE_NAME = 'tarangplus:playlist' + _VALID_URL = r'https?://(?:www\.)?tarangplus\.in/(?P[^#?/]+)/all/?(?:$|[?#])' + _TESTS = [{ + 'url': 'https://tarangplus.in/chhota-jaga/all', + 'info_dict': { + 'id': 'chhota-jaga', + 'title': 'Chhota Jaga', + }, + 'playlist_mincount': 33, + }, { + 'url': 'https://tarangplus.in/kids-yali-show/all', + 'info_dict': { + 'id': 'kids-yali-show', + 'title': 'Yali', + }, + 'playlist_mincount': 10, + }, { + 'url': 'https://tarangplus.in/trailer/all', + 'info_dict': { + 'id': 'trailer', + 'title': 'Trailer', + }, + 'playlist_mincount': 57, + }, { + 'url': 'https://tarangplus.in/latest-songs/all', + 'info_dict': { + 'id': 'latest-songs', + 'title': 'Latest Songs', + }, + 'playlist_mincount': 46, + }, { + 'url': 'https://tarangplus.in/premium-serials-episodes/all', + 'info_dict': { + 'id': 'premium-serials-episodes', + 'title': 'Primetime Latest Episodes', + }, + 'playlist_mincount': 100, + }] + + def _entries(self, webpage): + for url_path in traverse_obj(webpage, ( + {find_elements(cls='item')}, ..., + {find_elements(tag='a', attr='href', value='/.+', html=True, regex=True)}, + ..., {extract_attributes}, 'href', + )): + yield self.url_result(urljoin(self._BASE_URL, url_path), TarangPlusVideoIE) + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + + return self.playlist_result( + self._entries(webpage), display_id, + traverse_obj(webpage, ({find_element(id='al_title')}, {clean_html}))) diff --git a/plugins/youtube_download/yt_dlp/extractor/telecinco.py b/plugins/youtube_download/yt_dlp/extractor/telecinco.py index bdcae3b..6846191 100644 --- a/plugins/youtube_download/yt_dlp/extractor/telecinco.py +++ b/plugins/youtube_download/yt_dlp/extractor/telecinco.py @@ -6,20 +6,21 @@ from ..networking.exceptions import HTTPError from ..utils import ( ExtractorError, clean_html, + extract_attributes, int_or_none, join_nonempty, str_or_none, - traverse_obj, update_url, url_or_none, ) +from ..utils.traversal import traverse_obj class TelecincoBaseIE(InfoExtractor): def _parse_content(self, content, url): - video_id = content['dataMediaId'] + video_id = content['dataMediaId'][1] config = self._download_json( - content['dataConfig'], video_id, 'Downloading config JSON') + content['dataConfig'][1], video_id, 'Downloading config JSON') services = config['services'] caronte = self._download_json(services['caronte'], video_id) if traverse_obj(caronte, ('dls', 0, 'drm', {bool})): @@ -57,9 +58,9 @@ class TelecincoBaseIE(InfoExtractor): 'id': video_id, 'title': traverse_obj(config, ('info', 'title', {str})), 'formats': formats, - 'thumbnail': (traverse_obj(content, ('dataPoster', {url_or_none})) + 'thumbnail': (traverse_obj(content, ('dataPoster', 1, {url_or_none})) or traverse_obj(config, 'poster', 'imageUrl', expected_type=url_or_none)), - 'duration': traverse_obj(content, ('dataDuration', {int_or_none})), + 'duration': traverse_obj(content, ('dataDuration', 1, {int_or_none})), 'http_headers': headers, } @@ -137,30 +138,45 @@ class TelecincoIE(TelecincoBaseIE): 'url': 'http://www.cuatro.com/chesterinlove/a-carta/chester-chester_in_love-chester_edu_2_2331030022.html', 'only_matching': True, }] + _ASTRO_ISLAND_RE = re.compile(r']+>') def _real_extract(self, url): display_id = self._match_id(url) webpage = self._download_webpage(url, display_id, impersonate=True) - article = self._search_json( - r'window\.\$REACTBASE_STATE\.article(?:_multisite)?\s*=', - webpage, 'article', display_id)['article'] - description = traverse_obj(article, ('leadParagraph', {clean_html}, filter)) - if article.get('editorialType') != 'VID': + props_list = traverse_obj(webpage, ( + {self._ASTRO_ISLAND_RE.findall}, ..., + {extract_attributes}, 'props', {json.loads})) + + description = traverse_obj(props_list, (..., 'leadParagraph', 1, {clean_html}, any, filter)) + main_content = traverse_obj(props_list, (..., ('content', ('articleData', 1, 'opening')), 1, {dict}, any)) + + if traverse_obj(props_list, (..., 'editorialType', 1, {str}, any)) != 'VID': # e.g. 'ART' entries = [] - for p in traverse_obj(article, ((('opening', all), 'body'), lambda _, v: v['content'])): - content = p['content'] - type_ = p.get('type') - if type_ == 'paragraph' and isinstance(content, str): + for p in traverse_obj(props_list, (..., 'articleData', 1, ('opening', ('body', 1, ...)), 1, {dict})): + type_ = traverse_obj(p, ('type', 1, {str})) + content = traverse_obj(p, ('content', 1, {str} if type_ == 'paragraph' else {dict})) + if not content: + continue + if type_ == 'paragraph': description = join_nonempty(description, content, delim='') - elif type_ == 'video' and isinstance(content, dict): + elif type_ == 'video': entries.append(self._parse_content(content, url)) + else: + self.report_warning( + f'Skipping unsupported content type "{type_}"', display_id, only_once=True) return self.playlist_result( - entries, str_or_none(article.get('id')), - traverse_obj(article, ('title', {str})), clean_html(description)) + entries, + traverse_obj(props_list, (..., 'id', 1, {int}, {str_or_none}, any)) or display_id, + traverse_obj(main_content, ('dataTitle', 1, {str})), + clean_html(description)) - info = self._parse_content(article['opening']['content'], url) + if not main_content: + raise ExtractorError('Unable to extract main content from webpage') + + info = self._parse_content(main_content, url) info['description'] = description + return info diff --git a/plugins/youtube_download/yt_dlp/extractor/thisoldhouse.py b/plugins/youtube_download/yt_dlp/extractor/thisoldhouse.py index fbc12d5..b9d1154 100644 --- a/plugins/youtube_download/yt_dlp/extractor/thisoldhouse.py +++ b/plugins/youtube_download/yt_dlp/extractor/thisoldhouse.py @@ -1,18 +1,17 @@ -import json +import urllib.parse from .brightcove import BrightcoveNewIE from .common import InfoExtractor from .zype import ZypeIE from ..networking import HEADRequest -from ..networking.exceptions import HTTPError from ..utils import ( ExtractorError, filter_dict, parse_qs, smuggle_url, - try_call, urlencode_postdata, ) +from ..utils.traversal import traverse_obj class ThisOldHouseIE(InfoExtractor): @@ -77,46 +76,43 @@ class ThisOldHouseIE(InfoExtractor): 'only_matching': True, }] - _LOGIN_URL = 'https://login.thisoldhouse.com/usernamepassword/login' - def _perform_login(self, username, password): - self._request_webpage( - HEADRequest('https://www.thisoldhouse.com/insider'), None, 'Requesting session cookies') - urlh = self._request_webpage( - 'https://www.thisoldhouse.com/wp-login.php', None, 'Requesting login info', - errnote='Unable to login', query={'redirect_to': 'https://www.thisoldhouse.com/insider'}) + login_page = self._download_webpage( + 'https://www.thisoldhouse.com/insider-login', None, 'Downloading login page') + hidden_inputs = self._hidden_inputs(login_page) + response = self._download_json( + 'https://www.thisoldhouse.com/wp-admin/admin-ajax.php', None, 'Logging in', + headers={ + 'Accept': 'application/json', + 'X-Requested-With': 'XMLHttpRequest', + }, data=urlencode_postdata(filter_dict({ + 'action': 'onebill_subscriber_login', + 'email': username, + 'password': password, + 'pricingPlanTerm': hidden_inputs['pricing_plan_term'], + 'utm_parameters': hidden_inputs.get('utm_parameters'), + 'nonce': hidden_inputs['mdcr_onebill_login_nonce'], + }))) - try: - auth_form = self._download_webpage( - self._LOGIN_URL, None, 'Submitting credentials', headers={ - 'Content-Type': 'application/json', - 'Referer': urlh.url, - }, data=json.dumps(filter_dict({ - **{('client_id' if k == 'client' else k): v[0] for k, v in parse_qs(urlh.url).items()}, - 'tenant': 'thisoldhouse', - 'username': username, - 'password': password, - 'popup_options': {}, - 'sso': True, - '_csrf': try_call(lambda: self._get_cookies(self._LOGIN_URL)['_csrf'].value), - '_intstate': 'deprecated', - }), separators=(',', ':')).encode()) - except ExtractorError as e: - if isinstance(e.cause, HTTPError) and e.cause.status == 401: + message = traverse_obj(response, ('data', 'message', {str})) + if not response['success']: + if message and 'Something went wrong' in message: raise ExtractorError('Invalid username or password', expected=True) - raise - - self._request_webpage( - 'https://login.thisoldhouse.com/login/callback', None, 'Completing login', - data=urlencode_postdata(self._hidden_inputs(auth_form))) + raise ExtractorError(message or 'Login was unsuccessful') + if message and 'Your subscription is not active' in message: + self.report_warning( + f'{self.IE_NAME} said your subscription is not active. ' + f'If your subscription is active, this could be caused by too many sign-ins, ' + f'and you should instead try using {self._login_hint(method="cookies")[4:]}') + else: + self.write_debug(f'{self.IE_NAME} said: {message}') def _real_extract(self, url): display_id = self._match_id(url) - webpage = self._download_webpage(url, display_id) - if 'To Unlock This content' in webpage: - self.raise_login_required( - 'This video is only available for subscribers. ' - 'Note that --cookies-from-browser may not work due to this site using session cookies') + webpage, urlh = self._download_webpage_handle(url, display_id) + # If login response says inactive subscription, site redirects to frontpage for Insider content + if 'To Unlock This content' in webpage or urllib.parse.urlparse(urlh.url).path in ('', '/'): + self.raise_login_required('This video is only available for subscribers') video_url, video_id = self._search_regex( r']+src=[\'"]((?:https?:)?//(?:www\.)?thisoldhouse\.(?:chorus\.build|com)/videos/zype/([0-9a-f]{24})[^\'"]*)[\'"]', diff --git a/plugins/youtube_download/yt_dlp/extractor/tiktok.py b/plugins/youtube_download/yt_dlp/extractor/tiktok.py index b7e058e..02ec2b2 100644 --- a/plugins/youtube_download/yt_dlp/extractor/tiktok.py +++ b/plugins/youtube_download/yt_dlp/extractor/tiktok.py @@ -454,6 +454,7 @@ class TikTokBaseIE(InfoExtractor): 'like_count': 'digg_count', 'repost_count': 'share_count', 'comment_count': 'comment_count', + 'save_count': 'collect_count', }, expected_type=int_or_none), **author_info, 'channel_url': format_field(author_info, 'channel_id', self._UPLOADER_URL_FORMAT, default=None), @@ -607,6 +608,7 @@ class TikTokBaseIE(InfoExtractor): 'like_count': 'diggCount', 'repost_count': 'shareCount', 'comment_count': 'commentCount', + 'save_count': 'collectCount', }), expected_type=int_or_none), 'thumbnails': [ { @@ -646,6 +648,7 @@ class TikTokIE(TikTokBaseIE): 'like_count': int, 'repost_count': int, 'comment_count': int, + 'save_count': int, 'artist': 'Ysrbeats', 'album': 'Lehanga', 'track': 'Lehanga', @@ -675,6 +678,7 @@ class TikTokIE(TikTokBaseIE): 'like_count': int, 'repost_count': int, 'comment_count': int, + 'save_count': int, 'artists': ['Evan Todd', 'Jessica Keenan Wynn', 'Alice Lee', 'Barrett Wilbert Weed', 'Jon Eidson'], 'track': 'Big Fun', }, @@ -702,6 +706,7 @@ class TikTokIE(TikTokBaseIE): 'like_count': int, 'repost_count': int, 'comment_count': int, + 'save_count': int, }, }, { # Sponsored video, only available with feed workaround @@ -725,6 +730,7 @@ class TikTokIE(TikTokBaseIE): 'like_count': int, 'repost_count': int, 'comment_count': int, + 'save_count': int, }, 'skip': 'This video is unavailable', }, { @@ -751,6 +757,7 @@ class TikTokIE(TikTokBaseIE): 'like_count': int, 'repost_count': int, 'comment_count': int, + 'save_count': int, }, }, { # hydration JSON is sent in a