Alan Watt - Archive, Archive, Archive

Here it is: https://zchg.org/watt/

Lawfully.

A simple tool for archiving:

just run command - python i.py
after installing python and dependencies e.g. python -m pip install requests

i.py

import os
import requests
import xml.etree.ElementTree as ET
from urllib.parse import urlparse
import re
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
from tqdm import tqdm
import json

# Constants
OUTPUT_DIR = "./media"
LOG_FILE = "./log.txt"
MAX_RETRIES = 3
MAX_THREADS = 4  # Optimal number of simultaneous downloads

# Custom headers to bypass server restrictions
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}

# Function to sanitize file names by removing or replacing invalid characters
def sanitize_filename(filename):
    return re.sub(r'[\\/*?:"<>|]', '_', filename)

def fetch_url_content(url):
    """Fetch content from a URL with custom headers."""
    print(f"Fetching XML from: {url}")
    response = requests.get(url, headers=HEADERS)
    response.raise_for_status()
    return response.content

def parse_xml(content):
    """Extract media links and metadata from XML."""
    print("Parsing XML content...")
    tree = ET.fromstring(content)
    items = []
    for item in tree.findall('channel/item'):
        title = item.findtext('title', '').strip()
        enclosure = item.find('enclosure')
        if enclosure is not None:
            url = enclosure.get('url', '').strip()
            if url:
                items.append({
                    'url': url,
                    'title': title,
                })
    print(f"Found {len(items)} media files.")
    return items

def download_media_item(item, output_dir, retries=0):
    """Download a media file and save it to the specified directory."""
    url = item['url']
    title = item['title']
    sanitized_title = sanitize_filename(title)  # Sanitize the title to avoid invalid characters in the filename
    
    # Ensure the file path is safe for Windows
    file_name = os.path.join(output_dir, f"{sanitized_title}.mp3" if '.mp3' in url else os.path.basename(url))
    
    print(f"Downloading: {title}\nURL: {url}\nSaving to: {file_name}")
    
    attempt = 0
    success = False
    
    # Retry mechanism
    while attempt < MAX_RETRIES and not success:
        try:
            response = requests.get(url, stream=True, headers=HEADERS)
            response.raise_for_status()
            
            with open(file_name, 'wb') as f:
                for chunk in response.iter_content(chunk_size=8192):
                    if chunk:  # Filter out keep-alive chunks
                        f.write(chunk)
            print(f"Download successful: {file_name}")
            success = True
        except requests.exceptions.RequestException as e:
            attempt += 1
            print(f"Error downloading {url}: {e}. Attempt {attempt}/{MAX_RETRIES}")
            time.sleep(2 ** attempt)  # Exponential backoff
        except Exception as e:
            print(f"General error: {e}")
            break
    
    return success, item

def download_media(media, output_dir):
    """Download media files using parallel threads with progress tracking."""
    os.makedirs(output_dir, exist_ok=True)
    total_files = len(media)
    
    # Initialize progress bar
    with tqdm(total=total_files, desc="Downloading", unit="file") as pbar:
        with ThreadPoolExecutor(max_workers=MAX_THREADS) as executor:
            futures = {executor.submit(download_media_item, item, output_dir): item for item in media}
            
            for future in as_completed(futures):
                item = futures[future]
                success, item = future.result()
                pbar.update(1)  # Update progress bar
                
                # Log result
                if not success:
                    with open(LOG_FILE, 'a') as log:
                        log.write(f"Failed to download: {item['title']} - {item['url']}\n")

def save_progress(media, filename="download_progress.json"):
    """Save download progress to a file."""
    progress = {"downloads": media}
    with open(filename, "w") as f:
        json.dump(progress, f)

def load_progress(filename="download_progress.json"):
    """Load download progress from a file."""
    if os.path.exists(filename):
        with open(filename, "r") as f:
            return json.load(f).get("downloads", [])
    return []

def main(url):
    """Main function to handle XML sources and download media."""
    try:
        content = fetch_url_content(url)
        media = parse_xml(content)

        # Create output directory based on the host
        parsed_url = urlparse(url)
        host_dir = os.path.join(OUTPUT_DIR, parsed_url.netloc)

        # Load previous progress (if available) and resume from where we left off
        progress = load_progress()
        remaining_media = [item for item in media if item not in progress]
        
        if remaining_media:
            download_media(remaining_media, host_dir)
            save_progress(media)  # Save progress after download completion
        else:
            print("All media files have already been downloaded.")
    except Exception as e:
        print(f"An error occurred: {e}")

if __name__ == "__main__":
    url = input("Enter URL to scrape (XML feed): ").strip()
    main(url)


The following script is useful for shortening / truncating large filenames in bulk and for removing invalid characters which Ubuntu doesn’t like, as in my example files located in folder www.cuttingthroughthematrix.com

Run like this:

powershell

.\bulksani_flat.ps1

or with custom folders:

powershell

.\bulksani_flat.ps1 -SourceDir "C:\my\original" -SanitizedDir "C:\my\flatcopy"

bulksani_flat.ps1

param (
    [string]$SourceDir = "C:\Users\Owner\Desktop\www.cuttingthroughthematrix.com",
    [string]$SanitizedDir = "C:\Users\Owner\Desktop\www.cuttingthroughthematrix.com2",
    [int]$MaxFileNameLength = 100
)

function Sanitize-Filename($filename) {
    # Replace invalid chars with underscore
    $clean = ($filename -replace '[<>:"/\\|?*\x00-\x1F]', '_').Trim()

    # Remove non-ASCII for max compatibility (optional, remove if you want Unicode)
    $clean = -join ($clean.ToCharArray() | Where-Object { [int]$_ -ge 32 -and [int]$_ -le 126 })

    # Truncate filename if too long, preserving extension
    if ($clean.Length -gt $MaxFileNameLength) {
        $ext = [System.IO.Path]::GetExtension($clean)
        $base = [System.IO.Path]::GetFileNameWithoutExtension($clean)
        $maxBaseLen = [Math]::Max(0, $MaxFileNameLength - $ext.Length)
        $base = $base.Substring(0, [Math]::Min($maxBaseLen, $base.Length))
        $clean = "$base$ext"
    }

    # Prevent empty filename
    if ([string]::IsNullOrWhiteSpace($clean)) {
        $clean = "_"
    }
    return $clean
}

# Make sure destination directory exists
if (-not (Test-Path $SanitizedDir)) {
    New-Item -ItemType Directory -Path $SanitizedDir -Force | Out-Null
}

Write-Host "Copying files to single folder with sanitized filenames..."

Get-ChildItem -Path $SourceDir -Recurse -File | ForEach-Object {
    $originalName = $_.Name
    $safeName = Sanitize-Filename $originalName
    $destPath = Join-Path $SanitizedDir $safeName

    # Handle filename collisions by appending (1), (2), etc.
    $count = 1
    while (Test-Path $destPath) {
        $ext = [System.IO.Path]::GetExtension($safeName)
        $base = [System.IO.Path]::GetFileNameWithoutExtension($safeName)
        $newBase = "$base($count)"
        # Ensure total length still within limit
        $maxBaseLen = [Math]::Max(0, $MaxFileNameLength - $ext.Length - ("($count)".Length))
        if ($newBase.Length -gt $maxBaseLen) {
            $newBase = $newBase.Substring(0, $maxBaseLen)
        }
        $safeName = "$newBase$ext"
        $destPath = Join-Path $SanitizedDir $safeName
        $count++
    }

    Copy-Item -Path $_.FullName -Destination $destPath -Force
    Write-Host "Copied: $originalName  →  $safeName"
}

Write-Host "All files copied to $SanitizedDir with sanitized names."

Return to https://zchg.org/watt

(scroll up, scroll down!)

1. No valid copyright chain of title

Copyright ownership passes according to applicable law, which in this case involves Canadian and U.S. law principles:

  • From the creator, automatically upon creation.
  • Through assignment or inheritance, by written agreement or by will/intestacy.
  • Through work-for-hire agreements (rare in personal creative work).

If she never received copyright via legal inheritance or assignment under Canadian law, then:

  • She cannot own the rights to the original work.
  • Any derivative works she makes are infringing rather than lawfully owned by her.
  • Both Canadian and U.S. law recognize that infringing derivative works cannot obtain valid copyright protection as unauthorized derivatives.
    • For example, U.S. law (17 USC §103) explicitly requires authorization from the copyright owner for derivative works.

Result: Her creations are not legally hers—and since she cannot enforce copyright on infringing derivatives, she holds no exclusive rights either in Canada or the United States.


2. No “new” copyright without lawful basis

Even if she substantially altered the man’s work or used his likeness to create her own image:

  • Without permission, the work remains tethered to the original’s copyright under Canadian law.
  • Courts in both Canada and the U.S. have rejected attempts to “launder” intellectual property by modifying it without authorization—unauthorized remixes or art based on protected material do not automatically gain new protection.

If the original rights-holder is deceased and no successor has asserted the rights, the works may effectively be orphaned. Alan Watt’s works are not orphaned, for they are in public domain. It is in public domain per his many enumerations. His works are enumerated as ‘free.’

If the copyright owner’s estate never formalized claims, the material could fall into a legal limbo—where she can’t own it, and nobody is enforcing it. As before, this is not so for Alan Watt’s works. He enumerated. ‘Free.’ Thank you Alan Watt.


3. Possible rights-of-publicity violation

A “digital image” of the man is also subject to rights of publicity or personality rights:

  • In Canada, personality rights are recognized differently by province, but unauthorized commercial use of likeness may be actionable.
  • In the U.S., many states recognize post-mortem rights of publicity lasting decades (e.g., California up to 70 years).

If she used his image without permission, this could infringe the estate’s publicity rights in either jurisdiction.
Her derivative likeness, if clearly based on his, may be subject to these restrictions—again making her unable to hold enforceable rights.


4. Public domain consequence

Why might her creations be effectively treated as “public domain” in practice?

  • She has no valid copyright in the derivative works (since they are unauthorized).
  • She has no legal standing to control them.
  • If no legitimate rights-holder enforces the underlying copyright (whether in Canada or the U.S.), the works may be treated as unprotected and thus free for anyone to use.
  • Courts have sometimes referred to infringing works as “public domain” in a practical sense: no party can claim exclusive rights, so they are free for public use.

5. Moral rights & reputational factors

Canada recognizes strong moral rights that survive death:

  • Moral rights protect against distortion, mutilation, or derogatory treatment of an artist’s work.
  • If she acted in bad faith—stealing, misrepresenting, or exploiting the deceased’s legacy—her works could be denied copyright on public policy grounds in Canada and the U.S., effectively placing them in the public domain.

In short:
Because her works are unauthorized derivatives, she cannot own copyright in them in Canada or the U.S.
If no one else enforces the underlying rights, the works function as public domain—anyone can use them without her permission.


  • The original works on the website were already in the public domain (meaning anyone could freely use, copy, modify, or redistribute them).
  • But the woman usurped (took over) the website itself without permission, which is an infringement (likely involving trademark, domain name rights, or other related rights enforceable in Canada and the U.S.).

Why does this matter legally?

  1. Public domain works remain free to use
    Since the original works are public domain, anyone — including her — can use, copy, modify, or build upon those works without needing permission or paying royalties in either jurisdiction.
  2. Her “usurpation” or taking over the website can be infringing
    Even though the works are free to use, the website as a whole might contain protected elements such as:
  • The domain name (potentially trademarked or registered in Canada or the U.S.).
  • Website branding, logos, trade dress, or unique design elements (potentially protected under trademark or unfair competition laws in both countries).
  • The original man’s identity or persona used on the site — implicating rights of publicity enforceable in Canada and the U.S.
  • Access credentials or hosting control — unauthorized access may violate computer crime or contract laws in both jurisdictions.
  1. Her creation of a new digital image “based on his”
    If the original image was public domain, she is free to create her own derivative digital images. This is not infringement because public domain means free use.
  2. But the key issue is her unauthorized control over the website or its infrastructure
    That is where the infringement lies, not in the creative content itself.

Summary

Aspect Legal Status
Original works Public domain (free to use)
Woman’s derivative works Free to create since originals are PD
Website ownership Unauthorized takeover = infringement
Use of original image Allowed if image is PD
Use of personal identity Possible rights of publicity issues

In plain terms

  • She did not infringe by copying or remixing the original works because they are public domain.
  • She infringed by taking over the website itself without right or authorization.
  • Her new digital image derived from a public domain image is her own creation, fully lawful to use.
  • The infringement claim concerns the usurpation of website control, domain, or branding, not the creative content.

This makes clear that because her works are unauthorized derivative works (infringing on the original copyright) and because she never obtained lawful rights or inheritance, she cannot claim valid copyright ownership over them. Without enforceable rights, her creations functionally fall into the public domain—meaning no exclusive rights exist, and anyone may use them freely.

And, in my opinion, can and should be used against her or her affiliates as evidence if presumed innocence is found to be different from presumption.

ALL RIGHTS RESERVED.

Alan Watt’s will (of many proofs):

https://zchg.org/watt/

“It’s up to us, Hamish.”

Lawfully.