Merge branch 'jmbannon:master' into master
This commit is contained in:
commit
2905a8d1c0
297 changed files with 3140 additions and 1342 deletions
10
.github/workflows/ci-windows.yaml
vendored
10
.github/workflows/ci-windows.yaml
vendored
|
|
@ -29,7 +29,7 @@ jobs:
|
|||
move "ffmpeg-master-latest-win64-gpl\bin\ffprobe.exe" "ffprobe.exe"
|
||||
|
||||
python -m pip install -e .[test]
|
||||
python -m pytest tests/unit
|
||||
python -m pytest --reruns 3 --reruns-delay 5 tests/unit
|
||||
|
||||
test-soundcloud:
|
||||
runs-on: windows-latest
|
||||
|
|
@ -52,7 +52,7 @@ jobs:
|
|||
move "ffmpeg-master-latest-win64-gpl\bin\ffprobe.exe" "ffprobe.exe"
|
||||
|
||||
python -m pip install -e .[test]
|
||||
python -m pytest tests/e2e/soundcloud
|
||||
python -m pytest --reruns 3 --reruns-delay 5 tests/e2e/soundcloud
|
||||
|
||||
test-bandcamp:
|
||||
runs-on: windows-latest
|
||||
|
|
@ -75,7 +75,7 @@ jobs:
|
|||
move "ffmpeg-master-latest-win64-gpl\bin\ffprobe.exe" "ffprobe.exe"
|
||||
|
||||
python -m pip install -e .[test]
|
||||
python -m pytest tests/e2e/bandcamp
|
||||
python -m pytest --reruns 3 --reruns-delay 5 tests/e2e/bandcamp
|
||||
|
||||
|
||||
test-youtube:
|
||||
|
|
@ -99,7 +99,7 @@ jobs:
|
|||
move "ffmpeg-master-latest-win64-gpl\bin\ffprobe.exe" "ffprobe.exe"
|
||||
|
||||
python -m pip install -e .[test]
|
||||
python -m pytest tests/e2e/youtube
|
||||
python -m pytest --reruns 3 --reruns-delay 5 tests/e2e/youtube
|
||||
|
||||
test-plugins:
|
||||
runs-on: windows-latest
|
||||
|
|
@ -122,4 +122,4 @@ jobs:
|
|||
move "ffmpeg-master-latest-win64-gpl\bin\ffprobe.exe" "ffprobe.exe"
|
||||
|
||||
python -m pip install -e .[test]
|
||||
python -m pytest tests/e2e/plugins
|
||||
python -m pytest --reruns 3 --reruns-delay 5 tests/e2e/plugins
|
||||
|
|
|
|||
10
.github/workflows/ci.yaml
vendored
10
.github/workflows/ci.yaml
vendored
|
|
@ -44,7 +44,7 @@ jobs:
|
|||
pip install -e .[test]
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ffmpeg
|
||||
coverage run -m pytest tests/unit && coverage xml -o /opt/coverage/unit/coverage.xml
|
||||
coverage run -m pytest --reruns 3 --reruns-delay 5 tests/unit && coverage xml -o /opt/coverage/unit/coverage.xml
|
||||
|
||||
- name: Save coverage
|
||||
uses: actions/cache@v3
|
||||
|
|
@ -70,7 +70,7 @@ jobs:
|
|||
pip install -e .[test]
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ffmpeg
|
||||
coverage run -m pytest tests/e2e/soundcloud && coverage xml -o /opt/coverage/soundcloud/coverage.xml
|
||||
coverage run -m pytest --reruns 3 --reruns-delay 5 tests/e2e/soundcloud && coverage xml -o /opt/coverage/soundcloud/coverage.xml
|
||||
|
||||
test-bandcamp:
|
||||
runs-on: ubuntu-22.04
|
||||
|
|
@ -90,7 +90,7 @@ jobs:
|
|||
pip install -e .[test]
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ffmpeg
|
||||
coverage run -m pytest tests/e2e/bandcamp && coverage xml -o /opt/coverage/bandcamp/coverage.xml
|
||||
coverage run -m pytest --reruns 3 --reruns-delay 5 tests/e2e/bandcamp && coverage xml -o /opt/coverage/bandcamp/coverage.xml
|
||||
|
||||
- name: Save coverage
|
||||
uses: actions/cache@v3
|
||||
|
|
@ -116,7 +116,7 @@ jobs:
|
|||
pip install -e .[test]
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ffmpeg
|
||||
coverage run -m pytest tests/e2e/youtube && coverage xml -o /opt/coverage/youtube/coverage.xml
|
||||
coverage run -m pytest --reruns 3 --reruns-delay 5 tests/e2e/youtube && coverage xml -o /opt/coverage/youtube/coverage.xml
|
||||
|
||||
- name: Save coverage
|
||||
uses: actions/cache@v3
|
||||
|
|
@ -142,7 +142,7 @@ jobs:
|
|||
pip install -e .[test]
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ffmpeg
|
||||
coverage run -m pytest tests/e2e/plugins && coverage xml -o /opt/coverage/plugins/coverage.xml
|
||||
coverage run -m pytest --reruns 3 --reruns-delay 5 tests/e2e/plugins && coverage xml -o /opt/coverage/plugins/coverage.xml
|
||||
|
||||
- name: Save coverage
|
||||
uses: actions/cache@v3
|
||||
|
|
|
|||
47
.github/workflows/package-ubuntu.yaml
vendored
47
.github/workflows/package-ubuntu.yaml
vendored
|
|
@ -19,6 +19,49 @@ env:
|
|||
jobs:
|
||||
# Push image to GitHub Packages.
|
||||
# See also https://docs.docker.com/docker-hub/builds/
|
||||
version:
|
||||
name: version
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
pypi_version: ${{ steps.set_outputs.outputs.pypi_version }}
|
||||
local_version: ${{ steps.set_outputs.outputs.local_version }}
|
||||
init_contents: ${{ steps.set_outputs.outputs.init_contents }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: master
|
||||
|
||||
- name: Set date and commit hash variables
|
||||
run: |
|
||||
echo "DATE=$(date +'%Y.%m.%d')" >> $GITHUB_ENV
|
||||
echo "COMMIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
|
||||
|
||||
- name: Count number of commits on master on day, minus 1 to account for post-push
|
||||
run: |
|
||||
echo "DATE_COMMIT_COUNT=$(($(git rev-list --count master --since='${{ env.DATE }} 00:00:00')-1))" >> $GITHUB_ENV
|
||||
- name: Set pypi and local version values
|
||||
run: |
|
||||
echo "LOCAL_VERSION=${{ env.DATE }}+${{ env.COMMIT_HASH }}" >> $GITHUB_ENV
|
||||
if [ ${{ env.DATE_COMMIT_COUNT }} -le "0" ]
|
||||
then
|
||||
echo "PYPI_VERSION=${{ env.DATE }}" >> $GITHUB_ENV
|
||||
else
|
||||
echo "PYPI_VERSION=${{ env.DATE }}.post${{ env.DATE_COMMIT_COUNT }}" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Test versions
|
||||
run: |
|
||||
echo "${{ env.PYPI_VERSION }}"
|
||||
echo "${{ env.LOCAL_VERSION }}"
|
||||
|
||||
- id: set_outputs
|
||||
run: |
|
||||
echo "pypi_version=${{ env.PYPI_VERSION }}" >> "$GITHUB_OUTPUT"
|
||||
echo "local_version=${{ env.LOCAL_VERSION }}" >> "$GITHUB_OUTPUT"
|
||||
echo 'init_contents=__pypi_version__ = "${{ env.PYPI_VERSION }}";__local_version__ = "${{ env.LOCAL_VERSION }}"' >> "$GITHUB_OUTPUT"
|
||||
|
||||
build:
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
|
|
@ -57,7 +100,7 @@ jobs:
|
|||
permissions:
|
||||
contents: read
|
||||
|
||||
if: ${{ github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v') }}
|
||||
if: ${{ github.ref == 'refs/heads/master' && !contains(github.event.head_commit.message, '[DEV]') }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
|
|
@ -141,6 +184,7 @@ jobs:
|
|||
deploy:
|
||||
runs-on: ubuntu-22.04
|
||||
needs: [
|
||||
version,
|
||||
build,
|
||||
package-arm64,
|
||||
package-amd64
|
||||
|
|
@ -218,6 +262,7 @@ jobs:
|
|||
--cache-from=type=local,src=/tmp/build-cache/amd64 \
|
||||
--cache-from=type=local,src=/tmp/build-cache/arm64 \
|
||||
--tag ${{ steps.formatted-image_id.outputs.IMAGE_ID }}:ubuntu-${{ steps.formatted_version.outputs.VERSION }} \
|
||||
--tag ${{ steps.formatted-image_id.outputs.IMAGE_ID }}:ubuntu-${{ needs.version.outputs.pypi_version }} \
|
||||
--label "runnumber=ubuntu-${GITHUB_RUN_ID}" \
|
||||
--file docker/Dockerfile.ubuntu \
|
||||
docker/
|
||||
47
.github/workflows/package.yaml
vendored
47
.github/workflows/package.yaml
vendored
|
|
@ -19,6 +19,49 @@ env:
|
|||
jobs:
|
||||
# Push image to GitHub Packages.
|
||||
# See also https://docs.docker.com/docker-hub/builds/
|
||||
version:
|
||||
name: version
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
pypi_version: ${{ steps.set_outputs.outputs.pypi_version }}
|
||||
local_version: ${{ steps.set_outputs.outputs.local_version }}
|
||||
init_contents: ${{ steps.set_outputs.outputs.init_contents }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: master
|
||||
|
||||
- name: Set date and commit hash variables
|
||||
run: |
|
||||
echo "DATE=$(date +'%Y.%m.%d')" >> $GITHUB_ENV
|
||||
echo "COMMIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
|
||||
|
||||
- name: Count number of commits on master on day, minus 1 to account for post-push
|
||||
run: |
|
||||
echo "DATE_COMMIT_COUNT=$(($(git rev-list --count master --since='${{ env.DATE }} 00:00:00')-1))" >> $GITHUB_ENV
|
||||
- name: Set pypi and local version values
|
||||
run: |
|
||||
echo "LOCAL_VERSION=${{ env.DATE }}+${{ env.COMMIT_HASH }}" >> $GITHUB_ENV
|
||||
if [ ${{ env.DATE_COMMIT_COUNT }} -le "0" ]
|
||||
then
|
||||
echo "PYPI_VERSION=${{ env.DATE }}" >> $GITHUB_ENV
|
||||
else
|
||||
echo "PYPI_VERSION=${{ env.DATE }}.post${{ env.DATE_COMMIT_COUNT }}" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Test versions
|
||||
run: |
|
||||
echo "${{ env.PYPI_VERSION }}"
|
||||
echo "${{ env.LOCAL_VERSION }}"
|
||||
|
||||
- id: set_outputs
|
||||
run: |
|
||||
echo "pypi_version=${{ env.PYPI_VERSION }}" >> "$GITHUB_OUTPUT"
|
||||
echo "local_version=${{ env.LOCAL_VERSION }}" >> "$GITHUB_OUTPUT"
|
||||
echo 'init_contents=__pypi_version__ = "${{ env.PYPI_VERSION }}";__local_version__ = "${{ env.LOCAL_VERSION }}"' >> "$GITHUB_OUTPUT"
|
||||
|
||||
build:
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
|
|
@ -139,6 +182,7 @@ jobs:
|
|||
deploy:
|
||||
runs-on: ubuntu-22.04
|
||||
needs: [
|
||||
version,
|
||||
build,
|
||||
package-arm64,
|
||||
package-amd64
|
||||
|
|
@ -148,7 +192,7 @@ jobs:
|
|||
packages: write
|
||||
contents: read
|
||||
|
||||
if: ${{ github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v') }}
|
||||
if: ${{ github.ref == 'refs/heads/master' && !contains(github.event.head_commit.message, '[DEV]') }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
|
|
@ -216,5 +260,6 @@ jobs:
|
|||
--cache-from=type=local,src=/tmp/build-cache/amd64 \
|
||||
--cache-from=type=local,src=/tmp/build-cache/arm64 \
|
||||
--tag ${{ steps.formatted-image_id.outputs.IMAGE_ID }}:${{ steps.formatted_version.outputs.VERSION }} \
|
||||
--tag ${{ steps.formatted-image_id.outputs.IMAGE_ID }}:${{ needs.version.outputs.pypi_version }} \
|
||||
--label "runnumber=${GITHUB_RUN_ID}" \
|
||||
docker/
|
||||
4
.github/workflows/release.yaml
vendored
4
.github/workflows/release.yaml
vendored
|
|
@ -171,7 +171,7 @@ jobs:
|
|||
ls -lh /opt/builds
|
||||
|
||||
- name: Create Release
|
||||
if: ${{ github.ref == 'refs/heads/master' }}
|
||||
if: ${{ github.ref == 'refs/heads/master' && !contains(github.event.head_commit.message, '[DEV]') }}
|
||||
id: create_release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
|
|
@ -207,7 +207,7 @@ jobs:
|
|||
python3 -m build
|
||||
|
||||
- name: Publish distribution 📦 to PyPI
|
||||
if: ${{ github.ref == 'refs/heads/master' }}
|
||||
if: ${{ github.ref == 'refs/heads/master' && !contains(github.event.head_commit.message, '[DEV]') }}
|
||||
uses: pypa/gh-action-pypi-publish@release/v1
|
||||
with:
|
||||
password: ${{ secrets.PYPI_API_TOKEN }}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ Config
|
|||
======
|
||||
ytdl-sub is configured using a ``config.yaml`` file.
|
||||
|
||||
.. _config_yaml:
|
||||
.. _config:
|
||||
|
||||
config.yaml
|
||||
-----------
|
||||
|
|
@ -29,7 +29,7 @@ and subscriptions.
|
|||
.. autoclass:: ytdl_sub.config.config_validator.ConfigOptions()
|
||||
:members:
|
||||
:member-order: bysource
|
||||
:exclude-members: persist_logs, experimental
|
||||
:exclude-members: subscription_value, persist_logs, experimental
|
||||
|
||||
persist_logs
|
||||
""""""""""""
|
||||
|
|
@ -183,10 +183,17 @@ file_convert
|
|||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
format
|
||||
''''''
|
||||
.. autoclass:: ytdl_sub.plugins.format.FormatOptions()
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
match_filters
|
||||
'''''''''''''
|
||||
.. autoclass:: ytdl_sub.plugins.match_filters.MatchFiltersOptions()
|
||||
:members:
|
||||
:member-order: bysource
|
||||
:exclude-members: partial_validate
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
|
@ -292,8 +299,66 @@ custom variables: ``{output_directory}``, ``{playlist_name}``, and ``{url}``. Th
|
|||
the `parent preset`_ to ``playlist_preset_ex``, and must define the variables ``{playlist_name}``
|
||||
and ``{url}`` since the preset did not.
|
||||
|
||||
.. _beautifying subscriptions:
|
||||
|
||||
Beautifying Subscriptions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Subscriptions support using presets as keys, and using keys to set override variables as values.
|
||||
For example:
|
||||
|
||||
.. code-block:: yaml
|
||||
:caption: subscription.yaml
|
||||
|
||||
tv_show:
|
||||
only_recent:
|
||||
[News]:
|
||||
"Breaking News": "https://www.youtube.com/@SomeBreakingNews"
|
||||
|
||||
[Tech]:
|
||||
"Two Minute Papers": "https://www.youtube.com/@TwoMinutePapers"
|
||||
|
||||
Will create two subscriptions named "Breaking News" and "Two Minute Papers", equivalent to:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
"Breaking News":
|
||||
preset:
|
||||
- "tv_show"
|
||||
- "only_recent"
|
||||
|
||||
overrides:
|
||||
subscription_indent_1: "News"
|
||||
subscription_name: "Breaking News"
|
||||
subscription_value: "https://www.youtube.com/@SomeBreakingNews"
|
||||
|
||||
"Two Minute Papers":
|
||||
preset:
|
||||
- "tv_show"
|
||||
|
||||
overrides:
|
||||
subscription_indent_1: "Tech"
|
||||
subscription_name: "Two Minute Papers"
|
||||
subscription_value: "https://www.youtube.com/@TwoMinutePapers"
|
||||
|
||||
You can provide as many parent presets in the form of keys, and subscription indents as ``[keys]``.
|
||||
This can drastically simplify subscription definitions by setting things like so in your
|
||||
parent preset:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
presets:
|
||||
tv_show_name:
|
||||
overrides:
|
||||
tv_show_name: "{subscription_name}"
|
||||
url: "{subscription_value}"
|
||||
genre: "{subscription_indent_1}"
|
||||
|
||||
.. _subscription value:
|
||||
|
||||
File Preset
|
||||
^^^^^^^^^^^
|
||||
NOTE: This is deprecated in favor of using the method in :ref:`beautifying subscriptions`.
|
||||
|
||||
You can apply a preset to all subscriptions in the ``subscription.yaml`` file
|
||||
by using the file-wide ``__preset__``:
|
||||
|
||||
|
|
@ -311,8 +376,11 @@ by using the file-wide ``__preset__``:
|
|||
This ``subscription.yaml`` is equivalent to the one above it because all
|
||||
subscriptions automatically set ``__preset__`` as a `parent preset`_.
|
||||
|
||||
File Subscription Value
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Subscription Value
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
NOTE: This is deprecated in favor of using the method in :ref:`beautifying subscriptions`.
|
||||
|
||||
With a clever config and use of ``__preset__``, your subscriptions can typically boil
|
||||
down to a name and url. You can set ``__value__`` to the name of an override variable,
|
||||
and use the override variable ``subscription_name`` to achieve one-liner subscriptions.
|
||||
|
|
@ -322,20 +390,19 @@ Using the example above, we can do:
|
|||
:caption: subscription.yaml
|
||||
|
||||
__preset__:
|
||||
preset: "playlist_preset_ex"
|
||||
preset:
|
||||
- "tv_show"
|
||||
overrides:
|
||||
playlist_name: "{subscription_name}"
|
||||
tv_show_name: "{subscription_name}"
|
||||
|
||||
__value__: "url"
|
||||
|
||||
# single-line subscription
|
||||
"diy-playlist": "https://youtube.com/playlist?list=UCsvn_Po0SmunchJYtttWpOxMg"
|
||||
|
||||
``"diy-playlist"`` gets assigned to the ``playlist_name`` override variable by setting
|
||||
it with ``subscription_name`` , and the url gets assigned to ``url`` by setting ``__value__``
|
||||
to write values to it.
|
||||
# single-line subscription, sets "Brandon Acker" and the subscription value
|
||||
# to the override variables tv_show_name and url
|
||||
"Brandon Acker": "https://www.youtube.com/@brandonacker"
|
||||
|
||||
Traditional subscriptions that can override presets will still work when using ``__value__``.
|
||||
``__value__`` can also be set within a :ref:`config`.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,14 @@
|
|||
Deprecation Notices
|
||||
===================
|
||||
|
||||
Oct 2023
|
||||
--------
|
||||
|
||||
subscription preset and value
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
The use of ``__value__`` will go away in Dec 2023 in favor of the method found in
|
||||
:ref:`beautifying subscriptions`. ``__preset__`` will still be supported for the time being.
|
||||
|
||||
July 2023
|
||||
---------
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ ytdl-sub configs, check out the
|
|||
|
||||
|
||||
For navigating config docs, use the left-side bar on the
|
||||
:ref:`config_yaml` page to find every available ytdl-sub field.
|
||||
:ref:`config` page to find every available ytdl-sub field.
|
||||
|
||||
Contents
|
||||
========
|
||||
|
|
|
|||
|
|
@ -69,10 +69,6 @@ presets:
|
|||
date_range:
|
||||
after: "today-{download_range}"
|
||||
|
||||
# Stops fetching metadata if the video is out of range (saves time + bandwidth)
|
||||
ytdl_options:
|
||||
break_on_reject: True
|
||||
|
||||
# Deletes any videos older than download_range. WARNING: do not use
|
||||
# "season_by_year__episode_by_download_index" if you plan to delete older videos
|
||||
output_options:
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ package_dir =
|
|||
packages=find:
|
||||
|
||||
install_requires =
|
||||
yt-dlp==2023.7.6
|
||||
yt-dlp==2023.9.24
|
||||
argparse==1.4.0
|
||||
colorama==0.4.6
|
||||
mergedeep==1.3.4
|
||||
|
|
@ -44,6 +44,7 @@ where=src
|
|||
test =
|
||||
coverage[toml]==6.3.2
|
||||
pytest==7.1.1
|
||||
pytest-rerunfailures==12.0
|
||||
lint =
|
||||
black==22.3.0
|
||||
isort==5.10.1
|
||||
|
|
|
|||
|
|
@ -341,6 +341,8 @@ def main() -> List[Tuple[Subscription, FileHandlerTransactionLog]]:
|
|||
transaction_logs.append(
|
||||
_view_url_from_cli(config=config, url=args.url, split_chapters=args.split_chapters)
|
||||
)
|
||||
else:
|
||||
raise ValidationException("Must provide one of the commands: sub, dl, view")
|
||||
|
||||
if not args.suppress_transaction_log:
|
||||
_output_transaction_log(
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ from typing import Dict
|
|||
|
||||
from ytdl_sub.config.config_validator import ConfigValidator
|
||||
from ytdl_sub.config.preset import Preset
|
||||
from ytdl_sub.utils.exceptions import FileNotFoundException
|
||||
from ytdl_sub.utils.ffmpeg import FFMPEG
|
||||
from ytdl_sub.utils.yaml import load_yaml
|
||||
from ytdl_sub.validators.file_path_validators import FilePathValidatorMixin
|
||||
|
|
@ -68,8 +69,20 @@ class ConfigFile(ConfigValidator):
|
|||
Returns
|
||||
-------
|
||||
Config file validator
|
||||
|
||||
Raises
|
||||
------
|
||||
FileNotFoundException
|
||||
Not found
|
||||
"""
|
||||
config_dict = load_yaml(file_path=config_path)
|
||||
try:
|
||||
config_dict = load_yaml(file_path=config_path)
|
||||
except FileNotFoundException as exc:
|
||||
raise FileNotFoundException(
|
||||
f"The config file '{config_path}' could not be found. "
|
||||
f"Did you set --config correctly?"
|
||||
) from exc
|
||||
|
||||
return ConfigFile.from_dict(config_dict)
|
||||
|
||||
def as_dict(self) -> Dict[str, Any]:
|
||||
|
|
|
|||
|
|
@ -106,6 +106,7 @@ class ConfigOptions(StrictDictValidator):
|
|||
"ffprobe_path",
|
||||
"file_name_max_bytes",
|
||||
"experimental",
|
||||
"subscription_value",
|
||||
}
|
||||
|
||||
def __init__(self, name: str, value: Any):
|
||||
|
|
@ -138,6 +139,9 @@ class ConfigOptions(StrictDictValidator):
|
|||
self._file_name_max_bytes = self._validate_key(
|
||||
key="file_name_max_bytes", validator=IntValidator, default=MAX_FILE_NAME_BYTES
|
||||
)
|
||||
self._subscription_value = self._validate_key_if_present(
|
||||
key="subscription_value", validator=StringValidator
|
||||
)
|
||||
|
||||
@property
|
||||
def working_directory(self) -> str:
|
||||
|
|
@ -230,6 +234,14 @@ class ConfigOptions(StrictDictValidator):
|
|||
"""
|
||||
return self._ffprobe_path.value
|
||||
|
||||
@property
|
||||
def subscription_value(self) -> Optional[str]:
|
||||
"""
|
||||
Optional. Sets the :ref:`subscription value` for subscription
|
||||
files that use this config.
|
||||
"""
|
||||
return self._subscription_value.value if self._subscription_value else None
|
||||
|
||||
|
||||
class ConfigValidator(StrictDictValidator):
|
||||
_required_keys = {"configuration", "presets"}
|
||||
|
|
|
|||
|
|
@ -72,6 +72,14 @@ class Plugin(BasePlugin[TOptionsValidator], Generic[TOptionsValidator], ABC):
|
|||
Class to define the new plugin functionality
|
||||
"""
|
||||
|
||||
def ytdl_options_match_filters(self) -> Tuple[List[str], List[str]]:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
Tuple of match-filters to apply, first one being non-breaking, second breaking
|
||||
"""
|
||||
return [], []
|
||||
|
||||
def ytdl_options(self) -> Optional[Dict]:
|
||||
"""
|
||||
Returns
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ from ytdl_sub.plugins.chapters import ChaptersPlugin
|
|||
from ytdl_sub.plugins.date_range import DateRangePlugin
|
||||
from ytdl_sub.plugins.embed_thumbnail import EmbedThumbnailPlugin
|
||||
from ytdl_sub.plugins.file_convert import FileConvertPlugin
|
||||
from ytdl_sub.plugins.format import FormatPlugin
|
||||
from ytdl_sub.plugins.internal.view import ViewPlugin
|
||||
from ytdl_sub.plugins.match_filters import MatchFiltersPlugin
|
||||
from ytdl_sub.plugins.music_tags import MusicTagsPlugin
|
||||
|
|
@ -30,6 +31,7 @@ class PluginMapping:
|
|||
"date_range": DateRangePlugin,
|
||||
"embed_thumbnail": EmbedThumbnailPlugin,
|
||||
"file_convert": FileConvertPlugin,
|
||||
"format": FormatPlugin,
|
||||
"match_filters": MatchFiltersPlugin,
|
||||
"music_tags": MusicTagsPlugin,
|
||||
"video_tags": VideoTagsPlugin,
|
||||
|
|
|
|||
|
|
@ -246,6 +246,7 @@ class OutputOptions(StrictDictValidator):
|
|||
thumbnail_name: "{title_sanitized}.{thumbnail_ext}"
|
||||
info_json_name: "{title_sanitized}.{info_json_ext}"
|
||||
download_archive_name: ".ytdl-sub-{subscription_name}-download-archive.json"
|
||||
migrated_download_archive_name: ".ytdl-sub-{subscription_name_sanitized}-download-archive.json"
|
||||
maintain_download_archive: True
|
||||
keep_files_before: now
|
||||
keep_files_after: 19000101
|
||||
|
|
@ -256,6 +257,7 @@ class OutputOptions(StrictDictValidator):
|
|||
"thumbnail_name",
|
||||
"info_json_name",
|
||||
"download_archive_name",
|
||||
"migrated_download_archive_name",
|
||||
"maintain_download_archive",
|
||||
"keep_files_before",
|
||||
"keep_files_after",
|
||||
|
|
@ -298,6 +300,10 @@ class OutputOptions(StrictDictValidator):
|
|||
validator=OverridesStringFormatterValidator,
|
||||
default=DEFAULT_DOWNLOAD_ARCHIVE_NAME,
|
||||
)
|
||||
self._migrated_download_archive_name = self._validate_key_if_present(
|
||||
key="migrated_download_archive_name",
|
||||
validator=OverridesStringFormatterValidator,
|
||||
)
|
||||
|
||||
self._maintain_download_archive = self._validate_key_if_present(
|
||||
key="maintain_download_archive", validator=BoolValidator, default=False
|
||||
|
|
@ -358,6 +364,16 @@ class OutputOptions(StrictDictValidator):
|
|||
"""
|
||||
return self._download_archive_name
|
||||
|
||||
@property
|
||||
def migrated_download_archive_name(self) -> Optional[OverridesStringFormatterValidator]:
|
||||
"""
|
||||
Optional. Intended to be used if you are migrating a subscription with either a new
|
||||
subscription name or output directory. It will try to load the archive file using this name
|
||||
first, and fallback to ``download_archive_name``. It will always save to this file
|
||||
and remove the original ``download_archive_name``.
|
||||
"""
|
||||
return self._migrated_download_archive_name
|
||||
|
||||
@property
|
||||
def maintain_download_archive(self) -> bool:
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ from pathlib import Path
|
|||
from typing import Dict
|
||||
from typing import Iterable
|
||||
from typing import List
|
||||
from typing import Optional
|
||||
|
||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
||||
from ytdl_sub.config.preset_options import Overrides
|
||||
|
|
@ -123,7 +124,7 @@ class InfoJsonDownloader(SourcePlugin[InfoJsonDownloaderOptions]):
|
|||
):
|
||||
self._enhanced_download_archive.num_entries_removed += 1
|
||||
|
||||
def download(self, entry: Entry) -> Entry:
|
||||
def download(self, entry: Entry) -> Optional[Entry]:
|
||||
"""
|
||||
Mock the download by copying the entry file from the output directory into
|
||||
the working directory
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ class SourcePlugin(BasePlugin[TOptionsValidator], Generic[TOptionsValidator], AB
|
|||
"""Gathers metadata of all entries to download"""
|
||||
|
||||
@abc.abstractmethod
|
||||
def download(self, entry: Entry) -> Entry:
|
||||
def download(self, entry: Entry) -> Optional[Entry]:
|
||||
"""The function to perform the download of all media entries"""
|
||||
|
||||
@final
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@ from ytdl_sub.entries.variables.kwargs import REQUESTED_SUBTITLES
|
|||
from ytdl_sub.entries.variables.kwargs import SOURCE_ENTRY
|
||||
from ytdl_sub.entries.variables.kwargs import SPONSORBLOCK_CHAPTERS
|
||||
from ytdl_sub.entries.variables.kwargs import UPLOAD_DATE_INDEX
|
||||
from ytdl_sub.entries.variables.kwargs import YTDL_SUB_MATCH_FILTER_REJECT
|
||||
from ytdl_sub.utils.file_handler import FileHandler
|
||||
from ytdl_sub.utils.logger import Logger
|
||||
from ytdl_sub.utils.thumbnail import ThumbnailTypes
|
||||
|
|
@ -462,7 +461,7 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
|||
)
|
||||
yield entry
|
||||
|
||||
def download(self, entry: Entry) -> Entry:
|
||||
def download(self, entry: Entry) -> Optional[Entry]:
|
||||
"""
|
||||
Parameters
|
||||
----------
|
||||
|
|
@ -485,16 +484,13 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
|||
entry.title,
|
||||
)
|
||||
|
||||
# Match-filters are applied at the download stage (not metadata stage).
|
||||
# If the download is rejected, and match_filter is present in the ytdl options,
|
||||
# then filter downstream in the match_filter plugin
|
||||
# Match-filters can be applied at the download stage. If the download is rejected,
|
||||
# then return None
|
||||
try:
|
||||
download_entry = self._extract_entry_info_with_retry(entry=entry)
|
||||
except RejectedVideoReached:
|
||||
if "match_filter" in self.download_ytdl_options:
|
||||
entry.add_kwargs({YTDL_SUB_MATCH_FILTER_REJECT: True})
|
||||
return entry
|
||||
raise
|
||||
download_logger.info("Entry rejected by download match-filter, skipping ..")
|
||||
return None
|
||||
|
||||
upload_date_idx = self._enhanced_download_archive.mapping.get_num_entries_with_upload_date(
|
||||
upload_date_standardized=entry.upload_date_standardized
|
||||
|
|
|
|||
|
|
@ -47,7 +47,6 @@ REQUESTED_SUBTITLES = _("requested_subtitles", backend=True)
|
|||
CHAPTERS = _("chapters", backend=True)
|
||||
YTDL_SUB_CUSTOM_CHAPTERS = _("ytdl_sub_custom_chapters", backend=True)
|
||||
YTDL_SUB_REGEX_SOURCE_VARS = _("ytdl_sub_regex_source_vars", backend=True)
|
||||
YTDL_SUB_MATCH_FILTER_REJECT = _("ytdl_sub_match_filter_reject", backend=True)
|
||||
SPONSORBLOCK_CHAPTERS = _("sponsorblock_chapters", backend=True)
|
||||
SPLIT_BY_CHAPTERS_PARENT_ENTRY = _("split_by_chapters_parent_entry", backend=True)
|
||||
COMMENTS = _("comments", backend=True)
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ from ytdl_sub.config.preset_options import OptionsDictValidator
|
|||
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
||||
from ytdl_sub.entries.entry import Entry
|
||||
from ytdl_sub.utils.exceptions import FileNotDownloadedException
|
||||
from ytdl_sub.utils.file_handler import FileMetadata
|
||||
from ytdl_sub.validators.audo_codec_validator import AUDIO_CODEC_EXTS
|
||||
from ytdl_sub.validators.audo_codec_validator import AUDIO_CODEC_TYPES_EXTENSION_MAPPING
|
||||
from ytdl_sub.validators.audo_codec_validator import AudioTypeValidator
|
||||
from ytdl_sub.validators.validators import FloatValidator
|
||||
|
|
@ -49,7 +51,7 @@ class AudioExtractOptions(OptionsDictValidator):
|
|||
def codec(self) -> str:
|
||||
"""
|
||||
The codec to output after extracting the audio. Supported codecs are aac, flac, mp3, m4a,
|
||||
opus, vorbis, wav.
|
||||
opus, vorbis, wav, and best to grab the best possible format at runtime.
|
||||
"""
|
||||
return self._codec
|
||||
|
||||
|
|
@ -105,12 +107,39 @@ class AudioExtractPlugin(Plugin[AudioExtractOptions]):
|
|||
FileNotDownloadedException
|
||||
If the audio file is not found
|
||||
"""
|
||||
new_ext = AUDIO_CODEC_TYPES_EXTENSION_MAPPING[self.plugin_options.codec]
|
||||
extracted_audio_file = entry.get_download_file_path().removesuffix(entry.ext) + new_ext
|
||||
extracted_audio_file = entry.get_download_file_path()
|
||||
|
||||
# yt-dlp doesn't record which ext is used, so try to find it
|
||||
if self.plugin_options.codec == "best":
|
||||
new_ext = "m4a"
|
||||
|
||||
for possible_ext in AUDIO_CODEC_EXTS:
|
||||
extracted_audio_file = (
|
||||
entry.get_download_file_path().removesuffix(entry.ext) + possible_ext
|
||||
)
|
||||
|
||||
if os.path.isfile(extracted_audio_file):
|
||||
new_ext = possible_ext
|
||||
break
|
||||
else:
|
||||
new_ext = AUDIO_CODEC_TYPES_EXTENSION_MAPPING[self.plugin_options.codec]
|
||||
extracted_audio_file = entry.get_download_file_path().removesuffix(entry.ext) + new_ext
|
||||
|
||||
entry.add_kwargs({"ext": new_ext})
|
||||
|
||||
if not self.is_dry_run:
|
||||
if not os.path.isfile(extracted_audio_file):
|
||||
raise FileNotDownloadedException("Failed to find the extracted audio file")
|
||||
|
||||
entry.add_kwargs({"ext": new_ext})
|
||||
|
||||
return entry
|
||||
|
||||
def post_process_entry(self, entry: Entry) -> Optional[FileMetadata]:
|
||||
"""
|
||||
Warn the user that best cannot infer the format that will be used at run-time.
|
||||
"""
|
||||
if self.plugin_options.codec == "best" and self.is_dry_run:
|
||||
return FileMetadata(
|
||||
"Caution: extracted audio with 'best' format is not known during dry-run. "
|
||||
"Defaulting to m4a."
|
||||
)
|
||||
return None
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
from typing import Dict
|
||||
from typing import List
|
||||
from typing import Optional
|
||||
from typing import Tuple
|
||||
|
||||
from ytdl_sub.config.plugin import Plugin
|
||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
||||
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
||||
from ytdl_sub.utils.datetime import to_date_range
|
||||
from ytdl_sub.utils.datetime import to_date_str
|
||||
from ytdl_sub.validators.string_datetime import StringDatetimeValidator
|
||||
|
||||
|
||||
|
|
@ -48,25 +48,25 @@ class DateRangeOptions(OptionsDictValidator):
|
|||
class DateRangePlugin(Plugin[DateRangeOptions]):
|
||||
plugin_options_type = DateRangeOptions
|
||||
|
||||
def ytdl_options(self) -> Optional[Dict]:
|
||||
def ytdl_options_match_filters(self) -> Tuple[List[str], List[str]]:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
YTDL options for setting a date range
|
||||
match filters for before (non-breaking) and after (breaking)
|
||||
"""
|
||||
ytdl_options_builder = YTDLOptionsBuilder()
|
||||
match_filters: List[str] = []
|
||||
breaking_match_filters: List[str] = []
|
||||
|
||||
source_date_range = to_date_range(
|
||||
before=self.plugin_options.before,
|
||||
after=self.plugin_options.after,
|
||||
overrides=self.overrides,
|
||||
)
|
||||
if source_date_range:
|
||||
ytdl_options_builder.add({"daterange": source_date_range})
|
||||
if self.plugin_options.before:
|
||||
before_str = to_date_str(
|
||||
date_validator=self.plugin_options.before, overrides=self.overrides
|
||||
)
|
||||
match_filters.append(f"upload_date < {before_str}")
|
||||
|
||||
# Only add break_on_reject if after is specified, but not before.
|
||||
# Otherwise, it can break on first metadata pull if it's after the 'before'
|
||||
if self.plugin_options.after and not self.plugin_options.before:
|
||||
ytdl_options_builder.add({"break_on_reject": True})
|
||||
if self.plugin_options.after:
|
||||
after_str = to_date_str(
|
||||
date_validator=self.plugin_options.after, overrides=self.overrides
|
||||
)
|
||||
breaking_match_filters.append(f"upload_date >= {after_str}")
|
||||
|
||||
return ytdl_options_builder.to_dict()
|
||||
return match_filters, breaking_match_filters
|
||||
|
|
|
|||
|
|
@ -131,13 +131,14 @@ class FileConvertPlugin(Plugin[FileConvertOptions]):
|
|||
"""
|
||||
if self.plugin_options.convert_with == "yt-dlp":
|
||||
return {
|
||||
"merge_output_format": self.plugin_options.convert_to,
|
||||
"postprocessors": [
|
||||
{
|
||||
"key": "FFmpegVideoRemuxer",
|
||||
"when": "post_process",
|
||||
"preferedformat": self.plugin_options.convert_to,
|
||||
}
|
||||
]
|
||||
],
|
||||
}
|
||||
return None
|
||||
|
||||
|
|
|
|||
44
src/ytdl_sub/plugins/format.py
Normal file
44
src/ytdl_sub/plugins/format.py
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
from typing import Dict
|
||||
from typing import Optional
|
||||
|
||||
from ytdl_sub.config.plugin import Plugin
|
||||
from ytdl_sub.config.preset_options import OptionsValidator
|
||||
from ytdl_sub.validators.validators import StringValidator
|
||||
|
||||
|
||||
class FormatOptions(OptionsValidator):
|
||||
"""
|
||||
Set ``--format`` to pass into yt-dlp to download a specific format quality.
|
||||
Uses the same syntax as yt-dlp.
|
||||
|
||||
Usage:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
presets:
|
||||
my_example_preset:
|
||||
format: "(bv*[height<=1080]+bestaudio/best[height<=1080])"
|
||||
"""
|
||||
|
||||
def __init__(self, name, value):
|
||||
super().__init__(name, value)
|
||||
self._format = StringValidator(name=name, value=value).value
|
||||
|
||||
@property
|
||||
def format(self) -> str:
|
||||
"""
|
||||
yt-dlp format, uses same syntax as yt-dlp.
|
||||
"""
|
||||
return self._format
|
||||
|
||||
|
||||
class FormatPlugin(Plugin[FormatOptions]):
|
||||
plugin_options_type = FormatOptions
|
||||
|
||||
def ytdl_options(self) -> Optional[Dict]:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
yt-dlp format
|
||||
"""
|
||||
return {"format": self.plugin_options.format}
|
||||
|
|
@ -1,21 +1,61 @@
|
|||
import copy
|
||||
from typing import Any
|
||||
from typing import Dict
|
||||
from typing import List
|
||||
from typing import Optional
|
||||
|
||||
from yt_dlp import match_filter_func
|
||||
from typing import Tuple
|
||||
|
||||
from ytdl_sub.config.plugin import Plugin
|
||||
from ytdl_sub.config.plugin import PluginPriority
|
||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
||||
from ytdl_sub.entries.entry import Entry
|
||||
from ytdl_sub.entries.variables.kwargs import YTDL_SUB_MATCH_FILTER_REJECT
|
||||
from ytdl_sub.utils.logger import Logger
|
||||
from ytdl_sub.validators.validators import StringListValidator
|
||||
|
||||
logger = Logger.get("match_filters")
|
||||
|
||||
|
||||
def default_filters() -> Tuple[List[str], List[str]]:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
Default filters and breaking filters to always use
|
||||
"""
|
||||
return ["!is_live & !is_upcoming & !post_live"], []
|
||||
|
||||
|
||||
def combine_filters(filters: List[str], to_combine: List[str]) -> List[str]:
|
||||
"""
|
||||
Parameters
|
||||
----------
|
||||
filters
|
||||
User-defined match-filters
|
||||
to_combine
|
||||
Filters that need to be combined via AND to the original filters.
|
||||
These are derived from plugins
|
||||
|
||||
Returns
|
||||
-------
|
||||
merged filters
|
||||
|
||||
Raises
|
||||
------
|
||||
ValueError
|
||||
Only supports combining 1 filter at this time. Should never be hit by users
|
||||
"""
|
||||
if len(to_combine) == 0:
|
||||
return filters
|
||||
if not filters:
|
||||
return copy.deepcopy(to_combine)
|
||||
|
||||
if len(to_combine) > 1:
|
||||
raise ValueError("Match-filters to combine only supports 1 at this time")
|
||||
|
||||
output_filters: List[str] = []
|
||||
filter_to_combine: str = to_combine[0]
|
||||
|
||||
for match_filter in filters:
|
||||
output_filters.append(f"{match_filter} & {filter_to_combine}")
|
||||
|
||||
return output_filters
|
||||
|
||||
|
||||
class MatchFiltersOptions(OptionsDictValidator):
|
||||
"""
|
||||
Set ``--match-filters``` to pass into yt-dlp to filter entries from being downloaded.
|
||||
|
|
@ -46,7 +86,7 @@ class MatchFiltersOptions(OptionsDictValidator):
|
|||
# - "availability=?public"
|
||||
"""
|
||||
|
||||
_required_keys = {"filters"}
|
||||
_optional_keys = {"filters"}
|
||||
|
||||
@classmethod
|
||||
def partial_validate(cls, name: str, value: Any) -> None:
|
||||
|
|
@ -57,44 +97,25 @@ class MatchFiltersOptions(OptionsDictValidator):
|
|||
|
||||
def __init__(self, name, value):
|
||||
super().__init__(name, value)
|
||||
self._filters = self._validate_key(key="filters", validator=StringListValidator).list
|
||||
self._filters = self._validate_key_if_present(key="filters", validator=StringListValidator)
|
||||
|
||||
@property
|
||||
def filters(self) -> List[str]:
|
||||
"""
|
||||
The filters themselves. If used multiple times, the filter matches if at least one of the
|
||||
conditions are met. For logical AND's between match filters, use the ``&`` operator in
|
||||
a single match filter.
|
||||
a single match filter. These are applied when gathering metadata.
|
||||
"""
|
||||
return [validator.value for validator in self._filters]
|
||||
return [validator.value for validator in self._filters.list] if self._filters else []
|
||||
|
||||
|
||||
class MatchFiltersPlugin(Plugin[MatchFiltersOptions]):
|
||||
plugin_options_type = MatchFiltersOptions
|
||||
priority = PluginPriority(modify_entry=PluginPriority.MODIFY_ENTRY_FIRST)
|
||||
|
||||
def ytdl_options(self) -> Optional[Dict]:
|
||||
def ytdl_options_match_filters(self) -> Tuple[List[str], List[str]]:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
match_filter after calling the utility function for it
|
||||
match_filters to apply at the metadata stage
|
||||
"""
|
||||
match_filters: List[str] = []
|
||||
for filter_str in self.plugin_options.filters:
|
||||
logger.debug("Adding match-filter %s", filter_str)
|
||||
match_filters.append(filter_str)
|
||||
|
||||
return {
|
||||
"match_filter": match_filter_func(match_filters),
|
||||
}
|
||||
|
||||
def modify_entry(self, entry: Entry) -> Optional[Entry]:
|
||||
"""
|
||||
If an entry is marked as not being downloaded due to a match_filter reject,
|
||||
do not propagate the entry further (especially since there is no entry file!)
|
||||
"""
|
||||
if entry.kwargs_get(YTDL_SUB_MATCH_FILTER_REJECT, False):
|
||||
logger.info("Entry rejected by match-filter, skipping ..")
|
||||
return None
|
||||
|
||||
return entry
|
||||
return self.plugin_options.filters, []
|
||||
|
|
|
|||
|
|
@ -124,10 +124,13 @@ class FromSourceVariablesRegex(StrictDictValidator):
|
|||
class RegexOptions(OptionsDictValidator):
|
||||
r"""
|
||||
Performs regex matching on an entry's source or override variables. Regex can be used to filter
|
||||
entries from proceeding with download or capture groups to create new source variables. NOTE to
|
||||
use backslashes anywhere in your regex, i.e. ``\d``, you must add another backslash escape. This
|
||||
means ``\d`` should be written as ``\\d``. This is because YAML requires an escape for any
|
||||
backslash usage.
|
||||
entries from proceeding with download or capture groups to create new source variables.
|
||||
|
||||
NOTE that YAML differentiates between single-quote (``'``) and double-quote (``"``), which can
|
||||
affect regex. Double-quote implies string literals, i.e. ``"\n"`` is the literal chars ``\n``,
|
||||
whereas single-quote, ``'\n'`` gets evaluated to a new line. To escape ``\`` when using
|
||||
single-quote, use ``\\``. This is necessary if you want your regex to be something like
|
||||
``\d\n`` to match a number and adjacent new-line. It must be written as ``\\d\n``.
|
||||
|
||||
If you want to regex-search multiple source variables to create a logical OR effect, you can
|
||||
create an override variable that contains the concatenation of them, and search that with regex.
|
||||
|
|
@ -162,10 +165,10 @@ class RegexOptions(OptionsDictValidator):
|
|||
# This tries to scrape a date from the description and produce new
|
||||
# source variables
|
||||
match:
|
||||
- "([0-9]{4})-([0-9]{2})-([0-9]{2})"
|
||||
- '([0-9]{4})-([0-9]{2})-([0-9]{2})'
|
||||
# Exclude any entry where the description contains #short
|
||||
exclude:
|
||||
- "#short"
|
||||
- '#short'
|
||||
|
||||
# Each capture group creates these new source variables, respectively,
|
||||
# as well a sanitized version, i.e. `captured_upload_year_sanitized`
|
||||
|
|
|
|||
|
|
@ -3,13 +3,13 @@
|
|||
presets:
|
||||
|
||||
best_video_quality:
|
||||
format: "bestvideo+bestaudio/best"
|
||||
ytdl_options:
|
||||
format: "bestvideo+bestaudio/best"
|
||||
merge_output_format: "mp4"
|
||||
|
||||
max_1080p:
|
||||
format: "(bv*[height<=1080]+bestaudio/best[height<=1080])"
|
||||
ytdl_options:
|
||||
format: "(bv*[height<=1080]+bestaudio/best[height<=1080])"
|
||||
merge_output_format: "mp4"
|
||||
|
||||
chunk_initial_download:
|
||||
|
|
|
|||
|
|
@ -6,12 +6,13 @@ presets:
|
|||
- "_plex_base"
|
||||
- "_episode_base"
|
||||
- "_episode_video_tags"
|
||||
ytdl_options:
|
||||
format: "(bv*[ext=mp4][vcodec~='^((he|a)vc|h26[45])']+ba[ext=m4a]) / (bv[ext=mp4]*+ba[ext=m4a]/b)"
|
||||
format: "(bv*[ext=mp4][vcodec~='^((he|a)vc|h26[45])']+ba[ext=m4a]) / (bv[ext=mp4]*+ba[ext=m4a]/b)"
|
||||
overrides:
|
||||
tv_show_poster_file_name: "poster.jpg"
|
||||
tv_show_fanart_file_name: "fanart.jpg"
|
||||
season_poster_file_name: "Season {season_number_padded}/Season{season_number_padded}.jpg"
|
||||
file_convert:
|
||||
convert_to: "mp4" # webm doesn't play in many plex clients, so use mp4 instead
|
||||
|
||||
_jellyfin_tv_show:
|
||||
preset:
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
from abc import ABC
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
from ytdl_sub.config.config_validator import ConfigOptions
|
||||
from ytdl_sub.config.preset import Preset
|
||||
|
|
@ -8,8 +9,11 @@ from ytdl_sub.config.preset_options import OutputOptions
|
|||
from ytdl_sub.config.preset_options import Overrides
|
||||
from ytdl_sub.config.preset_options import YTDLOptions
|
||||
from ytdl_sub.downloaders.url.validators import MultiUrlValidator
|
||||
from ytdl_sub.utils.logger import Logger
|
||||
from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive
|
||||
|
||||
logger = Logger.get("subscription")
|
||||
|
||||
|
||||
class BaseSubscription(ABC):
|
||||
"""
|
||||
|
|
@ -43,10 +47,16 @@ class BaseSubscription(ABC):
|
|||
self._config_options = config_options
|
||||
self._preset_options = preset_options
|
||||
|
||||
migrated_file_name: Optional[str] = None
|
||||
if migrated_file_name_option := self.output_options.migrated_download_archive_name:
|
||||
migrated_file_name = self.overrides.apply_formatter(migrated_file_name_option)
|
||||
|
||||
# TODO: Do not include this as part of the subscription
|
||||
self._enhanced_download_archive = EnhancedDownloadArchive(
|
||||
file_name=self.overrides.apply_formatter(self.output_options.download_archive_name),
|
||||
working_directory=self.working_directory,
|
||||
output_directory=self.output_directory,
|
||||
migrated_file_name=migrated_file_name,
|
||||
)
|
||||
|
||||
@property
|
||||
|
|
|
|||
|
|
@ -1,17 +1,23 @@
|
|||
import copy
|
||||
from typing import Any
|
||||
from typing import Dict
|
||||
from typing import List
|
||||
from typing import Optional
|
||||
|
||||
from ytdl_sub.config.config_file import ConfigFile
|
||||
from ytdl_sub.config.preset import Preset
|
||||
from ytdl_sub.subscriptions.subscription_download import SubscriptionDownload
|
||||
from ytdl_sub.subscriptions.subscription_validators import SubscriptionValidator
|
||||
from ytdl_sub.utils.exceptions import ValidationException
|
||||
from ytdl_sub.utils.logger import Logger
|
||||
from ytdl_sub.utils.yaml import load_yaml
|
||||
from ytdl_sub.validators.validators import LiteralDictValidator
|
||||
|
||||
FILE_PRESET_APPLY_KEY = "__preset__"
|
||||
FILE_SUBSCRIPTION_VALUE_KEY = "__value__"
|
||||
|
||||
logger = Logger.get("subscription")
|
||||
|
||||
|
||||
class Subscription(SubscriptionDownload):
|
||||
@classmethod
|
||||
|
|
@ -63,6 +69,28 @@ class Subscription(SubscriptionDownload):
|
|||
config=config,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def _maybe_get_subscription_value(
|
||||
cls, config: ConfigFile, subscription_dict: Dict
|
||||
) -> Optional[str]:
|
||||
subscription_value_key: Optional[str] = config.config_options.subscription_value
|
||||
if FILE_SUBSCRIPTION_VALUE_KEY in subscription_dict:
|
||||
if not isinstance(subscription_dict[FILE_SUBSCRIPTION_VALUE_KEY], str):
|
||||
raise ValidationException(
|
||||
f"Using {FILE_SUBSCRIPTION_VALUE_KEY} in a subscription"
|
||||
f"must be a string that corresponds to an override variable"
|
||||
)
|
||||
|
||||
subscription_value_key = subscription_dict[FILE_SUBSCRIPTION_VALUE_KEY]
|
||||
|
||||
if subscription_value_key is not None:
|
||||
logger.warning(
|
||||
"Using %s in a subscription will eventually be deprecated in favor of writing "
|
||||
"to the override variable `subscription_value`. Please update by Dec 2023.",
|
||||
FILE_SUBSCRIPTION_VALUE_KEY,
|
||||
)
|
||||
return subscription_value_key
|
||||
|
||||
@classmethod
|
||||
def from_file_path(cls, config: ConfigFile, subscription_path: str) -> List["Subscription"]:
|
||||
"""
|
||||
|
|
@ -90,7 +118,9 @@ class Subscription(SubscriptionDownload):
|
|||
subscription_dict = load_yaml(file_path=subscription_path)
|
||||
|
||||
has_file_preset = FILE_PRESET_APPLY_KEY in subscription_dict
|
||||
has_file_subscription_value = FILE_SUBSCRIPTION_VALUE_KEY in subscription_dict
|
||||
file_subscription_value: Optional[str] = cls._maybe_get_subscription_value(
|
||||
config=config, subscription_dict=subscription_dict
|
||||
)
|
||||
|
||||
# If a file preset is present...
|
||||
if has_file_preset:
|
||||
|
|
@ -104,50 +134,22 @@ class Subscription(SubscriptionDownload):
|
|||
config = copy.deepcopy(config)
|
||||
config.presets.dict[FILE_PRESET_APPLY_KEY] = file_preset.dict
|
||||
|
||||
if has_file_subscription_value:
|
||||
if not isinstance(subscription_dict[FILE_SUBSCRIPTION_VALUE_KEY], str):
|
||||
raise ValidationException(
|
||||
f"Using {FILE_SUBSCRIPTION_VALUE_KEY} in a subscription"
|
||||
f"must be a string that corresponds to an override variable"
|
||||
)
|
||||
subscriptions_dict: Dict[str, Any] = {
|
||||
key: obj
|
||||
for key, obj in subscription_dict.items()
|
||||
if key not in [FILE_PRESET_APPLY_KEY, FILE_SUBSCRIPTION_VALUE_KEY]
|
||||
}
|
||||
|
||||
for subscription_key, subscription_object in subscription_dict.items():
|
||||
|
||||
# Skip file preset or value
|
||||
if subscription_key in [FILE_PRESET_APPLY_KEY, FILE_SUBSCRIPTION_VALUE_KEY]:
|
||||
continue
|
||||
|
||||
# If the subscription obj is just a string, set it to the override variable
|
||||
# defined in FILE_SUBSCRIPTION_VALUE_KEY
|
||||
if isinstance(subscription_object, str) and has_file_subscription_value:
|
||||
subscription_object = {
|
||||
"overrides": {
|
||||
subscription_dict[FILE_SUBSCRIPTION_VALUE_KEY]: subscription_object
|
||||
}
|
||||
}
|
||||
elif isinstance(subscription_object, dict):
|
||||
pass
|
||||
elif isinstance(subscription_object, str) and not has_file_subscription_value:
|
||||
raise ValidationException(
|
||||
f"Subscription {subscription_key} is a string, but "
|
||||
f"{FILE_SUBSCRIPTION_VALUE_KEY} is not set to an override variable"
|
||||
)
|
||||
else:
|
||||
raise ValidationException(
|
||||
f"Subscription {subscription_key} should be in the form of a preset"
|
||||
)
|
||||
|
||||
# If it has file_preset, inject it as a parent preset
|
||||
if has_file_preset:
|
||||
parent_preset = subscription_object.get("preset", [])
|
||||
# Preset can be a single string
|
||||
if isinstance(parent_preset, str):
|
||||
parent_preset = [parent_preset]
|
||||
|
||||
# If it's not a string or list, it will fail downstream
|
||||
if isinstance(parent_preset, list):
|
||||
subscription_object["preset"] = parent_preset + [FILE_PRESET_APPLY_KEY]
|
||||
subscriptions_dicts = SubscriptionValidator(
|
||||
name="",
|
||||
value=subscriptions_dict,
|
||||
config=config,
|
||||
presets=[FILE_PRESET_APPLY_KEY] if has_file_preset else [],
|
||||
indent_overrides=[],
|
||||
subscription_value=file_subscription_value,
|
||||
).subscription_dicts()
|
||||
|
||||
for subscription_key, subscription_object in subscriptions_dicts.items():
|
||||
subscriptions.append(
|
||||
cls.from_dict(
|
||||
config=config,
|
||||
|
|
|
|||
|
|
@ -295,6 +295,9 @@ class SubscriptionDownload(BaseSubscription, ABC):
|
|||
continue
|
||||
|
||||
entry = downloader.download(entry)
|
||||
if entry is None:
|
||||
continue
|
||||
|
||||
entry_metadata = FileMetadata()
|
||||
if isinstance(entry, tuple):
|
||||
entry, entry_metadata = entry
|
||||
|
|
|
|||
208
src/ytdl_sub/subscriptions/subscription_validators.py
Normal file
208
src/ytdl_sub/subscriptions/subscription_validators.py
Normal file
|
|
@ -0,0 +1,208 @@
|
|||
import copy
|
||||
from abc import ABC
|
||||
from abc import abstractmethod
|
||||
from typing import Dict
|
||||
from typing import List
|
||||
from typing import Optional
|
||||
|
||||
from ytdl_sub.config.config_file import ConfigFile
|
||||
from ytdl_sub.config.preset_options import Overrides
|
||||
from ytdl_sub.validators.validators import DictValidator
|
||||
from ytdl_sub.validators.validators import StringListValidator
|
||||
from ytdl_sub.validators.validators import StringValidator
|
||||
from ytdl_sub.validators.validators import Validator
|
||||
|
||||
|
||||
def subscription_indent_variable_name(index: int) -> str:
|
||||
"""
|
||||
Parameters
|
||||
----------
|
||||
index
|
||||
0th-based index
|
||||
|
||||
Returns
|
||||
-------
|
||||
subscription_index_i, where i is 1-based index
|
||||
"""
|
||||
return f"subscription_indent_{index + 1}"
|
||||
|
||||
|
||||
def subscription_value_variable_name() -> str:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
The override variable name containing the subscription value if present
|
||||
"""
|
||||
return "subscription_value"
|
||||
|
||||
|
||||
def maybe_indent_override_value(value: str) -> Optional[str]:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
Value if it is an overide [Value]. None otherwise.
|
||||
"""
|
||||
if value.startswith("[") and value.endswith("]"):
|
||||
return value[1:-1]
|
||||
return None
|
||||
|
||||
|
||||
class SubscriptionOutput(Validator, ABC):
|
||||
def __init__(self, name, value, presets: List[str], indent_overrides: List[str]):
|
||||
super().__init__(name, value)
|
||||
self._presets = copy.deepcopy(presets)
|
||||
self._indent_overrides = copy.deepcopy(indent_overrides)
|
||||
|
||||
def _indent_overrides_dict(self) -> Dict[str, str]:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
indent overrides to merge with the preset dict's overrides
|
||||
"""
|
||||
return {
|
||||
subscription_indent_variable_name(i): self._indent_overrides[i]
|
||||
for i in range(len(self._indent_overrides))
|
||||
}
|
||||
|
||||
@abstractmethod
|
||||
def subscription_dicts(self) -> Dict[str, Dict]:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
Subscriptions in the form of ``{ subscription_name: preset_dict }``
|
||||
"""
|
||||
|
||||
|
||||
class SubscriptionPresetDictValidator(SubscriptionOutput, DictValidator):
|
||||
def __init__(self, name, value, presets: List[str], indent_overrides: List[str]):
|
||||
super().__init__(name=name, value=value, presets=presets, indent_overrides=indent_overrides)
|
||||
|
||||
_ = self._validate_key_if_present(key="preset", validator=StringListValidator, default=[])
|
||||
_ = self._validate_key_if_present(key="overrides", validator=Overrides, default={})
|
||||
|
||||
def subscription_dicts(self) -> Dict[str, Dict]:
|
||||
output_dict = copy.deepcopy(self._dict)
|
||||
parent_presets = output_dict.get("preset", [])
|
||||
|
||||
# Preset can be a single string
|
||||
if isinstance(parent_presets, str):
|
||||
parent_presets = [parent_presets]
|
||||
|
||||
output_dict["preset"] = parent_presets + self._presets
|
||||
output_dict["overrides"] = dict(
|
||||
output_dict.get("overrides", {}), **self._indent_overrides_dict()
|
||||
)
|
||||
return {self._leaf_name: output_dict}
|
||||
|
||||
|
||||
class SubscriptionValueValidator(SubscriptionOutput, StringValidator):
|
||||
def __init__(
|
||||
self,
|
||||
name,
|
||||
value,
|
||||
config: ConfigFile,
|
||||
presets: List[str],
|
||||
indent_overrides: List[str],
|
||||
subscription_value: Optional[str],
|
||||
):
|
||||
super().__init__(name=name, value=value, presets=presets, indent_overrides=indent_overrides)
|
||||
|
||||
if self._leaf_name in config.presets.keys:
|
||||
raise self._validation_exception(
|
||||
f"{self._leaf_name} conflicts with an existing preset name and cannot be "
|
||||
f"used as a subscription name"
|
||||
)
|
||||
|
||||
if subscription_value is None:
|
||||
raise self._validation_exception(
|
||||
f"Subscription {self._leaf_name} is a string, but the subscription value "
|
||||
f"is not set to an override variable"
|
||||
)
|
||||
|
||||
self._subscription_value: str = subscription_value
|
||||
|
||||
def subscription_dicts(self) -> Dict[str, Dict]:
|
||||
return {
|
||||
self._leaf_name: {
|
||||
"preset": self._presets,
|
||||
"overrides": dict(
|
||||
{
|
||||
self._subscription_value: self.value,
|
||||
"subscription_value": self.value,
|
||||
},
|
||||
**self._indent_overrides_dict(),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class SubscriptionValidator(SubscriptionOutput):
|
||||
"""
|
||||
Top-level subscription validator
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
name,
|
||||
value,
|
||||
config: ConfigFile,
|
||||
presets: List[str],
|
||||
indent_overrides: List[str],
|
||||
subscription_value: Optional[str],
|
||||
):
|
||||
super().__init__(name=name, value=value, presets=presets, indent_overrides=indent_overrides)
|
||||
self._children: List[SubscriptionOutput] = []
|
||||
|
||||
for key, obj in value.items():
|
||||
obj_name = f"{name}.{key}" if name else key
|
||||
|
||||
if isinstance(obj, str):
|
||||
self._children.append(
|
||||
SubscriptionValueValidator(
|
||||
name=obj_name,
|
||||
value=obj,
|
||||
config=config,
|
||||
presets=presets,
|
||||
indent_overrides=indent_overrides,
|
||||
subscription_value=subscription_value,
|
||||
)
|
||||
)
|
||||
elif isinstance(value, dict):
|
||||
if key in config.presets.keys:
|
||||
self._children.append(
|
||||
SubscriptionValidator(
|
||||
name=obj_name,
|
||||
value=obj,
|
||||
config=config,
|
||||
presets=presets + [key],
|
||||
indent_overrides=indent_overrides,
|
||||
subscription_value=subscription_value,
|
||||
)
|
||||
)
|
||||
elif override_value := maybe_indent_override_value(key):
|
||||
self._children.append(
|
||||
SubscriptionValidator(
|
||||
name=obj_name,
|
||||
value=obj,
|
||||
config=config,
|
||||
presets=presets,
|
||||
indent_overrides=indent_overrides + [override_value],
|
||||
subscription_value=subscription_value,
|
||||
)
|
||||
)
|
||||
else:
|
||||
self._children.append(
|
||||
SubscriptionPresetDictValidator(
|
||||
name=obj_name,
|
||||
value=obj,
|
||||
presets=presets,
|
||||
indent_overrides=indent_overrides,
|
||||
)
|
||||
)
|
||||
|
||||
def subscription_dicts(self) -> Dict[str, Dict]:
|
||||
subscription_dicts: Dict[str, Dict] = {}
|
||||
for child in self._children:
|
||||
subscription_dicts = dict(subscription_dicts, **child.subscription_dicts())
|
||||
|
||||
return subscription_dicts
|
||||
|
|
@ -5,20 +5,27 @@ from typing import Optional
|
|||
from typing import Type
|
||||
from typing import TypeVar
|
||||
|
||||
from yt_dlp import match_filter_func
|
||||
|
||||
from ytdl_sub.config.plugin import Plugin
|
||||
from ytdl_sub.config.preset import Preset
|
||||
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
||||
from ytdl_sub.plugins.audio_extract import AudioExtractPlugin
|
||||
from ytdl_sub.plugins.chapters import ChaptersPlugin
|
||||
from ytdl_sub.plugins.date_range import DateRangePlugin
|
||||
from ytdl_sub.plugins.file_convert import FileConvertPlugin
|
||||
from ytdl_sub.plugins.format import FormatPlugin
|
||||
from ytdl_sub.plugins.match_filters import MatchFiltersPlugin
|
||||
from ytdl_sub.plugins.match_filters import combine_filters
|
||||
from ytdl_sub.plugins.match_filters import default_filters
|
||||
from ytdl_sub.plugins.subtitles import SubtitlesPlugin
|
||||
from ytdl_sub.utils.ffmpeg import FFMPEG
|
||||
from ytdl_sub.utils.logger import Logger
|
||||
from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive
|
||||
|
||||
PluginT = TypeVar("PluginT", bound=Plugin)
|
||||
|
||||
logger = Logger.get("ytdl-options")
|
||||
|
||||
|
||||
class SubscriptionYTDLOptions:
|
||||
def __init__(
|
||||
|
|
@ -87,15 +94,67 @@ class SubscriptionYTDLOptions:
|
|||
return ytdl_options
|
||||
|
||||
def _plugin_ytdl_options(self, plugin: Type[PluginT]) -> Dict:
|
||||
if not (audio_extract_plugin := self._get_plugin(plugin)):
|
||||
return {}
|
||||
if plugin_obj := self._get_plugin(plugin):
|
||||
return plugin_obj.ytdl_options()
|
||||
|
||||
return audio_extract_plugin.ytdl_options()
|
||||
return {}
|
||||
|
||||
@property
|
||||
def _user_ytdl_options(self) -> Dict:
|
||||
return self._preset.ytdl_options.dict
|
||||
|
||||
@property
|
||||
def _plugin_match_filters(self) -> Dict:
|
||||
"""
|
||||
All match-filters from every plugin to fetch metadata.
|
||||
In order for other plugins to not collide with user-defined match-filters, do
|
||||
|
||||
match_filters = user_match_filters or {}
|
||||
for plugin in plugins:
|
||||
for filter in match_filters:
|
||||
AND plugin's match filters onto the existing filters
|
||||
|
||||
Otherwise, the filters separately act as an OR
|
||||
"""
|
||||
match_filters, breaking_match_filters = default_filters()
|
||||
|
||||
match_filters_plugin = self._get_plugin(MatchFiltersPlugin)
|
||||
if match_filters_plugin:
|
||||
(
|
||||
user_match_filters,
|
||||
user_breaking_match_filters,
|
||||
) = match_filters_plugin.ytdl_options_match_filters()
|
||||
match_filters = combine_filters(filters=user_match_filters, to_combine=match_filters)
|
||||
breaking_match_filters = combine_filters(
|
||||
filters=user_breaking_match_filters, to_combine=breaking_match_filters
|
||||
)
|
||||
|
||||
for plugin in self._plugins:
|
||||
# Do not re-add original match-filters plugin
|
||||
if isinstance(plugin, MatchFiltersPlugin):
|
||||
continue
|
||||
|
||||
pl_match_filters, pl_breaking_match_filters = plugin.ytdl_options_match_filters()
|
||||
|
||||
match_filters = combine_filters(filters=match_filters, to_combine=pl_match_filters)
|
||||
breaking_match_filters = combine_filters(
|
||||
filters=breaking_match_filters, to_combine=pl_breaking_match_filters
|
||||
)
|
||||
|
||||
logger.debug(
|
||||
"Setting match-filters: %s",
|
||||
"\n - ".join([""] + match_filters) if match_filters else "[]",
|
||||
)
|
||||
logger.debug(
|
||||
"Setting breaking-match-filters: %s",
|
||||
"\n - ".join([""] + breaking_match_filters) if breaking_match_filters else "[]",
|
||||
)
|
||||
return {
|
||||
"match_filter": match_filter_func(
|
||||
filters=match_filters, breaking_filters=breaking_match_filters
|
||||
)
|
||||
}
|
||||
|
||||
def metadata_builder(self) -> YTDLOptionsBuilder:
|
||||
"""
|
||||
Returns
|
||||
|
|
@ -106,7 +165,8 @@ class SubscriptionYTDLOptions:
|
|||
return YTDLOptionsBuilder().add(
|
||||
self._global_options,
|
||||
self._output_options,
|
||||
self._plugin_ytdl_options(DateRangePlugin),
|
||||
self._plugin_match_filters,
|
||||
self._plugin_ytdl_options(FormatPlugin),
|
||||
self._user_ytdl_options, # user ytdl options...
|
||||
self._info_json_only_options, # then info_json_only options
|
||||
)
|
||||
|
|
@ -121,11 +181,11 @@ class SubscriptionYTDLOptions:
|
|||
ytdl_options_builder = YTDLOptionsBuilder().add(
|
||||
self._global_options,
|
||||
self._output_options,
|
||||
self._plugin_ytdl_options(MatchFiltersPlugin),
|
||||
self._plugin_ytdl_options(FileConvertPlugin),
|
||||
self._plugin_ytdl_options(SubtitlesPlugin),
|
||||
self._plugin_ytdl_options(ChaptersPlugin),
|
||||
self._plugin_ytdl_options(AudioExtractPlugin),
|
||||
self._plugin_ytdl_options(FormatPlugin),
|
||||
self._user_ytdl_options, # user ytdl options...
|
||||
self._download_only_options, # then download_only options
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
from typing import Optional
|
||||
|
||||
from yt_dlp import DateRange
|
||||
from yt_dlp.utils import datetime_from_str
|
||||
|
||||
from ytdl_sub.config.preset_options import Overrides
|
||||
from ytdl_sub.validators.string_datetime import StringDatetimeValidator
|
||||
|
|
@ -29,3 +30,13 @@ def to_date_range(
|
|||
return DateRange(start=start, end=end)
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def to_date_str(date_validator: StringDatetimeValidator, overrides: Overrides) -> str:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
Date in the form of YYYYMMDD as a string
|
||||
"""
|
||||
date_str = overrides.apply_formatter(formatter=date_validator)
|
||||
return datetime_from_str(date_str).date().strftime("%Y%m%d")
|
||||
|
|
|
|||
|
|
@ -220,7 +220,14 @@ class Logger:
|
|||
|
||||
# Log validation exceptions as-is
|
||||
if isinstance(exception, ValidationException):
|
||||
logger.error(exception)
|
||||
logger.error(str(exception))
|
||||
# Log permission errors explicitly
|
||||
elif isinstance(exception, PermissionError):
|
||||
logger.error(
|
||||
"A permission error occurred:\n%s\n"
|
||||
"The user running ytdl-sub must have permission to this file/directory.",
|
||||
str(exception),
|
||||
)
|
||||
# For other uncaught errors, log as bug:
|
||||
else:
|
||||
logger.exception("An uncaught error occurred:")
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ VIDEO_CODEC_EXTS: Set[str] = {"avi", "flv", "mkv", "mov", "mp4", "webm"}
|
|||
|
||||
class AudioTypeValidator(StringSelectValidator):
|
||||
_expected_value_type_name = "codec"
|
||||
_select_values = AUDIO_CODEC_TYPES
|
||||
_select_values = AUDIO_CODEC_TYPES.union({"best"}) # support 'best' in the audio extract plugin
|
||||
|
||||
|
||||
class FileTypeValidator(StringSelectValidator):
|
||||
|
|
|
|||
|
|
@ -93,6 +93,26 @@ class Validator(ABC):
|
|||
"""
|
||||
return validation_exception(self._name, error_message, exception_class)
|
||||
|
||||
@final
|
||||
@property
|
||||
def _root_name(self) -> str:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
"first" from the first.element.of.the.name
|
||||
"""
|
||||
return self._name.split(".")[0]
|
||||
|
||||
@final
|
||||
@property
|
||||
def _leaf_name(self) -> str:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
"first" from the first.element.of.the.name
|
||||
"""
|
||||
return self._name.split(".")[-1]
|
||||
|
||||
|
||||
class ValueValidator(Validator, ABC, Generic[ValueT]):
|
||||
"""
|
||||
|
|
@ -179,16 +199,6 @@ class DictValidator(Validator):
|
|||
super().__init__(name, value)
|
||||
self.__validator_dict: Dict[str, Validator] = {}
|
||||
|
||||
@final
|
||||
@property
|
||||
def _root_name(self) -> str:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
"first" from the first.element.of.the.name
|
||||
"""
|
||||
return self._name.split(".")[0]
|
||||
|
||||
@final
|
||||
@property
|
||||
def _dict(self) -> dict:
|
||||
|
|
|
|||
|
|
@ -18,6 +18,9 @@ from ytdl_sub.entries.variables.kwargs import SPLIT_BY_CHAPTERS_PARENT_ENTRY
|
|||
from ytdl_sub.utils.file_handler import FileHandler
|
||||
from ytdl_sub.utils.file_handler import FileHandlerTransactionLog
|
||||
from ytdl_sub.utils.file_handler import FileMetadata
|
||||
from ytdl_sub.utils.logger import Logger
|
||||
|
||||
logger = Logger.get("archive")
|
||||
|
||||
|
||||
@dataclass
|
||||
|
|
@ -358,11 +361,25 @@ class EnhancedDownloadArchive:
|
|||
"""
|
||||
|
||||
@classmethod
|
||||
def _maybe_load_download_mappings(cls, mapping_file_path: str) -> DownloadMappings:
|
||||
def _maybe_load_download_mappings(
|
||||
cls, mapping_file_path: str, migrated_mapping_file_path: Optional[str]
|
||||
) -> DownloadMappings:
|
||||
"""
|
||||
Tries to load download mappings if a file exists. Otherwise returns empty mappings.
|
||||
"""
|
||||
# If a mapping file exists in the output directory, load it up.
|
||||
if migrated_mapping_file_path is not None:
|
||||
if os.path.isfile(migrated_mapping_file_path):
|
||||
logger.warning(
|
||||
"MIGRATION SUCCESSFUL, loading migrated archive file. Can now set "
|
||||
"`output_options.migrated_download_archive` to "
|
||||
"`output_options.download_archive`"
|
||||
)
|
||||
return DownloadMappings.from_file(migrated_mapping_file_path)
|
||||
|
||||
logger.warning(
|
||||
"MIGRATION DETECTED, will write archive file to %s", migrated_mapping_file_path
|
||||
)
|
||||
|
||||
if os.path.isfile(mapping_file_path):
|
||||
return DownloadMappings.from_file(json_file_path=mapping_file_path)
|
||||
return DownloadMappings()
|
||||
|
|
@ -373,14 +390,14 @@ class EnhancedDownloadArchive:
|
|||
working_directory: str,
|
||||
output_directory: str,
|
||||
dry_run: bool = False,
|
||||
migrated_file_name: Optional[str] = None,
|
||||
):
|
||||
self._file_name = file_name
|
||||
self._file_handler = FileHandler(
|
||||
working_directory=working_directory, output_directory=output_directory, dry_run=dry_run
|
||||
)
|
||||
self._download_mapping = self._maybe_load_download_mappings(
|
||||
mapping_file_path=self.output_file_path
|
||||
)
|
||||
self._download_mapping = DownloadMappings() # gets reinitialized
|
||||
self._migrated_file_name = migrated_file_name
|
||||
|
||||
self.num_entries_added: int = 0
|
||||
self.num_entries_modified: int = 0
|
||||
|
|
@ -415,7 +432,8 @@ class EnhancedDownloadArchive:
|
|||
dry_run=dry_run,
|
||||
)
|
||||
self._download_mapping = self._maybe_load_download_mappings(
|
||||
mapping_file_path=self.output_file_path
|
||||
mapping_file_path=self._output_file_path,
|
||||
migrated_mapping_file_path=self._migrated_file_path,
|
||||
)
|
||||
return self
|
||||
|
||||
|
|
@ -456,7 +474,7 @@ class EnhancedDownloadArchive:
|
|||
return self._file_name
|
||||
|
||||
@property
|
||||
def output_file_path(self) -> str:
|
||||
def _output_file_path(self) -> str:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
|
|
@ -464,6 +482,17 @@ class EnhancedDownloadArchive:
|
|||
"""
|
||||
return str(Path(self.output_directory) / self.file_name)
|
||||
|
||||
@property
|
||||
def _migrated_file_path(self) -> Optional[str]:
|
||||
"""
|
||||
Returns
|
||||
-------
|
||||
The migrated download mapping's file path in the output directory.
|
||||
"""
|
||||
if self._migrated_file_name:
|
||||
return str(Path(self.output_directory) / self._migrated_file_name)
|
||||
return None
|
||||
|
||||
@property
|
||||
def working_file_path(self) -> str:
|
||||
"""
|
||||
|
|
@ -543,7 +572,17 @@ class EnhancedDownloadArchive:
|
|||
-------
|
||||
self
|
||||
"""
|
||||
if not self.get_file_handler_transaction_log().is_empty:
|
||||
# If a migrated file name is present, always save to that file
|
||||
if self._migrated_file_name:
|
||||
self._download_mapping.to_file(output_json_file=self.working_file_path)
|
||||
self.save_file_to_output_directory(
|
||||
file_name=self.file_name, output_file_name=self._migrated_file_name
|
||||
)
|
||||
# and delete the old one if the name differs
|
||||
if self._file_name != self._migrated_file_name:
|
||||
self.delete_file_from_output_directory(file_name=self.file_name)
|
||||
# Otherwise, only save if there are changes to the transaction log
|
||||
elif not self.get_file_handler_transaction_log().is_empty:
|
||||
self._download_mapping.to_file(output_json_file=self.working_file_path)
|
||||
self.save_file_to_output_directory(file_name=self.file_name)
|
||||
return self
|
||||
|
|
|
|||
|
|
@ -11,9 +11,8 @@ def single_song_preset_dict_old_format(output_directory):
|
|||
"preset": "single",
|
||||
# test multi-tags
|
||||
"music_tags": {"embed_thumbnail": True, "tags": {"genres": ["multi_tag_1", "multi_tag_2"]}},
|
||||
# download the worst format so it is fast
|
||||
"format": "worst[ext=mp4]", # download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp4]",
|
||||
"postprocessor_args": {"ffmpeg": ["-bitexact"]}, # Must add this for reproducibility
|
||||
},
|
||||
"overrides": {
|
||||
|
|
@ -31,9 +30,8 @@ def single_song_preset_dict(output_directory):
|
|||
"music_tags": {"genres": ["multi_tag_1", "multi_tag_2"]},
|
||||
# test the new embed_thumbnail plugin
|
||||
"embed_thumbnail": True,
|
||||
# download the worst format so it is fast
|
||||
"format": "worst[ext=mp4]", # download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp4]",
|
||||
"postprocessor_args": {"ffmpeg": ["-bitexact"]}, # Must add this for reproducibility
|
||||
},
|
||||
"overrides": {
|
||||
|
|
@ -43,14 +41,18 @@ def single_song_preset_dict(output_directory):
|
|||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def single_song_best_format_preset_dict(single_song_preset_dict):
|
||||
return dict(single_song_preset_dict, **{"audio_extract": {"codec": "best"}})
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def multiple_songs_preset_dict(output_directory):
|
||||
return {
|
||||
"preset": "albums_from_playlists",
|
||||
"audio_extract": {"codec": "vorbis", "quality": 140},
|
||||
# download the worst format so it is fast
|
||||
"format": "worst[ext=mp4]", # download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp4]",
|
||||
"postprocessor_args": {"ffmpeg": ["-bitexact"]}, # Must add this for reproducibility
|
||||
},
|
||||
"overrides": {
|
||||
|
|
@ -88,7 +90,7 @@ class TestAudioExtract:
|
|||
)
|
||||
|
||||
@pytest.mark.parametrize("dry_run", [True, False])
|
||||
def test_audio_extract_single_song_new_format(
|
||||
def test_audio_extract_single_song(
|
||||
self,
|
||||
music_audio_config,
|
||||
single_song_preset_dict,
|
||||
|
|
@ -113,6 +115,32 @@ class TestAudioExtract:
|
|||
expected_download_summary_file_name="plugins/test_audio_extract_single.json",
|
||||
)
|
||||
|
||||
@pytest.mark.parametrize("dry_run", [True, False])
|
||||
def test_audio_extract_single_song_best_format(
|
||||
self,
|
||||
music_audio_config,
|
||||
single_song_best_format_preset_dict,
|
||||
output_directory,
|
||||
dry_run,
|
||||
):
|
||||
subscription = Subscription.from_dict(
|
||||
config=music_audio_config,
|
||||
preset_name="single_song_best_test",
|
||||
preset_dict=single_song_best_format_preset_dict,
|
||||
)
|
||||
|
||||
transaction_log = subscription.download(dry_run=dry_run)
|
||||
assert_transaction_log_matches(
|
||||
output_directory=output_directory,
|
||||
transaction_log=transaction_log,
|
||||
transaction_log_summary_file_name=f"plugins/test_audio_extract_single_best{'_dry_run' if dry_run else ''}.txt",
|
||||
)
|
||||
assert_expected_downloads(
|
||||
output_directory=output_directory,
|
||||
dry_run=dry_run,
|
||||
expected_download_summary_file_name=f"plugins/test_audio_extract_single_best{'_dry_run' if dry_run else ''}.json",
|
||||
)
|
||||
|
||||
@pytest.mark.parametrize("dry_run", [True, False])
|
||||
def test_audio_extract_multiple_songs(
|
||||
self,
|
||||
|
|
|
|||
|
|
@ -35,9 +35,8 @@ def sponsorblock_and_subs_preset_dict(output_directory) -> Dict:
|
|||
"Outro",
|
||||
],
|
||||
},
|
||||
# download the worst format so it is fast
|
||||
"format": "worst[ext=mp4]", # download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp4]",
|
||||
"postprocessor_args": {"ffmpeg": ["-bitexact"]}, # Must add this for reproducibility
|
||||
},
|
||||
"overrides": {"artist": "JMC"},
|
||||
|
|
|
|||
|
|
@ -15,9 +15,8 @@ def recent_preset_dict(output_directory):
|
|||
return {
|
||||
"preset": "tv_show",
|
||||
"date_range": {"after": "20150101"},
|
||||
# download the worst format so it is fast
|
||||
"format": "worst[ext=mp4]", # download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp4]",
|
||||
"max_views": 100000, # do not download the popular PJ concert
|
||||
},
|
||||
"overrides": {
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@ def preset_dict(output_directory):
|
|||
"preset": "music_video",
|
||||
"download": "https://www.youtube.com/watch?v=2zYF9JLHDmA",
|
||||
"output_options": {"output_directory": output_directory},
|
||||
# download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"postprocessor_args": {"ffmpeg": ["-bitexact"]}, # Must add this for reproducibility
|
||||
},
|
||||
|
|
@ -25,7 +24,6 @@ def playlist_preset_dict(output_directory):
|
|||
"preset": "music_video",
|
||||
"download": "https://www.youtube.com/playlist?list=PL5BC0FC26BECA5A35",
|
||||
"output_options": {"output_directory": output_directory},
|
||||
# download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"postprocessor_args": {"ffmpeg": ["-bitexact"]}, # Must add this for reproducibility
|
||||
},
|
||||
|
|
@ -33,7 +31,34 @@ def playlist_preset_dict(output_directory):
|
|||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def livestream_preset_dict(output_directory):
|
||||
return {
|
||||
"preset": "music_video",
|
||||
"download": "https://www.youtube.com/watch?v=DoUOrTJbIu4",
|
||||
"output_options": {"output_directory": output_directory},
|
||||
"ytdl_options": {
|
||||
"postprocessor_args": {"ffmpeg": ["-bitexact"]},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
class TestFileConvert:
|
||||
def test_livestreams_download_filtered(
|
||||
self,
|
||||
music_video_config,
|
||||
livestream_preset_dict,
|
||||
output_directory,
|
||||
):
|
||||
subscription = Subscription.from_dict(
|
||||
config=music_video_config,
|
||||
preset_name="match_filter_test",
|
||||
preset_dict=livestream_preset_dict,
|
||||
)
|
||||
|
||||
transaction_log = subscription.download(dry_run=False)
|
||||
assert transaction_log.is_empty
|
||||
|
||||
@pytest.mark.parametrize("dry_run", [True, False])
|
||||
def test_match_filters_empty(
|
||||
self,
|
||||
|
|
|
|||
|
|
@ -13,9 +13,8 @@ def single_song_video_dict(output_directory):
|
|||
"output_options": {"output_directory": output_directory, "file_name": "will_error.mp4"},
|
||||
# test multi-tags
|
||||
"music_tags": {"genres": ["multi_tag_1", "multi_tag_2"]},
|
||||
# download the worst format so it is fast
|
||||
"format": "worst[ext=mp4]", # download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp4]",
|
||||
"postprocessor_args": {"ffmpeg": ["-bitexact"]}, # Must add this for reproducibility
|
||||
},
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,10 +11,7 @@ def subscription_dict(output_directory):
|
|||
"download": "https://www.youtube.com/shorts/ucYmEqmlhFw",
|
||||
# override the output directory with our fixture-generated dir
|
||||
"output_options": {"output_directory": output_directory},
|
||||
# download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "best[height<=480]",
|
||||
},
|
||||
"format": "best[height<=480]", # download the worst format so it is fast
|
||||
"nfo_tags": {
|
||||
"tags": {
|
||||
"kodi_safe_title 🎸": "kodi_safe_value 🎸",
|
||||
|
|
|
|||
|
|
@ -20,10 +20,7 @@ def regex_subscription_dict_base(output_directory):
|
|||
"download": "https://youtube.com/playlist?list=PL5BC0FC26BECA5A35",
|
||||
# override the output directory with our fixture-generated dir
|
||||
"output_options": {"output_directory": output_directory},
|
||||
# download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "best[height<=480]",
|
||||
},
|
||||
"format": "best[height<=480]", # download the worst format so it is fast
|
||||
"regex": {
|
||||
# tests that skip_if_match_fails defaults to True
|
||||
"from": {
|
||||
|
|
|
|||
|
|
@ -13,9 +13,8 @@ from ytdl_sub.utils.exceptions import ValidationException
|
|||
def yt_album_as_chapters_preset_dict(output_directory):
|
||||
return {
|
||||
"preset": "albums_from_chapters",
|
||||
# download the worst format so it is fast
|
||||
"format": "worst[ext=mp4]", # download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp4]",
|
||||
"postprocessor_args": {"ffmpeg": ["-bitexact"]}, # Must add this for reproducibility
|
||||
},
|
||||
"overrides": {
|
||||
|
|
|
|||
|
|
@ -18,10 +18,7 @@ def single_video_subs_embed_preset_dict(output_directory):
|
|||
"languages": ["en", "de"],
|
||||
"allow_auto_generated_subtitles": True,
|
||||
},
|
||||
# download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp4]",
|
||||
},
|
||||
"format": "worst[ext=mp4]", # download the worst format so it is fast
|
||||
"overrides": {"artist": "JMC"},
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,10 +9,7 @@ from ytdl_sub.subscriptions.subscription import Subscription
|
|||
def subscription_dict(output_directory):
|
||||
return {
|
||||
"preset": "soundcloud_discography",
|
||||
# download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp3]",
|
||||
},
|
||||
"format": "worst[ext=mp3]", # download the worst format so it is fast
|
||||
"overrides": {
|
||||
"track_artist": "j_b",
|
||||
"sc_artist_url": "https://soundcloud.com/jessebannon",
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@ from ytdl_sub.subscriptions.subscription import Subscription
|
|||
def channel_preset_dict(output_directory):
|
||||
return {
|
||||
"preset": "tv_show",
|
||||
"format": "worst[ext=mp4]", # download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp4]", # download the worst format so it is fast
|
||||
"max_views": 100000, # do not download the popular PJ concert
|
||||
"break_on_reject": False, # do not break from max views
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,9 +1,14 @@
|
|||
from pathlib import Path
|
||||
from typing import Dict
|
||||
|
||||
import pytest
|
||||
from conftest import assert_logs
|
||||
from e2e.conftest import mock_run_from_cli
|
||||
from expected_download import assert_expected_downloads
|
||||
from expected_transaction_log import assert_transaction_log_matches
|
||||
from mergedeep import mergedeep
|
||||
|
||||
from ytdl_sub.config.config_file import ConfigFile
|
||||
from ytdl_sub.downloaders.ytdlp import YTDLP
|
||||
from ytdl_sub.subscriptions.subscription import Subscription
|
||||
|
||||
|
|
@ -16,10 +21,7 @@ def playlist_preset_dict(output_directory):
|
|||
"season_by_collection__episode_by_year_month_day",
|
||||
"collection_season_1",
|
||||
],
|
||||
# download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp4]",
|
||||
},
|
||||
"format": "worst[ext=mp4]", # download the worst format so it is fast
|
||||
"output_directory_nfo_tags": {
|
||||
"nfo_name": "tvshow.nfo",
|
||||
"nfo_root": "test",
|
||||
|
|
@ -54,6 +56,50 @@ class TestPlaylist:
|
|||
files exist and have the expected md5 file hashes.
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def _ensure_subscription_migrates(
|
||||
cls,
|
||||
config: ConfigFile,
|
||||
subscription_name: str,
|
||||
subscription_dict: Dict,
|
||||
output_directory: Path,
|
||||
):
|
||||
# Ensure download archive migrates
|
||||
mergedeep.merge(
|
||||
subscription_dict,
|
||||
{
|
||||
"output_options": {
|
||||
"migrated_download_archive_name": ".ytdl-sub-{tv_show_name_sanitized}-download-archive.json"
|
||||
}
|
||||
},
|
||||
)
|
||||
migrated_subscription = Subscription.from_dict(
|
||||
config=config,
|
||||
preset_name=subscription_name,
|
||||
preset_dict=subscription_dict,
|
||||
)
|
||||
transaction_log = migrated_subscription.download()
|
||||
|
||||
assert_transaction_log_matches(
|
||||
output_directory=output_directory,
|
||||
transaction_log=transaction_log,
|
||||
transaction_log_summary_file_name="youtube/test_playlist_archive_migrated.txt",
|
||||
)
|
||||
assert_expected_downloads(
|
||||
output_directory=output_directory,
|
||||
dry_run=False,
|
||||
expected_download_summary_file_name="youtube/test_playlist_archive_migrated.json",
|
||||
)
|
||||
|
||||
# Ensure no changes after migration
|
||||
transaction_log = migrated_subscription.download()
|
||||
assert transaction_log.is_empty
|
||||
assert_expected_downloads(
|
||||
output_directory=output_directory,
|
||||
dry_run=False,
|
||||
expected_download_summary_file_name="youtube/test_playlist_archive_migrated.json",
|
||||
)
|
||||
|
||||
@pytest.mark.parametrize("dry_run", [True, False])
|
||||
def test_playlist_download(
|
||||
self,
|
||||
|
|
@ -87,16 +133,22 @@ class TestPlaylist:
|
|||
expected_message="ExistingVideoReached, stopping additional downloads",
|
||||
log_level="debug",
|
||||
):
|
||||
_ = playlist_subscription.download()
|
||||
transaction_log = playlist_subscription.download()
|
||||
|
||||
# TODO: output_directory_nfo is always rewritten, fix!
|
||||
# assert transaction_log.is_empty
|
||||
assert transaction_log.is_empty
|
||||
assert_expected_downloads(
|
||||
output_directory=output_directory,
|
||||
dry_run=dry_run,
|
||||
expected_download_summary_file_name="youtube/test_playlist.json",
|
||||
)
|
||||
|
||||
self._ensure_subscription_migrates(
|
||||
config=music_video_config,
|
||||
subscription_name="music_video_playlist_test",
|
||||
subscription_dict=playlist_preset_dict,
|
||||
output_directory=output_directory,
|
||||
)
|
||||
|
||||
@pytest.mark.parametrize("dry_run", [True, False])
|
||||
def test_playlist_download_from_cli_sub(
|
||||
self,
|
||||
|
|
@ -135,10 +187,9 @@ class TestPlaylist:
|
|||
expected_message="ExistingVideoReached, stopping additional downloads",
|
||||
log_level="debug",
|
||||
):
|
||||
_ = mock_run_from_cli(args=args)[0][1]
|
||||
transaction_log = mock_run_from_cli(args=args)[0][1]
|
||||
|
||||
# TODO: output_directory_nfo is always rewritten, fix!
|
||||
# assert transaction_log.is_empty
|
||||
assert transaction_log.is_empty
|
||||
assert_expected_downloads(
|
||||
output_directory=output_directory,
|
||||
dry_run=dry_run,
|
||||
|
|
|
|||
|
|
@ -23,12 +23,8 @@ def single_video_preset_dict_old_video_tags_format(output_directory):
|
|||
"output_directory": output_directory,
|
||||
"maintain_download_archive": False,
|
||||
},
|
||||
# embed thumb into the video
|
||||
"embed_thumbnail": True,
|
||||
# download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp4]",
|
||||
},
|
||||
"embed_thumbnail": True, # embed thumb into the video
|
||||
"format": "worst[ext=mp4]", # download the worst format so it is fast
|
||||
# also test video tags
|
||||
"video_tags": {
|
||||
"tags": {
|
||||
|
|
@ -49,12 +45,8 @@ def single_video_preset_dict(output_directory):
|
|||
"output_directory": output_directory,
|
||||
"maintain_download_archive": False,
|
||||
},
|
||||
# embed thumb into the video
|
||||
"embed_thumbnail": True,
|
||||
# download the worst format so it is fast
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp4]",
|
||||
},
|
||||
"embed_thumbnail": True, # embed thumb into the video
|
||||
"format": "worst[ext=mp4]", # download the worst format so it is fast
|
||||
# also test video tags
|
||||
"video_tags": {
|
||||
"title": "{title}",
|
||||
|
|
@ -76,8 +68,8 @@ def single_tv_show_video_nulled_values_preset_dict(output_directory):
|
|||
"thumbnail_name": "",
|
||||
"info_json_name": "",
|
||||
},
|
||||
"format": "worst[ext=mp4]",
|
||||
"ytdl_options": {
|
||||
"format": "worst[ext=mp4]",
|
||||
"max_downloads": 2,
|
||||
},
|
||||
# test override variables added by ytdl-sub
|
||||
|
|
|
|||
|
|
@ -28,6 +28,12 @@ def _get_files_in_directory(relative_directory: Path | str) -> List[Path]:
|
|||
return relative_file_paths
|
||||
|
||||
|
||||
def _get_file_md5_hash(full_file_path: str | Path) -> str:
|
||||
if str(full_file_path).endswith(".info.json"):
|
||||
return "INFO_JSON"
|
||||
return get_file_md5_hash(full_file_path=full_file_path)
|
||||
|
||||
|
||||
@dataclass
|
||||
class ExpectedDownloadFile:
|
||||
path: Path
|
||||
|
|
@ -79,9 +85,9 @@ class ExpectedDownloads:
|
|||
if IS_WINDOWS or path in ignore_md5_hashes_for or path.endswith(".info.json"):
|
||||
continue
|
||||
|
||||
md5_hash = get_file_md5_hash(full_file_path=full_path)
|
||||
md5_hash = _get_file_md5_hash(full_file_path=full_path)
|
||||
assert md5_hash in expected_download.md5, (
|
||||
f"MD5 hash for {str(expected_download.path)} does not match: "
|
||||
f"MD5 hash for {str(expected_download.path)} does not match: "
|
||||
f"{md5_hash} != {expected_download.md5}"
|
||||
)
|
||||
|
||||
|
|
@ -103,7 +109,7 @@ class ExpectedDownloads:
|
|||
def from_directory(cls, directory_path: str | Path) -> "ExpectedDownloads":
|
||||
relative_file_paths = _get_files_in_directory(relative_directory=directory_path)
|
||||
expected_downloads_dict = {
|
||||
str(file_path): get_file_md5_hash(full_file_path=Path(directory_path) / file_path)
|
||||
str(file_path): _get_file_md5_hash(full_file_path=Path(directory_path) / file_path)
|
||||
for file_path in relative_file_paths
|
||||
}
|
||||
return cls.from_dict(expected_downloads_dict)
|
||||
|
|
|
|||
|
|
@ -48,8 +48,6 @@ def assert_transaction_log_matches(
|
|||
# Split, ensure there are the same number of new lines
|
||||
summary_lines: List[str] = summary.split("\n")
|
||||
expected_summary_lines: List[str] = expected_summary.split("\n")
|
||||
print(summary_lines)
|
||||
print(expected_summary_lines)
|
||||
assert len(summary_lines) == len(
|
||||
expected_summary_lines
|
||||
), f"Summary number of lines differ: {len(summary_lines) != len(expected_summary_lines)}"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
".ytdl-sub-chapters_from_comments-download-archive.json": "122723ce8d257eebb05178daa26141f6",
|
||||
"JMC/JMC - Move 78 - Automated Improvisation [Full Album]-thumb.jpg": "c12e6a6f242680d1096a1a99d74a62c6",
|
||||
"JMC/JMC - Move 78 - Automated Improvisation [Full Album].info.json": "31d3e187632cffa84879027c9c7ddb2f",
|
||||
"JMC/JMC - Move 78 - Automated Improvisation [Full Album].mp4": "b82e8eb3f912a4ee2b14d90332fdce89",
|
||||
"JMC/JMC - Move 78 - Automated Improvisation [Full Album].info.json": "INFO_JSON",
|
||||
"JMC/JMC - Move 78 - Automated Improvisation [Full Album].mp4": "8f9842b656d0bd9107abde942f6b4b32",
|
||||
"JMC/JMC - Move 78 - Automated Improvisation [Full Album].nfo": "7a65b184d24c68fc0ec5380432250f5b"
|
||||
}
|
||||
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"Project ⧸ Zombie/.ytdl-sub-recent-download-archive.json": "ca7275efd7f2ebe489b8ca4007dc5361",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e102901 - Jesse's Minecraft Server | Teaser Trailer-thumb.jpg": "705ca4e0d99b37e9ecdf6bfe4b90c59b",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e102901 - Jesse's Minecraft Server | Teaser Trailer.info.json": "f249bd1137702b3db3d2805bbf4bfff8",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e102901 - Jesse's Minecraft Server | Teaser Trailer.info.json": "INFO_JSON",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e102901 - Jesse's Minecraft Server | Teaser Trailer.mp4": "dbb140af8676f34fb701d5199e8708ea",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e102901 - Jesse's Minecraft Server | Teaser Trailer.nfo": "ee5bee94667ed4f1d47af08384418d3c",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e110201 - Jesse's Minecraft Server | IP mc.jesse.id-thumb.jpg": "28d852ede73b879b9ebf9a061cfc7d46",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e110201 - Jesse's Minecraft Server | IP mc.jesse.id.info.json": "e143a26148069d0477dc45896afba93e",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e110201 - Jesse's Minecraft Server | IP mc.jesse.id.info.json": "INFO_JSON",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e110201 - Jesse's Minecraft Server | IP mc.jesse.id.mp4": "a1b58a20411fff51ba06c1fc31cadf1f",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e110201 - Jesse's Minecraft Server | IP mc.jesse.id.nfo": "c2f06f9eb5b42c777808a35587e5941e",
|
||||
"Project ⧸ Zombie/fanart.jpg": "129c6639b47299bc48062f0365e670ee",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"Project ⧸ Zombie/.ytdl-sub-recent-download-archive.json": "46170edaf7cc51e5f59ef5d4c0476200",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e110201 - Jesse's Minecraft Server | IP mc.jesse.id-thumb.jpg": "28d852ede73b879b9ebf9a061cfc7d46",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e110201 - Jesse's Minecraft Server | IP mc.jesse.id.info.json": "e143a26148069d0477dc45896afba93e",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e110201 - Jesse's Minecraft Server | IP mc.jesse.id.info.json": "INFO_JSON",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e110201 - Jesse's Minecraft Server | IP mc.jesse.id.mp4": "a1b58a20411fff51ba06c1fc31cadf1f",
|
||||
"Project ⧸ Zombie/Season 2018/s2018.e110201 - Jesse's Minecraft Server | IP mc.jesse.id.nfo": "c2f06f9eb5b42c777808a35587e5941e",
|
||||
"Project ⧸ Zombie/fanart.jpg": "129c6639b47299bc48062f0365e670ee",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
".ytdl-sub-file_convert_test-download-archive.json": "65aa49c7345f9fc201e42ddc4a96b19b",
|
||||
"Beyond The Guitar/Beyond The Guitar - When you hear Hugh Jackman is returning as Wolverine in Deadpool 3-thumb.jpg": "662fcaadf6e80d63591bac19a5fdffb0",
|
||||
"Beyond The Guitar/Beyond The Guitar - When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.info.json": "5201f78cc65d5bb26aeea114e11d6264",
|
||||
"Beyond The Guitar/Beyond The Guitar - When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.mp4": "390177bcc076e309d1534b8bb5afdcc7",
|
||||
"Beyond The Guitar/Beyond The Guitar - When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.info.json": "INFO_JSON",
|
||||
"Beyond The Guitar/Beyond The Guitar - When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.mp4": "fa29d8b1482e37be643f1b4a127e5185",
|
||||
"Beyond The Guitar/Beyond The Guitar - When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.nfo": "cacf09ab38f9b3085da9c5af516cf22a"
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
".ytdl-sub-file_convert_test-download-archive.json": "74813dccf4e9732e49f5dc3c2d66f3be",
|
||||
"Beyond The Guitar/Beyond The Guitar - When you hear Hugh Jackman is returning as Wolverine in Deadpool 3-thumb.jpg": "662fcaadf6e80d63591bac19a5fdffb0",
|
||||
"Beyond The Guitar/Beyond The Guitar - When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.info.json": "20cf671c3a613d4aae8f5bfbf14feba0",
|
||||
"Beyond The Guitar/Beyond The Guitar - When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.info.json": "INFO_JSON",
|
||||
"Beyond The Guitar/Beyond The Guitar - When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.mkv": "b5f248b560f89f3f2a83fcdcd197d486",
|
||||
"Beyond The Guitar/Beyond The Guitar - When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.nfo": "cacf09ab38f9b3085da9c5af516cf22a"
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
".ytdl-sub-match_filter_test-download-archive.json": "6017105735dd8fdfe18932c9c048dccf",
|
||||
"Project Zombie/Project Zombie - Jesse's Minecraft Server [Trailer - Mar.21]-thumb.jpg": "e7830aa8a64b0cde65ba3f7e5fc56530",
|
||||
"Project Zombie/Project Zombie - Jesse's Minecraft Server [Trailer - Mar.21].info.json": "ea8e2d03835416861654e3cffed5e181",
|
||||
"Project Zombie/Project Zombie - Jesse's Minecraft Server [Trailer - Mar.21].info.json": "INFO_JSON",
|
||||
"Project Zombie/Project Zombie - Jesse's Minecraft Server [Trailer - Mar.21].nfo": "17c303f07e9b3af77c90975f843c95bd",
|
||||
"Project Zombie/Project Zombie - Jesse's Minecraft Server [Trailer - Mar.21].webm": "ad90ebef1ea6cbdb924670cdd7d1b9b9"
|
||||
}
|
||||
|
|
@ -1,15 +1,15 @@
|
|||
{
|
||||
".ytdl-sub-split_by_chapters_video-download-archive.json": "c3fb0b4f31caaa10ac7954ea93da33c4",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/01 - 01. Intro (Feat. Racheal Ofori & Barney Artist).mp3": "8827ac62201abeb94f44a46d91628aa8",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/02 - 02. Answers (Feat. Rick David & Kaya Thomas - Dyke).mp3": "f17e02119bf073c4ed98da2a960b85d3",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/03 - 03. Blaze (Feat. Kaya Thomas - Dyke).mp3": "63c0bc97cbdaf35203011378b1860418",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/04 - 04. What If (Interlude).mp3": "eb1a8533390243a5c4c49d8b6871c0ce",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/05 - 05. No Peace (Feat. Tom Misch).mp3": "a1b54772207228bd4922ad93d249c9f5",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/06 - 06. Closer (Feat. Lester Duval).mp3": "1d217264368d5f078e67691ea1b3df97",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/07 - 07. Delusions: Rumination (Interlude) (Feat. Racheal Ofori).mp3": "4d1a1728dbd69a30bbc2ffa354851169",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/08 - 08. Dreams (Feat. Carmody).mp3": "c204cf16f9f44945634c6171a5192e99",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/09 - 09. Dreaming (Interlude) (Feat. Racheal Ofori).mp3": "795e22297f8db00697563774328ffb3a",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/10 - 10. Hopeful (Feat. Jordan Rakei).mp3": "3904a5cd81b5ac43850b7858fb8dd378",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/11 - 11. Sunrise (Pillows) (Feat. Emmavie).mp3": "a89549db5b16ff76d04fd0bbbfba3424",
|
||||
".ytdl-sub-split_by_chapters_video-download-archive.json": "a4337aeeaded1a1ef5d4c17d8e5ed71f",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/01 - 01. Intro (Feat. Racheal Ofori & Barney Artist.mp3": "73a98c0f110519e42a5ef6629fd5c84d",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/02 - 02. Answers (Feat. Rick David & Kaya Thomas - Dyke.mp3": "37b52830e5860546548c1f1c73433c9f",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/03 - 03. Blaze (Feat. Kaya Thomas - Dyke.mp3": "44859cc006906ad20da3b5cc966636a3",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/04 - 04. What If (Interlude.mp3": "1e81ccbb8ca22e2a9ff7b7dc0e2264fe",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/05 - 05. No Peace (Feat. Tom Misch.mp3": "959ce7ebe3e39680c36c9e4b0472e138",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/06 - 06. Closer (Feat. Lester Duval.mp3": "f812f8614d95dfa535e2049d6344e0a8",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/07 - 07. Delusions: Rumination (Interlude) (Feat. Racheal Ofori.mp3": "d704c2e5c4c26ca11007c62880aa2f6e",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/08 - 08. Dreams (Feat. Carmody.mp3": "94cd88bc220e77239ac02affd3e676f9",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/09 - 09. Dreaming (Interlude) (Feat. Racheal Ofori.mp3": "d379a7f5d14dcc9432447a1751a14179",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/10 - 10. Hopeful (Feat. Jordan Rakei.mp3": "bd63f123d442166784df208b09e9c6b7",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/11 - 11. Sunrise (Pillows) (Feat. Emmavie.mp3": "7b5725a2d452d0457179084ce5d1c34e",
|
||||
"Proved Records/[2017] Alfa Mist - Nocturne [Full Album]/folder.jpg": "bd3685acc53072e591bae2505ecb0648"
|
||||
}
|
||||
|
|
@ -1,15 +1,15 @@
|
|||
{
|
||||
".ytdl-sub-split_by_chapters_with_regex_video-download-archive.json": "9798e8289742586d0efd295a97c6c906",
|
||||
"Alfa Mist/[2017] Nocturne/01 - Intro (Feat. Racheal Ofori & Barney Artist).mp3": "c10cff170976c3c5139f6073eeb3e25e",
|
||||
"Alfa Mist/[2017] Nocturne/02 - Answers (Feat. Rick David & Kaya Thomas - Dyke).mp3": "881ecdbee4a0d565c0ec6eacf03115df",
|
||||
"Alfa Mist/[2017] Nocturne/03 - Blaze (Feat. Kaya Thomas - Dyke).mp3": "aa5c6fbab58dd2be2660bfb65be6a172",
|
||||
"Alfa Mist/[2017] Nocturne/04 - What If (Interlude).mp3": "a64ce02ed1188276c9744f92cfc81e8e",
|
||||
"Alfa Mist/[2017] Nocturne/05 - No Peace (Feat. Tom Misch).mp3": "a6dbe96141515caa32f3df4f66e46f75",
|
||||
"Alfa Mist/[2017] Nocturne/06 - Closer (Feat. Lester Duval).mp3": "9b8ff5357109c376cce4bdd25e724d7b",
|
||||
"Alfa Mist/[2017] Nocturne/07 - Delusions: Rumination (Interlude) (Feat. Racheal Ofori).mp3": "022b077892b838c478c65ba3b5f00b55",
|
||||
"Alfa Mist/[2017] Nocturne/08 - Dreams (Feat. Carmody).mp3": "75c9c0f789c378c45bb176aa6cc6ec57",
|
||||
"Alfa Mist/[2017] Nocturne/09 - Dreaming (Interlude) (Feat. Racheal Ofori).mp3": "af59a3ac869249ac6ef2586fa6c59009",
|
||||
"Alfa Mist/[2017] Nocturne/10 - Hopeful (Feat. Jordan Rakei).mp3": "27d36f90dc87264c57e88f3663b29467",
|
||||
"Alfa Mist/[2017] Nocturne/11 - Sunrise (Pillows) (Feat. Emmavie).mp3": "be7085f9a536dfd2f70ce001c65a416c",
|
||||
".ytdl-sub-split_by_chapters_with_regex_video-download-archive.json": "d13f803a92fe9630d5e6fa6f1baa46a9",
|
||||
"Alfa Mist/[2017] Nocturne/01 - Intro (Feat. Racheal Ofori & Barney Artist.mp3": "98c381825f8e0358711c21d084bc3568",
|
||||
"Alfa Mist/[2017] Nocturne/02 - Answers (Feat. Rick David & Kaya Thomas - Dyke.mp3": "8c971f3f0ef230797b033043b49a8888",
|
||||
"Alfa Mist/[2017] Nocturne/03 - Blaze (Feat. Kaya Thomas - Dyke.mp3": "50e74885a2a19a11420dc8c27b96b7bd",
|
||||
"Alfa Mist/[2017] Nocturne/04 - What If (Interlude.mp3": "d655ca75ba791731c6c49b022188bb79",
|
||||
"Alfa Mist/[2017] Nocturne/05 - No Peace (Feat. Tom Misch.mp3": "14e8492c8784913a0acd3be9a496ad5d",
|
||||
"Alfa Mist/[2017] Nocturne/06 - Closer (Feat. Lester Duval.mp3": "2371ae9951b04b436ac2994aed6684cb",
|
||||
"Alfa Mist/[2017] Nocturne/07 - Delusions: Rumination (Interlude) (Feat. Racheal Ofori.mp3": "644754ff7bcf926b34109f5d263a21b7",
|
||||
"Alfa Mist/[2017] Nocturne/08 - Dreams (Feat. Carmody.mp3": "d9d6a014e453e3c6ede1544f3ec1bb03",
|
||||
"Alfa Mist/[2017] Nocturne/09 - Dreaming (Interlude) (Feat. Racheal Ofori.mp3": "ea833ef0f0af9c347d3f5920899b8b44",
|
||||
"Alfa Mist/[2017] Nocturne/10 - Hopeful (Feat. Jordan Rakei.mp3": "714fae9edfc7844411984e664ced7285",
|
||||
"Alfa Mist/[2017] Nocturne/11 - Sunrise (Pillows) (Feat. Emmavie.mp3": "871d94d7e402cc3a29e80a5150735873",
|
||||
"Alfa Mist/[2017] Nocturne/folder.jpg": "bd3685acc53072e591bae2505ecb0648"
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
".ytdl-sub-single_song_best_test-download-archive.json": "f179ccfe0a9b3a76ae62122a3ccb58fd",
|
||||
"YouTube/[2019] YouTube Rewind 2019: For the Record | #YouTubeRewind/01 - YouTube Rewind 2019: For the Record | #YouTubeRewind.m4a": "4b03133e9422a9ce196d271beb15ceef",
|
||||
"YouTube/[2019] YouTube Rewind 2019: For the Record | #YouTubeRewind/folder.jpg": "50ee47c80f679029f5d3503bb91b045a"
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
".ytdl-sub-sponsorblock_with_embedded_subs_test-download-archive.json": "40abc64a8fe93a10406bff1548a2cbe2",
|
||||
"JMC/JMC - This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case-thumb.jpg": "b5353a824a4800cc26f884e3025ed969",
|
||||
"JMC/JMC - This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.info.json": "324f582f8a69d3844019e650b382773f",
|
||||
"JMC/JMC - This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.mp4": "20a9ddbececcc2c75d6df06e88007b5c",
|
||||
"JMC/JMC - This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.info.json": "INFO_JSON",
|
||||
"JMC/JMC - This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.mp4": "2fc2083fe731c1d7e5305b79df31667a",
|
||||
"JMC/JMC - This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.nfo": "b9bd35e4f260c728774d8dd31f83637c"
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
".ytdl-sub-subtitles_embedded_test-download-archive.json": "1aa35c1d2663ac721f33f8374c00af1a",
|
||||
"JMC/JMC - YouTube Rewind 2019: For the Record | #YouTubeRewind-thumb.jpg": "50ee47c80f679029f5d3503bb91b045a",
|
||||
"JMC/JMC - YouTube Rewind 2019: For the Record | #YouTubeRewind.info.json": "7940facc211cb3e3956af3f2ad6f19fd",
|
||||
"JMC/JMC - YouTube Rewind 2019: For the Record | #YouTubeRewind.info.json": "INFO_JSON",
|
||||
"JMC/JMC - YouTube Rewind 2019: For the Record | #YouTubeRewind.mp4": "1f1f91f85b162c20596a2413e704b809",
|
||||
"JMC/JMC - YouTube Rewind 2019: For the Record | #YouTubeRewind.nfo": "c64964fab07574080e5da3242e3bfd48"
|
||||
}
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
"JMC/JMC - YouTube Rewind 2019: For the Record | #YouTubeRewind-thumb.jpg": "50ee47c80f679029f5d3503bb91b045a",
|
||||
"JMC/JMC - YouTube Rewind 2019: For the Record | #YouTubeRewind.de.srt": "b343c3bb9257b7ee7ba38f570a115b37",
|
||||
"JMC/JMC - YouTube Rewind 2019: For the Record | #YouTubeRewind.en.srt": "fe8c6ee92cae6e059fd80fd61691adbe",
|
||||
"JMC/JMC - YouTube Rewind 2019: For the Record | #YouTubeRewind.info.json": "a3f7906782db2be4aa43bdd1354e80bb",
|
||||
"JMC/JMC - YouTube Rewind 2019: For the Record | #YouTubeRewind.info.json": "INFO_JSON",
|
||||
"JMC/JMC - YouTube Rewind 2019: For the Record | #YouTubeRewind.mp4": "1f1f91f85b162c20596a2413e704b809",
|
||||
"JMC/JMC - YouTube Rewind 2019: For the Record | #YouTubeRewind.nfo": "c64964fab07574080e5da3242e3bfd48"
|
||||
}
|
||||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "456d8882fc5e35d74f19b386d1d9a059",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "44a703e77c8285e81fec57ed9000bb0c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "5f221fdf07f200a297427b5df953d96f",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "3fe91099a510c9dc820a0a7adba98868",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "240eb2e4df1abb10290f957d75f2522c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "e780d5e9e678d4aae5b131a5f3603695",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "0c58e78e7727c893226b9fcbe39b1791",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "4a4d542da434d5b3ff8d304f0e077469",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "8b75d7f6f6f84cccf1867a91d15044a6",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c",
|
||||
"Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9"
|
||||
|
|
|
|||
|
|
@ -1,35 +1,35 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "2bf8edeaf8b5658c4a42a9faa9bb2f60",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "3caee440547dd4ed46ec3cdca46978f2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "5f221fdf07f200a297427b5df953d96f",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "0b180b38ac673e7e320e9e615974fe41",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "240eb2e4df1abb10290f957d75f2522c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "5b26edd07c0534d53884d6a42908f8db",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "0c58e78e7727c893226b9fcbe39b1791",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.info.json": "629fb263cff2e93b7ec67769ebbc75e0",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.mp4": "e8b77ffd826f8f7233b875e311adaf34",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.nfo": "c1f5925e1eab8bd21e077df560879d94",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.info.json": "0a3998c019cc33845be703ca1bb448f9",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.mp4": "4343e692b53f0abce80559b59ef2fa0c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.nfo": "9fdbaa70187252b0d303d128123c4e83",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.info.json": "e891c1960d5c29b5e1e73c98ecf2e7f6",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.mp4": "dea5d69ae35e47aa78a51f464088a6ad",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.nfo": "5e5815bbc8b471df94d8536b117409f4",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.info.json": "fe18c65b99ca8942e65d777c9a498577",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.mp4": "b2f03dcefe44b8afc65b2500c873aec2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.nfo": "a86c62cd14e6a42dd79639a6155165fe",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "aeeb1be477400f34485799112a8121c2",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "8b75d7f6f6f84cccf1867a91d15044a6",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c",
|
||||
"Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,36 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json": "2bf8edeaf8b5658c4a42a9faa9bb2f60",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "5f221fdf07f200a297427b5df953d96f",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "240eb2e4df1abb10290f957d75f2522c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "0c58e78e7727c893226b9fcbe39b1791",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.mp4": "e8b77ffd826f8f7233b875e311adaf34",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.nfo": "c1f5925e1eab8bd21e077df560879d94",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.mp4": "4343e692b53f0abce80559b59ef2fa0c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.nfo": "9fdbaa70187252b0d303d128123c4e83",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.mp4": "dea5d69ae35e47aa78a51f464088a6ad",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.nfo": "5e5815bbc8b471df94d8536b117409f4",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.mp4": "b2f03dcefe44b8afc65b2500c873aec2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.nfo": "a86c62cd14e6a42dd79639a6155165fe",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "8b75d7f6f6f84cccf1867a91d15044a6",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c",
|
||||
"Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9"
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json": "456d8882fc5e35d74f19b386d1d9a059",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "5f221fdf07f200a297427b5df953d96f",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "240eb2e4df1abb10290f957d75f2522c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "0c58e78e7727c893226b9fcbe39b1791",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "8b75d7f6f6f84cccf1867a91d15044a6",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c",
|
||||
"Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9"
|
||||
}
|
||||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "456d8882fc5e35d74f19b386d1d9a059",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "bebd3dafb168c976a8c817e83a550ce2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "5f221fdf07f200a297427b5df953d96f",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "7543d21dcf2bd220a9ce4cd15f1e1578",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "240eb2e4df1abb10290f957d75f2522c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "921a343cf11be7cc492678459dbdd926",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "0c58e78e7727c893226b9fcbe39b1791",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "5757f06de01c68c5104ec7a7b0c6a69b",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "8b75d7f6f6f84cccf1867a91d15044a6",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c",
|
||||
"Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
|
|
|
|||
|
|
@ -1,35 +1,35 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "2bf8edeaf8b5658c4a42a9faa9bb2f60",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "3a613f0724932930ab746bcf9f8bdf42",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "5f221fdf07f200a297427b5df953d96f",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "a702f2b8e66c348ceb3ec1fd65956024",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "240eb2e4df1abb10290f957d75f2522c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "455e6a6bce2b8630d1a53e11c5554362",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "0c58e78e7727c893226b9fcbe39b1791",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.info.json": "04c2a406e17fb509e849c3d5ccac8b5e",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.mp4": "e8b77ffd826f8f7233b875e311adaf34",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.nfo": "c1f5925e1eab8bd21e077df560879d94",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.info.json": "b5960c859c450da1c40fe68951499a8f",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.mp4": "4343e692b53f0abce80559b59ef2fa0c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.nfo": "9fdbaa70187252b0d303d128123c4e83",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.info.json": "1892550ced3033c5b779324e39ef77ac",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.mp4": "dea5d69ae35e47aa78a51f464088a6ad",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.nfo": "5e5815bbc8b471df94d8536b117409f4",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.info.json": "03254329cabbac6a887801d1a3a4a9fc",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.mp4": "b2f03dcefe44b8afc65b2500c873aec2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.nfo": "a86c62cd14e6a42dd79639a6155165fe",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "09b731b1e404368cf7ce3fe8197e1de9",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "8b75d7f6f6f84cccf1867a91d15044a6",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c",
|
||||
"Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json": "2bf8edeaf8b5658c4a42a9faa9bb2f60",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "5f221fdf07f200a297427b5df953d96f",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "240eb2e4df1abb10290f957d75f2522c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "0c58e78e7727c893226b9fcbe39b1791",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.mp4": "e8b77ffd826f8f7233b875e311adaf34",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000005 - Mock Entry 20-7.nfo": "c1f5925e1eab8bd21e077df560879d94",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.mp4": "4343e692b53f0abce80559b59ef2fa0c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000006 - Mock Entry 20-6.nfo": "9fdbaa70187252b0d303d128123c4e83",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.mp4": "dea5d69ae35e47aa78a51f464088a6ad",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000007 - Mock Entry 20-5.nfo": "5e5815bbc8b471df94d8536b117409f4",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.mp4": "b2f03dcefe44b8afc65b2500c873aec2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000008 - Mock Entry 20-4.nfo": "a86c62cd14e6a42dd79639a6155165fe",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "8b75d7f6f6f84cccf1867a91d15044a6",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c",
|
||||
"Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
"Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a",
|
||||
"Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9"
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json": "456d8882fc5e35d74f19b386d1d9a059",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "5f221fdf07f200a297427b5df953d96f",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "240eb2e4df1abb10290f957d75f2522c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "0c58e78e7727c893226b9fcbe39b1791",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "8b75d7f6f6f84cccf1867a91d15044a6",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c",
|
||||
"Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
"Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a",
|
||||
"Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9"
|
||||
}
|
||||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "e30d83126c2c6981c936ed894a6f159b",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "44a703e77c8285e81fec57ed9000bb0c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "72205b53c6e2d477372e3d5bb3d35fff",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.nfo": "7c0f2a9d38bf617377e474fcb9bf2bc2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "3fe91099a510c9dc820a0a7adba98868",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "bc7ffede56ed138f592d76a3a02681ae",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.nfo": "1f4dec756555ee345cd9d6489b63e070",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "e780d5e9e678d4aae5b131a5f3603695",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "4825194cd6a037b79997cfb2d08ed444",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.nfo": "f6f704ae3ae0c4055590a147eb425609",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "4a4d542da434d5b3ff8d304f0e077469",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "efd9d3b1f941386c031e5899aa3042ed",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.nfo": "c6e0d368bfe9d70134e5a2ff2d3dccc6",
|
||||
"Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9"
|
||||
|
|
|
|||
|
|
@ -1,35 +1,35 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "126aec3c19ad3a56faceed442515faf5",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e060601 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e060601 - Mock Entry 20-7.info.json": "629fb263cff2e93b7ec67769ebbc75e0",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e060601 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e060601 - Mock Entry 20-7.mp4": "a44c49a4adb03fc619ff10a37025c09d",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e060601 - Mock Entry 20-7.nfo": "c4311723a97b1b299342aca9c079ffbc",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070601 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070601 - Mock Entry 20-6.info.json": "0a3998c019cc33845be703ca1bb448f9",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070601 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070601 - Mock Entry 20-6.mp4": "ca2a1e878e543c73e5d95c983580ea66",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070601 - Mock Entry 20-6.nfo": "2d3b121869944eeef9919765b6d10ec3",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070602 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070602 - Mock Entry 20-5.info.json": "e891c1960d5c29b5e1e73c98ecf2e7f6",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070602 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070602 - Mock Entry 20-5.mp4": "1ed7951cb4414e79f78f48176f9fc2c2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070602 - Mock Entry 20-5.nfo": "3b507ba7e4482c16ccd5b1a832c205eb",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080601 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080601 - Mock Entry 20-4.info.json": "fe18c65b99ca8942e65d777c9a498577",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080601 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080601 - Mock Entry 20-4.mp4": "fdc41ef1aceab35f2f229962ec4bb66a",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080601 - Mock Entry 20-4.nfo": "27e19fdc5941b870320b68f189e2c2ec",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "3caee440547dd4ed46ec3cdca46978f2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "72205b53c6e2d477372e3d5bb3d35fff",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.nfo": "7c0f2a9d38bf617377e474fcb9bf2bc2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "0b180b38ac673e7e320e9e615974fe41",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "bc7ffede56ed138f592d76a3a02681ae",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.nfo": "1f4dec756555ee345cd9d6489b63e070",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "5b26edd07c0534d53884d6a42908f8db",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "4825194cd6a037b79997cfb2d08ed444",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.nfo": "f6f704ae3ae0c4055590a147eb425609",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "aeeb1be477400f34485799112a8121c2",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "efd9d3b1f941386c031e5899aa3042ed",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.nfo": "c6e0d368bfe9d70134e5a2ff2d3dccc6",
|
||||
"Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9"
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "e30d83126c2c6981c936ed894a6f159b",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "bebd3dafb168c976a8c817e83a550ce2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "72205b53c6e2d477372e3d5bb3d35fff",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.nfo": "7c0f2a9d38bf617377e474fcb9bf2bc2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "7543d21dcf2bd220a9ce4cd15f1e1578",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "bc7ffede56ed138f592d76a3a02681ae",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.nfo": "1f4dec756555ee345cd9d6489b63e070",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "921a343cf11be7cc492678459dbdd926",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "4825194cd6a037b79997cfb2d08ed444",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.nfo": "f6f704ae3ae0c4055590a147eb425609",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "5757f06de01c68c5104ec7a7b0c6a69b",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "efd9d3b1f941386c031e5899aa3042ed",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.nfo": "c6e0d368bfe9d70134e5a2ff2d3dccc6",
|
||||
"Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
|
|
|
|||
|
|
@ -1,35 +1,35 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "126aec3c19ad3a56faceed442515faf5",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e060601 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e060601 - Mock Entry 20-7.info.json": "04c2a406e17fb509e849c3d5ccac8b5e",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e060601 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e060601 - Mock Entry 20-7.mp4": "a44c49a4adb03fc619ff10a37025c09d",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e060601 - Mock Entry 20-7.nfo": "c4311723a97b1b299342aca9c079ffbc",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070601 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070601 - Mock Entry 20-6.info.json": "b5960c859c450da1c40fe68951499a8f",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070601 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070601 - Mock Entry 20-6.mp4": "ca2a1e878e543c73e5d95c983580ea66",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070601 - Mock Entry 20-6.nfo": "2d3b121869944eeef9919765b6d10ec3",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070602 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070602 - Mock Entry 20-5.info.json": "1892550ced3033c5b779324e39ef77ac",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070602 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070602 - Mock Entry 20-5.mp4": "1ed7951cb4414e79f78f48176f9fc2c2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e070602 - Mock Entry 20-5.nfo": "3b507ba7e4482c16ccd5b1a832c205eb",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080601 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080601 - Mock Entry 20-4.info.json": "03254329cabbac6a887801d1a3a4a9fc",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080601 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080601 - Mock Entry 20-4.mp4": "fdc41ef1aceab35f2f229962ec4bb66a",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080601 - Mock Entry 20-4.nfo": "27e19fdc5941b870320b68f189e2c2ec",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "3a613f0724932930ab746bcf9f8bdf42",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "72205b53c6e2d477372e3d5bb3d35fff",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.nfo": "7c0f2a9d38bf617377e474fcb9bf2bc2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "a702f2b8e66c348ceb3ec1fd65956024",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "bc7ffede56ed138f592d76a3a02681ae",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.nfo": "1f4dec756555ee345cd9d6489b63e070",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "455e6a6bce2b8630d1a53e11c5554362",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "4825194cd6a037b79997cfb2d08ed444",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.nfo": "f6f704ae3ae0c4055590a147eb425609",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "09b731b1e404368cf7ce3fe8197e1de9",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "efd9d3b1f941386c031e5899aa3042ed",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.nfo": "c6e0d368bfe9d70134e5a2ff2d3dccc6",
|
||||
"Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "05539b932348da7e949a63eb71f77efc",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.info.json": "e780d5e9e678d4aae5b131a5f3603695",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.mp4": "5eafeb7a1c616dfe02c28fc902ce00fb",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.nfo": "88fee5353ad7eecd96865b34654bbde6",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.info.json": "3fe91099a510c9dc820a0a7adba98868",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.mp4": "e4a7144efa7039a03ae69460361ae518",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.nfo": "d781b80ef24916acbf3bf181ab32ddea",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.info.json": "44a703e77c8285e81fec57ed9000bb0c",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.mp4": "7566491129c54183e337e83455ab5bda",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.nfo": "252b3639b4d1686f8c79476943f89439",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.info.json": "4a4d542da434d5b3ff8d304f0e077469",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.mp4": "e94af7eed1fe7d2512d042979ca878dd",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.nfo": "e7374b766d9ec0599ecf209a0f78c0ba",
|
||||
"Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9"
|
||||
|
|
|
|||
|
|
@ -1,35 +1,35 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "6baee42e9095883c0ed77e6b5829e2c2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.info.json": "5b26edd07c0534d53884d6a42908f8db",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.mp4": "5eafeb7a1c616dfe02c28fc902ce00fb",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.nfo": "88fee5353ad7eecd96865b34654bbde6",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.info.json": "0b180b38ac673e7e320e9e615974fe41",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.mp4": "e4a7144efa7039a03ae69460361ae518",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.nfo": "d781b80ef24916acbf3bf181ab32ddea",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.info.json": "3caee440547dd4ed46ec3cdca46978f2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.mp4": "7566491129c54183e337e83455ab5bda",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.nfo": "252b3639b4d1686f8c79476943f89439",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14899 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14899 - Mock Entry 20-4.info.json": "fe18c65b99ca8942e65d777c9a498577",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14899 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14899 - Mock Entry 20-4.mp4": "0850f53dd2335ba57632128b9bb9d112",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14899 - Mock Entry 20-4.nfo": "4edc04aaea3799ef24bafe6afe4017e5",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17998 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17998 - Mock Entry 20-5.info.json": "e891c1960d5c29b5e1e73c98ecf2e7f6",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17998 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17998 - Mock Entry 20-5.mp4": "0dcd1a017948164d217f0bde59551655",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17998 - Mock Entry 20-5.nfo": "d7d3005d7a8b3feb7465e697cfb4cad4",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17999 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17999 - Mock Entry 20-6.info.json": "0a3998c019cc33845be703ca1bb448f9",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17999 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17999 - Mock Entry 20-6.mp4": "6c4b98bd5e32fbffef033f268d8587ae",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17999 - Mock Entry 20-6.nfo": "1832889c5a8010c28914ef5c9845e14f",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e20999 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e20999 - Mock Entry 20-7.info.json": "629fb263cff2e93b7ec67769ebbc75e0",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e20999 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e20999 - Mock Entry 20-7.mp4": "386aa9718db383c17aafc9a00d61d0f0",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e20999 - Mock Entry 20-7.nfo": "75a73feabcd828d88768c453ab13718e",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.info.json": "aeeb1be477400f34485799112a8121c2",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.mp4": "e94af7eed1fe7d2512d042979ca878dd",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.nfo": "e7374b766d9ec0599ecf209a0f78c0ba",
|
||||
"Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9"
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "05539b932348da7e949a63eb71f77efc",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.info.json": "921a343cf11be7cc492678459dbdd926",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.mp4": "5eafeb7a1c616dfe02c28fc902ce00fb",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.nfo": "88fee5353ad7eecd96865b34654bbde6",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.info.json": "7543d21dcf2bd220a9ce4cd15f1e1578",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.mp4": "e4a7144efa7039a03ae69460361ae518",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.nfo": "d781b80ef24916acbf3bf181ab32ddea",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.info.json": "bebd3dafb168c976a8c817e83a550ce2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.mp4": "7566491129c54183e337e83455ab5bda",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.nfo": "252b3639b4d1686f8c79476943f89439",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.info.json": "5757f06de01c68c5104ec7a7b0c6a69b",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.mp4": "e94af7eed1fe7d2512d042979ca878dd",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.nfo": "e7374b766d9ec0599ecf209a0f78c0ba",
|
||||
"Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
|
|
|
|||
|
|
@ -1,35 +1,35 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "6baee42e9095883c0ed77e6b5829e2c2",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.info.json": "455e6a6bce2b8630d1a53e11c5554362",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.mp4": "5eafeb7a1c616dfe02c28fc902ce00fb",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.nfo": "88fee5353ad7eecd96865b34654bbde6",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.info.json": "a702f2b8e66c348ceb3ec1fd65956024",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.mp4": "e4a7144efa7039a03ae69460361ae518",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.nfo": "d781b80ef24916acbf3bf181ab32ddea",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.info.json": "3a613f0724932930ab746bcf9f8bdf42",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.mp4": "7566491129c54183e337e83455ab5bda",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.nfo": "252b3639b4d1686f8c79476943f89439",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14899 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14899 - Mock Entry 20-4.info.json": "03254329cabbac6a887801d1a3a4a9fc",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14899 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14899 - Mock Entry 20-4.mp4": "0850f53dd2335ba57632128b9bb9d112",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e14899 - Mock Entry 20-4.nfo": "4edc04aaea3799ef24bafe6afe4017e5",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17998 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17998 - Mock Entry 20-5.info.json": "1892550ced3033c5b779324e39ef77ac",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17998 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17998 - Mock Entry 20-5.mp4": "0dcd1a017948164d217f0bde59551655",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17998 - Mock Entry 20-5.nfo": "d7d3005d7a8b3feb7465e697cfb4cad4",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17999 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17999 - Mock Entry 20-6.info.json": "b5960c859c450da1c40fe68951499a8f",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17999 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17999 - Mock Entry 20-6.mp4": "6c4b98bd5e32fbffef033f268d8587ae",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e17999 - Mock Entry 20-6.nfo": "1832889c5a8010c28914ef5c9845e14f",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e20999 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e20999 - Mock Entry 20-7.info.json": "04c2a406e17fb509e849c3d5ccac8b5e",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e20999 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e20999 - Mock Entry 20-7.mp4": "386aa9718db383c17aafc9a00d61d0f0",
|
||||
"Best Prebuilt TV Show by Date/Season 2020/s2020.e20999 - Mock Entry 20-7.nfo": "75a73feabcd828d88768c453ab13718e",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.info.json": "09b731b1e404368cf7ce3fe8197e1de9",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.mp4": "e94af7eed1fe7d2512d042979ca878dd",
|
||||
"Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.nfo": "e7374b766d9ec0599ecf209a0f78c0ba",
|
||||
"Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "5269b5e9e4fad7b63b6fdb3fef477b1e",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.info.json": "44a703e77c8285e81fec57ed9000bb0c",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.mp4": "776af67f6507b05700ff573ef9560aba",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.nfo": "4ba0e01c1e7295952c3f5e6b9b251d7d",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.info.json": "3fe91099a510c9dc820a0a7adba98868",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.mp4": "d83e7a55c37f8a5f3d18c4578bfc65af",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.nfo": "db9196b729c7b2cd26e3f0fc649b39f0",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.info.json": "e780d5e9e678d4aae5b131a5f3603695",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.mp4": "c1e00927a15da4afa48cdcb514610156",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.nfo": "ba4a387d9462f416ba176c31c1c55316",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.info.json": "4a4d542da434d5b3ff8d304f0e077469",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.mp4": "e1955b69689826e841c9b034209b7437",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.nfo": "93dd5c4c493422f9a60e61a6b965b39a",
|
||||
"Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9"
|
||||
|
|
|
|||
|
|
@ -1,35 +1,35 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "5c7b84a74e98bbbc6f5897742ba6dfec",
|
||||
"Best Prebuilt TV Show by Date/Season 202006/s202006.e0601 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202006/s202006.e0601 - Mock Entry 20-7.info.json": "629fb263cff2e93b7ec67769ebbc75e0",
|
||||
"Best Prebuilt TV Show by Date/Season 202006/s202006.e0601 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202006/s202006.e0601 - Mock Entry 20-7.mp4": "201f4f7a4cfb745b8befe75af83ef289",
|
||||
"Best Prebuilt TV Show by Date/Season 202006/s202006.e0601 - Mock Entry 20-7.nfo": "2742789534cd28d2b2c498df19b01070",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0601 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0601 - Mock Entry 20-6.info.json": "0a3998c019cc33845be703ca1bb448f9",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0601 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0601 - Mock Entry 20-6.mp4": "3acc0b8ad17afdf9396a3f7600307899",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0601 - Mock Entry 20-6.nfo": "a6c28bd2c7dece677bdfe342e1691a34",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0602 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0602 - Mock Entry 20-5.info.json": "e891c1960d5c29b5e1e73c98ecf2e7f6",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0602 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0602 - Mock Entry 20-5.mp4": "58fbeaa3e51e59ef3405464ab3bc46f1",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0602 - Mock Entry 20-5.nfo": "7a3a3d341795ab8b8f1faa5499ebe55c",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0601 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0601 - Mock Entry 20-4.info.json": "fe18c65b99ca8942e65d777c9a498577",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0601 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0601 - Mock Entry 20-4.mp4": "aa76dff1662eda9596791ca5076a8385",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0601 - Mock Entry 20-4.nfo": "0d38c0fe0b0bbbfd3fe78cb71e9b65f4",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.info.json": "3caee440547dd4ed46ec3cdca46978f2",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.mp4": "776af67f6507b05700ff573ef9560aba",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.nfo": "4ba0e01c1e7295952c3f5e6b9b251d7d",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.info.json": "0b180b38ac673e7e320e9e615974fe41",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.mp4": "d83e7a55c37f8a5f3d18c4578bfc65af",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.nfo": "db9196b729c7b2cd26e3f0fc649b39f0",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.info.json": "5b26edd07c0534d53884d6a42908f8db",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.mp4": "c1e00927a15da4afa48cdcb514610156",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.nfo": "ba4a387d9462f416ba176c31c1c55316",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.info.json": "aeeb1be477400f34485799112a8121c2",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.mp4": "e1955b69689826e841c9b034209b7437",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.nfo": "93dd5c4c493422f9a60e61a6b965b39a",
|
||||
"Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9"
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "5269b5e9e4fad7b63b6fdb3fef477b1e",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.info.json": "bebd3dafb168c976a8c817e83a550ce2",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.mp4": "776af67f6507b05700ff573ef9560aba",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.nfo": "4ba0e01c1e7295952c3f5e6b9b251d7d",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.info.json": "7543d21dcf2bd220a9ce4cd15f1e1578",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.mp4": "d83e7a55c37f8a5f3d18c4578bfc65af",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.nfo": "db9196b729c7b2cd26e3f0fc649b39f0",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.info.json": "921a343cf11be7cc492678459dbdd926",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.mp4": "c1e00927a15da4afa48cdcb514610156",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.nfo": "ba4a387d9462f416ba176c31c1c55316",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.info.json": "5757f06de01c68c5104ec7a7b0c6a69b",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.mp4": "e1955b69689826e841c9b034209b7437",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.nfo": "93dd5c4c493422f9a60e61a6b965b39a",
|
||||
"Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
|
|
|
|||
|
|
@ -1,35 +1,35 @@
|
|||
{
|
||||
"Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "5c7b84a74e98bbbc6f5897742ba6dfec",
|
||||
"Best Prebuilt TV Show by Date/Season 202006/s202006.e0601 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202006/s202006.e0601 - Mock Entry 20-7.info.json": "04c2a406e17fb509e849c3d5ccac8b5e",
|
||||
"Best Prebuilt TV Show by Date/Season 202006/s202006.e0601 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202006/s202006.e0601 - Mock Entry 20-7.mp4": "201f4f7a4cfb745b8befe75af83ef289",
|
||||
"Best Prebuilt TV Show by Date/Season 202006/s202006.e0601 - Mock Entry 20-7.nfo": "2742789534cd28d2b2c498df19b01070",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0601 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0601 - Mock Entry 20-6.info.json": "b5960c859c450da1c40fe68951499a8f",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0601 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0601 - Mock Entry 20-6.mp4": "3acc0b8ad17afdf9396a3f7600307899",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0601 - Mock Entry 20-6.nfo": "a6c28bd2c7dece677bdfe342e1691a34",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0602 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0602 - Mock Entry 20-5.info.json": "1892550ced3033c5b779324e39ef77ac",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0602 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0602 - Mock Entry 20-5.mp4": "58fbeaa3e51e59ef3405464ab3bc46f1",
|
||||
"Best Prebuilt TV Show by Date/Season 202007/s202007.e0602 - Mock Entry 20-5.nfo": "7a3a3d341795ab8b8f1faa5499ebe55c",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0601 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0601 - Mock Entry 20-4.info.json": "03254329cabbac6a887801d1a3a4a9fc",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0601 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0601 - Mock Entry 20-4.mp4": "aa76dff1662eda9596791ca5076a8385",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0601 - Mock Entry 20-4.nfo": "0d38c0fe0b0bbbfd3fe78cb71e9b65f4",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.info.json": "3a613f0724932930ab746bcf9f8bdf42",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.mp4": "776af67f6507b05700ff573ef9560aba",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.nfo": "4ba0e01c1e7295952c3f5e6b9b251d7d",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.info.json": "a702f2b8e66c348ceb3ec1fd65956024",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.mp4": "d83e7a55c37f8a5f3d18c4578bfc65af",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.nfo": "db9196b729c7b2cd26e3f0fc649b39f0",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.info.json": "455e6a6bce2b8630d1a53e11c5554362",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.mp4": "c1e00927a15da4afa48cdcb514610156",
|
||||
"Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.nfo": "ba4a387d9462f416ba176c31c1c55316",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.info.json": "09b731b1e404368cf7ce3fe8197e1de9",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.mp4": "e1955b69689826e841c9b034209b7437",
|
||||
"Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.nfo": "93dd5c4c493422f9a60e61a6b965b39a",
|
||||
"Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "4e5ef7394c029e7fe230f82dfe134e4c",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.info.json": "eaa3f351703b80239f15c03c5b727f31",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.mp4": "838968aa64d56f99166bc2867879da0d",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.nfo": "2a3d9b51221a541fefc29eebffe47cd4",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.info.json": "e8acab0ed714ef96a6d1463154996a5b",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.mp4": "1109271e45e1c7ce0652b4e8e567d6bb",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.nfo": "ec57b2c78058e18cdc015813e8a14b9d",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.info.json": "893ed940046b8a650af0072029292899",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.mp4": "57644342b3e0f8697328fff415fd9bd6",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.nfo": "cd919caf88b0eed99fd2a595c1afa6b1",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.info.json": "001f7b61786b4ecb207cdf45fc6838e8",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.mp4": "bae6a68cab905f3d67fe95de2c0b11b4",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.nfo": "7c4b28456fe5d398b7dad966eb194421",
|
||||
"Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "4e5ef7394c029e7fe230f82dfe134e4c",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.info.json": "23ea4fc60be000f224c60911133445c4",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.mp4": "838968aa64d56f99166bc2867879da0d",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.nfo": "2a3d9b51221a541fefc29eebffe47cd4",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.info.json": "473f212008eabbff7614e092e39c0e83",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.mp4": "1109271e45e1c7ce0652b4e8e567d6bb",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.nfo": "ec57b2c78058e18cdc015813e8a14b9d",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.info.json": "2ee2edf10085b2aa3a3a1cd1850cfab1",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.mp4": "57644342b3e0f8697328fff415fd9bd6",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.nfo": "cd919caf88b0eed99fd2a595c1afa6b1",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.info.json": "37c636ccbbbde5211290aa40e86c95ca",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.mp4": "bae6a68cab905f3d67fe95de2c0b11b4",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.nfo": "7c4b28456fe5d398b7dad966eb194421",
|
||||
"Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
|
|
|
|||
|
|
@ -1,35 +1,35 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "c7c2427315924db344d4659a60c59bc9",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.info.json": "28de4c86761f962a274f877676273f42",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.mp4": "3abb120022201c52f187795e5382e7d8",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.nfo": "7d8f03bdcd8ee66fd1578a86f20365cc",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "9ec937cc60b7e8fef0a6741033d539e3",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "f955993d7c3bd19a3f1974f9ca8fa8d5",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.info.json": "9cc088e0502239894663985c73cbb8d1",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.mp4": "65278e617ec6faae1fa5e1cc150b40bc",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.nfo": "39996f43e9761247dce614247f99c808",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.info.json": "376f0187fb4be474af0634cab27a94a3",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.mp4": "ae68c2c53268d732849149196e531935",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.nfo": "cae377877c966dad492eaa3f224b86ba",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.info.json": "753590baac8c807337d7be2c6a1bee17",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.mp4": "838968aa64d56f99166bc2867879da0d",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.nfo": "974bb83bd43b9579ab1716f66589ccc1",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.info.json": "eafd4c6ae0be81da688c25c305de550a",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.mp4": "1109271e45e1c7ce0652b4e8e567d6bb",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.nfo": "b12dcb09ffad7f23f21d350e1f60f128",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.info.json": "776544b88a36a0ed7842ad34b462947c",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.mp4": "57644342b3e0f8697328fff415fd9bd6",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.nfo": "e6fd0fc3e95b77c595d1a77c2060fd98",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.info.json": "fac6137b97e4db79621f55694fd5ed07",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.mp4": "bae6a68cab905f3d67fe95de2c0b11b4",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.nfo": "23386ea27c1e64afcecdb235acb81b79",
|
||||
"Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
|
|
|
|||
|
|
@ -1,35 +1,35 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "c7c2427315924db344d4659a60c59bc9",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.info.json": "d699b2e091b389dd470a8d6719b87d00",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.mp4": "3abb120022201c52f187795e5382e7d8",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.nfo": "7d8f03bdcd8ee66fd1578a86f20365cc",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "8318cac15f71dfaa373ebb8470288f82",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "f955993d7c3bd19a3f1974f9ca8fa8d5",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.info.json": "d7e89687663d7251635f6011acf76ca2",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.mp4": "65278e617ec6faae1fa5e1cc150b40bc",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.nfo": "39996f43e9761247dce614247f99c808",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.info.json": "d27c625857e68c56ffa89a199d21c1a2",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.mp4": "ae68c2c53268d732849149196e531935",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.nfo": "cae377877c966dad492eaa3f224b86ba",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.info.json": "eb87faf31e9521949e1d46caa9bdaeba",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.mp4": "838968aa64d56f99166bc2867879da0d",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.nfo": "974bb83bd43b9579ab1716f66589ccc1",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.info.json": "f9b1724b674ce5fe90ca3da72b9dce50",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.mp4": "1109271e45e1c7ce0652b4e8e567d6bb",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.nfo": "b12dcb09ffad7f23f21d350e1f60f128",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.info.json": "c21e448042a9ce3f81651726f8ac8586",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.mp4": "57644342b3e0f8697328fff415fd9bd6",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.nfo": "e6fd0fc3e95b77c595d1a77c2060fd98",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.info.json": "1ff4454ef2e877c2bb857da26aa59a0d",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.mp4": "bae6a68cab905f3d67fe95de2c0b11b4",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.nfo": "23386ea27c1e64afcecdb235acb81b79",
|
||||
"Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "809885e6c29bba06215b840516628090",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "001f7b61786b4ecb207cdf45fc6838e8",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "82258d5ed3062fc8fd986ec9bedec888",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.nfo": "ddf2763f976aaa79199bddbfd3b66501",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "893ed940046b8a650af0072029292899",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "d3c9d4918af48a3da67baabab3535e20",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.nfo": "cda58b9d5b7ee05d5e4d5144ebfe0f94",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "e8acab0ed714ef96a6d1463154996a5b",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "a464e06a6679b3de0dd332b0022aa7bb",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.nfo": "4d5775492f2731cb5dc04a84ebcb029d",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "eaa3f351703b80239f15c03c5b727f31",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "555fdada3339f0d359656478d9d171d2",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.nfo": "2980b224863465a8b8a465c9d381d1f4",
|
||||
"Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "809885e6c29bba06215b840516628090",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "82258d5ed3062fc8fd986ec9bedec888",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.nfo": "ddf2763f976aaa79199bddbfd3b66501",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "d3c9d4918af48a3da67baabab3535e20",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.nfo": "cda58b9d5b7ee05d5e4d5144ebfe0f94",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "a464e06a6679b3de0dd332b0022aa7bb",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.nfo": "4d5775492f2731cb5dc04a84ebcb029d",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "555fdada3339f0d359656478d9d171d2",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.nfo": "2980b224863465a8b8a465c9d381d1f4",
|
||||
"Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/tvshow.nfo": "a3f1061135b7aa0c25e5176a271d32f0"
|
||||
}
|
||||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "809885e6c29bba06215b840516628090",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "37c636ccbbbde5211290aa40e86c95ca",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "82258d5ed3062fc8fd986ec9bedec888",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.nfo": "ddf2763f976aaa79199bddbfd3b66501",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "2ee2edf10085b2aa3a3a1cd1850cfab1",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "d3c9d4918af48a3da67baabab3535e20",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.nfo": "cda58b9d5b7ee05d5e4d5144ebfe0f94",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "473f212008eabbff7614e092e39c0e83",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "a464e06a6679b3de0dd332b0022aa7bb",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.nfo": "4d5775492f2731cb5dc04a84ebcb029d",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "23ea4fc60be000f224c60911133445c4",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "555fdada3339f0d359656478d9d171d2",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.nfo": "2980b224863465a8b8a465c9d381d1f4",
|
||||
"Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "809885e6c29bba06215b840516628090",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "82258d5ed3062fc8fd986ec9bedec888",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.nfo": "ddf2763f976aaa79199bddbfd3b66501",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "d3c9d4918af48a3da67baabab3535e20",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.nfo": "cda58b9d5b7ee05d5e4d5144ebfe0f94",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "a464e06a6679b3de0dd332b0022aa7bb",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.nfo": "4d5775492f2731cb5dc04a84ebcb029d",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "555fdada3339f0d359656478d9d171d2",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.nfo": "2980b224863465a8b8a465c9d381d1f4",
|
||||
"Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
"Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a",
|
||||
"Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/tvshow.nfo": "a3f1061135b7aa0c25e5176a271d32f0"
|
||||
}
|
||||
|
|
@ -1,35 +1,35 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "7331c3a7cc0b43cd547b82af4ec35a3f",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "376f0187fb4be474af0634cab27a94a3",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "6ba89f1f4436cc71bbe572bcf5a4c077",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.nfo": "42ad110e3f608de3edb94735631d39a7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "9cc088e0502239894663985c73cbb8d1",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "86158254bbe1cd4de61f2f03d63c4afc",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.nfo": "ea4dee97b5bb9e49cb72f0942f851feb",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "9ec937cc60b7e8fef0a6741033d539e3",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "f955993d7c3bd19a3f1974f9ca8fa8d5",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "28de4c86761f962a274f877676273f42",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "68380cbe2709d869c965a8aee21217f9",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.nfo": "c487f013b8d5adc399a793bc803b898f",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "fac6137b97e4db79621f55694fd5ed07",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "82258d5ed3062fc8fd986ec9bedec888",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.nfo": "4eedc1c0e99858530e6228001d024766",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "776544b88a36a0ed7842ad34b462947c",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "d3c9d4918af48a3da67baabab3535e20",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.nfo": "cc1541a65508fcbfd9f024042cb6b6ce",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "eafd4c6ae0be81da688c25c305de550a",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "a464e06a6679b3de0dd332b0022aa7bb",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.nfo": "d5fa573faf1d29c367117917417df62c",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "753590baac8c807337d7be2c6a1bee17",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "555fdada3339f0d359656478d9d171d2",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.nfo": "6c40cd5d13c8d088e57906e809a591f8",
|
||||
"Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "7331c3a7cc0b43cd547b82af4ec35a3f",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "6ba89f1f4436cc71bbe572bcf5a4c077",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.nfo": "42ad110e3f608de3edb94735631d39a7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "86158254bbe1cd4de61f2f03d63c4afc",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.nfo": "ea4dee97b5bb9e49cb72f0942f851feb",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "f955993d7c3bd19a3f1974f9ca8fa8d5",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "68380cbe2709d869c965a8aee21217f9",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.nfo": "c487f013b8d5adc399a793bc803b898f",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "82258d5ed3062fc8fd986ec9bedec888",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.nfo": "4eedc1c0e99858530e6228001d024766",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "d3c9d4918af48a3da67baabab3535e20",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.nfo": "cc1541a65508fcbfd9f024042cb6b6ce",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "a464e06a6679b3de0dd332b0022aa7bb",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.nfo": "d5fa573faf1d29c367117917417df62c",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "555fdada3339f0d359656478d9d171d2",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.nfo": "6c40cd5d13c8d088e57906e809a591f8",
|
||||
"Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/season02-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/tvshow.nfo": "61943a17325c5188475651ca7c68446d"
|
||||
}
|
||||
|
|
@ -1,35 +1,35 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "7331c3a7cc0b43cd547b82af4ec35a3f",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "d27c625857e68c56ffa89a199d21c1a2",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "6ba89f1f4436cc71bbe572bcf5a4c077",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.nfo": "42ad110e3f608de3edb94735631d39a7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "d7e89687663d7251635f6011acf76ca2",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "86158254bbe1cd4de61f2f03d63c4afc",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.nfo": "ea4dee97b5bb9e49cb72f0942f851feb",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "8318cac15f71dfaa373ebb8470288f82",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "f955993d7c3bd19a3f1974f9ca8fa8d5",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "d699b2e091b389dd470a8d6719b87d00",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "68380cbe2709d869c965a8aee21217f9",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.nfo": "c487f013b8d5adc399a793bc803b898f",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "1ff4454ef2e877c2bb857da26aa59a0d",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "82258d5ed3062fc8fd986ec9bedec888",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.nfo": "4eedc1c0e99858530e6228001d024766",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "c21e448042a9ce3f81651726f8ac8586",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "d3c9d4918af48a3da67baabab3535e20",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.nfo": "cc1541a65508fcbfd9f024042cb6b6ce",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "f9b1724b674ce5fe90ca3da72b9dce50",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "a464e06a6679b3de0dd332b0022aa7bb",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.nfo": "d5fa573faf1d29c367117917417df62c",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "eb87faf31e9521949e1d46caa9bdaeba",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "555fdada3339f0d359656478d9d171d2",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.nfo": "6c40cd5d13c8d088e57906e809a591f8",
|
||||
"Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "7331c3a7cc0b43cd547b82af4ec35a3f",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "6ba89f1f4436cc71bbe572bcf5a4c077",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.nfo": "42ad110e3f608de3edb94735631d39a7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "86158254bbe1cd4de61f2f03d63c4afc",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.nfo": "ea4dee97b5bb9e49cb72f0942f851feb",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "f955993d7c3bd19a3f1974f9ca8fa8d5",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "68380cbe2709d869c965a8aee21217f9",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.nfo": "c487f013b8d5adc399a793bc803b898f",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "82258d5ed3062fc8fd986ec9bedec888",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.nfo": "4eedc1c0e99858530e6228001d024766",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "d3c9d4918af48a3da67baabab3535e20",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.nfo": "cc1541a65508fcbfd9f024042cb6b6ce",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "a464e06a6679b3de0dd332b0022aa7bb",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.nfo": "d5fa573faf1d29c367117917417df62c",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "555fdada3339f0d359656478d9d171d2",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.nfo": "6c40cd5d13c8d088e57906e809a591f8",
|
||||
"Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
"Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a",
|
||||
"Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/season02-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/tvshow.nfo": "61943a17325c5188475651ca7c68446d"
|
||||
}
|
||||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "ede1deeba072bae50f7f7039deca0543",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.info.json": "001f7b61786b4ecb207cdf45fc6838e8",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.mp4": "2ed76a1c5ca5aefc99cafbe45beb7968",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.nfo": "043c6de15ab09f32e64414d1f4a8a89c",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.info.json": "893ed940046b8a650af0072029292899",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.mp4": "e98fdf4ba39fa60c6349152c65352df7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.nfo": "4fb018858502fe2c7a0d3dcb89145a8d",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.info.json": "e8acab0ed714ef96a6d1463154996a5b",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.mp4": "1dd828f81bcb808ad91f6d1da8cce235",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.nfo": "6ac2ee3bd87b453d56bd90b42bbf52a0",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.info.json": "eaa3f351703b80239f15c03c5b727f31",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.mp4": "052709f404d1ec6a33c8a0b52e133c83",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.nfo": "d54ba1888f0083f8de6f401e399ad379",
|
||||
"Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "ede1deeba072bae50f7f7039deca0543",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.info.json": "37c636ccbbbde5211290aa40e86c95ca",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.mp4": "2ed76a1c5ca5aefc99cafbe45beb7968",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.nfo": "043c6de15ab09f32e64414d1f4a8a89c",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.info.json": "2ee2edf10085b2aa3a3a1cd1850cfab1",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.mp4": "e98fdf4ba39fa60c6349152c65352df7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.nfo": "4fb018858502fe2c7a0d3dcb89145a8d",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.info.json": "473f212008eabbff7614e092e39c0e83",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.mp4": "1dd828f81bcb808ad91f6d1da8cce235",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.nfo": "6ac2ee3bd87b453d56bd90b42bbf52a0",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.info.json": "23ea4fc60be000f224c60911133445c4",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.mp4": "052709f404d1ec6a33c8a0b52e133c83",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.nfo": "d54ba1888f0083f8de6f401e399ad379",
|
||||
"Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61",
|
||||
|
|
|
|||
|
|
@ -1,35 +1,35 @@
|
|||
{
|
||||
"Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "9b9e26ff3d036f450501bf5adb979aeb",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.info.json": "376f0187fb4be474af0634cab27a94a3",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.mp4": "98da10d4278b3b4fbc3a52a57ce8faea",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.nfo": "9ceac835c0166bf4f7354106379e6d17",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.info.json": "9cc088e0502239894663985c73cbb8d1",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.mp4": "2d964ed943027358d440b2c6faf00f56",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.nfo": "35f15e5437cae813095fe2ca3bd2ca18",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.info.json": "9ec937cc60b7e8fef0a6741033d539e3",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.mp4": "9a1a761fafc7213e30aedf7ba01e192e",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.nfo": "9aa69e4c86bb282ac57b2024ec2fbd34",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.info.json": "28de4c86761f962a274f877676273f42",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.mp4": "2d09a282c18e12c7b435ec9b0fcd83ba",
|
||||
"Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.nfo": "709533b6b8f501196db0d98dfe2b2b16",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.info.json": "fac6137b97e4db79621f55694fd5ed07",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.mp4": "2ed76a1c5ca5aefc99cafbe45beb7968",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.nfo": "05f34cd0e6be4b09ea96134faec892f6",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.info.json": "776544b88a36a0ed7842ad34b462947c",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.mp4": "e98fdf4ba39fa60c6349152c65352df7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.nfo": "54b4f84daf25626703f7b3a36b0dea49",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.info.json": "eafd4c6ae0be81da688c25c305de550a",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.mp4": "1dd828f81bcb808ad91f6d1da8cce235",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.nfo": "3d2644161e57b94cfac5e95732864cc3",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.info.json": "753590baac8c807337d7be2c6a1bee17",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.mp4": "052709f404d1ec6a33c8a0b52e133c83",
|
||||
"Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.nfo": "fd91adb2089d0fcdbb2e568a10ac880e",
|
||||
"Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7",
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue