CANADIAN AND AMERICAN CHARTS Upload destination: https://hartgenscripts.com/muze/ 1. WHAT TO UPLOAD Upload the CONTENTS of this folder into your existing muze directory: canadachartpositions.php chartartists.php chartcatalogue.php chartlists.php chartperiod.php chart-data/ (the complete folder, including its subfolders and hidden .htaccess) Keep every filename and subfolder unchanged. Do not upload just the PHP files: the chart-data folder contains the database required by them. The ZIP contains these files at its root, ready to extract into muze. It does not contain another muze directory inside it. The original installer, DBF files and CDX files are not needed on the server. These endpoints supersede the earlier plain-text charts.php prototype. The supplied artistfacts.php example is not included or replaced. 2. SERVER REQUIREMENTS PHP 8.1 or later with the standard zlib extension enabled. No MySQL, SQLite, Composer, dbase extension or OpenAI request is required. The PHP process needs read access to chart-data. It does not write there. The chart-data folder includes an Apache 2.4 .htaccess rule denying browser downloads and an IIS web.config rule. Keep these files when uploading. If the host uses Nginx or disables .htaccess, deny web access to chart-data in the server configuration, or store the data outside the web root and set the MUZE_CHART_DATA environment variable to that private directory. Do not replace an existing .htaccess or web.config in the main muze directory. The supplied rules live only inside the new chart-data folder. 3. YOUR EXISTING JAWS SAMPLE The main lookup file is canadachartpositions.php. The original JAWS sample uses the title parameter and POST method. The URL for this package is: https://hartgenscripts.com/muze/canadachartpositions.php?title=Survivor%20-%20Eye%20Of%20The%20Tiger The service accepts the POST request with parameters in the URL that your ShellURLToFileSend call makes. Normal GET and form-encoded POST also work. Your existing api_key parameter is accepted but not used. No key is needed for this database service, and it makes no external API request. The response is a UTF-8 HTML fragment with the same Arial 14px div wrapper, h1/h2/h3 headings, and paragraphs used in your artistfacts.php example. It has no JavaScript, layout tables or Markdown headings. Recording results start with Canadian and American Charts. Each chart statistic has its own paragraph. Recording and artist notes are retained, without the archive introduction, historical-notes heading, recording IDs or result counters. Your JAWS script already appends the instruction to press Escape, so the PHP response does not repeat it. All supplied JAWS searches request limit=all and display their complete results together. There are no page-number prompts. Upload this PHP version before using the updated JAWS text file, so the server accepts limit=all. Searches accept case variations, hyphen/dash separators, punctuation, and partial artist/title wording. Multiple possible recordings are shown as separate results. Artist names such as AC/DC and Olivia Newton-John work. There is no automatic guess that replaces a missing artist/title match. An artist and title can also be supplied separately: https://hartgenscripts.com/muze/canadachartpositions.php?artist=Survivor&song=Eye%20Of%20The%20Tiger 4. WHAT THE PACKAGE CONTAINS 60,405 recordings across 43 chart series. The default scope includes 22 Canadian and 7 Billboard chart series, covering 58,050 recordings with at least one record in those series. The additional 14 Radio and Records series are available with scope=rr or scope=all, or by selecting an individual RR chart ID. Available recording information includes: - All linked titles and artists, including available medley information. - Composer names as actually stored, sometimes surnames or abbreviations. - Entry date, peak position, peak date, total weeks, weeks at number one, weeks in the top ten, and weeks in the top fifty, for each matching chart. - The artist, title, composer and recording notes present in the database. Notes reflect the June 1999 database. No modern information is added. Search results do not silently fill in missing names or facts from the web. 5. ENDPOINTS AND EXAMPLES SONG LOOKUP: canadachartpositions.php Use title=Artist - Title, or separate artist= and song= parameters. A title without an artist is also accepted. Use id= if you already know a recording ID. IDs are case-sensitive and are not displayed in the results. https://hartgenscripts.com/muze/canadachartpositions.php?title=Survivor%20-%20Eye%20Of%20The%20Tiger https://hartgenscripts.com/muze/canadachartpositions.php?title=AC%2FDC%20-%20Highway%20To%20Hell https://hartgenscripts.com/muze/canadachartpositions.php?id=9Z&scope=billboard ARTIST LIST: chartartists.php Supply artist=Survivor, or title=Survivor for a JAWS-style query. Recordings are ordered by their earliest entry date across the selected, matching charts. Equal dates are ordered by title, artist and recording ID. Each recording also lists its charts by entry date, earliest first. https://hartgenscripts.com/muze/chartartists.php?artist=Survivor&limit=all https://hartgenscripts.com/muze/chartartists.php?artist=Elton%20John&scope=canadian&limit=all COMPOSER LOOKUP: canadachartpositions.php Supply composer= and optionally song=. Search the credit as stored: for example, use Peterik because this recording's credit is a surname. https://hartgenscripts.com/muze/canadachartpositions.php?composer=Peterik&song=Eye%20Of%20The%20Tiger CHART CATALOGUE: chartcatalogue.php Lists each chart's query ID, publisher/group and first/last stored months. https://hartgenscripts.com/muze/chartcatalogue.php https://hartgenscripts.com/muze/chartcatalogue.php?scope=all HIT LISTS: chartlists.php Select a chart or scope. Filter by overall peak position and/or exact entry or peak dates. Results are listed alphabetically by artist/title, subject to search relevance if text criteria are supplied. chart=RPM100 chooses RPM 100 Hit Tracks. peak=1 means the recording's overall stored peak was exactly number one. peak_max=10 means the recording's overall stored peak was in the top ten. year=1982 selects the calendar year of the stored peak date by default. date_field=entry changes the date filter to the entry date. from=1982-01-01 and to=1982-12-31 specify an inclusive date range. year=, if supplied, takes precedence over from= and to=. artist=, song= and composer= can be combined with these filters. These filters also work on canadachartpositions.php and chartartists.php. https://hartgenscripts.com/muze/chartlists.php?chart=RPM100&year=1982&peak=1 https://hartgenscripts.com/muze/chartlists.php?scope=billboard&year=1982&peak_max=10 https://hartgenscripts.com/muze/chartlists.php?chart=RPMCOU&date_field=entry&from=1975-06-01&to=1975-06-30 Important: year=1982&peak=1 finds records whose stored PEAK DATE is in 1982. It does not claim to list every song that held number one at any point in 1982, because a song could have first peaked in a previous year. Only chart records that satisfy the filters are displayed. PERIOD RANKING: chartperiod.php Use one chart ID and from=YYYY-MM. Optional to=YYYY-MM defaults to from=. The start and end months are inclusive. The default chart is RPM100. JAWS uses its built-in IntToPaddedString function to build from/to YYYY-MM values from the selected year and month. The current PHP also accepts single-digit months, such as from=1964-6&to=1965-6, and normalises these to 1964-06 and 1965-06 before comparison. Full dates also accept single-digit months and days. Invalid dates, such as 1965-2-29, are still rejected. Upload the updated canadachartpositions.php to accept dates without leading zeroes. It also accepts numeric from_year, from_month, to_year and to_month fields, or valid full dates. When full dates are supplied, their complete calendar months are included. Numeric year/month fields take precedence over the corresponding date text. https://hartgenscripts.com/muze/chartperiod.php?chart=RPM100&from=1982-09 https://hartgenscripts.com/muze/chartperiod.php?chart=RPM100&from=1982-01&to=1982-12&limit=100 The ranking uses only stored appearances within the chosen months, ordered by best recorded position, appearances at that position, appearances in the top ten, top twenty, top fifty, then total appearances. Exact ties share a rank. Tied rows are displayed in recording-ID order for consistency. This follows the criteria described in the original program's help, but has not been compared against a running copy of that program. It is a calculated period ranking, not a published weekly chart. 6. COMMON OPTIONS scope=combined Canadian and Billboard charts. This is the default. scope=canadian Canadian charts only. scope=billboard Billboard charts only. scope=rr Radio and Records charts only. scope=all All 43 series. chart=RPM100 selects one chart and takes precedence over scope. Use chartcatalogue.php?scope=all to see every valid chart ID. limit=all Return all matching recordings. Used by every supplied JAWS search, including the original artist-title lookup. limit=25 Default for other callers; numeric limits from 1 to 100 remain supported for clients that explicitly request pages. offset=0 Starting result offset. Add limit to offset for the next page. A simple message says when more results are available; result counts and technical offsets are not displayed. details=1 Include full statistics, credits and notes for each recording. details=0 Compact listing. This is the default for multiple matches; a single match receives full details automatically. artist= and composer= match the corresponding fields, rather than guessing which person a surname refers to. Data spelling and abbreviations are preserved. Artist/title matches are deterministic; no AI matching is used. 7. SOURCE LIMITATIONS Exact weekly charts, previous-week ranks, entry ranks and weeks elapsed as of a chosen historical day are not recoverable from this database. The position dates retain month and year only. The service reports the complete run recorded in June 1999. A run still in progress at that cutoff may be incomplete. The main RPM positions span June 1964 to June 1999; other series vary. First and last stored months do not prove uninterrupted coverage. Some supplied total-weeks values differ from stored position-row counts. Song statistics use the explicit total-weeks field. Period rankings clearly label their row counts as stored appearances. The position encoding combines positions 99 and 100. Period rankings label that band accordingly. The exact peak in the separate song-statistics table is preserved, including an explicit peak of 100 where recorded. Four internal placeholder notes were omitted from the derived package. One hundred Radio and Records Modern Rock records have a date code that decodes to December 2071. They are omitted from period calculations; the underlying song statistics remain available. Canadian and Billboard data are unaffected by that anomaly. The original source files are unchanged. 8. CHECK AFTER UPLOADING Open chartcatalogue.php and confirm that the default view lists 29 series. Then try the Survivor example through your JAWS ChartPositions script. The result should include RPM (22 total weeks), Billboard Hot 100 (25 total weeks) and Billboard Adult Contemporary (12 total weeks). The package was tested locally using actual HTTP GET, form POST and your JAWS-style POST with URL parameters, under a 128 MB PHP memory limit. The complete 1964-1999 RPM period query was also checked. The earlier version was confirmed working by the user. These display changes have been tested locally; the updated files still need to be uploaded. 9. PHP AND JAWS UPDATES Canadian Charts PHP Update.zip contains all five complete PHP files. Upload them into https://hartgenscripts.com/muze/, replacing the corresponding files. The chart-data folder has not changed and does not need to be uploaded again. The main lookup retains the existing filename canadachartpositions.php. No change is needed to the JAWS code that appends the Escape instruction. For the complete-results and date-order update, replace canadachartpositions.php on the server and use the complete updated PHP and JAWS/JAWS Script Sample.txt in your existing JAWS script set, including its helper functions and menu. No database upload is needed. Current refinements: - Artist notes appear only on the first recording carrying that exact note. Distinct notes for the same artist name are retained when they first occur. - The displayed database name is Canadian and American Charts. - Available charts is no longer an item in the JAWS menu. - Complete dates use successive Day, Month and Year list selections. Whole-year filters use a year list. Years run from 1955 to 1999. - Every script begins with StopSpeech, and pauses remain after dialogs close. - The starting date and year default to the selected chart's first recorded entry date. Period rankings default to its first stored position month. The former fixed 1982 preset has been removed. - The end date starts with the selected start date. Press Enter through its lists to keep that date. Escape cancels the search. - Invalid days, such as 31 April or 29 February in a non-leap year, prompt for a valid day. Reversed date ranges are rejected. - Period rankings still include whole calendar months. The day-selection prompt explains that the entire selected month will be included. - JAWS uses built-in zero-padding directly for its date and month values. - Upload the updated canadachartpositions.php to allow single-digit months and days in requests. The captured period request from=1964-6&to=1965-6 is accepted as June 1964 through June 1965. No database upload is needed. HTTP errors retain the same accessible HTML structure: invalid inputs use 400, unavailable weekly charts use 422, and missing/damaged data uses 500. Valid empty searches use HTTP 200 and explain that no match was found.