Anzahl Tage ermitteln

Begonnen von zaede, 22. Oktober 2009, 17:09:14

Vorheriges Thema - Nächstes Thema

zaede

Hallo,

1. Wenn ich $mul(%played_per_day%,30) eingebe, erhalte ich immer den Wert 0 zurück ?

2. Ist es möglich die Anzahl Tage zu ermitteln.

Etwa so:
$sub(%added%,%last_played%) wo mir dann als Wert die Anzahl Tage zurück gibt ?




tedgo

#1
Title Formatting in foobar2000 arbeitet nur mit integren Zahlen.
Hast du also %played_per_day% = 0.99 wird daraus 0. Und 0 * 30 = na? Richtig, 0.

Welche Tage willst du denn ermittelt haben?
Wenn du die Tage zwischen %first_played% und %last_played% ermitteln willst (denn nur dieser Zeitraum wird in %played_per_day% berücksichtigt), dann mach doch mal folgendes:
$muldiv(%play_count%,100,$replace(%played_per_day%,.,))

EDIT:
Wobei angemerkt werden muss, dass das Ergebnis durch Rundungsfehler ebenfalls vom tatsächlichen Wert um einige Tage abweichen wird!

zaede

Was ich gerne möchte ist die Azahl Tage zwischen
%Added% und %Last_Played% ermitteln.

Bsp:

Der Track wurde `added` am (19-10-2009)
und last played war heute (22-10-2009)
ergibt dann den Wert 3. Den Wert den ich suche.


tedgo

#3
Dann musst du tricksen, denn %played_per_day% berücksichtigt kein %added%.

Ich poste jetzt mal den Weg, den ich ähnlich in meiner Konfiguration verwende (ich verwende allerdings andere Daten):

$puts(ady,$muldiv($year(%added%),1461,4))
$puts(adm,$select($month(%added%),0,31,59,90,120,151,181,212,243,273,304,334))
$puts(add,$day_of_month(%added%))
$puts(addays,$add($get(ady),$get(adm),$get(add)))
$puts(lpy,$muldiv($year(%last_played%),1461,4))
$puts(lpm,$select($month(%last_played%),0,31,59,90,120,151,181,212,243,273,304,334))
$puts(lpd,$day_of_month(%last_played%))
$puts(lpdays,$add($get(lpy),$get(lpm),$get(lpd)))
$puts(library.days,$sub($get(lpdays),$get(addays)))


Auch hier gibt es eine Fehlerquote, allerdings max 1 Tag (und das auch nur vom 1. Januar bis zum 1. März in einem Schaltjahr ;)).
Das liegt ganz einfach daran, dass das Title Formatting nicht für Rechenaufgaben gedacht ist, sondern auch von mir hier nur dazu missbraucht wird!

Aufrufen kannst du dann die Anzahl an Tagen mit $get(library.days)

EDIT (wieder mal...  ::)):
Wenn du deine Playback Statistics immer in die File-Tags schreibst, ist es einfacher:
$div($sub(%last_played_timestamp%,%added_timestamp%),864000000000)
Aber: Da TitleFormatting immer rundet auch hier bis zu 1Tag Differenz.

zaede

Wow Danke,

Hät ich wohl Jahre dafür gebraucht.  :cool:

qwert73

#5
Im Zusammenhang mit Datumsberechnungen habe ich folgende interessante Seite gefunden - die Kapitel 6 und Anhang A zeigen einige in JavaScript gehaltene Algorithmen, mit denen sich einiges machen lässt: Bestimmung des Wochentags oder der Kalenderwoche bei einem gegebenen Datum, aber auch die Ermittlung der Differenz zwischen zwei Daten. Um die Algorithmen vollständig zu begreifen und in Title Formatting zu überführen bräuchte ich auch etliche Jahre.

[offtopic]
Zitat von: tedgo in 22. Oktober 2009, 18:25:35
Das liegt ganz einfach daran, dass das Title Formatting nicht für Rechenaufgaben gedacht ist, sondern auch von mir hier nur dazu missbraucht wird!
Das Snippet, das Du gebrauchst, ist zwar für Normalsterbliche schwer durchschaubar, aber es liegt wahrlich kein Mißbrauch vor. Letzteres ist häufig und zu Recht als Vorwurf im HA Forum zu lesen gewesen, meinte aber was anderes als komplexe Ausdrücke. Die originäre und hauptsächliche Aufgabe von Title Formatting ist es, die in einem Track enthaltenen Informationen/Eigenschaften (z.B. darin enthaltene Tags, die Länge oder Größe des Stücks, ...) herauszupicken, den/die herausgepickten Wert(e) zu bearbeiten und ein Ergebnis zu ermitteln, das in verschiedenen Zusammenhängen zu gebrauchen ist (Album List, Definition von Spalten in der Playlistansicht, Sortierung und einiges mehr). Um Mißbrauch simpel zu erklären: Es ist alles andere und simpel daran zu erkennen, dass als Variable/Funktion auf einmal etwas auftaucht, dass sich auf etwas anderes bezieht als einen Track - %playback_order% wäre solch eine Variable, die einen Title Formatting Ausdruck vor das Problem stellt, wie es denn von den Änderungen der Playback Order unterrichtet werden soll. Die Auswüchse solch einen Mißbrauchs kennt jeder, wenn er mit Title Formatting versucht, die Position eines Albencovers zu bestimmen.

Weil also Title Formatting ruhig mal ein wenig komplexer sein darf, wenn es nicht anders geht, hier ein Beispiel, wie zu einem bestimmten Datum der Wochentag ermittelt wird. Aber zweifelsohne: eine Funktion $day_of_week(), die einem den Krampf ersparen würde, wäre nett.

tedgo

#6
Mit dem Missbrauch meinte ich lediglich, dass ich es für Berechnungen benutze, wofür es eigentlich nicht gedacht ist ;)

Für JavaScript habe ich übrigens das passende Pendant ebenfalls in meiner Konfiguration:

var today = new Date();
var fpy = fb.TitleFormat("$year(%first_played%)").Eval();
var fpm = fb.TitleFormat("$sub($month(%first_played%),1)").Eval();
var fpd = fb.TitleFormat("$day_of_month(%first_played%)").Eval();
var fday = new Date(fpy, fpm, fpd);
var one_day = 1000 * 60 * 60 * 24;
var ar_days = Math.floor((today.getTime() - fday.getTime()) / one_day);

Natürlich kommt man auch hier nicht ganz ums TitleFormatting herum, muss man doch dadurch die Info %first_played% beziehen.
In dem Beispiel wird die Differenz zwischen "first played" und "heute" ermittelt (in JScript kann man "heute" einfach mit Date() abgreifen).
Das %first_played% muss aber zum berechnen erst in ein für Java Script übliches Datumsformat gebracht werden (new Date(fpy, fpm, fpd)).
Und da in JavaScript der Januar nicht Monat 1 sondern 0 ist, muss man vom TitleFormatting-Monat einfach 1 abziehen.

aus nachfolgenden Beiträgen neues Thema erstellt - tedgo